{"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-6919543de5e8c458", "name": "Possibly dead Python function: replace_auth", "shortDescription": {"text": "Possibly dead Python function: replace_auth"}, "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-2f4924c09c70c0ec", "name": "Possibly dead Python function: footer", "shortDescription": {"text": "Possibly dead Python function: footer"}, "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-26e7b930013fe201", "name": "Possibly dead Python function: handle_optio_exceptions", "shortDescription": {"text": "Possibly dead Python function: handle_optio_exceptions"}, "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-ef5a93360724be42", "name": "Possibly dead Python function: cleanup_expired", "shortDescription": {"text": "Possibly dead Python function: cleanup_expired"}, "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-b41d9831ef835bce", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "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-01fec0352224526d", "name": "Possibly dead Python function: when_ready", "shortDescription": {"text": "Possibly dead Python function: when_ready"}, "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-57527694d9c45cc6", "name": "Possibly dead Python function: worker_int", "shortDescription": {"text": "Possibly dead Python function: worker_int"}, "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-9b9eef234128434c", "name": "Possibly dead Python function: pre_fork", "shortDescription": {"text": "Possibly dead Python function: pre_fork"}, "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-73e46c813b288758", "name": "Possibly dead Python function: post_fork", "shortDescription": {"text": "Possibly dead Python function: post_fork"}, "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-0e827c484f0e2c8a", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "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-46c233bef5a1e719", "name": "Possibly dead Python function: apply_rate_limiting_to_blueprint", "shortDescription": {"text": "Possibly dead Python function: apply_rate_limiting_to_blueprint"}, "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-7a715498ee05905b", "name": "Possibly dead Python function: add_rate_limit_headers", "shortDescription": {"text": "Possibly dead Python function: add_rate_limit_headers"}, "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-dc37becad89e3acd", "name": "Possibly dead Python function: audit_log", "shortDescription": {"text": "Possibly dead Python function: audit_log"}, "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-ec341c375173b914", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "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-4cf9716632313d0e", "name": "Possibly dead Python function: log_admin_action", "shortDescription": {"text": "Possibly dead Python function: log_admin_action"}, "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-af38dafbc18be956", "name": "Possibly dead Python function: cleanup_context", "shortDescription": {"text": "Possibly dead Python function: cleanup_context"}, "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-1dd112b263d3f85e", "name": "Possibly dead Python function: validate_csrf_token", "shortDescription": {"text": "Possibly dead Python function: validate_csrf_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-c6c0677d15836c51", "name": "Possibly dead Python function: add_request_id", "shortDescription": {"text": "Possibly dead Python function: add_request_id"}, "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-a57aff0624aeb62a", "name": "Possibly dead Python function: handle_app_error", "shortDescription": {"text": "Possibly dead Python function: handle_app_error"}, "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-30b9b3d7ac004f83", "name": "Possibly dead Python function: handle_http_error", "shortDescription": {"text": "Possibly dead Python function: handle_http_error"}, "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-65d8aa438117e1b2", "name": "Possibly dead Python function: handle_generic_error", "shortDescription": {"text": "Possibly dead Python function: handle_generic_error"}, "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-e1c182735ff34afb", "name": "Stray `console.log` in TS/JS \u2014 frontend/vite.config.js:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/vite.config.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-9acd8cba9a0c3d2a", "name": "Stray `console.log` in TS/JS \u2014 frontend/migrate-icons.js:310", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/migrate-icons.js:310"}, "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-0e766e85c688aa4d", "name": "Stray `console.log` in TS/JS \u2014 frontend/fix-unmapped-icons.js:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/fix-unmapped-icons.js:84"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a9d9857fcf4e6f6", "name": "Stray `console.log` in TS/JS \u2014 frontend/scripts/refactor-modals.js:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/scripts/refactor-modals.js:57"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-046147e1e01d0893", "name": "Stray `console.log` in TS/JS \u2014 frontend/public/sw.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/public/sw.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-50ffbfb7045dc551", "name": "Stray `console.log` in TS/JS \u2014 frontend/public/generate-icons.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/public/generate-icons.js:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f8478d524856cbb", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/main.jsx:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/main.jsx: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-b72c4254a714d22c", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/utils/logger.js:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/utils/logger.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-b6d550d5180c10d5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/utils/sanitize.js:61", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/utils/sanitize.js:61"}, "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-86fad3d3a171e41f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/utils/__tests__/dangerouslySetInnerHTML.lint.test.js:", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/utils/__tests__/dangerouslySetInnerHTML.lint.test.js:2"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0007eee394d3c138", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CoursePreview.jsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CoursePreview.jsx:110"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae5a50d046315d8e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/LessonEditor.jsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/LessonEditor.jsx:181"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d65826953d54aaf0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SimilarQuestAutocomplete.jsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SimilarQuestAutocomplete.jsx:138"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-538974d5e83c65a2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoPortfolio.jsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoPortfolio.jsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a0dbe20c23be899", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/QuestSelector.jsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/QuestSelector.jsx:147"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b28049eeebf6c5c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ActingAsBanner.jsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ActingAsBanner.jsx:77"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-156ad2343309c15f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ParentMessageViewer.jsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ParentMessageViewer.jsx:166"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-894a52641f096cb6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ParentConversationsViewer.jsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ParentConversationsViewer.jsx:217"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1fb61cd6c68866a1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/FamilyQuestChildSelector.jsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/FamilyQuestChildSelector.jsx:102"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-02aa109f10bb8148", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/FamilySettingsModal.jsx:533", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/FamilySettingsModal.jsx:533"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4814e867553996a7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ShowcaseFamilySection.jsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ShowcaseFamilySection.jsx:113"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-32783fa782b360ea", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/DependentSettingsModal.jsx:711", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/DependentSettingsModal.jsx:711"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-145deebbde2f16af", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/docs/DocsSidebar.jsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/docs/DocsSidebar.jsx:98"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-faab7ea41e410a71", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/shared/AttachmentPreviewList.jsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/shared/AttachmentPreviewList.jsx:47"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4f3238dfff309331", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/StatsCard.jsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/StatsCard.jsx:117"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d67c6ba4a8465507", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/EmptyStates.jsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/EmptyStates.jsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fdfab29111fc3de6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/SkillsChart.jsx:167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/SkillsChart.jsx:167"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a218e303b2337927", "name": "React Flow <MiniMap> without dark background \u2014 frontend/src/components/philosophy/MindMap.jsx:274", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 frontend/src/components/philosophy/MindMap.jsx:274"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b3e6225edd449083", "name": "React Flow <Controls> without dark theming \u2014 frontend/src/components/philosophy/MindMap.jsx:273", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 frontend/src/components/philosophy/MindMap.jsx:273"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4afb2b4f5885b7e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/philosophy/NodeDetailPanel.jsx:103", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/philosophy/NodeDetailPanel.jsx:103"}, "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-52b21480962677c2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/philosophy/PhilosophySEOFallback.jsx:31", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/philosophy/PhilosophySEOFallback.jsx:31"}, "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-d3a8bb921f1b316d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/philosophy/MobileMindMap.jsx:230", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/philosophy/MobileMindMap.jsx:230"}, "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-30ab0b3392155cb1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lti/LtiEvidenceEditor.jsx:182", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lti/LtiEvidenceEditor.jsx:182"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f27dc8a23a7dbcf", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/FeedCard.jsx:350", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/FeedCard.jsx:350"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aac40a55f05b1a22", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/DocumentPreview.jsx:229", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/DocumentPreview.jsx:229"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-49389b7f9eff5a3f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/VideoLinkPreview.jsx:25", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/VideoLinkPreview.jsx:25"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-856da6d28f8b9d4f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/LinkPreviewCard.jsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/LinkPreviewCard.jsx:119"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5bf040d7e92e7f1f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tutor/ParentDashboard.jsx:282", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tutor/ParentDashboard.jsx:282"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec7e071ec6236198", "name": "Icon-only button without accessible name \u2014 frontend/src/components/tutor/ChatInterface.jsx:363", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/tutor/ChatInterface.jsx:363"}, "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-abceb36dc609904a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tutor/ConversationHistory.jsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tutor/ConversationHistory.jsx:134"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b487ce55cb13572c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence-report/ReportCard.jsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence-report/ReportCard.jsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0768826b24bdf833", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/AddQuestModal.jsx:290", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/AddQuestModal.jsx:290"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-133c4fb53603e448", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/StudentClassesView.jsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/StudentClassesView.jsx:128"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-711face676b56f56", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/StudentAgenda.jsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/StudentAgenda.jsx:79"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-00ca1123bbaafa9b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/ClassAdvisorsTab.jsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/ClassAdvisorsTab.jsx:142"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ab57533d5f0f4ba", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/ClassCard.jsx:40", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/ClassCard.jsx:40"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36b5f911c4df31da", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/AddStudentsModal.jsx:198", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/AddStudentsModal.jsx:198"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0bbf6d14e23487e6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/ClassQuestsTab.jsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/ClassQuestsTab.jsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7eb468d8e6993b12", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/learning-events/PromoteToTaskModal.jsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/learning-events/PromoteToTaskModal.jsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3848021ed3267507", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/learning-events/RequestXpModal.jsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/learning-events/RequestXpModal.jsx:220"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0389866c84b0f04d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/learning-events/LearningEventCard.jsx:321", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/learning-events/LearningEventCard.jsx:321"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-475f9dbb36d01fc1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/marketing/AnnouncementBanner.jsx:13", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/marketing/AnnouncementBanner.jsx:13"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6334309e68d52b9e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/DiplomaCreditTracker.jsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/DiplomaCreditTracker.jsx:213"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d0a6f49a198b0e9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/EvidenceMasonryGallery.jsx:333", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/EvidenceMasonryGallery.jsx:333"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e402819ab667f52", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/EvidenceDetailModal.jsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/EvidenceDetailModal.jsx:67"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-630e42b403dfaff5", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/CompactSidebar.jsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/CompactSidebar.jsx:215"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9dfc3731fb68c94d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/SkillsRadarChart.jsx:258", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/SkillsRadarChart.jsx:258"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9940ceb653184439", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/evidence/EvidenceContentGrid.jsx:22", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/evidence/EvidenceContentGrid.jsx:221"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f72dd2b4e0d9ab2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/AdminUsers.jsx:534", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/AdminUsers.jsx:534"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c3bb1275684790a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/UserEnrollmentsTab.jsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/UserEnrollmentsTab.jsx:172"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aedf731d188cf364", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/UserDetailsModal.jsx:367", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/UserDetailsModal.jsx:367"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b48326c7dbf6d1a", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/components/admin/UserDetailsModal.jsx:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/admin/UserDetailsModal.jsx:54"}, "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-0f0b0537697f56e9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/DocsManager.jsx:411", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/DocsManager.jsx:411"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3c58fc384db05680", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/AdminConnections.jsx:441", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/AdminConnections.jsx:441"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aff9c14802e6cbb2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/DocsAIPanel.jsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/DocsAIPanel.jsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-649b3265ac295b9e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/AdminQuests.jsx:756", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/AdminQuests.jsx:756"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-88db66285facc6f2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/ChatLogsModal.jsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/ChatLogsModal.jsx:125"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3be4169230401977", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/MasqueradeBanner.jsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/MasqueradeBanner.jsx:69"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1405b6d31e3c47a8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/UserConnectionsTab.jsx:405", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/UserConnectionsTab.jsx:405"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e4f7176bb4abbbc", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/quests/QuestPersonalizationWizard.jsx:282", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/quests/QuestPersonalizationWizard.jsx:282"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a0f84244a7048570", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/EvidenceDisplay.jsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/EvidenceDisplay.jsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c379b35c9a26fcd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/EvidenceBlockRenderer.jsx:376", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/EvidenceBlockRenderer.jsx:376"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a7b2db64159f9d34", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/EvidenceContentEditor.jsx:488", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/EvidenceContentEditor.jsx:488"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d95d50a9a49a8447", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/ImprovedEvidenceUploader.jsx:382", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/ImprovedEvidenceUploader.jsx:382"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4d42862d996bf1eb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/blocks/VideoBlock.jsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/blocks/VideoBlock.jsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7d2b2a2b96bfa16", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/blocks/DocumentBlock.jsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/blocks/DocumentBlock.jsx:83"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-22ab38fdba8b998a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/blocks/LinkBlock.jsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/blocks/LinkBlock.jsx:49"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bae7c544d2d8624c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/CourseTab.jsx:1073", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/CourseTab.jsx:1073"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-297b2b6c946c5e82", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/AdvisorsTab.jsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/AdvisorsTab.jsx:279"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-774ba04c2d58eabc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/OverviewTab.jsx:383", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/OverviewTab.jsx:383"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d2e2cffc33c7c40", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/connections/AdvisorStudentSect", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/connections/AdvisorStudentSection.jsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3ad252cc3af176b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/people/InvitationLinksSection.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/people/InvitationLinksSection.jsx:138"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fbbc8c4036cf14ab", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/people/PendingInvitationsSecti", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/people/PendingInvitationsSection.jsx:46"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-32a779de36ea9006", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/people/RelationshipsSection.js", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/people/RelationshipsSection.jsx:164"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-573cc223e94b769d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/interest-tracks/TrackSelector.jsx:229", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/interest-tracks/TrackSelector.jsx:229"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a1b6c900115c5b4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/interest-tracks/InterestTracksList.jsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/interest-tracks/InterestTracksList.jsx:230"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94dd86fbfe5be659", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/components/interest-tracks/InterestTracksList.jsx:112", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/interest-tracks/InterestTracksList.jsx:112"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a2db9708b8eb39c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/quest/QuestCardSimple.jsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/quest/QuestCardSimple.jsx:221"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-669dfc2d423a520c", "name": "React Flow <MiniMap> without dark background \u2014 frontend/src/components/quest/QuestMap/QuestMap.jsx:171", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 frontend/src/components/quest/QuestMap/QuestMap.jsx:171"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78ca1dae99a6beb1", "name": "React Flow <Controls> without dark theming \u2014 frontend/src/components/quest/QuestMap/QuestMap.jsx:165", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 frontend/src/components/quest/QuestMap/QuestMap.jsx:165"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c8300eb2b136e870", "name": "Custom React Flow node registered without explicit width/height \u2014 frontend/src/components/quest/QuestMap/QuestMap.jsx:69", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 frontend/src/components/quest/QuestMap/QuestMap.jsx:69"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d70e6700bc7d5108", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/quest/improved/QuestCard.jsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/quest/improved/QuestCard.jsx:165"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8cff7ff8dd0a0a21", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/quest/improved/QuestListItem.jsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/quest/improved/QuestListItem.jsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-48a56240a4d49ce7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/MergeModal.jsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/MergeModal.jsx:110"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd97e88c2c928415", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/CreditDataTable.jsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/CreditDataTable.jsx:110"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b7da9e80739c848", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/ItemList.jsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/ItemList.jsx:73"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c9933c55095bf4b1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/StudentContext.jsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/StudentContext.jsx:134"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b5ccd5d0234a746c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/ClassReviewsSection.jsx:12", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/ClassReviewsSection.jsx:128"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc80cf92a58e447d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/CurriculumEditor.jsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/CurriculumEditor.jsx:79"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18abcad94b7c5d99", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonViewer.jsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonViewer.jsx:186"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a9eed9b0f0c110eb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonContentRenderer.jsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonContentRenderer.jsx:164"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9fe7cfceff2ab862", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/curriculum/LessonContentRenderer.jsx:120", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/curriculum/LessonContentRenderer.jsx:120"}, "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-9404ce00fd032ee2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/CurriculumView.jsx:558", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/CurriculumView.jsx:558"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-865df68e99727ea3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/TaskLinker.jsx:459", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/TaskLinker.jsx:459"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fff68e86cb463137", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/FileUploader.jsx:228", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/FileUploader.jsx:228"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57cca633529e1339", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonItem.jsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonItem.jsx:103"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9952323529e96bbc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/StepEditor.jsx:346", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/StepEditor.jsx:346"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-327060ae61c7b6c4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonBlockEditor.jsx:728", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonBlockEditor.jsx:728"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a7193d35a17513fb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonTaskPanel.jsx:41", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonTaskPanel.jsx:41"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4cf6766e3a70e59", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonPreviewModal.jsx:315", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonPreviewModal.jsx:315"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f6a0317669f5e01b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/curriculum/LessonPreviewModal.jsx:202", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/curriculum/LessonPreviewModal.jsx:202"}, "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-532886094c57933d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/content/FileStepContent.jsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/content/FileStepContent.jsx:77"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0db22deb350b02ac", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/curriculum/content/TextStepContent.jsx:16", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/curriculum/content/TextStepContent.jsx:16"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc185694b16342b0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/CourseCardWithQuests.jsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/CourseCardWithQuests.jsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c1038a40590ad4d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/course/StudentPreviewModal.jsx:186", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/course/StudentPreviewModal.jsx:186"}, "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-71f8b9d1132e52c1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/AllTasksModal.jsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/AllTasksModal.jsx:279"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bf27a2e870819d22", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/SortableLessonItem.jsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/SortableLessonItem.jsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dabeaf408c91fd68", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/CourseBuilderHeader.jsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/CourseBuilderHeader.jsx:74"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d595d8aac0c66aa4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/refine/ChangePreview.jsx:236", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/refine/ChangePreview.jsx:236"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4dbf08f982260417", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/outline/OutlineTreeItem.jsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/outline/OutlineTreeItem.jsx:217"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d677caa6f0ed7ed0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/outline/OutlineEditor.jsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/outline/OutlineEditor.jsx:152"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4987dbded684e1c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/QuestAccordionGallery.jsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/QuestAccordionGallery.jsx:239"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bfb75a107016a742", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/ConnectionsSection.jsx:20", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/ConnectionsSection.jsx:20"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a6f151bf3b178ad", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/LearningSnapshot.jsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/LearningSnapshot.jsx:193"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a69e42ba3baf6a8c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/LearningJournalSection.jsx:464", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/LearningJournalSection.jsx:464"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e24ef238cb9aad94", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/PortfolioSection.jsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/PortfolioSection.jsx:308"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f978dceb4a248e2d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/advisor/AddEvidenceModal.jsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/advisor/AddEvidenceModal.jsx:142"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-25844e8fcd717ccf", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/AuthCallback.jsx:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/AuthCallback.jsx:37"}, "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-5c862a533db30113", "name": "Icon-only button without accessible name \u2014 frontend/src/pages/ShowcasePage.jsx:479", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/pages/ShowcasePage.jsx:479"}, "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-cc116ab67a3d6b60", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ShowcasePage.jsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ShowcasePage.jsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42232515f55f1ca1", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/ObserverFeedPage.jsx:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/ObserverFeedPage.jsx: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-895d5537753f430d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DashboardPage.jsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DashboardPage.jsx:163"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-54170e392e5c53a8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/StudentFeedbackPage.jsx:238", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/StudentFeedbackPage.jsx:238"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7dfbf23b950277a4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/classes/AdminClassReviewQueue.jsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/classes/AdminClassReviewQueue.jsx:119"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b999bce3842aa3a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/classes/StudentClassForm.jsx:698", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/classes/StudentClassForm.jsx:698"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a7e6c1b13631d77", "name": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/pages/classes/StudentClassForm.jsx:695", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/pages/classes/StudentClassForm.jsx:695"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0804aed1d3b1bbcc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/classes/MyClasses.jsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/classes/MyClasses.jsx:106"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-662a7efc8557f9ee", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/oea/OEACreditsView.jsx:278", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/oea/OEACreditsView.jsx:278"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42e7f75fe8a6ab8a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/PhilosophyEditor.jsx:331", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/PhilosophyEditor.jsx:331"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-274b0daa018ac362", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/pages/admin/CourseGeneratorWizard.jsx:1024", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/pages/admin/CourseGeneratorWizard.jsx:1024"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d41e62ed145247e2", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/admin/CourseGeneratorWizard.jsx:829", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/admin/CourseGeneratorWizard.jsx:829"}, "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-73e57080acc6a0bc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/ShowcaseConsentPanel.jsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/ShowcaseConsentPanel.jsx:32"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60f8afa3a9819241", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/BulkCourseGeneration.jsx:353", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/BulkCourseGeneration.jsx:353"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b6858718b88e981c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/treehouse/TreehouseFacilitatorPage.jsx:296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/treehouse/TreehouseFacilitatorPage.jsx:296"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c1817f8dd64bcb3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/courses/CourseHomepage.jsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/courses/CourseHomepage.jsx:89"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea5385d77b0608b9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/curriculum/CurriculumBuilder.jsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/curriculum/CurriculumBuilder.jsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e161e2bf2e4041e6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/advisor/QuestInvitations.jsx:248", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/advisor/QuestInvitations.jsx:248"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bb0669ec5fdd06ae", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/hooks/useHomepageImages.js:104", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/hooks/useHomepageImages.js:104"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-358557ad63bbe2e7", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/services/authService.js:303", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/services/authService.js:303"}, "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-ba112435a4172e64", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/services/evidenceDocumentService.js:181", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/services/evidenceDocumentService.js:181"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-18d11f642d7fa308", "name": "\"active\" state uses light bg in a dark theme \u2014 frontend-v2/app/(app)/(tabs)/feed.tsx:545", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend-v2/app/(app)/(tabs)/feed.tsx:545"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a2d7fbf79f816188", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-v2/src/components/curriculum/sanitizeLessonHtml.ts:3", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-v2/src/components/curriculum/sanitizeLessonHtml.ts:3"}, "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-ef7da95e44274e96", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-v2/src/components/curriculum/LessonViewer.tsx:76", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-v2/src/components/curriculum/LessonViewer.tsx:76"}, "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-5d34962e0a4b9e25", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-v2/src/components/curriculum/__tests__/LessonViewer.sanit", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-v2/src/components/curriculum/__tests__/LessonViewer.sanitize.test.tsx:8"}, "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-2e55fce621089e26", "name": "Stray `console.log` in TS/JS \u2014 frontend-v2/src/hooks/useQuestDetail.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend-v2/src/hooks/useQuestDetail.ts:65"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a8f27493ee1a201", "name": "Stray `console.log` in TS/JS \u2014 frontend-v2/e2e/global-teardown.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend-v2/e2e/global-teardown.ts: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-20bd4b403f51820f", "name": "Stray `console.log` in TS/JS \u2014 frontend-v2/e2e/global-setup.ts:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend-v2/e2e/global-setup.ts:72"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3d0ea43de9860c29", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/ai-quest-cycle/index.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/ai-quest-cycle/index.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d202763c2b1e2270", "name": "Insecure pattern 'local_storage_auth_token' in CLAUDE.md:426", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in CLAUDE.md:426"}, "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-c2cd0a83d532a18e", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/utils/browserDetection.js:181", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/utils/browserDetection.js:181"}, "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-70a38938b307d45a", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/utils/__tests__/browserDetection.test.js:135", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/utils/__tests__/browserDetection.test.js:135"}, "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-cc10ced3fb0a6093", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/philosophy/NodeDetailPanel.jsx:103", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/philosophy/NodeDetailPanel.jsx:103"}, "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-205008174b6a52ca", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/philosophy/PhilosophySEOFallback.jsx:31", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/philosophy/PhilosophySEOFallback.jsx:31"}, "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-bd164b8cdac97970", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/philosophy/MobileMindMap.jsx:230", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/philosophy/MobileMindMap.jsx:230"}, "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-d27ea2e149a20a69", "name": "Insecure pattern 'domparser_html_parse' in frontend/src/components/quest/QuestDetailHeader.jsx:26", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in frontend/src/components/quest/QuestDetailHeader.jsx:26"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9193b15316283a0c", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/curriculum/LessonContentRenderer.jsx:120", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/curriculum/LessonContentRenderer.jsx:120"}, "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-a39005b425d2dc6a", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/curriculum/LessonPreviewModal.jsx:202", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/curriculum/LessonPreviewModal.jsx:202"}, "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-f1ab4d0f4f8c3769", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/curriculum/content/TextStepContent.jsx:16", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/curriculum/content/TextStepContent.jsx:16"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-08c4de15a5324b10", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/course/StudentPreviewModal.jsx:186", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/course/StudentPreviewModal.jsx:186"}, "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-9c089ce93d9bee92", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/contexts/AuthContext.jsx:157", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/contexts/AuthContext.jsx:157"}, "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-bf5c3be09b37235b", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/contexts/AuthContext.test.jsx:457", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/contexts/AuthContext.test.jsx:457"}, "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-01cc33616b8a3f44", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/contexts/ActingAsContext.jsx:139", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/contexts/ActingAsContext.jsx:139"}, "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-267b12178c62c702", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/pages/AuthCallback.jsx:199", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/pages/AuthCallback.jsx:199"}, "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-2c41e0811ab7c027", "name": "Possible secret in frontend/src/pages/AcceptInvitationPage.jsx", "shortDescription": {"text": "Possible secret in frontend/src/pages/AcceptInvitationPage.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-67125eda76ebd917", "name": "Insecure pattern 'domparser_html_parse' in frontend/src/pages/courses/CourseHomepage.jsx:34", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in frontend/src/pages/courses/CourseHomepage.jsx:34"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9ec726cb6467b19", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/services/api.test.js:44", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/services/api.test.js:44"}, "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-e3b525f820003f83", "name": "Insecure pattern 'dangerous_innerhtml' in frontend-v2/README.md:29", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend-v2/README.md:29"}, "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-d65c9b2d7d492cb9", "name": "Possible secret in frontend-v2/app/invite/[code].tsx", "shortDescription": {"text": "Possible secret in frontend-v2/app/invite/[code].tsx"}, "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-8bfc788a47e75510", "name": "Possible secret in frontend-v2/app/(app)/(tabs)/family.tsx", "shortDescription": {"text": "Possible secret in frontend-v2/app/(app)/(tabs)/family.tsx"}, "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-8d7290a51d5813e0", "name": "Possible secret in frontend-v2/app/(auth)/register.tsx", "shortDescription": {"text": "Possible secret in frontend-v2/app/(auth)/register.tsx"}, "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-d78ad6fd101d659f", "name": "Insecure pattern 'dangerous_innerhtml' in frontend-v2/src/components/curriculum/LessonViewer.tsx:76", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend-v2/src/components/curriculum/LessonViewer.tsx:76"}, "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-60a5746a7a817338", "name": "Insecure pattern 'local_storage_auth_token' in frontend-v2/src/services/__tests__/tokenStore.web.test.ts:34", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend-v2/src/services/__tests__/tokenStore.web.test.ts:34"}, "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-dcde435f89f7640e", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-quest-cycle/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-quest-cycle/index.ts:5"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac579b8732a90e64", "name": "Possible secret in backend/scripts/seed_demo_family.py", "shortDescription": {"text": "Possible secret in backend/scripts/seed_demo_family.py"}, "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-4b9d557ff314d9b3", "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-46c644c6227e4d4a", "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-fd0f32f49d62d185", "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-ddc5d31c0b737152", "name": "Very large file: frontend/src/components/organization/CourseTab.jsx (1166 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/organization/CourseTab.jsx (1166 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-54040086187bcb81", "name": "Very large file: frontend/src/pages/courses/CourseHomepage.jsx (1485 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/courses/CourseHomepage.jsx (1485 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-16d1dbee98b3b1b6", "name": "Very large file: frontend-v2/app/(app)/(tabs)/admin.tsx (1618 lines)", "shortDescription": {"text": "Very large file: frontend-v2/app/(app)/(tabs)/admin.tsx (1618 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-b274bed0b1981184", "name": "Very large file: backend/routes/evidence_documents.py (1525 lines)", "shortDescription": {"text": "Very large file: backend/routes/evidence_documents.py (1525 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-7606dc7fe1759efa", "name": "Very large file: backend/routes/parent/learning_moments.py (1239 lines)", "shortDescription": {"text": "Very large file: backend/routes/parent/learning_moments.py (1239 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-a4c104d273b61e91", "name": "Very large file: backend/routes/admin/curriculum_upload.py (1400 lines)", "shortDescription": {"text": "Very large file: backend/routes/admin/curriculum_upload.py (1400 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-4c2cc75ed562e74f", "name": "Very large file: backend/services/interest_tracks_service.py (1930 lines)", "shortDescription": {"text": "Very large file: backend/services/interest_tracks_service.py (1930 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-68e1523d0b55fe95", "name": "Very large file: backend/services/base_ai_service.py (1419 lines)", "shortDescription": {"text": "Very large file: backend/services/base_ai_service.py (1419 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": "247 tests / 1443 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 1100 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 636 placeholder/mock markers across 253 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-24f2ea4bd14badc1", "name": "Agent instruction contains unpinned remote install: CLAUDE.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: CLAUDE.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-505bc666a82f9849", "name": "Agent instruction/config may expose a secret: .claude/settings.local.json", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/settings.local.json"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6700aacbc07a66df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/utils/errorHandling.js:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/utils/errorHandling.js:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-01e8c0bfe24b0b1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/utils/retryHelper.js:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/utils/retryHelper.js:50"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d9e6ec91cc25f209", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/Layout.jsx:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/Layout.jsx:86"}, "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-d4d3d5a880b63bb4", "name": "Commented-code block (7 lines) in frontend/src/components/notifications/PushNotificationBanner.jsx:60", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/notifications/PushNotificationBanner.jsx:60"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-786643409675728f", "name": "Commented-code block (5 lines) in frontend/src/components/navigation/BackButton.jsx:65", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/navigation/BackButton.jsx:65"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18a28ecd345bc5f3", "name": "Commented-code block (10 lines) in frontend/src/components/navigation/Sidebar.jsx:146", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/components/navigation/Sidebar.jsx:146"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3f18bfd43a10a71b", "name": "Commented-code block (5 lines) in frontend/src/components/admin/QuestForm.jsx:453", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/admin/QuestForm.jsx:453"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a9c4c32d2a513df4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/quest/TaskCompletionModal.jsx:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/quest/TaskCompletionModal.jsx:47"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c7e08695cbd5a2", "name": "Commented-code block (5 lines) in frontend/src/components/credit-dashboard/StatusTimeline.jsx:16", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/credit-dashboard/StatusTimeline.jsx:16"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17803c32a8ddb059", "name": "Commented-code block (6 lines) in frontend/src/components/credit-dashboard/evidenceDiff.js:27", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/credit-dashboard/evidenceDiff.js:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f6db576856447b97", "name": "Commented-code block (6 lines) in frontend/src/pages/BountyBoardPage.jsx:310", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/BountyBoardPage.jsx:310"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eace6b6dd9865128", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/AuthCallback.jsx:325", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/AuthCallback.jsx:325"}, "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-bb71301246d8a769", "name": "Commented-code block (5 lines) in frontend/src/pages/DiplomaPage.jsx:745", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/DiplomaPage.jsx:745"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0ee4b051f178155", "name": "Commented-code block (8 lines) in frontend/src/pages/ParentDashboardPage.jsx:70", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/pages/ParentDashboardPage.jsx:70"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6dee06ee31dc0d64", "name": "Commented-code block (5 lines) in frontend/src/pages/lti/LtiQuestPage.jsx:32", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/lti/LtiQuestPage.jsx:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-10bea32d491611d0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/lti/LtiEvidencePage.jsx:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/lti/LtiEvidencePage.jsx:11"}, "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-8ddd6be676b9347a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/lti/__tests__/LtiEvidencePage.test.jsx:3", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/lti/__tests__/LtiEvidencePage.test.jsx:3"}, "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-3d064dc587174043", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/api/useNotifications.js:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/api/useNotifications.js:62"}, "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-431e95d86b78b306", "name": "Commented-code block (6 lines) in frontend/src/services/api.js:15", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/services/api.js:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3618dcfc18cdb093", "name": "Commented-code block (6 lines) in tests/e2e/specs/02-login.spec.js:91", "shortDescription": {"text": "Commented-code block (6 lines) in tests/e2e/specs/02-login.spec.js:91"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0b7284fc7a499bc5", "name": "Commented-code block (5 lines) in frontend-v2/app/_layout.tsx:107", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/app/_layout.tsx:107"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0379dd0b585d75ba", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/app/(lti)/lti-evidence.tsx:118", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/app/(lti)/lti-evidence.tsx:118"}, "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-06683042b8c35a15", "name": "Commented-code block (6 lines) in frontend-v2/app/(app)/_layout.tsx:52", "shortDescription": {"text": "Commented-code block (6 lines) in frontend-v2/app/(app)/_layout.tsx:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d61aa91fcafafeba", "name": "Commented-code block (5 lines) in frontend-v2/app/(app)/notifications.tsx:185", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/app/(app)/notifications.tsx:185"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8ad319ed209c7cf", "name": "Commented-code block (6 lines) in frontend-v2/app/(app)/bounties/[id].tsx:160", "shortDescription": {"text": "Commented-code block (6 lines) in frontend-v2/app/(app)/bounties/[id].tsx:160"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47d3ec22bd9753cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/app/(app)/bounties/__tests__/create.test.tsx:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/app/(app)/bounties/__tests__/create.test.tsx:55"}, "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-08e2520bca596f4e", "name": "Commented-code block (6 lines) in frontend-v2/app/(app)/(tabs)/messages.tsx:86", "shortDescription": {"text": "Commented-code block (6 lines) in frontend-v2/app/(app)/(tabs)/messages.tsx:86"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-597197407c0c1fe9", "name": "Commented-code block (7 lines) in frontend-v2/app/(app)/(tabs)/journal.tsx:105", "shortDescription": {"text": "Commented-code block (7 lines) in frontend-v2/app/(app)/(tabs)/journal.tsx:105"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bcaa1c890b51d16d", "name": "Commented-code block (5 lines) in frontend-v2/app/(app)/(tabs)/feed.tsx:430", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/app/(app)/(tabs)/feed.tsx:430"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-89a5015e9268640a", "name": "Commented-code block (5 lines) in frontend-v2/app/(app)/(tabs)/dashboard.tsx:265", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/app/(app)/(tabs)/dashboard.tsx:265"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fce9fc8cd300e6db", "name": "Commented-code block (7 lines) in frontend-v2/src/__tests__/setup.tsx:347", "shortDescription": {"text": "Commented-code block (7 lines) in frontend-v2/src/__tests__/setup.tsx:347"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e9bb1797856516c", "name": "Commented-code block (5 lines) in frontend-v2/src/stores/authStore.ts:204", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/stores/authStore.ts:204"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b1d44b214c70aed", "name": "Commented-code block (8 lines) in frontend-v2/src/stores/actingAsStore.ts:291", "shortDescription": {"text": "Commented-code block (8 lines) in frontend-v2/src/stores/actingAsStore.ts:291"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd0264816f3ee6bf", "name": "Commented-code block (7 lines) in frontend-v2/src/components/bounties/BountiesView.tsx:212", "shortDescription": {"text": "Commented-code block (7 lines) in frontend-v2/src/components/bounties/BountiesView.tsx:212"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ca5b336b4de0e4b4", "name": "Commented-code block (5 lines) in frontend-v2/src/components/parent/InviteObserverSheet.tsx:322", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/components/parent/InviteObserverSheet.tsx:322"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c92122dcf3930c4f", "name": "Commented-code block (5 lines) in frontend-v2/src/components/journal/LearningEventCard.tsx:136", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/components/journal/LearningEventCard.tsx:136"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-53462a1e4478ee4e", "name": "Commented-code block (6 lines) in frontend-v2/src/components/journal/EditMomentModal.tsx:241", "shortDescription": {"text": "Commented-code block (6 lines) in frontend-v2/src/components/journal/EditMomentModal.tsx:241"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7de721d99eea6bb3", "name": "Commented-code block (5 lines) in frontend-v2/src/components/ui/bottom-sheet.tsx:63", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/components/ui/bottom-sheet.tsx:63"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f2d1eefa7eb0593", "name": "Commented-code block (7 lines) in frontend-v2/src/components/ui/button.tsx:105", "shortDescription": {"text": "Commented-code block (7 lines) in frontend-v2/src/components/ui/button.tsx:105"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06e6bcd98be97327", "name": "Commented-code block (8 lines) in frontend-v2/src/components/feed/FeedCard.tsx:36", "shortDescription": {"text": "Commented-code block (8 lines) in frontend-v2/src/components/feed/FeedCard.tsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0612165f896a33ab", "name": "Commented-code block (5 lines) in frontend-v2/src/components/capture/CaptureSheet.tsx:106", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/components/capture/CaptureSheet.tsx:106"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5e8b377b0330d484", "name": "Commented-code block (5 lines) in frontend-v2/src/components/communication/ChatWindow.tsx:121", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/components/communication/ChatWindow.tsx:121"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0844bc93ad9cf334", "name": "Commented-code block (5 lines) in frontend-v2/src/hooks/useDashboard.ts:110", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/hooks/useDashboard.ts:110"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-01f76da26bc44344", "name": "Commented-code block (5 lines) in frontend-v2/src/hooks/useJournal.ts:257", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/hooks/useJournal.ts:257"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c21511f3e7e04b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/src/hooks/useMessages.ts:108", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/src/hooks/useMessages.ts:108"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-624f9ce62d18e070", "name": "Commented-code block (6 lines) in frontend-v2/src/hooks/useQuests.ts:61", "shortDescription": {"text": "Commented-code block (6 lines) in frontend-v2/src/hooks/useQuests.ts:61"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-762b0faf7665dfc9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/src/hooks/useQuests.ts:245", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/src/hooks/useQuests.ts:245"}, "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-ff912cc9b8b1a253", "name": "Commented-code block (5 lines) in frontend-v2/src/hooks/useParent.ts:63", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/hooks/useParent.ts:63"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6bdb7c6043b7cb02", "name": "Commented-code block (8 lines) in frontend-v2/src/services/api.ts:15", "shortDescription": {"text": "Commented-code block (8 lines) in frontend-v2/src/services/api.ts:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-40990d2fbdbc3e56", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/src/services/api.ts:444", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/src/services/api.ts:444"}, "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-ea30e72624ff4dad", "name": "Commented-code block (7 lines) in frontend-v2/src/services/signedUpload.ts:85", "shortDescription": {"text": "Commented-code block (7 lines) in frontend-v2/src/services/signedUpload.ts:85"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef290d0ee4c67439", "name": "Commented-code block (6 lines) in frontend-v2/src/services/sentry.ts:116", "shortDescription": {"text": "Commented-code block (6 lines) in frontend-v2/src/services/sentry.ts:116"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b205265e7645038", "name": "Commented-code block (5 lines) in frontend-v2/src/services/diagnostics.ts:125", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/services/diagnostics.ts:125"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-54df9a10958caed4", "name": "Commented-code block (5 lines) in frontend-v2/src/services/documentScanner.ts:42", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-v2/src/services/documentScanner.ts:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-606d1a47bc8bf255", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/e2e/global-teardown.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/e2e/global-teardown.ts: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-6ac11c5baf122a66", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/e2e/global-setup.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/e2e/global-setup.ts:49"}, "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-38249beff6c794f7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/ai-quest-cycle/index.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/ai-quest-cycle/index.ts:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9fd427d053ac869", "name": "Commented-code block (7 lines) in backend/database.py:40", "shortDescription": {"text": "Commented-code block (7 lines) in backend/database.py:40"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a43aa50c69b6c41d", "name": "Legacy-named symbol `auth_login_v1` in backend/api_spec_generator.py:28", "shortDescription": {"text": "Legacy-named symbol `auth_login_v1` in backend/api_spec_generator.py:28"}, "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-192e863cd8d07aa2", "name": "Commented-code block (6 lines) in backend/app_config.py:117", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app_config.py:117"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de42a20ae5f2375c", "name": "Commented-code block (5 lines) in backend/gunicorn.conf.py:37", "shortDescription": {"text": "Commented-code block (5 lines) in backend/gunicorn.conf.py:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7868a5db5454bf03", "name": "Commented-code block (5 lines) in backend/config/constants.py:34", "shortDescription": {"text": "Commented-code block (5 lines) in backend/config/constants.py:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-158489e0667f6f76", "name": "Legacy-named symbol `test_invalid_too_old` in backend/tests/unit/test_bulk_import.py:195", "shortDescription": {"text": "Legacy-named symbol `test_invalid_too_old` in backend/tests/unit/test_bulk_import.py:195"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d3368feebceff518", "name": "Commented-code block (5 lines) in backend/tests/unit/test_quest_detail_moments.py:164", "shortDescription": {"text": "Commented-code block (5 lines) in backend/tests/unit/test_quest_detail_moments.py:164"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b2014f3d67a5dac", "name": "Legacy-named symbol `speech_v1` in backend/tests/services/test_transcription_service.py:33", "shortDescription": {"text": "Legacy-named symbol `speech_v1` in backend/tests/services/test_transcription_service.py:33"}, "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-2d16f0c11090db4e", "name": "Legacy-named symbol `pw_v2` in backend/tests/manual/test_imscc_parser.py:12", "shortDescription": {"text": "Legacy-named symbol `pw_v2` in backend/tests/manual/test_imscc_parser.py:12"}, "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-8bccb833fb393ed2", "name": "Commented-code block (6 lines) in backend/middleware/memory_monitor.py:155", "shortDescription": {"text": "Commented-code block (6 lines) in backend/middleware/memory_monitor.py:155"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce5901d7f515880d", "name": "Commented-code block (6 lines) in backend/scripts/seed_demo_family.py:430", "shortDescription": {"text": "Commented-code block (6 lines) in backend/scripts/seed_demo_family.py:430"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4ee85a5f45690cc", "name": "Commented-code block (5 lines) in backend/utils/session_manager.py:788", "shortDescription": {"text": "Commented-code block (5 lines) in backend/utils/session_manager.py:788"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df681813558b620e", "name": "Commented-code block (6 lines) in backend/routes/quest_personalization.py:436", "shortDescription": {"text": "Commented-code block (6 lines) in backend/routes/quest_personalization.py:436"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e0ebeffe47ffbf4", "name": "Legacy-named symbol `api_response_v1` in backend/routes/evidence_reports.py:24", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/evidence_reports.py:24"}, "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-ae4a91470219052b", "name": "Commented-code block (5 lines) in backend/routes/evidence_documents.py:288", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/evidence_documents.py:288"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8c22767ec855ae8f", "name": "Legacy-named symbol `create_quest_v2` in backend/routes/admin_core.py:70", "shortDescription": {"text": "Legacy-named symbol `create_quest_v2` in backend/routes/admin_core.py:70"}, "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-62440771fe677ace", "name": "Commented-code block (7 lines) in backend/routes/admin_core.py:68", "shortDescription": {"text": "Commented-code block (7 lines) in backend/routes/admin_core.py:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec0d14a7864708da", "name": "Commented-code block (6 lines) in backend/routes/family_quests.py:207", "shortDescription": {"text": "Commented-code block (6 lines) in backend/routes/family_quests.py:207"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b1e5bfa3fe4a915c", "name": "Legacy-named symbol `api_response_v1` in backend/routes/portfolio.py:12", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/portfolio.py:12"}, "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-a809bc4eb74546b9", "name": "Legacy-named symbol `api_response_v1` in backend/routes/auth/google_oauth.py:17", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/google_oauth.py:17"}, "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-d1bc58008347a59e", "name": "Commented-code block (5 lines) in backend/routes/auth/google_oauth.py:501", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/auth/google_oauth.py:501"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f33bb9f867a08fd8", "name": "Legacy-named symbol `api_response_v1` in backend/routes/auth/registration.py:19", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/registration.py:19"}, "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-7ee9d937f9053b51", "name": "Commented-code block (8 lines) in backend/routes/auth/registration.py:399", "shortDescription": {"text": "Commented-code block (8 lines) in backend/routes/auth/registration.py:399"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-72de50a6d1a7ff87", "name": "Legacy-named symbol `api_response_v1` in backend/routes/auth/apple_oauth.py:22", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/apple_oauth.py:22"}, "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-0162004c70b41ee1", "name": "Commented-code block (7 lines) in backend/routes/auth/password.py:55", "shortDescription": {"text": "Commented-code block (7 lines) in backend/routes/auth/password.py:55"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c206ff4750099d81", "name": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/diagnostics.py:20", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/diagnostics.py:20"}, "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-36cd67026d27ce3b", "name": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/tokens.py:20", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/tokens.py:20"}, "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-e9b43faa139cf217", "name": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/core.py:20", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/core.py:20"}, "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-2c975887b389cb88", "name": "Commented-code block (6 lines) in backend/routes/auth/login/core.py:342", "shortDescription": {"text": "Commented-code block (6 lines) in backend/routes/auth/login/core.py:342"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c99de7d1bcb3e47a", "name": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/settings.py:20", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/settings.py:20"}, "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-2d2ca080ba7dbc07", "name": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/security.py:20", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/security.py:20"}, "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-aee188a64ef15391", "name": "Commented-code block (5 lines) in backend/routes/parent/learning_moments.py:751", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/parent/learning_moments.py:751"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1dd93bafdc2ed7c7", "name": "Commented-code block (5 lines) in backend/routes/learning_events/crud.py:170", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/learning_events/crud.py:170"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57e1dda2cb77c808", "name": "Commented-code block (5 lines) in backend/routes/lti/launch.py:115", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/lti/launch.py:115"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fb918d38b7f1f829", "name": "Commented-code block (6 lines) in backend/routes/lti/deep_linking.py:161", "shortDescription": {"text": "Commented-code block (6 lines) in backend/routes/lti/deep_linking.py:161"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3d03a98a21141b13", "name": "Commented-code block (5 lines) in backend/routes/observer/feed.py:252", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/observer/feed.py:252"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-28e58bb47ae137e9", "name": "Commented-code block (5 lines) in backend/routes/observer/family.py:326", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/observer/family.py:326"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3909f916188c964", "name": "Commented-code block (5 lines) in backend/routes/observer/acceptance.py:188", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/observer/acceptance.py:188"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6af05bdbd85bcea4", "name": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/org_admin_actions.py:15", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/org_admin_actions.py:15"}, "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-e4fc25b8ccb7b296", "name": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/merge.py:11", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/merge.py:11"}, "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-807847f35f48fecb", "name": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/items.py:20", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/items.py:20"}, "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-b7584e087bc79e8a", "name": "Commented-code block (6 lines) in backend/routes/credit_dashboard/items.py:12", "shortDescription": {"text": "Commented-code block (6 lines) in backend/routes/credit_dashboard/items.py:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-83630b61546ae583", "name": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/superadmin_actions.py:19", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/superadmin_actions.py:19"}, "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-e77d0c7f0e7c6419", "name": "Legacy-named symbol `api_response_v1` in backend/routes/tasks/completion.py:18", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/tasks/completion.py:18"}, "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-48b6ae92a354c0a5", "name": "Commented-code block (5 lines) in backend/routes/tasks/completion.py:106", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/tasks/completion.py:106"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33359cd66c3e2ca5", "name": "Commented-code block (7 lines) in backend/routes/tasks/crud.py:108", "shortDescription": {"text": "Commented-code block (7 lines) in backend/routes/tasks/crud.py:108"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4f64f477d0ce62a4", "name": "Legacy-named symbol `api_response_v1` in backend/routes/tasks/credit.py:14", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/tasks/credit.py:14"}, "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-46c3a7a8da84ee0f", "name": "Legacy-named symbol `api_response_v1` in backend/routes/admin/class_reviews.py:19", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/admin/class_reviews.py:19"}, "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-630cc3a847cf2f15", "name": "Legacy-named symbol `api_response_v1` in backend/routes/admin/poe.py:32", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/admin/poe.py:32"}, "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-d22d817f75a09870", "name": "Legacy-named symbol `days_old` in backend/routes/admin/ai_jobs.py:117", "shortDescription": {"text": "Legacy-named symbol `days_old` in backend/routes/admin/ai_jobs.py:117"}, "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-35e10da100c5452e", "name": "Commented-code block (5 lines) in backend/routes/admin/ai_jobs.py:104", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/admin/ai_jobs.py:104"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b89002caa360334c", "name": "Commented-code block (5 lines) in backend/routes/quest/completion.py:495", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/quest/completion.py:495"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e240458eb1fa49c5", "name": "Commented-code block (5 lines) in backend/routes/quest/detail.py:140", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/quest/detail.py:140"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56ad29e6405b3d67", "name": "Legacy-named symbol `api_response_v1` in backend/routes/quest/classes.py:19", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/quest/classes.py:19"}, "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-b10c42a64f36b8e7", "name": "Legacy-named symbol `api_response_v1` in backend/routes/quest/listing.py:15", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/quest/listing.py:15"}, "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-534dabc169a446ac", "name": "Legacy-named symbol `api_response_v1` in backend/routes/quest/enrollment.py:17", "shortDescription": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/quest/enrollment.py:17"}, "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-b388300a917d399b", "name": "Commented-code block (5 lines) in backend/routes/courses/crud.py:54", "shortDescription": {"text": "Commented-code block (5 lines) in backend/routes/courses/crud.py:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fd14c52b890d827f", "name": "Commented-code block (5 lines) in backend/services/personalization_service.py:219", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/personalization_service.py:219"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0d8161bce7f18973", "name": "Commented-code block (5 lines) in backend/services/media_upload_service.py:352", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/media_upload_service.py:352"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb13257b1d6d8b3f", "name": "Commented-code block (7 lines) in backend/services/dashboard_service.py:390", "shortDescription": {"text": "Commented-code block (7 lines) in backend/services/dashboard_service.py:390"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0fba373bf4e5ddb3", "name": "Commented-code block (5 lines) in backend/services/video_processing_service.py:225", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/video_processing_service.py:225"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-14ee8b32ba787b69", "name": "Network/subprocess call without timeout or try/except \u2014 backend/services/video_processing_service.py:439", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 backend/services/video_processing_service.py:439"}, "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-03ae0f114532795b", "name": "Commented-code block (8 lines) in backend/services/interest_tracks_service.py:1867", "shortDescription": {"text": "Commented-code block (8 lines) in backend/services/interest_tracks_service.py:1867"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ad00b59298338ef", "name": "Commented-code block (5 lines) in backend/services/base_service.py:287", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/base_service.py:287"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7846e2ef035ce159", "name": "Stub function `update_status` (body is just `pass`/`return`) \u2014 backend/services/base_service.py:337", "shortDescription": {"text": "Stub function `update_status` (body is just `pass`/`return`) \u2014 backend/services/base_service.py:337"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36012b1cf97bdbca", "name": "Legacy-named symbol `is_legacy` in backend/services/portfolio_service.py:1138", "shortDescription": {"text": "Legacy-named symbol `is_legacy` in backend/services/portfolio_service.py:1138"}, "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-a8e1cc7a62f637a7", "name": "Commented-code block (5 lines) in backend/services/lti_service.py:211", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/lti_service.py:211"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0a408e26681ed69c", "name": "Network/subprocess call without timeout or try/except \u2014 backend/services/lti_service.py:447", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 backend/services/lti_service.py:447"}, "fullDescription": {"text": "`requests.post(...)` 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-723430c9d413482e", "name": "Commented-code block (10 lines) in backend/services/base_ai_service.py:551", "shortDescription": {"text": "Commented-code block (10 lines) in backend/services/base_ai_service.py:551"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef45b670a5445c4c", "name": "Legacy-named symbol `task_ids_to_copy` in backend/services/course_enrollment_service.py:258", "shortDescription": {"text": "Legacy-named symbol `task_ids_to_copy` in backend/services/course_enrollment_service.py:258"}, "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-fff481fad90391b6", "name": "Commented-code block (5 lines) in backend/services/notification_service.py:19", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/notification_service.py:19"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e78e89c0247950e1", "name": "Legacy-named symbol `load_copy` in backend/services/email_copy_loader.py:20", "shortDescription": {"text": "Legacy-named symbol `load_copy` in backend/services/email_copy_loader.py:20"}, "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-7896955cd31bfe3f", "name": "Commented-code block (6 lines) in backend/services/xp_service.py:334", "shortDescription": {"text": "Commented-code block (6 lines) in backend/services/xp_service.py:334"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cdc3d1b990f846d5", "name": "Commented-code block (5 lines) in backend/services/task_library_service.py:347", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/task_library_service.py:347"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-37bdbbaf02c5e621", "name": "Commented-code block (5 lines) in backend/services/bounty_service.py:146", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/bounty_service.py:146"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61220822e2c2767c", "name": "Commented-code block (7 lines) in backend/services/learning_events_service.py:494", "shortDescription": {"text": "Commented-code block (7 lines) in backend/services/learning_events_service.py:494"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-97721a6db5af3f86", "name": "Legacy-named symbol `get_email_copy` in backend/services/email_service.py:218", "shortDescription": {"text": "Legacy-named symbol `get_email_copy` in backend/services/email_service.py:218"}, "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-c8691169aa26b127", "name": "Legacy-named symbol `speech_v1` in backend/services/transcription_service.py:29", "shortDescription": {"text": "Legacy-named symbol `speech_v1` in backend/services/transcription_service.py:29"}, "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-04ad83de8020b40c", "name": "Commented-code block (5 lines) in backend/repositories/quest_repository.py:485", "shortDescription": {"text": "Commented-code block (5 lines) in backend/repositories/quest_repository.py:485"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36c2c4215462fb87", "name": "Legacy-named symbol `nOld` in backend/migrations/personalized_quests_migration.py:71", "shortDescription": {"text": "Legacy-named symbol `nOld` in backend/migrations/personalized_quests_migration.py:71"}, "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-79ff44a7be2591de", "name": "Legacy-named symbol `days_old` in backend/jobs/scheduler.py:320", "shortDescription": {"text": "Legacy-named symbol `days_old` in backend/jobs/scheduler.py:320"}, "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-0f2d921ecc4b3313", "name": "111 env vars used in code but missing from .env.example", "shortDescription": {"text": "111 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AI_REQUEST_TIMEOUT`, `API_TIMEOUT`, `APP_VERSION`, `BACKEND_URL`, `BASE_URL`, `CACHE_DEFAULT_TIMEOUT`, `CACHE_TYPE`, `CANVAS_LTI_PRIVATE_KEY_PEM` + 103 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/middleware/idempotency.py:get_redis_client, backend/middleware/idempotency.py:get\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-380b7cb95b387b9c", "name": "Near-duplicate function bodies in 11 places", "shortDescription": {"text": "Near-duplicate function bodies in 11 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/utils/auth/decorators.py:decorated_function, backend/utils/auth/decorators.py:decorated_function, backend/utils/auth/decorators.py:decorated_function, backend/utils/auth/decorators.py:decorated_function\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:\nbackend/routes/showcase.py:ai_captions, backend/routes/showcase.py:ai_alt_text, backend/routes/showcase.py:ai_quote_pull\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-ec95304c94c48f43", "name": "Frontend route `for-students` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `for-students` has no Link/navigate to it \u2014 frontend/src/App.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-f0afa32af4fba308", "name": "Frontend route `for-families` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `for-families` has no Link/navigate to it \u2014 frontend/src/App.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-af5514d5ad9e00f5", "name": "Frontend route `for-schools` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `for-schools` has no Link/navigate to it \u2014 frontend/src/App.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-f85fcee616bb4d17", "name": "Frontend route `how-it-works` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `how-it-works` has no Link/navigate to it \u2014 frontend/src/App.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-7d532d8bf70f9af2", "name": "Frontend route `academy` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `academy` has no Link/navigate to it \u2014 frontend/src/App.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-f42c8dad6e453e1e", "name": "Frontend route `poe` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `poe` has no Link/navigate to it \u2014 frontend/src/App.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-440112a750e540fa", "name": "Frontend route `lti-launch` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `lti-launch` has no Link/navigate to it \u2014 frontend/src/App.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-f4d515e44b5eba8c", "name": "Frontend route `lti-deep-link` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `lti-deep-link` has no Link/navigate to it \u2014 frontend/src/App.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-958c55a3f6dd85a9", "name": "Frontend route `lti-quest/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `lti-quest/:id` has no Link/navigate to it \u2014 frontend/src/App.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-d2cef4d78dc8d3da", "name": "Frontend route `lti-evidence` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `lti-evidence` has no Link/navigate to it \u2014 frontend/src/App.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-fefb0f31ec81e6aa", "name": "Frontend route `lti-error` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `lti-error` has no Link/navigate to it \u2014 frontend/src/App.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-6c11f718caf19ee1", "name": "Frontend route `demo` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `demo` has no Link/navigate to it \u2014 frontend/src/App.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-ce76e2ea005be3b3", "name": "Frontend route `login` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `login` has no Link/navigate to it \u2014 frontend/src/App.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-000ae1b4385638cf", "name": "Frontend route `login/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `login/:slug` has no Link/navigate to it \u2014 frontend/src/App.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-bdcf15ab7e263148", "name": "Frontend route `register` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `register` has no Link/navigate to it \u2014 frontend/src/App.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-82d678f812272510", "name": "Frontend route `join/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `join/:slug` has no Link/navigate to it \u2014 frontend/src/App.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-ff618c2ebd152ead", "name": "Frontend route `forgot-password` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `forgot-password` has no Link/navigate to it \u2014 frontend/src/App.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-396d166db5d3c612", "name": "Frontend route `reset-password` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `reset-password` has no Link/navigate to it \u2014 frontend/src/App.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-08911e4af00d9562", "name": "Frontend route `auth/callback` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `auth/callback` has no Link/navigate to it \u2014 frontend/src/App.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-b0b0053c1871184d", "name": "Frontend route `email-verification` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `email-verification` has no Link/navigate to it \u2014 frontend/src/App.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-689a5a04c00025ed", "name": "Frontend route `terms` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `terms` has no Link/navigate to it \u2014 frontend/src/App.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-1000a7c5a271d7d6", "name": "Frontend route `privacy` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `privacy` has no Link/navigate to it \u2014 frontend/src/App.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-640a594205799bab", "name": "Frontend route `support` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `support` has no Link/navigate to it \u2014 frontend/src/App.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-40ac1a0516ec4902", "name": "Frontend route `academy-agreement` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `academy-agreement` has no Link/navigate to it \u2014 frontend/src/App.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-7ebe6858f7b57f06", "name": "Frontend route `academy-handbook` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `academy-handbook` has no Link/navigate to it \u2014 frontend/src/App.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-5f91a47e3b222b6f", "name": "Frontend route `parental-consent` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `parental-consent` has no Link/navigate to it \u2014 frontend/src/App.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-2e871598f476fac8", "name": "Frontend route `catalog` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `catalog` has no Link/navigate to it \u2014 frontend/src/App.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-aa1e699227a6007b", "name": "Frontend route `course/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `course/:slug` has no Link/navigate to it \u2014 frontend/src/App.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-3b944f7883ec806d", "name": "Frontend route `class/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `class/:slug` has no Link/navigate to it \u2014 frontend/src/App.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-70afaceecf10f60e", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 frontend/src/App.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-c6168643d72143ee", "name": "Frontend route `quests` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `quests` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-8f7f47d9549f3646", "name": "Frontend route `quests/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `quests/:id` has no Link/navigate to it \u2014 frontend/src/App.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-d4d06c036eaa41dc", "name": "Frontend route `quests/:id/curriculum` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `quests/:id/curriculum` has no Link/navigate to it \u2014 frontend/src/App.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-d627823b44e9d08c", "name": "Frontend route `quests/:questId/library` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `quests/:questId/library` has no Link/navigate to it \u2014 frontend/src/App.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-f45fd93154add838", "name": "Frontend route `constellation` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `constellation` has no Link/navigate to it \u2014 frontend/src/App.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-b837931c4e5134a6", "name": "Frontend route `courses` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `courses` has no Link/navigate to it \u2014 frontend/src/App.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-7f6d386d3df63c51", "name": "Frontend route `courses/:courseId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `courses/:courseId` has no Link/navigate to it \u2014 frontend/src/App.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-acaca80911d71a40", "name": "Frontend route `courses/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `courses/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.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-58c91b48aa020a1a", "name": "Frontend route `courses/new` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `courses/new` has no Link/navigate to it \u2014 frontend/src/App.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-0ba6a17688868dae", "name": "Frontend route `my-classes` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `my-classes` has no Link/navigate to it \u2014 frontend/src/App.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-6a402f2c6bbef4bd", "name": "Frontend route `classes/new` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `classes/new` has no Link/navigate to it \u2014 frontend/src/App.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-a396d076069bfdbc", "name": "Frontend route `classes/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `classes/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.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-515ca6210695a1a9", "name": "Frontend route `credits` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `credits` has no Link/navigate to it \u2014 frontend/src/App.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-51e6d362f20cd155", "name": "Frontend route `transcript` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `transcript` has no Link/navigate to it \u2014 frontend/src/App.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-c419c33befa5df1d", "name": "Frontend route `overview` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `overview` has no Link/navigate to it \u2014 frontend/src/App.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-0650c16c2cf18347", "name": "Frontend route `profile` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 frontend/src/App.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-4f839994bbc0d755", "name": "Frontend route `friends` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `friends` has no Link/navigate to it \u2014 frontend/src/App.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-6139869fc0e8bad0", "name": "Frontend route `connections` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `connections` has no Link/navigate to it \u2014 frontend/src/App.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-d45da13a67b909f7", "name": "Frontend route `messages` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `messages` has no Link/navigate to it \u2014 frontend/src/App.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-037a0602049c74b8", "name": "Frontend route `communication` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `communication` has no Link/navigate to it \u2014 frontend/src/App.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-cdcf36154d03c487", "name": "Frontend route `learning-journal` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `learning-journal` has no Link/navigate to it \u2014 frontend/src/App.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-e6422814e88974f7", "name": "Frontend route `invitations` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `invitations` has no Link/navigate to it \u2014 frontend/src/App.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-71e373a3e1c087f3", "name": "Frontend route `notifications` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `notifications` has no Link/navigate to it \u2014 frontend/src/App.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-3a3b81fd252c966e", "name": "Frontend route `feedback` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `feedback` has no Link/navigate to it \u2014 frontend/src/App.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-0736a64cb1f13eb9", "name": "Frontend route `observer/feed` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `observer/feed` has no Link/navigate to it \u2014 frontend/src/App.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-fe93e2cd8a7344ef", "name": "Frontend route `observer/welcome` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `observer/welcome` has no Link/navigate to it \u2014 frontend/src/App.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-a117b92c02a92d54", "name": "Frontend route `observer/student/:studentId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `observer/student/:studentId` has no Link/navigate to it \u2014 frontend/src/App.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-cbdadf30d498774d", "name": "Frontend route `evidence-reports` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `evidence-reports` has no Link/navigate to it \u2014 frontend/src/App.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-63d4dc626532ad32", "name": "Frontend route `evidence-reports/new` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `evidence-reports/new` has no Link/navigate to it \u2014 frontend/src/App.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-cfa365fca68c61ed", "name": "Frontend route `evidence-reports/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `evidence-reports/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.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-39a64b0601434aee", "name": "Frontend route `bounties` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `bounties` has no Link/navigate to it \u2014 frontend/src/App.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-ffcbdd66fe18cc31", "name": "Frontend route `bounties/create` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `bounties/create` has no Link/navigate to it \u2014 frontend/src/App.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-6640263d1f37ade1", "name": "Frontend route `bounties/:bountyId/edit` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `bounties/:bountyId/edit` has no Link/navigate to it \u2014 frontend/src/App.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-d00a9e98b7d80030", "name": "Frontend route `bounties/:bountyId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `bounties/:bountyId` has no Link/navigate to it \u2014 frontend/src/App.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-5d81190afb63b319", "name": "Frontend route `buddy` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `buddy` has no Link/navigate to it \u2014 frontend/src/App.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-54e4823cdaee7864", "name": "Frontend route `opened-academy` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `opened-academy` has no Link/navigate to it \u2014 frontend/src/App.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-c6dc06e12a2155ac", "name": "Frontend route `opened-academy/student/:studentId/pathway` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `opened-academy/student/:studentId/pathway` has no Link/navigate to it \u2014 frontend/src/App.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-b78b2e6236aa3e67", "name": "Frontend route `opened-academy/student/:studentId/credits` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `opened-academy/student/:studentId/credits` has no Link/navigate to it \u2014 frontend/src/App.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-418c55c930ce75ec", "name": "Frontend route `treehouse` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `treehouse` has no Link/navigate to it \u2014 frontend/src/App.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-d323326fbf011281", "name": "Frontend route `treehouse/browse` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `treehouse/browse` has no Link/navigate to it \u2014 frontend/src/App.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-d7766831315924ea", "name": "Frontend route `treehouse/showcase` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `treehouse/showcase` has no Link/navigate to it \u2014 frontend/src/App.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-4af9701e7b171812", "name": "Frontend route `treehouse/facilitator` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `treehouse/facilitator` has no Link/navigate to it \u2014 frontend/src/App.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-07bbd48508ed2049", "name": "Frontend route `gryffin` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `gryffin` has no Link/navigate to it \u2014 frontend/src/App.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-3b3b6a42ed27bc9d", "name": "Frontend route `gryffin/:classId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `gryffin/:classId` has no Link/navigate to it \u2014 frontend/src/App.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-f201b815c7d6f9fa", "name": "Frontend route `admin/*` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `admin/*` has no Link/navigate to it \u2014 frontend/src/App.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-6f7eaf9abf563776", "name": "Frontend route `course-plan` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `course-plan` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-822eae0c5aebad0e", "name": "Frontend route `course-plan/:sessionId` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `course-plan/:sessionId` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-53873e4b0f606e48", "name": "Frontend route `showcase` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `showcase` has no Link/navigate to it \u2014 frontend/src/App.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-61aa80739a280968", "name": "Frontend route `organization` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `organization` has no Link/navigate to it \u2014 frontend/src/App.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-d25b744ee8ad13ba", "name": "Frontend route `admin/organizations/:orgId/student/:studentId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `admin/organizations/:orgId/student/:studentId` has no Link/navigate to it \u2014 frontend/src/App.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-ef0c9b7fe3d8e7fc", "name": "Frontend route `org-classes` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `org-classes` has no Link/navigate to it \u2014 frontend/src/App.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-66a5be0163efbe70", "name": "Frontend route `org-classes/:classId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `org-classes/:classId` has no Link/navigate to it \u2014 frontend/src/App.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-541bad7b83657e70", "name": "Frontend route `advisor` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `advisor` has no Link/navigate to it \u2014 frontend/src/App.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-65e885e2382a77be", "name": "Frontend route `advisor/dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `advisor/dashboard` has no Link/navigate to it \u2014 frontend/src/App.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-e33b71f98782fdc3", "name": "Frontend route `advisor/checkin/:studentId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `advisor/checkin/:studentId` has no Link/navigate to it \u2014 frontend/src/App.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-a27879adcf9128f0", "name": "Frontend route `advisor/verification` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `advisor/verification` has no Link/navigate to it \u2014 frontend/src/App.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-91ae8dc67fe275dc", "name": "Frontend route `advisor/invitations` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `advisor/invitations` has no Link/navigate to it \u2014 frontend/src/App.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-943689d07fd49ac0", "name": "Frontend route `quests/:questId/curriculum/edit` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `quests/:questId/curriculum/edit` has no Link/navigate to it \u2014 frontend/src/App.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-973c5b8b9eeee69c", "name": "Frontend route `credit-dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `credit-dashboard` has no Link/navigate to it \u2014 frontend/src/App.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-9575bb8b9ef66260", "name": "Frontend route `parent/dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `parent/dashboard` has no Link/navigate to it \u2014 frontend/src/App.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-35b089c29898d797", "name": "Frontend route `parent/dashboard/:studentId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `parent/dashboard/:studentId` has no Link/navigate to it \u2014 frontend/src/App.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-a1bac4b384d555d1", "name": "Frontend route `parent/quest/:studentId/:questId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `parent/quest/:studentId/:questId` has no Link/navigate to it \u2014 frontend/src/App.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-a8b6c28fe162e5b9", "name": "Frontend route `parent/child/:childId/journal` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `parent/child/:childId/journal` has no Link/navigate to it \u2014 frontend/src/App.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-46e3213a887f1393", "name": "Frontend route `parent/students/:studentId/report` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `parent/students/:studentId/report` has no Link/navigate to it \u2014 frontend/src/App.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-23e93c1581645325", "name": "Frontend route `docs/:categorySlug` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `docs/:categorySlug` has no Link/navigate to it \u2014 frontend/src/App.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-c24d3108a0a321a6", "name": "Frontend route `docs/:categorySlug/:articleSlug` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `docs/:categorySlug/:articleSlug` has no Link/navigate to it \u2014 frontend/src/App.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-982857b4b8969048", "name": "Frontend route `diploma` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `diploma` has no Link/navigate to it \u2014 frontend/src/App.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-37f590443a23d667", "name": "Frontend route `portfolio/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `portfolio/:slug` has no Link/navigate to it \u2014 frontend/src/App.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-e1c3c1e73cb27e54", "name": "Frontend route `public/diploma/:userId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `public/diploma/:userId` has no Link/navigate to it \u2014 frontend/src/App.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-dc1dad5e759cc9a6", "name": "Frontend route `public/transcript/:userId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `public/transcript/:userId` has no Link/navigate to it \u2014 frontend/src/App.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-cf8334a3acf1154d", "name": "Frontend route `treehouse-kiosk` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `treehouse-kiosk` has no Link/navigate to it \u2014 frontend/src/App.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-e2ad532e02a43730", "name": "Frontend route `report/:token` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `report/:token` has no Link/navigate to it \u2014 frontend/src/App.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-89363dff4b8de607", "name": "Frontend route `shared/feed/:token` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `shared/feed/:token` has no Link/navigate to it \u2014 frontend/src/App.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-8134549b0fed0e6c", "name": "Frontend route `invitation/:code` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `invitation/:code` has no Link/navigate to it \u2014 frontend/src/App.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-d4e813ae5d648a95", "name": "Frontend route `observer/accept/:invitationCode` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `observer/accept/:invitationCode` has no Link/navigate to it \u2014 frontend/src/App.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-38ec5a91aeff9404", "name": "Frontend route `mobile` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `mobile` has no Link/navigate to it \u2014 frontend/src/App.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-bf8aa77fe5039b6b", "name": "Frontend route `/protected` has no Link/navigate to it \u2014 frontend/src/components/PrivateRoute.test.jsx", "shortDescription": {"text": "Frontend route `/protected` has no Link/navigate to it \u2014 frontend/src/components/PrivateRoute.test.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-115317e5b8699bfc", "name": "Frontend route `/quests/:id` has no Link/navigate to it \u2014 frontend/src/pages/QuestDetail.test.jsx", "shortDescription": {"text": "Frontend route `/quests/:id` has no Link/navigate to it \u2014 frontend/src/pages/QuestDetail.test.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-45b5107ea1e203e9", "name": "Frontend route `flagged-tasks` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `flagged-tasks` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-21ac8f8ffe827302", "name": "Frontend route `user/:userId/transfer-credits` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `user/:userId/transfer-credits` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-1707d1d74085d30c", "name": "Frontend route `user/:userId/transcript` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `user/:userId/transcript` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-00b7e3e9e36558ad", "name": "Frontend route `organizations/:orgId` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `organizations/:orgId` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-896909cdaa7d81f1", "name": "Frontend route `generate-course` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `generate-course` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-6704e8d0ee7a0212", "name": "Frontend route `generate-course/:courseId` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `generate-course/:courseId` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-a1cb6db859a34b53", "name": "Frontend route `course-generation-queue` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `course-generation-queue` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-d144692e4ab8afc5", "name": "Frontend route `classes/*` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx", "shortDescription": {"text": "Frontend route `classes/*` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.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-a21d6a7dda433645", "name": "Frontend route `/admin/*` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.test.jsx", "shortDescription": {"text": "Frontend route `/admin/*` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.test.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-fe277d67cec46969", "name": "Frontend route `/admin/organizations/:orgId` has no Link/navigate to it \u2014 frontend/src/pages/admin/OrganizationManagemen", "shortDescription": {"text": "Frontend route `/admin/organizations/:orgId` has no Link/navigate to it \u2014 frontend/src/pages/admin/OrganizationManagement.test.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-ccc09eb0d5f7b2ef", "name": "Frontend route `/admin/organizations/` has no Link/navigate to it \u2014 frontend/src/pages/admin/OrganizationManagement.test", "shortDescription": {"text": "Frontend route `/admin/organizations/` has no Link/navigate to it \u2014 frontend/src/pages/admin/OrganizationManagement.test.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-41af5d63c59849b9", "name": "Frontend route `/courses/:courseId` has no Link/navigate to it \u2014 frontend/src/pages/courses/CourseHomepage.test.jsx", "shortDescription": {"text": "Frontend route `/courses/:courseId` has no Link/navigate to it \u2014 frontend/src/pages/courses/CourseHomepage.test.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-914f1f00606620fc", "name": "Frontend route `/curriculum/:questId/build` has no Link/navigate to it \u2014 frontend/src/pages/curriculum/CurriculumBuilder", "shortDescription": {"text": "Frontend route `/curriculum/:questId/build` has no Link/navigate to it \u2014 frontend/src/pages/curriculum/CurriculumBuilder.test.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-49b6fda1503d17e6", "name": "Flask mutation route `mark_as_read` without `@login_required` \u2014 backend/routes/notifications.py:92", "shortDescription": {"text": "Flask mutation route `mark_as_read` without `@login_required` \u2014 backend/routes/notifications.py:92"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5ca421b5f9a3300b", "name": "Flask mutation route `mark_all_as_read` without `@login_required` \u2014 backend/routes/notifications.py:119", "shortDescription": {"text": "Flask mutation route `mark_all_as_read` without `@login_required` \u2014 backend/routes/notifications.py:119"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7b101937399049ed", "name": "Flask mutation route `delete_notification` without `@login_required` \u2014 backend/routes/notifications.py:145", "shortDescription": {"text": "Flask mutation route `delete_notification` without `@login_required` \u2014 backend/routes/notifications.py:145"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0fd3bd975ca9360a", "name": "Flask mutation route `delete_all_notifications` without `@login_required` \u2014 backend/routes/notifications.py:172", "shortDescription": {"text": "Flask mutation route `delete_all_notifications` without `@login_required` \u2014 backend/routes/notifications.py:172"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6cddbf71ba9bdf7d", "name": "Flask mutation route `send_notification` without `@login_required` \u2014 backend/routes/notifications.py:198", "shortDescription": {"text": "Flask mutation route `send_notification` without `@login_required` \u2014 backend/routes/notifications.py:198"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-64a55f9eb5022ece", "name": "Flask mutation route `update_preferences` without `@login_required` \u2014 backend/routes/notifications.py:299", "shortDescription": {"text": "Flask mutation route `update_preferences` without `@login_required` \u2014 backend/routes/notifications.py:299"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0b6d62e7825f2008", "name": "Flask mutation route `broadcast_notification` without `@login_required` \u2014 backend/routes/notifications.py:331", "shortDescription": {"text": "Flask mutation route `broadcast_notification` without `@login_required` \u2014 backend/routes/notifications.py:331"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-56d86041e6cff508", "name": "Flask mutation route `request_account_deletion` without `@login_required` \u2014 backend/routes/account_deletion.py:36", "shortDescription": {"text": "Flask mutation route `request_account_deletion` without `@login_required` \u2014 backend/routes/account_deletion.py:36"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-360ebbe761670f40", "name": "Flask mutation route `cancel_account_deletion` without `@login_required` \u2014 backend/routes/account_deletion.py:116", "shortDescription": {"text": "Flask mutation route `cancel_account_deletion` without `@login_required` \u2014 backend/routes/account_deletion.py:116"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-884288561178d57d", "name": "Flask mutation route `delete_user_account_permanent` without `@login_required` \u2014 backend/routes/account_deletion.py:422", "shortDescription": {"text": "Flask mutation route `delete_user_account_permanent` without `@login_required` \u2014 backend/routes/account_deletion.py:422"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a1c2c738470ad585", "name": "Flask mutation route `create_signal` without `@login_required` \u2014 backend/routes/treehouse.py:200", "shortDescription": {"text": "Flask mutation route `create_signal` without `@login_required` \u2014 backend/routes/treehouse.py:200"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec13a0b787c3a559", "name": "Flask mutation route `resolve_signal` without `@login_required` \u2014 backend/routes/treehouse.py:267", "shortDescription": {"text": "Flask mutation route `resolve_signal` without `@login_required` \u2014 backend/routes/treehouse.py:267"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a3b7b5f88e93fabf", "name": "Flask mutation route `mark_pins` without `@login_required` \u2014 backend/routes/treehouse.py:349", "shortDescription": {"text": "Flask mutation route `mark_pins` without `@login_required` \u2014 backend/routes/treehouse.py:349"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f2f709f8fffd9299", "name": "Flask mutation route `adjust_balance` without `@login_required` \u2014 backend/routes/treehouse.py:387", "shortDescription": {"text": "Flask mutation route `adjust_balance` without `@login_required` \u2014 backend/routes/treehouse.py:387"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-777516f464d24356", "name": "Flask mutation route `create_showcase` without `@login_required` \u2014 backend/routes/treehouse.py:430", "shortDescription": {"text": "Flask mutation route `create_showcase` without `@login_required` \u2014 backend/routes/treehouse.py:430"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a09dfa335e4179b2", "name": "Flask mutation route `update_showcase` without `@login_required` \u2014 backend/routes/treehouse.py:454", "shortDescription": {"text": "Flask mutation route `update_showcase` without `@login_required` \u2014 backend/routes/treehouse.py:454"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a99a3ede6a69878c", "name": "Flask mutation route `join_showcase` without `@login_required` \u2014 backend/routes/treehouse.py:496", "shortDescription": {"text": "Flask mutation route `join_showcase` without `@login_required` \u2014 backend/routes/treehouse.py:496"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c7211cc12137b841", "name": "Flask mutation route `create_kiosk_device` without `@login_required` \u2014 backend/routes/treehouse.py:543", "shortDescription": {"text": "Flask mutation route `create_kiosk_device` without `@login_required` \u2014 backend/routes/treehouse.py:543"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1b85490cd55560b0", "name": "Flask mutation route `kiosk_roster` without `@login_required` \u2014 backend/routes/treehouse.py:564", "shortDescription": {"text": "Flask mutation route `kiosk_roster` without `@login_required` \u2014 backend/routes/treehouse.py:564"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7f77f664d3b190b8", "name": "Flask mutation route `kiosk_login` without `@login_required` \u2014 backend/routes/treehouse.py:594", "shortDescription": {"text": "Flask mutation route `kiosk_login` without `@login_required` \u2014 backend/routes/treehouse.py:594"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c4420986572cd9a5", "name": "Flask mutation route `enhance_content` without `@login_required` \u2014 backend/routes/curriculum_enhance.py:20", "shortDescription": {"text": "Flask mutation route `enhance_content` without `@login_required` \u2014 backend/routes/curriculum_enhance.py:20"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1cceb3f39e1424da", "name": "Flask mutation route `start_personalization` without `@login_required` \u2014 backend/routes/quest_personalization.py:71", "shortDescription": {"text": "Flask mutation route `start_personalization` without `@login_required` \u2014 backend/routes/quest_personalization.py:71"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ac7040c7b2a04cf8", "name": "Flask mutation route `generate_tasks` without `@login_required` \u2014 backend/routes/quest_personalization.py:120", "shortDescription": {"text": "Flask mutation route `generate_tasks` without `@login_required` \u2014 backend/routes/quest_personalization.py:120"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-25a2949ef37f1656", "name": "Flask mutation route `refine_tasks` without `@login_required` \u2014 backend/routes/quest_personalization.py:248", "shortDescription": {"text": "Flask mutation route `refine_tasks` without `@login_required` \u2014 backend/routes/quest_personalization.py:248"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bf48cd878d496db8", "name": "Flask mutation route `edit_task` without `@login_required` \u2014 backend/routes/quest_personalization.py:294", "shortDescription": {"text": "Flask mutation route `edit_task` without `@login_required` \u2014 backend/routes/quest_personalization.py:294"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c5bd94a65a99bce2", "name": "Flask mutation route `analyze_manual_task` without `@login_required` \u2014 backend/routes/quest_personalization.py:338", "shortDescription": {"text": "Flask mutation route `analyze_manual_task` without `@login_required` \u2014 backend/routes/quest_personalization.py:338"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-51c76b3dc10832ee", "name": "Flask mutation route `add_manual_tasks_batch` without `@login_required` \u2014 backend/routes/quest_personalization.py:389", "shortDescription": {"text": "Flask mutation route `add_manual_tasks_batch` without `@login_required` \u2014 backend/routes/quest_personalization.py:389"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cd539815365c266a", "name": "Flask mutation route `finalize_tasks` without `@login_required` \u2014 backend/routes/quest_personalization.py:508", "shortDescription": {"text": "Flask mutation route `finalize_tasks` without `@login_required` \u2014 backend/routes/quest_personalization.py:508"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da38c381a5134c14", "name": "Flask mutation route `accept_task_immediate` without `@login_required` \u2014 backend/routes/quest_personalization.py:561", "shortDescription": {"text": "Flask mutation route `accept_task_immediate` without `@login_required` \u2014 backend/routes/quest_personalization.py:561"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9c0feec94a472613", "name": "Flask mutation route `skip_task_save_to_library` without `@login_required` \u2014 backend/routes/quest_personalization.py:689", "shortDescription": {"text": "Flask mutation route `skip_task_save_to_library` without `@login_required` \u2014 backend/routes/quest_personalization.py:689"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5ee2d9890d0854a1", "name": "Flask mutation route `search_quest_image_route` without `@login_required` \u2014 backend/routes/images.py:20", "shortDescription": {"text": "Flask mutation route `search_quest_image_route` without `@login_required` \u2014 backend/routes/images.py:20"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-37510be6bbb3d81f", "name": "Flask mutation route `generate_quest_from_topic` without `@login_required` \u2014 backend/routes/quest_ai.py:36", "shortDescription": {"text": "Flask mutation route `generate_quest_from_topic` without `@login_required` \u2014 backend/routes/quest_ai.py:36"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9e12bf4146651ab8", "name": "Flask mutation route `enhance_quest_description` without `@login_required` \u2014 backend/routes/quest_ai.py:130", "shortDescription": {"text": "Flask mutation route `enhance_quest_description` without `@login_required` \u2014 backend/routes/quest_ai.py:130"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4de07540cb82c64d", "name": "Flask mutation route `suggest_tasks_for_quest` without `@login_required` \u2014 backend/routes/quest_ai.py:187", "shortDescription": {"text": "Flask mutation route `suggest_tasks_for_quest` without `@login_required` \u2014 backend/routes/quest_ai.py:187"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8ab9a88c0074ed8c", "name": "Flask mutation route `validate_quest_quality` without `@login_required` \u2014 backend/routes/quest_ai.py:247", "shortDescription": {"text": "Flask mutation route `validate_quest_quality` without `@login_required` \u2014 backend/routes/quest_ai.py:247"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f95fb69e3f4a8be2", "name": "Flask mutation route `enhance_student_quest_idea` without `@login_required` \u2014 backend/routes/quest_ai.py:296", "shortDescription": {"text": "Flask mutation route `enhance_student_quest_idea` without `@login_required` \u2014 backend/routes/quest_ai.py:296"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-68e00634f0109467", "name": "Flask mutation route `accept_approach` without `@login_required` \u2014 backend/routes/quest_ai.py:471", "shortDescription": {"text": "Flask mutation route `accept_approach` without `@login_required` \u2014 backend/routes/quest_ai.py:471"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bdec2fe6ee08c59a", "name": "Flask mutation route `create_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:39", "shortDescription": {"text": "Flask mutation route `create_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:39"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1a106b96ef15a75e", "name": "Flask mutation route `update_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:177", "shortDescription": {"text": "Flask mutation route `update_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:177"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d56ae115dda9986", "name": "Flask mutation route `delete_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:227", "shortDescription": {"text": "Flask mutation route `delete_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:227"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-30dc6672618618a5", "name": "Flask mutation route `approve_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:315", "shortDescription": {"text": "Flask mutation route `approve_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:315"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-400f456969d109e6", "name": "Flask mutation route `deny_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:347", "shortDescription": {"text": "Flask mutation route `deny_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:347"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d646a0b8ebc24fd7", "name": "Flask mutation route `update_settings` without `@login_required` \u2014 backend/routes/platform_settings.py:49", "shortDescription": {"text": "Flask mutation route `update_settings` without `@login_required` \u2014 backend/routes/platform_settings.py:49"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6e560558e6eee6b5", "name": "Flask mutation route `save_evidence_document` without `@login_required` \u2014 backend/routes/evidence_documents.py:119", "shortDescription": {"text": "Flask mutation route `save_evidence_document` without `@login_required` \u2014 backend/routes/evidence_documents.py:119"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bba5869e73e5bc3c", "name": "Flask mutation route `upload_task_file` without `@login_required` \u2014 backend/routes/evidence_documents.py:364", "shortDescription": {"text": "Flask mutation route `upload_task_file` without `@login_required` \u2014 backend/routes/evidence_documents.py:364"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c437d00ccaf26722", "name": "Flask mutation route `init_task_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:425", "shortDescription": {"text": "Flask mutation route `init_task_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:425"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-85bb7525dba6225c", "name": "Flask mutation route `finalize_task_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:479", "shortDescription": {"text": "Flask mutation route `finalize_task_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:479"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-67c1d6caeb460119", "name": "Flask mutation route `init_block_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:545", "shortDescription": {"text": "Flask mutation route `init_block_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:545"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2c23acba0dd341f8", "name": "Flask mutation route `finalize_block_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:609", "shortDescription": {"text": "Flask mutation route `finalize_block_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:609"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cb0ef48f37181b3f", "name": "Flask mutation route `upload_block_file` without `@login_required` \u2014 backend/routes/evidence_documents.py:715", "shortDescription": {"text": "Flask mutation route `upload_block_file` without `@login_required` \u2014 backend/routes/evidence_documents.py:715"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-41775af54992f156", "name": "Flask mutation route `delete_block_file` without `@login_required` \u2014 backend/routes/evidence_documents.py:1279", "shortDescription": {"text": "Flask mutation route `delete_block_file` without `@login_required` \u2014 backend/routes/evidence_documents.py:1279"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ed882bf91629644a", "name": "Flask mutation route `delete_storage_urls` without `@login_required` \u2014 backend/routes/evidence_documents.py:1345", "shortDescription": {"text": "Flask mutation route `delete_storage_urls` without `@login_required` \u2014 backend/routes/evidence_documents.py:1345"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bb223f0ada31377d", "name": "Flask mutation route `delete_evidence_block` without `@login_required` \u2014 backend/routes/evidence_documents.py:1384", "shortDescription": {"text": "Flask mutation route `delete_evidence_block` without `@login_required` \u2014 backend/routes/evidence_documents.py:1384"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-343fbb20466659ef", "name": "Flask mutation route `complete_task_with_evidence` without `@login_required` \u2014 backend/routes/evidence_documents.py:1457", "shortDescription": {"text": "Flask mutation route `complete_task_with_evidence` without `@login_required` \u2014 backend/routes/evidence_documents.py:1457"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-60b5736ad77d5ea3", "name": "Flask mutation route `select_pathway` without `@login_required` \u2014 backend/routes/oea.py:189", "shortDescription": {"text": "Flask mutation route `select_pathway` without `@login_required` \u2014 backend/routes/oea.py:189"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1fdec0c1982090d8", "name": "Flask mutation route `add_student_credit` without `@login_required` \u2014 backend/routes/oea.py:283", "shortDescription": {"text": "Flask mutation route `add_student_credit` without `@login_required` \u2014 backend/routes/oea.py:283"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0cc3ebf1db3b85f2", "name": "Flask mutation route `update_student_credit` without `@login_required` \u2014 backend/routes/oea.py:351", "shortDescription": {"text": "Flask mutation route `update_student_credit` without `@login_required` \u2014 backend/routes/oea.py:351"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7bc1b1e9fbf14077", "name": "Flask mutation route `delete_student_credit` without `@login_required` \u2014 backend/routes/oea.py:427", "shortDescription": {"text": "Flask mutation route `delete_student_credit` without `@login_required` \u2014 backend/routes/oea.py:427"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-57a4bd97db18b626", "name": "Flask mutation route `ensure_credit_quest` without `@login_required` \u2014 backend/routes/oea.py:453", "shortDescription": {"text": "Flask mutation route `ensure_credit_quest` without `@login_required` \u2014 backend/routes/oea.py:453"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9f25705a0c5d56d9", "name": "Flask mutation route `add_credit_evidence` without `@login_required` \u2014 backend/routes/oea.py:516", "shortDescription": {"text": "Flask mutation route `add_credit_evidence` without `@login_required` \u2014 backend/routes/oea.py:516"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1377a078d8337d3e", "name": "Flask mutation route `delete_credit_evidence` without `@login_required` \u2014 backend/routes/oea.py:572", "shortDescription": {"text": "Flask mutation route `delete_credit_evidence` without `@login_required` \u2014 backend/routes/oea.py:572"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-67e356f6dd033a56", "name": "Flask mutation route `update_user_profile` without `@login_required` \u2014 backend/routes/admin_core.py:172", "shortDescription": {"text": "Flask mutation route `update_user_profile` without `@login_required` \u2014 backend/routes/admin_core.py:172"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d285011847f02053", "name": "Flask mutation route `update_user_role` without `@login_required` \u2014 backend/routes/admin_core.py:233", "shortDescription": {"text": "Flask mutation route `update_user_role` without `@login_required` \u2014 backend/routes/admin_core.py:233"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1aa8d042ba88582b", "name": "Flask mutation route `reset_user_password` without `@login_required` \u2014 backend/routes/admin_core.py:276", "shortDescription": {"text": "Flask mutation route `reset_user_password` without `@login_required` \u2014 backend/routes/admin_core.py:276"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b3da881da9127603", "name": "Flask mutation route `toggle_user_status` without `@login_required` \u2014 backend/routes/admin_core.py:344", "shortDescription": {"text": "Flask mutation route `toggle_user_status` without `@login_required` \u2014 backend/routes/admin_core.py:344"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1990506d1acb33e6", "name": "Flask mutation route `delete_user_account` without `@login_required` \u2014 backend/routes/admin_core.py:381", "shortDescription": {"text": "Flask mutation route `delete_user_account` without `@login_required` \u2014 backend/routes/admin_core.py:381"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8dbc44f708c13d61", "name": "Flask mutation route `send_bulk_email` without `@login_required` \u2014 backend/routes/admin_core.py:418", "shortDescription": {"text": "Flask mutation route `send_bulk_email` without `@login_required` \u2014 backend/routes/admin_core.py:418"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b5dabf2648ea93bd", "name": "Flask mutation route `generate_tasks` without `@login_required` \u2014 backend/routes/demo.py:191", "shortDescription": {"text": "Flask mutation route `generate_tasks` without `@login_required` \u2014 backend/routes/demo.py:191"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e2437c082d7cb06c", "name": "Flask mutation route `verify_task_completion` without `@login_required` \u2014 backend/routes/teacher_verification.py:171", "shortDescription": {"text": "Flask mutation route `verify_task_completion` without `@login_required` \u2014 backend/routes/teacher_verification.py:171"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1983c08b700bdd7a", "name": "Flask mutation route `send_message` without `@login_required` \u2014 backend/routes/direct_messages.py:170", "shortDescription": {"text": "Flask mutation route `send_message` without `@login_required` \u2014 backend/routes/direct_messages.py:170"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d322292c3aba8317", "name": "Flask mutation route `mark_message_as_read` without `@login_required` \u2014 backend/routes/direct_messages.py:216", "shortDescription": {"text": "Flask mutation route `mark_message_as_read` without `@login_required` \u2014 backend/routes/direct_messages.py:216"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f161fedd0dcb005f", "name": "Flask mutation route `post_credit_message` without `@login_required` \u2014 backend/routes/credit_messages.py:103", "shortDescription": {"text": "Flask mutation route `post_credit_message` without `@login_required` \u2014 backend/routes/credit_messages.py:103"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-84608689bfef22d7", "name": "Flask mutation route `upload_evidence_for_student` without `@login_required` \u2014 backend/routes/helper_evidence.py:113", "shortDescription": {"text": "Flask mutation route `upload_evidence_for_student` without `@login_required` \u2014 backend/routes/helper_evidence.py:113"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eedfde11de38c653", "name": "Flask mutation route `upload_evidence_batch` without `@login_required` \u2014 backend/routes/helper_evidence.py:253", "shortDescription": {"text": "Flask mutation route `upload_evidence_batch` without `@login_required` \u2014 backend/routes/helper_evidence.py:253"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cb519a901ec7e051", "name": "Flask mutation route `delete_helper_evidence_block` without `@login_required` \u2014 backend/routes/helper_evidence.py:448", "shortDescription": {"text": "Flask mutation route `delete_helper_evidence_block` without `@login_required` \u2014 backend/routes/helper_evidence.py:448"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ad71b13293e2b71f", "name": "Flask mutation route `helper_signed_upload_init` without `@login_required` \u2014 backend/routes/helper_evidence.py:661", "shortDescription": {"text": "Flask mutation route `helper_signed_upload_init` without `@login_required` \u2014 backend/routes/helper_evidence.py:661"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-63c6db8e697dc6eb", "name": "Flask mutation route `helper_signed_upload_finalize` without `@login_required` \u2014 backend/routes/helper_evidence.py:722", "shortDescription": {"text": "Flask mutation route `helper_signed_upload_finalize` without `@login_required` \u2014 backend/routes/helper_evidence.py:722"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c9d39e711b11e73d", "name": "Flask mutation route `create_bug_report` without `@login_required` \u2014 backend/routes/bug_reports.py:99", "shortDescription": {"text": "Flask mutation route `create_bug_report` without `@login_required` \u2014 backend/routes/bug_reports.py:99"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4aa8d8399eb87778", "name": "Flask mutation route `update_bug_report` without `@login_required` \u2014 backend/routes/bug_reports.py:203", "shortDescription": {"text": "Flask mutation route `update_bug_report` without `@login_required` \u2014 backend/routes/bug_reports.py:203"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f611083e36c467aa", "name": "Flask mutation route `track_client_events` without `@login_required` \u2014 backend/routes/activity.py:61", "shortDescription": {"text": "Flask mutation route `track_client_events` without `@login_required` \u2014 backend/routes/activity.py:61"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c89c744284e11f33", "name": "Flask mutation route `generate_steps` without `@login_required` \u2014 backend/routes/task_steps.py:20", "shortDescription": {"text": "Flask mutation route `generate_steps` without `@login_required` \u2014 backend/routes/task_steps.py:20"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f6fdad572d3f58e1", "name": "Flask mutation route `drill_down_step` without `@login_required` \u2014 backend/routes/task_steps.py:74", "shortDescription": {"text": "Flask mutation route `drill_down_step` without `@login_required` \u2014 backend/routes/task_steps.py:74"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0f74fc6b43a51c4f", "name": "Flask mutation route `toggle_step` without `@login_required` \u2014 backend/routes/task_steps.py:151", "shortDescription": {"text": "Flask mutation route `toggle_step` without `@login_required` \u2014 backend/routes/task_steps.py:151"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a4824e8e5be6aa6", "name": "Flask mutation route `delete_all_steps` without `@login_required` \u2014 backend/routes/task_steps.py:186", "shortDescription": {"text": "Flask mutation route `delete_all_steps` without `@login_required` \u2014 backend/routes/task_steps.py:186"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d864ace6b343f25e", "name": "Flask mutation route `upload_evidence` without `@login_required` \u2014 backend/routes/uploads.py:54", "shortDescription": {"text": "Flask mutation route `upload_evidence` without `@login_required` \u2014 backend/routes/uploads.py:54"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-866324466d384538", "name": "Flask mutation route `upload_evidence_base64` without `@login_required` \u2014 backend/routes/uploads.py:94", "shortDescription": {"text": "Flask mutation route `upload_evidence_base64` without `@login_required` \u2014 backend/routes/uploads.py:94"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bb56ca912d78ba36", "name": "Flask mutation route `request_upload_session` without `@login_required` \u2014 backend/routes/uploads.py:151", "shortDescription": {"text": "Flask mutation route `request_upload_session` without `@login_required` \u2014 backend/routes/uploads.py:151"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c2d2f0085ccb2f29", "name": "Flask mutation route `finalize_signed_upload` without `@login_required` \u2014 backend/routes/uploads.py:196", "shortDescription": {"text": "Flask mutation route `finalize_signed_upload` without `@login_required` \u2014 backend/routes/uploads.py:196"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c45b19ee2bb39e32", "name": "Flask mutation route `request_signed_upload_url` without `@login_required` \u2014 backend/routes/uploads.py:258", "shortDescription": {"text": "Flask mutation route `request_signed_upload_url` without `@login_required` \u2014 backend/routes/uploads.py:258"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dfea685f1ef38260", "name": "Flask mutation route `process_uploaded_file` without `@login_required` \u2014 backend/routes/uploads.py:329", "shortDescription": {"text": "Flask mutation route `process_uploaded_file` without `@login_required` \u2014 backend/routes/uploads.py:329"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6f08bb3b69b433e7", "name": "Flask mutation route `patch_status` without `@login_required` \u2014 backend/routes/showcase.py:102", "shortDescription": {"text": "Flask mutation route `patch_status` without `@login_required` \u2014 backend/routes/showcase.py:102"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-db54b3c6ba205c17", "name": "Flask mutation route `record_post` without `@login_required` \u2014 backend/routes/showcase.py:121", "shortDescription": {"text": "Flask mutation route `record_post` without `@login_required` \u2014 backend/routes/showcase.py:121"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a085178ba265350f", "name": "Flask mutation route `patch_post` without `@login_required` \u2014 backend/routes/showcase.py:148", "shortDescription": {"text": "Flask mutation route `patch_post` without `@login_required` \u2014 backend/routes/showcase.py:148"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-06e98e4c69cc53f7", "name": "Flask mutation route `ai_captions` without `@login_required` \u2014 backend/routes/showcase.py:177", "shortDescription": {"text": "Flask mutation route `ai_captions` without `@login_required` \u2014 backend/routes/showcase.py:177"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-49fd62836950bea2", "name": "Flask mutation route `ai_alt_text` without `@login_required` \u2014 backend/routes/showcase.py:195", "shortDescription": {"text": "Flask mutation route `ai_alt_text` without `@login_required` \u2014 backend/routes/showcase.py:195"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-629b3ee4039dbec2", "name": "Flask mutation route `ai_quote_pull` without `@login_required` \u2014 backend/routes/showcase.py:213", "shortDescription": {"text": "Flask mutation route `ai_quote_pull` without `@login_required` \u2014 backend/routes/showcase.py:213"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-af1ed28f172aced4", "name": "Flask mutation route `parent_self_revoke` without `@login_required` \u2014 backend/routes/showcase.py:281", "shortDescription": {"text": "Flask mutation route `parent_self_revoke` without `@login_required` \u2014 backend/routes/showcase.py:281"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-344f0c7ac18e865e", "name": "Flask mutation route `create_family_quest` without `@login_required` \u2014 backend/routes/family_quests.py:50", "shortDescription": {"text": "Flask mutation route `create_family_quest` without `@login_required` \u2014 backend/routes/family_quests.py:50"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8b8b1642191589a0", "name": "Flask mutation route `update_family_quest_template_tasks` without `@login_required` \u2014 backend/routes/family_quests.py:11", "shortDescription": {"text": "Flask mutation route `update_family_quest_template_tasks` without `@login_required` \u2014 backend/routes/family_quests.py:112"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04c57ccb078e89f3", "name": "Flask mutation route `enroll_children_in_family_quest` without `@login_required` \u2014 backend/routes/family_quests.py:186", "shortDescription": {"text": "Flask mutation route `enroll_children_in_family_quest` without `@login_required` \u2014 backend/routes/family_quests.py:186"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-64286c76524b8a7d", "name": "Flask mutation route `create_task_for_dependent` without `@login_required` \u2014 backend/routes/family_quests.py:292", "shortDescription": {"text": "Flask mutation route `create_task_for_dependent` without `@login_required` \u2014 backend/routes/family_quests.py:292"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dec505149540ef42", "name": "Flask mutation route `uncomplete_task_for_dependent` without `@login_required` \u2014 backend/routes/family_quests.py:389", "shortDescription": {"text": "Flask mutation route `uncomplete_task_for_dependent` without `@login_required` \u2014 backend/routes/family_quests.py:389"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-950debe6e9cd553d", "name": "Flask mutation route `create_announcement` without `@login_required` \u2014 backend/routes/announcements.py:29", "shortDescription": {"text": "Flask mutation route `create_announcement` without `@login_required` \u2014 backend/routes/announcements.py:29"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3787a40f63390e35", "name": "Flask mutation route `create_group` without `@login_required` \u2014 backend/routes/group_messages.py:30", "shortDescription": {"text": "Flask mutation route `create_group` without `@login_required` \u2014 backend/routes/group_messages.py:30"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7ba71d17381b383f", "name": "Flask mutation route `update_group` without `@login_required` \u2014 backend/routes/group_messages.py:139", "shortDescription": {"text": "Flask mutation route `update_group` without `@login_required` \u2014 backend/routes/group_messages.py:139"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2b0f0f52d3dc747e", "name": "Flask mutation route `delete_group` without `@login_required` \u2014 backend/routes/group_messages.py:191", "shortDescription": {"text": "Flask mutation route `delete_group` without `@login_required` \u2014 backend/routes/group_messages.py:191"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a289aaabb03766b", "name": "Flask mutation route `add_member` without `@login_required` \u2014 backend/routes/group_messages.py:219", "shortDescription": {"text": "Flask mutation route `add_member` without `@login_required` \u2014 backend/routes/group_messages.py:219"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-097fd79527e20814", "name": "Flask mutation route `remove_member` without `@login_required` \u2014 backend/routes/group_messages.py:256", "shortDescription": {"text": "Flask mutation route `remove_member` without `@login_required` \u2014 backend/routes/group_messages.py:256"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5fefce550032f655", "name": "Flask mutation route `leave_group` without `@login_required` \u2014 backend/routes/group_messages.py:283", "shortDescription": {"text": "Flask mutation route `leave_group` without `@login_required` \u2014 backend/routes/group_messages.py:283"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-76380dda775e80c1", "name": "Flask mutation route `send_message` without `@login_required` \u2014 backend/routes/group_messages.py:349", "shortDescription": {"text": "Flask mutation route `send_message` without `@login_required` \u2014 backend/routes/group_messages.py:349"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-13aebee1170af02a", "name": "Flask mutation route `mark_as_read` without `@login_required` \u2014 backend/routes/group_messages.py:395", "shortDescription": {"text": "Flask mutation route `mark_as_read` without `@login_required` \u2014 backend/routes/group_messages.py:395"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8bda958f6b294aaf", "name": "Flask mutation route `submit_contact` without `@login_required` \u2014 backend/routes/contact.py:18", "shortDescription": {"text": "Flask mutation route `submit_contact` without `@login_required` \u2014 backend/routes/contact.py:18"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cf55f479efed7880", "name": "Flask mutation route `create_dependent` without `@login_required` \u2014 backend/routes/dependents.py:121", "shortDescription": {"text": "Flask mutation route `create_dependent` without `@login_required` \u2014 backend/routes/dependents.py:121"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f3ba1a339eca1f39", "name": "Flask mutation route `update_dependent` without `@login_required` \u2014 backend/routes/dependents.py:231", "shortDescription": {"text": "Flask mutation route `update_dependent` without `@login_required` \u2014 backend/routes/dependents.py:231"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-32ffee160f79f345", "name": "Flask mutation route `upload_dependent_avatar` without `@login_required` \u2014 backend/routes/dependents.py:304", "shortDescription": {"text": "Flask mutation route `upload_dependent_avatar` without `@login_required` \u2014 backend/routes/dependents.py:304"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0ebc0bb6e7a66c2b", "name": "Flask mutation route `delete_dependent` without `@login_required` \u2014 backend/routes/dependents.py:393", "shortDescription": {"text": "Flask mutation route `delete_dependent` without `@login_required` \u2014 backend/routes/dependents.py:393"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8478b6c30439de76", "name": "Flask mutation route `promote_dependent` without `@login_required` \u2014 backend/routes/dependents.py:435", "shortDescription": {"text": "Flask mutation route `promote_dependent` without `@login_required` \u2014 backend/routes/dependents.py:435"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-616e0a5e2bfb36e0", "name": "Flask mutation route `add_dependent_login` without `@login_required` \u2014 backend/routes/dependents.py:512", "shortDescription": {"text": "Flask mutation route `add_dependent_login` without `@login_required` \u2014 backend/routes/dependents.py:512"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-64f6e39b96ecdf95", "name": "Flask mutation route `toggle_child_ai_access` without `@login_required` \u2014 backend/routes/dependents.py:635", "shortDescription": {"text": "Flask mutation route `toggle_child_ai_access` without `@login_required` \u2014 backend/routes/dependents.py:635"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d20fb023a51a4c05", "name": "Flask mutation route `update_child_ai_features` without `@login_required` \u2014 backend/routes/dependents.py:730", "shortDescription": {"text": "Flask mutation route `update_child_ai_features` without `@login_required` \u2014 backend/routes/dependents.py:730"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-33f6278470d85f95", "name": "Flask mutation route `generate_acting_as_token` without `@login_required` \u2014 backend/routes/dependents.py:828", "shortDescription": {"text": "Flask mutation route `generate_acting_as_token` without `@login_required` \u2014 backend/routes/dependents.py:828"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-13ebaf47d7222307", "name": "Flask mutation route `stop_acting_as` without `@login_required` \u2014 backend/routes/dependents.py:880", "shortDescription": {"text": "Flask mutation route `stop_acting_as` without `@login_required` \u2014 backend/routes/dependents.py:880"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b5e00129574d49c2", "name": "Flask mutation route `report_content` without `@login_required` \u2014 backend/routes/moderation.py:24", "shortDescription": {"text": "Flask mutation route `report_content` without `@login_required` \u2014 backend/routes/moderation.py:24"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-95b4d168748c3894", "name": "Flask mutation route `block_user` without `@login_required` \u2014 backend/routes/moderation.py:81", "shortDescription": {"text": "Flask mutation route `block_user` without `@login_required` \u2014 backend/routes/moderation.py:81"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5626d155cff0e9cd", "name": "Flask mutation route `unblock_user` without `@login_required` \u2014 backend/routes/moderation.py:113", "shortDescription": {"text": "Flask mutation route `unblock_user` without `@login_required` \u2014 backend/routes/moderation.py:113"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ff2c85bb41f8454c", "name": "Flask mutation route `enroll_in_poe` without `@login_required` \u2014 backend/routes/poe.py:83", "shortDescription": {"text": "Flask mutation route `enroll_in_poe` without `@login_required` \u2014 backend/routes/poe.py:83"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7e622c521b12cb91", "name": "Flask mutation route `add_sample_task_to_user_quest` without `@login_required` \u2014 backend/routes/quest_types.py:28", "shortDescription": {"text": "Flask mutation route `add_sample_task_to_user_quest` without `@login_required` \u2014 backend/routes/quest_types.py:28"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7816786149e218b3", "name": "Flask mutation route `calculate_credits` without `@login_required` \u2014 backend/routes/credits.py:256", "shortDescription": {"text": "Flask mutation route `calculate_credits` without `@login_required` \u2014 backend/routes/credits.py:256"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bdd3b6b6c47741a0", "name": "Flask mutation route `update_portfolio_privacy` without `@login_required` \u2014 backend/routes/portfolio.py:183", "shortDescription": {"text": "Flask mutation route `update_portfolio_privacy` without `@login_required` \u2014 backend/routes/portfolio.py:183"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3fb7db148de51929", "name": "Flask mutation route `submit_interest` without `@login_required` \u2014 backend/routes/promo.py:15", "shortDescription": {"text": "Flask mutation route `submit_interest` without `@login_required` \u2014 backend/routes/promo.py:15"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-34a7dcb472a9d97e", "name": "Flask mutation route `subscribe` without `@login_required` \u2014 backend/routes/push_subscriptions.py:44", "shortDescription": {"text": "Flask mutation route `subscribe` without `@login_required` \u2014 backend/routes/push_subscriptions.py:44"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-abab743e1a03da98", "name": "Flask mutation route `unsubscribe` without `@login_required` \u2014 backend/routes/push_subscriptions.py:112", "shortDescription": {"text": "Flask mutation route `unsubscribe` without `@login_required` \u2014 backend/routes/push_subscriptions.py:112"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-85e40545a7246628", "name": "Flask mutation route `register_expo_token` without `@login_required` \u2014 backend/routes/push_subscriptions.py:196", "shortDescription": {"text": "Flask mutation route `register_expo_token` without `@login_required` \u2014 backend/routes/push_subscriptions.py:196"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4dc8a2da94d1a30d", "name": "Flask mutation route `deactivate_expo_token` without `@login_required` \u2014 backend/routes/push_subscriptions.py:241", "shortDescription": {"text": "Flask mutation route `deactivate_expo_token` without `@login_required` \u2014 backend/routes/push_subscriptions.py:241"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8877c6290f91059e", "name": "Flask mutation route `test_push` without `@login_required` \u2014 backend/routes/push_subscriptions.py:274", "shortDescription": {"text": "Flask mutation route `test_push` without `@login_required` \u2014 backend/routes/push_subscriptions.py:274"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-38dffbf73a8f175b", "name": "Flask mutation route `google_oauth_callback` without `@login_required` \u2014 backend/routes/auth/google_oauth.py:110", "shortDescription": {"text": "Flask mutation route `google_oauth_callback` without `@login_required` \u2014 backend/routes/auth/google_oauth.py:110"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3a5f1bc59ec73aac", "name": "Flask mutation route `accept_tos` without `@login_required` \u2014 backend/routes/auth/google_oauth.py:375", "shortDescription": {"text": "Flask mutation route `accept_tos` without `@login_required` \u2014 backend/routes/auth/google_oauth.py:375"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d179ec6b79090ab7", "name": "Flask mutation route `register` without `@login_required` \u2014 backend/routes/auth/registration.py:111", "shortDescription": {"text": "Flask mutation route `register` without `@login_required` \u2014 backend/routes/auth/registration.py:111"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f7c28ac13fadbd62", "name": "Flask mutation route `verify_email_otp` without `@login_required` \u2014 backend/routes/auth/registration.py:582", "shortDescription": {"text": "Flask mutation route `verify_email_otp` without `@login_required` \u2014 backend/routes/auth/registration.py:582"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c63b50d36afcf663", "name": "Flask mutation route `resend_verification` without `@login_required` \u2014 backend/routes/auth/registration.py:653", "shortDescription": {"text": "Flask mutation route `resend_verification` without `@login_required` \u2014 backend/routes/auth/registration.py:653"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-99e4305f0fd45354", "name": "Flask mutation route `apple_oauth_callback` without `@login_required` \u2014 backend/routes/auth/apple_oauth.py:36", "shortDescription": {"text": "Flask mutation route `apple_oauth_callback` without `@login_required` \u2014 backend/routes/auth/apple_oauth.py:36"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ac434fed98ba176d", "name": "Flask mutation route `mark_tutorial_completed` without `@login_required` \u2014 backend/routes/auth/session.py:58", "shortDescription": {"text": "Flask mutation route `mark_tutorial_completed` without `@login_required` \u2014 backend/routes/auth/session.py:58"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f30a08f5bf31d3c", "name": "Flask mutation route `forgot_password` without `@login_required` \u2014 backend/routes/auth/password.py:165", "shortDescription": {"text": "Flask mutation route `forgot_password` without `@login_required` \u2014 backend/routes/auth/password.py:165"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0909343e294e6a4f", "name": "Flask mutation route `reset_password` without `@login_required` \u2014 backend/routes/auth/password.py:332", "shortDescription": {"text": "Flask mutation route `reset_password` without `@login_required` \u2014 backend/routes/auth/password.py:332"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-52a0409666c292d6", "name": "Flask mutation route `token` without `@login_required` \u2014 backend/routes/auth/oauth.py:142", "shortDescription": {"text": "Flask mutation route `token` without `@login_required` \u2014 backend/routes/auth/oauth.py:142"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3d989e3a9aa56c4d", "name": "Flask mutation route `revoke` without `@login_required` \u2014 backend/routes/auth/oauth.py:346", "shortDescription": {"text": "Flask mutation route `revoke` without `@login_required` \u2014 backend/routes/auth/oauth.py:346"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec91521c7e5cec2c", "name": "Flask mutation route `create_client` without `@login_required` \u2014 backend/routes/auth/oauth.py:432", "shortDescription": {"text": "Flask mutation route `create_client` without `@login_required` \u2014 backend/routes/auth/oauth.py:432"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d787fa951a0a7059", "name": "Flask mutation route `refresh_token` without `@login_required` \u2014 backend/routes/auth/login/tokens.py:36", "shortDescription": {"text": "Flask mutation route `refresh_token` without `@login_required` \u2014 backend/routes/auth/login/tokens.py:36"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-23e3c158edbf7aca", "name": "Flask mutation route `login` without `@login_required` \u2014 backend/routes/auth/login/core.py:180", "shortDescription": {"text": "Flask mutation route `login` without `@login_required` \u2014 backend/routes/auth/login/core.py:180"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a3b0f24f63d28759", "name": "Flask mutation route `org_login` without `@login_required` \u2014 backend/routes/auth/login/core.py:451", "shortDescription": {"text": "Flask mutation route `org_login` without `@login_required` \u2014 backend/routes/auth/login/core.py:451"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-51bd49b350e1ed3d", "name": "Flask mutation route `logout` without `@login_required` \u2014 backend/routes/auth/login/core.py:722", "shortDescription": {"text": "Flask mutation route `logout` without `@login_required` \u2014 backend/routes/auth/login/core.py:722"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b452249cc0d94819", "name": "Flask mutation route `update_ai_settings` without `@login_required` \u2014 backend/routes/auth/login/settings.py:75", "shortDescription": {"text": "Flask mutation route `update_ai_settings` without `@login_required` \u2014 backend/routes/auth/login/settings.py:75"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9eab43cd7df1f46a", "name": "Flask mutation route `upload_child_avatar` without `@login_required` \u2014 backend/routes/parent/child_overview.py:588", "shortDescription": {"text": "Flask mutation route `upload_child_avatar` without `@login_required` \u2014 backend/routes/parent/child_overview.py:588"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7e6c3dd1f8f96013", "name": "Flask mutation route `create_child_learning_moment` without `@login_required` \u2014 backend/routes/parent/learning_moments.p", "shortDescription": {"text": "Flask mutation route `create_child_learning_moment` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:22"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f2be8d15b304670", "name": "Flask mutation route `upload_moment_media` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:176", "shortDescription": {"text": "Flask mutation route `upload_moment_media` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:176"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-acb991e7ccdecfc5", "name": "Flask mutation route `init_moment_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:2", "shortDescription": {"text": "Flask mutation route `init_moment_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:225"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-99e32dcc9177abd9", "name": "Flask mutation route `finalize_moment_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moments.", "shortDescription": {"text": "Flask mutation route `finalize_moment_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:264"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-357d15d3199b45e6", "name": "Flask mutation route `create_child_topic` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:447", "shortDescription": {"text": "Flask mutation route `create_child_topic` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:447"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8291339bc830d2be", "name": "Flask mutation route `assign_child_moment_to_topic` without `@login_required` \u2014 backend/routes/parent/learning_moments.p", "shortDescription": {"text": "Flask mutation route `assign_child_moment_to_topic` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:633"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b15db09e66ad3318", "name": "Flask mutation route `update_child_learning_moment` without `@login_required` \u2014 backend/routes/parent/learning_moments.p", "shortDescription": {"text": "Flask mutation route `update_child_learning_moment` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:705"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-58f0e31d05959d23", "name": "Flask mutation route `delete_child_learning_moment` without `@login_required` \u2014 backend/routes/parent/learning_moments.p", "shortDescription": {"text": "Flask mutation route `delete_child_learning_moment` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:848"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-863185cda93ac1c5", "name": "Flask mutation route `save_child_moment_evidence` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:", "shortDescription": {"text": "Flask mutation route `save_child_moment_evidence` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:935"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d028244d6a778317", "name": "Flask mutation route `upload_child_moment_file` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:10", "shortDescription": {"text": "Flask mutation route `upload_child_moment_file` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:1052"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2347bddc778a446e", "name": "Flask mutation route `init_moment_block_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moment", "shortDescription": {"text": "Flask mutation route `init_moment_block_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:1127"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-950f804f2661b18e", "name": "Flask mutation route `finalize_moment_block_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_mo", "shortDescription": {"text": "Flask mutation route `finalize_moment_block_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:1178"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-23af614ecd98ba34", "name": "Flask mutation route `generate_family_quest_ideas` without `@login_required` \u2014 backend/routes/parent/family_quest_ai.py:", "shortDescription": {"text": "Flask mutation route `generate_family_quest_ideas` without `@login_required` \u2014 backend/routes/parent/family_quest_ai.py:30"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fe9609f3fa22e0fe", "name": "Flask mutation route `refine_family_quest_idea` without `@login_required` \u2014 backend/routes/parent/family_quest_ai.py:89", "shortDescription": {"text": "Flask mutation route `refine_family_quest_idea` without `@login_required` \u2014 backend/routes/parent/family_quest_ai.py:89"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7955e25302476929", "name": "Flask mutation route `accept_family_quest_idea` without `@login_required` \u2014 backend/routes/parent/family_quest_ai.py:128", "shortDescription": {"text": "Flask mutation route `accept_family_quest_idea` without `@login_required` \u2014 backend/routes/parent/family_quest_ai.py:128"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0982bdce7f2f1c63", "name": "Flask mutation route `oidc_login_init` without `@login_required` \u2014 backend/routes/lti/launch.py:60", "shortDescription": {"text": "Flask mutation route `oidc_login_init` without `@login_required` \u2014 backend/routes/lti/launch.py:60"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-37eb2f2a332955cb", "name": "Flask mutation route `lti_launch` without `@login_required` \u2014 backend/routes/lti/launch.py:151", "shortDescription": {"text": "Flask mutation route `lti_launch` without `@login_required` \u2014 backend/routes/lti/launch.py:151"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ccb93b4f230f368c", "name": "Flask mutation route `deep_link_submit` without `@login_required` \u2014 backend/routes/lti/deep_linking.py:120", "shortDescription": {"text": "Flask mutation route `deep_link_submit` without `@login_required` \u2014 backend/routes/lti/deep_linking.py:120"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da8824958966adce", "name": "Flask mutation route `exchange_auth_code` without `@login_required` \u2014 backend/routes/lti/token.py:38", "shortDescription": {"text": "Flask mutation route `exchange_auth_code` without `@login_required` \u2014 backend/routes/lti/token.py:38"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-61b860947f364c0a", "name": "Flask mutation route `generate_observer_invite_link` without `@login_required` \u2014 backend/routes/observer/student_invitat", "shortDescription": {"text": "Flask mutation route `generate_observer_invite_link` without `@login_required` \u2014 backend/routes/observer/student_invitations.py:23"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-67fc94775e5c5818", "name": "Flask mutation route `cancel_observer_invitation` without `@login_required` \u2014 backend/routes/observer/student_invitation", "shortDescription": {"text": "Flask mutation route `cancel_observer_invitation` without `@login_required` \u2014 backend/routes/observer/student_invitations.py:115"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a7e7f2aad7311a8e", "name": "Flask mutation route `remove_observer` without `@login_required` \u2014 backend/routes/observer/student_invitations.py:338", "shortDescription": {"text": "Flask mutation route `remove_observer` without `@login_required` \u2014 backend/routes/observer/student_invitations.py:338"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9d0579b52560d7e5", "name": "Flask mutation route `create_share_token` without `@login_required` \u2014 backend/routes/observer/sharing.py:76", "shortDescription": {"text": "Flask mutation route `create_share_token` without `@login_required` \u2014 backend/routes/observer/sharing.py:76"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bf0ce3ad22be26e8", "name": "Flask mutation route `record_feed_views` without `@login_required` \u2014 backend/routes/observer/social.py:24", "shortDescription": {"text": "Flask mutation route `record_feed_views` without `@login_required` \u2014 backend/routes/observer/social.py:24"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d1b5b4885b823966", "name": "Flask mutation route `toggle_feed_item_visibility` without `@login_required` \u2014 backend/routes/observer/activity.py:519", "shortDescription": {"text": "Flask mutation route `toggle_feed_item_visibility` without `@login_required` \u2014 backend/routes/observer/activity.py:519"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c626bb7a16d69ac5", "name": "Flask mutation route `post_observer_comment` without `@login_required` \u2014 backend/routes/observer/comments.py:79", "shortDescription": {"text": "Flask mutation route `post_observer_comment` without `@login_required` \u2014 backend/routes/observer/comments.py:79"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df2de856c5d484cc", "name": "Flask mutation route `delete_observer_comment` without `@login_required` \u2014 backend/routes/observer/comments.py:196", "shortDescription": {"text": "Flask mutation route `delete_observer_comment` without `@login_required` \u2014 backend/routes/observer/comments.py:196"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d383cd79b2a74cca", "name": "Flask mutation route `family_invite` without `@login_required` \u2014 backend/routes/observer/family.py:29", "shortDescription": {"text": "Flask mutation route `family_invite` without `@login_required` \u2014 backend/routes/observer/family.py:29"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5e677872f2d73ec8", "name": "Flask mutation route `family_invite_email` without `@login_required` \u2014 backend/routes/observer/family.py:153", "shortDescription": {"text": "Flask mutation route `family_invite_email` without `@login_required` \u2014 backend/routes/observer/family.py:153"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-409915b7b3c5c973", "name": "Flask mutation route `toggle_child_access` without `@login_required` \u2014 backend/routes/observer/family.py:455", "shortDescription": {"text": "Flask mutation route `toggle_child_access` without `@login_required` \u2014 backend/routes/observer/family.py:455"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e7cedfc8138f73ec", "name": "Flask mutation route `remove_family_observer` without `@login_required` \u2014 backend/routes/observer/family.py:557", "shortDescription": {"text": "Flask mutation route `remove_family_observer` without `@login_required` \u2014 backend/routes/observer/family.py:557"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ccea6f343485eba0", "name": "Flask mutation route `revoke_pending_family_invite` without `@login_required` \u2014 backend/routes/observer/family.py:691", "shortDescription": {"text": "Flask mutation route `revoke_pending_family_invite` without `@login_required` \u2014 backend/routes/observer/family.py:691"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aedc97e01300b9c6", "name": "Flask mutation route `parent_send_observer_invitation` without `@login_required` \u2014 backend/routes/observer/parent_manage", "shortDescription": {"text": "Flask mutation route `parent_send_observer_invitation` without `@login_required` \u2014 backend/routes/observer/parent_management.py:23"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b0c2a9c7b4500da2", "name": "Flask mutation route `remove_observer_for_student` without `@login_required` \u2014 backend/routes/observer/parent_management", "shortDescription": {"text": "Flask mutation route `remove_observer_for_student` without `@login_required` \u2014 backend/routes/observer/parent_management.py:272"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7de54a0f754aed7e", "name": "Flask mutation route `accept_observer_invitation` without `@login_required` \u2014 backend/routes/observer/acceptance.py:115", "shortDescription": {"text": "Flask mutation route `accept_observer_invitation` without `@login_required` \u2014 backend/routes/observer/acceptance.py:115"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b077e0b73a07cbc", "name": "Flask mutation route `exchange_auth_code` without `@login_required` \u2014 backend/routes/spark_integration/sso.py:196", "shortDescription": {"text": "Flask mutation route `exchange_auth_code` without `@login_required` \u2014 backend/routes/spark_integration/sso.py:196"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ca4cacef31115586", "name": "Flask mutation route `course_sync_webhook` without `@login_required` \u2014 backend/routes/spark_integration/webhooks.py:54", "shortDescription": {"text": "Flask mutation route `course_sync_webhook` without `@login_required` \u2014 backend/routes/spark_integration/webhooks.py:54"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-edff38b6541bbaeb", "name": "Flask mutation route `submission_webhook` without `@login_required` \u2014 backend/routes/spark_integration/webhooks.py:147", "shortDescription": {"text": "Flask mutation route `submission_webhook` without `@login_required` \u2014 backend/routes/spark_integration/webhooks.py:147"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d520f52ce4d70f5e", "name": "Flask mutation route `create_class_group` without `@login_required` \u2014 backend/routes/classes/messaging.py:29", "shortDescription": {"text": "Flask mutation route `create_class_group` without `@login_required` \u2014 backend/routes/classes/messaging.py:29"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2464fbcc65ea476f", "name": "Flask mutation route `add_class_quest` without `@login_required` \u2014 backend/routes/classes/quests.py:85", "shortDescription": {"text": "Flask mutation route `add_class_quest` without `@login_required` \u2014 backend/routes/classes/quests.py:85"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a6d1cfa4065a51a1", "name": "Flask mutation route `remove_class_quest` without `@login_required` \u2014 backend/routes/classes/quests.py:183", "shortDescription": {"text": "Flask mutation route `remove_class_quest` without `@login_required` \u2014 backend/routes/classes/quests.py:183"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-95360580463c2555", "name": "Flask mutation route `set_class_quest_schedule` without `@login_required` \u2014 backend/routes/classes/quests.py:227", "shortDescription": {"text": "Flask mutation route `set_class_quest_schedule` without `@login_required` \u2014 backend/routes/classes/quests.py:227"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-915db5f0ee0f4a4c", "name": "Flask mutation route `set_class_quest_due_date` without `@login_required` \u2014 backend/routes/classes/quests.py:279", "shortDescription": {"text": "Flask mutation route `set_class_quest_due_date` without `@login_required` \u2014 backend/routes/classes/quests.py:279"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-68674d983423cac1", "name": "Flask mutation route `reorder_class_quests` without `@login_required` \u2014 backend/routes/classes/quests.py:346", "shortDescription": {"text": "Flask mutation route `reorder_class_quests` without `@login_required` \u2014 backend/routes/classes/quests.py:346"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f3e6d8c5997aef3d", "name": "Flask mutation route `create_and_add_class_quest` without `@login_required` \u2014 backend/routes/classes/quests.py:395", "shortDescription": {"text": "Flask mutation route `create_and_add_class_quest` without `@login_required` \u2014 backend/routes/classes/quests.py:395"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e69eb34ef2561b8a", "name": "Flask mutation route `create_class` without `@login_required` \u2014 backend/routes/classes/crud.py:70", "shortDescription": {"text": "Flask mutation route `create_class` without `@login_required` \u2014 backend/routes/classes/crud.py:70"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8af121915aa753ae", "name": "Flask mutation route `update_class` without `@login_required` \u2014 backend/routes/classes/crud.py:166", "shortDescription": {"text": "Flask mutation route `update_class` without `@login_required` \u2014 backend/routes/classes/crud.py:166"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-52846b71f69f4c33", "name": "Flask mutation route `archive_class` without `@login_required` \u2014 backend/routes/classes/crud.py:226", "shortDescription": {"text": "Flask mutation route `archive_class` without `@login_required` \u2014 backend/routes/classes/crud.py:226"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e566e083f86c9b01", "name": "Flask mutation route `enroll_students` without `@login_required` \u2014 backend/routes/classes/students.py:95", "shortDescription": {"text": "Flask mutation route `enroll_students` without `@login_required` \u2014 backend/routes/classes/students.py:95"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-795a680482d757f7", "name": "Flask mutation route `withdraw_student` without `@login_required` \u2014 backend/routes/classes/students.py:180", "shortDescription": {"text": "Flask mutation route `withdraw_student` without `@login_required` \u2014 backend/routes/classes/students.py:180"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ebf2044f53bb6c0b", "name": "Flask mutation route `add_class_advisor` without `@login_required` \u2014 backend/routes/classes/advisors.py:78", "shortDescription": {"text": "Flask mutation route `add_class_advisor` without `@login_required` \u2014 backend/routes/classes/advisors.py:78"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fdef0cb55e6295a0", "name": "Flask mutation route `remove_class_advisor` without `@login_required` \u2014 backend/routes/classes/advisors.py:151", "shortDescription": {"text": "Flask mutation route `remove_class_advisor` without `@login_required` \u2014 backend/routes/classes/advisors.py:151"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-597ccf4276341a68", "name": "Flask mutation route `org_approve_credit` without `@login_required` \u2014 backend/routes/credit_dashboard/org_admin_actions.", "shortDescription": {"text": "Flask mutation route `org_approve_credit` without `@login_required` \u2014 backend/routes/credit_dashboard/org_admin_actions.py:64"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c21ea036b95df650", "name": "Flask mutation route `org_grow_this` without `@login_required` \u2014 backend/routes/credit_dashboard/org_admin_actions.py:30", "shortDescription": {"text": "Flask mutation route `org_grow_this` without `@login_required` \u2014 backend/routes/credit_dashboard/org_admin_actions.py:303"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b45a361a0379c1e0", "name": "Flask mutation route `merge_tasks` without `@login_required` \u2014 backend/routes/credit_dashboard/merge.py:21", "shortDescription": {"text": "Flask mutation route `merge_tasks` without `@login_required` \u2014 backend/routes/credit_dashboard/merge.py:21"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cc4c472e677deaac", "name": "Flask mutation route `approve_credit` without `@login_required` \u2014 backend/routes/credit_dashboard/superadmin_actions.py:", "shortDescription": {"text": "Flask mutation route `approve_credit` without `@login_required` \u2014 backend/routes/credit_dashboard/superadmin_actions.py:30"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-61eeea64db9f74b9", "name": "Flask mutation route `grow_this` without `@login_required` \u2014 backend/routes/credit_dashboard/superadmin_actions.py:176", "shortDescription": {"text": "Flask mutation route `grow_this` without `@login_required` \u2014 backend/routes/credit_dashboard/superadmin_actions.py:176"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2b48206d43e7b5a6", "name": "Flask mutation route `suggest_grow_this_feedback` without `@login_required` \u2014 backend/routes/credit_dashboard/superadmin", "shortDescription": {"text": "Flask mutation route `suggest_grow_this_feedback` without `@login_required` \u2014 backend/routes/credit_dashboard/superadmin_actions.py:321"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d75521eb8fbca7ea", "name": "Flask mutation route `complete_task` without `@login_required` \u2014 backend/routes/tasks/completion.py:29", "shortDescription": {"text": "Flask mutation route `complete_task` without `@login_required` \u2014 backend/routes/tasks/completion.py:29"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-05ba463c9ed04565", "name": "Flask mutation route `finalize_task` without `@login_required` \u2014 backend/routes/tasks/completion.py:354", "shortDescription": {"text": "Flask mutation route `finalize_task` without `@login_required` \u2014 backend/routes/tasks/completion.py:354"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-44c1c87979be500c", "name": "Flask mutation route `update_task` without `@login_required` \u2014 backend/routes/tasks/crud.py:19", "shortDescription": {"text": "Flask mutation route `update_task` without `@login_required` \u2014 backend/routes/tasks/crud.py:19"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ad84ed040e84bce8", "name": "Flask mutation route `drop_task` without `@login_required` \u2014 backend/routes/tasks/crud.py:257", "shortDescription": {"text": "Flask mutation route `drop_task` without `@login_required` \u2014 backend/routes/tasks/crud.py:257"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bf37136e8e5fb772", "name": "Flask mutation route `request_diploma_credit` without `@login_required` \u2014 backend/routes/tasks/credit.py:53", "shortDescription": {"text": "Flask mutation route `request_diploma_credit` without `@login_required` \u2014 backend/routes/tasks/credit.py:53"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5f35be5d0e9155ad", "name": "Flask mutation route `bulk_import_users` without `@login_required` \u2014 backend/routes/admin/bulk_import.py:136", "shortDescription": {"text": "Flask mutation route `bulk_import_users` without `@login_required` \u2014 backend/routes/admin/bulk_import.py:136"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-80577701d6877751", "name": "Flask mutation route `validate_import_file` without `@login_required` \u2014 backend/routes/admin/bulk_import.py:425", "shortDescription": {"text": "Flask mutation route `validate_import_file` without `@login_required` \u2014 backend/routes/admin/bulk_import.py:425"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2a83f32c9f2016b1", "name": "Flask mutation route `upsert_consent` without `@login_required` \u2014 backend/routes/admin/showcase_consent.py:70", "shortDescription": {"text": "Flask mutation route `upsert_consent` without `@login_required` \u2014 backend/routes/admin/showcase_consent.py:70"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e6ef8c9b75304f74", "name": "Flask mutation route `revoke_consent` without `@login_required` \u2014 backend/routes/admin/showcase_consent.py:98", "shortDescription": {"text": "Flask mutation route `revoke_consent` without `@login_required` \u2014 backend/routes/admin/showcase_consent.py:98"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-72e525c2d1bc7626", "name": "Flask mutation route `set_permission` without `@login_required` \u2014 backend/routes/admin/showcase_consent.py:115", "shortDescription": {"text": "Flask mutation route `set_permission` without `@login_required` \u2014 backend/routes/admin/showcase_consent.py:115"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-530b09e0e2f32f8c", "name": "Flask mutation route `approve_class_review` without `@login_required` \u2014 backend/routes/admin/class_reviews.py:194", "shortDescription": {"text": "Flask mutation route `approve_class_review` without `@login_required` \u2014 backend/routes/admin/class_reviews.py:194"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-18e9caf48438d36f", "name": "Flask mutation route `reject_class_review` without `@login_required` \u2014 backend/routes/admin/class_reviews.py:226", "shortDescription": {"text": "Flask mutation route `reject_class_review` without `@login_required` \u2014 backend/routes/admin/class_reviews.py:226"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-933b4419e245f2fe", "name": "Flask mutation route `create_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:8", "shortDescription": {"text": "Flask mutation route `create_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:88"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9286bf71441d216b", "name": "Flask mutation route `update_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:1", "shortDescription": {"text": "Flask mutation route `update_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:139"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a2324be3397d7466", "name": "Flask mutation route `grant_quest_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:20", "shortDescription": {"text": "Flask mutation route `grant_quest_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:206"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9180563f58294211", "name": "Flask mutation route `revoke_quest_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:2", "shortDescription": {"text": "Flask mutation route `revoke_quest_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:232"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-20dba48123b56afc", "name": "Flask mutation route `grant_course_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:2", "shortDescription": {"text": "Flask mutation route `grant_course_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:299"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8e62891a4964a646", "name": "Flask mutation route `revoke_course_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:", "shortDescription": {"text": "Flask mutation route `revoke_course_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:325"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-13233268ecab4fd3", "name": "Flask mutation route `toggle_organization_ai_access` without `@login_required` \u2014 backend/routes/admin/organization_manag", "shortDescription": {"text": "Flask mutation route `toggle_organization_ai_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:395"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-029d156c46122be2", "name": "Flask mutation route `add_users_to_organization` without `@login_required` \u2014 backend/routes/admin/organization_managemen", "shortDescription": {"text": "Flask mutation route `add_users_to_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:453"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a1e243dfebac2b55", "name": "Flask mutation route `remove_user_from_organization` without `@login_required` \u2014 backend/routes/admin/organization_manag", "shortDescription": {"text": "Flask mutation route `remove_user_from_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:519"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-66007c946a862824", "name": "Flask mutation route `bulk_remove_users_from_organization` without `@login_required` \u2014 backend/routes/admin/organization", "shortDescription": {"text": "Flask mutation route `bulk_remove_users_from_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:579"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-716ffbaf7e024828", "name": "Flask mutation route `create_username_student` without `@login_required` \u2014 backend/routes/admin/organization_management.", "shortDescription": {"text": "Flask mutation route `create_username_student` without `@login_required` \u2014 backend/routes/admin/organization_management.py:860"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-82e32741e42764ed", "name": "Flask mutation route `reset_user_password` without `@login_required` \u2014 backend/routes/admin/organization_management.py:1", "shortDescription": {"text": "Flask mutation route `reset_user_password` without `@login_required` \u2014 backend/routes/admin/organization_management.py:1020"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f7a096d6b3ca0e99", "name": "Flask mutation route `create_course_quest` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:3", "shortDescription": {"text": "Flask mutation route `create_course_quest` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:37"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-39870f38ca216de0", "name": "Flask mutation route `update_course_tasks` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:2", "shortDescription": {"text": "Flask mutation route `update_course_tasks` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:298"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3a2717b5e6bb6f4c", "name": "Flask mutation route `delete_course_task` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:49", "shortDescription": {"text": "Flask mutation route `delete_course_task` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:499"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-852d976fae142c36", "name": "Flask mutation route `update_template_tasks` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py", "shortDescription": {"text": "Flask mutation route `update_template_tasks` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:605"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5d67c23cd5ae11d7", "name": "Flask mutation route `delete_template_task` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:", "shortDescription": {"text": "Flask mutation route `delete_template_task` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:719"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9794239bd4156035", "name": "Flask mutation route `assign_student_to_advisor` without `@login_required` \u2014 backend/routes/admin/advisor_management.py:", "shortDescription": {"text": "Flask mutation route `assign_student_to_advisor` without `@login_required` \u2014 backend/routes/admin/advisor_management.py:190"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-041cf1a92f3f72b2", "name": "Flask mutation route `unassign_student_from_advisor` without `@login_required` \u2014 backend/routes/admin/advisor_management", "shortDescription": {"text": "Flask mutation route `unassign_student_from_advisor` without `@login_required` \u2014 backend/routes/admin/advisor_management.py:318"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-424c311158688ce6", "name": "Flask mutation route `assign_org_student_to_advisor` without `@login_required` \u2014 backend/routes/admin/org_connections.py", "shortDescription": {"text": "Flask mutation route `assign_org_student_to_advisor` without `@login_required` \u2014 backend/routes/admin/org_connections.py:168"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-693232823808f802", "name": "Flask mutation route `unassign_org_student_from_advisor` without `@login_required` \u2014 backend/routes/admin/org_connection", "shortDescription": {"text": "Flask mutation route `unassign_org_student_from_advisor` without `@login_required` \u2014 backend/routes/admin/org_connections.py:268"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e0c98250962ad95", "name": "Flask mutation route `unassign_advisor_from_student` without `@login_required` \u2014 backend/routes/admin/org_connections.py", "shortDescription": {"text": "Flask mutation route `unassign_advisor_from_student` without `@login_required` \u2014 backend/routes/admin/org_connections.py:470"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d5cff2319f7b4774", "name": "Flask mutation route `disconnect_org_parent_link` without `@login_required` \u2014 backend/routes/admin/org_connections.py:62", "shortDescription": {"text": "Flask mutation route `disconnect_org_parent_link` without `@login_required` \u2014 backend/routes/admin/org_connections.py:627"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1337e6e5f12870ef", "name": "Flask mutation route `create_org_manual_parent_link` without `@login_required` \u2014 backend/routes/admin/org_connections.py", "shortDescription": {"text": "Flask mutation route `create_org_manual_parent_link` without `@login_required` \u2014 backend/routes/admin/org_connections.py:670"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-db0881e57c647904", "name": "Flask mutation route `approve_connection_request` without `@login_required` \u2014 backend/routes/admin/parent_connections.py", "shortDescription": {"text": "Flask mutation route `approve_connection_request` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:69"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2bae7730b34a96e6", "name": "Flask mutation route `reject_connection_request` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:", "shortDescription": {"text": "Flask mutation route `reject_connection_request` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:124"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-32fcebf4199d1b47", "name": "Flask mutation route `disconnect_link` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:205", "shortDescription": {"text": "Flask mutation route `disconnect_link` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:205"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da589028815a1e00", "name": "Flask mutation route `create_manual_link` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:237", "shortDescription": {"text": "Flask mutation route `create_manual_link` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:237"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d31bd78160d2c0a6", "name": "Flask mutation route `create_student_task` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:5", "shortDescription": {"text": "Flask mutation route `create_student_task` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:53"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4016de7cf32447df", "name": "Flask mutation route `batch_copy_tasks` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:254", "shortDescription": {"text": "Flask mutation route `batch_copy_tasks` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:254"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9885c246f3511461", "name": "Flask mutation route `update_student_task` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:4", "shortDescription": {"text": "Flask mutation route `update_student_task` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:465"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5a49793f49d2f9a2", "name": "Flask mutation route `delete_student_task` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:5", "shortDescription": {"text": "Flask mutation route `delete_student_task` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:588"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-793514be680f7536", "name": "Flask mutation route `reorder_student_tasks` without `@login_required` \u2014 backend/routes/admin/student_task_management.py", "shortDescription": {"text": "Flask mutation route `reorder_student_tasks` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:658"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ea41f2a5807c2796", "name": "Flask mutation route `create_registration` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:57", "shortDescription": {"text": "Flask mutation route `create_registration` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:57"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e2054f196bc4ad71", "name": "Flask mutation route `update_registration` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:79", "shortDescription": {"text": "Flask mutation route `update_registration` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:79"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dff9e5d96a8d53a2", "name": "Flask mutation route `delete_registration` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:112", "shortDescription": {"text": "Flask mutation route `delete_registration` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:112"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-513f1a57381467f9", "name": "Flask mutation route `poll_canvas_grades` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:125", "shortDescription": {"text": "Flask mutation route `poll_canvas_grades` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:125"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b9a2de4bcd7e697e", "name": "Flask mutation route `add_planned_credit` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:220", "shortDescription": {"text": "Flask mutation route `add_planned_credit` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:220"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5c8c4cc121e46b9c", "name": "Flask mutation route `update_planned_credit` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:26", "shortDescription": {"text": "Flask mutation route `update_planned_credit` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:265"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e6062edf1630030", "name": "Flask mutation route `delete_planned_credit` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:30", "shortDescription": {"text": "Flask mutation route `delete_planned_credit` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:305"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d18ee9a6729f52ec", "name": "Flask mutation route `update_course_names` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:322", "shortDescription": {"text": "Flask mutation route `update_course_names` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:322"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2c2191c04dc0e42e", "name": "Flask mutation route `save_overrides` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:413", "shortDescription": {"text": "Flask mutation route `save_overrides` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:413"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c70af34dc05f9564", "name": "Flask mutation route `backfill_single_task` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:22", "shortDescription": {"text": "Flask mutation route `backfill_single_task` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:22"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c4b31b312975bc85", "name": "Flask mutation route `backfill_all_tasks` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:56", "shortDescription": {"text": "Flask mutation route `backfill_all_tasks` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:56"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-560e3a1b00d95295", "name": "Flask mutation route `update_task_distribution` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:261", "shortDescription": {"text": "Flask mutation route `update_task_distribution` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:261"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-00d457c0370148c5", "name": "Flask mutation route `regenerate_task_distribution` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py", "shortDescription": {"text": "Flask mutation route `regenerate_task_distribution` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:332"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c98481b88d53178f", "name": "Flask mutation route `bulk_enroll_users` without `@login_required` \u2014 backend/routes/admin/course_enrollments.py:111", "shortDescription": {"text": "Flask mutation route `bulk_enroll_users` without `@login_required` \u2014 backend/routes/admin/course_enrollments.py:111"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-206b4fa6d6679426", "name": "Flask mutation route `bulk_unenroll_users` without `@login_required` \u2014 backend/routes/admin/course_enrollments.py:364", "shortDescription": {"text": "Flask mutation route `bulk_unenroll_users` without `@login_required` \u2014 backend/routes/admin/course_enrollments.py:364"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c5f7c7f59418516a", "name": "Flask mutation route `preview_imscc_import` without `@login_required` \u2014 backend/routes/admin/course_import.py:28", "shortDescription": {"text": "Flask mutation route `preview_imscc_import` without `@login_required` \u2014 backend/routes/admin/course_import.py:28"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c3dfabc24a92fb87", "name": "Flask mutation route `confirm_imscc_import` without `@login_required` \u2014 backend/routes/admin/course_import.py:119", "shortDescription": {"text": "Flask mutation route `confirm_imscc_import` without `@login_required` \u2014 backend/routes/admin/course_import.py:119"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-209e68daec85b309", "name": "Flask mutation route `validate_imscc_file_endpoint` without `@login_required` \u2014 backend/routes/admin/course_import.py:21", "shortDescription": {"text": "Flask mutation route `validate_imscc_file_endpoint` without `@login_required` \u2014 backend/routes/admin/course_import.py:213"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-de7ad760e28f0d3d", "name": "Flask mutation route `approve_flagged_task` without `@login_required` \u2014 backend/routes/admin/task_flags.py:80", "shortDescription": {"text": "Flask mutation route `approve_flagged_task` without `@login_required` \u2014 backend/routes/admin/task_flags.py:80"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-029a5889b646a44c", "name": "Flask mutation route `delete_flagged_task` without `@login_required` \u2014 backend/routes/admin/task_flags.py:114", "shortDescription": {"text": "Flask mutation route `delete_flagged_task` without `@login_required` \u2014 backend/routes/admin/task_flags.py:114"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-701db207318c51d3", "name": "Flask mutation route `update_report` without `@login_required` \u2014 backend/routes/admin/moderation_queue.py:53", "shortDescription": {"text": "Flask mutation route `update_report` without `@login_required` \u2014 backend/routes/admin/moderation_queue.py:53"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dd93314b9a0ce0df", "name": "Flask mutation route `reconcile_user_xp` without `@login_required` \u2014 backend/routes/admin/xp_reconciliation.py:183", "shortDescription": {"text": "Flask mutation route `reconcile_user_xp` without `@login_required` \u2014 backend/routes/admin/xp_reconciliation.py:183"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f1813ea331c74870", "name": "Flask mutation route `batch_reconcile` without `@login_required` \u2014 backend/routes/admin/xp_reconciliation.py:346", "shortDescription": {"text": "Flask mutation route `batch_reconcile` without `@login_required` \u2014 backend/routes/admin/xp_reconciliation.py:346"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-126015b24712c761", "name": "Flask mutation route `retry_failed_awards` without `@login_required` \u2014 backend/routes/admin/xp_reconciliation.py:493", "shortDescription": {"text": "Flask mutation route `retry_failed_awards` without `@login_required` \u2014 backend/routes/admin/xp_reconciliation.py:493"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0a0b5bbc1fc4f024", "name": "Flask mutation route `approve_task` without `@login_required` \u2014 backend/routes/admin/task_approval.py:78", "shortDescription": {"text": "Flask mutation route `approve_task` without `@login_required` \u2014 backend/routes/admin/task_approval.py:78"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da942314e72d7d35", "name": "Flask mutation route `reject_task` without `@login_required` \u2014 backend/routes/admin/task_approval.py:117", "shortDescription": {"text": "Flask mutation route `reject_task` without `@login_required` \u2014 backend/routes/admin/task_approval.py:117"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-92a91b850772ed03", "name": "Flask mutation route `delete_task` without `@login_required` \u2014 backend/routes/admin/task_approval.py:178", "shortDescription": {"text": "Flask mutation route `delete_task` without `@login_required` \u2014 backend/routes/admin/task_approval.py:178"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f673864eff938c41", "name": "Flask mutation route `start_refine_session` without `@login_required` \u2014 backend/routes/admin/course_refine.py:78", "shortDescription": {"text": "Flask mutation route `start_refine_session` without `@login_required` \u2014 backend/routes/admin/course_refine.py:78"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-198c1883141c81ac", "name": "Flask mutation route `process_answers` without `@login_required` \u2014 backend/routes/admin/course_refine.py:154", "shortDescription": {"text": "Flask mutation route `process_answers` without `@login_required` \u2014 backend/routes/admin/course_refine.py:154"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1ef5e2bf1b95555b", "name": "Flask mutation route `apply_changes` without `@login_required` \u2014 backend/routes/admin/course_refine.py:247", "shortDescription": {"text": "Flask mutation route `apply_changes` without `@login_required` \u2014 backend/routes/admin/course_refine.py:247"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fd203e000d2bfca6", "name": "Flask mutation route `generate_prompt_update` without `@login_required` \u2014 backend/routes/admin/course_refine.py:306", "shortDescription": {"text": "Flask mutation route `generate_prompt_update` without `@login_required` \u2014 backend/routes/admin/course_refine.py:306"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a257108a3c025bb", "name": "Flask mutation route `cancel_session` without `@login_required` \u2014 backend/routes/admin/course_refine.py:430", "shortDescription": {"text": "Flask mutation route `cancel_session` without `@login_required` \u2014 backend/routes/admin/course_refine.py:430"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0c2cc32a7b3e22ea", "name": "Flask mutation route `create_parent_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:98", "shortDescription": {"text": "Flask mutation route `create_parent_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:98"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a13f5192b80fc0fd", "name": "Flask mutation route `create_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:315", "shortDescription": {"text": "Flask mutation route `create_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:315"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6a97310c96d83c19", "name": "Flask mutation route `resend_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:473", "shortDescription": {"text": "Flask mutation route `resend_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:473"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1e10283a1a92af3a", "name": "Flask mutation route `generate_invitation_link` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:574", "shortDescription": {"text": "Flask mutation route `generate_invitation_link` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:574"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-62292f1e2ff0d610", "name": "Flask mutation route `cancel_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:663", "shortDescription": {"text": "Flask mutation route `cancel_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:663"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c457331e5e69e4bf", "name": "Flask mutation route `check_email_exists` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:842", "shortDescription": {"text": "Flask mutation route `check_email_exists` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:842"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9ef3e59afc0c0382", "name": "Flask mutation route `accept_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:891", "shortDescription": {"text": "Flask mutation route `accept_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:891"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1fee59749617d3dd", "name": "Flask mutation route `update_user` without `@login_required` \u2014 backend/routes/admin/user_management.py:117", "shortDescription": {"text": "Flask mutation route `update_user` without `@login_required` \u2014 backend/routes/admin/user_management.py:117"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e7634e7a601003e8", "name": "Flask mutation route `update_user_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:190", "shortDescription": {"text": "Flask mutation route `update_user_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:190"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c8778856b5b2066f", "name": "Flask mutation route `delete_user` without `@login_required` \u2014 backend/routes/admin/user_management.py:267", "shortDescription": {"text": "Flask mutation route `delete_user` without `@login_required` \u2014 backend/routes/admin/user_management.py:267"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-34cf83c5314d9f49", "name": "Flask mutation route `bulk_delete_users` without `@login_required` \u2014 backend/routes/admin/user_management.py:299", "shortDescription": {"text": "Flask mutation route `bulk_delete_users` without `@login_required` \u2014 backend/routes/admin/user_management.py:299"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d514d52d7b12046", "name": "Flask mutation route `admin_reset_password` without `@login_required` \u2014 backend/routes/admin/user_management.py:333", "shortDescription": {"text": "Flask mutation route `admin_reset_password` without `@login_required` \u2014 backend/routes/admin/user_management.py:333"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fdbad7d22ceae0fc", "name": "Flask mutation route `admin_verify_email` without `@login_required` \u2014 backend/routes/admin/user_management.py:401", "shortDescription": {"text": "Flask mutation route `admin_verify_email` without `@login_required` \u2014 backend/routes/admin/user_management.py:401"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6de00d156d185665", "name": "Flask mutation route `upload_user_avatar` without `@login_required` \u2014 backend/routes/admin/user_management.py:545", "shortDescription": {"text": "Flask mutation route `upload_user_avatar` without `@login_required` \u2014 backend/routes/admin/user_management.py:545"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bd223c2907d20e4e", "name": "Flask mutation route `assign_user_to_organization` without `@login_required` \u2014 backend/routes/admin/user_management.py:6", "shortDescription": {"text": "Flask mutation route `assign_user_to_organization` without `@login_required` \u2014 backend/routes/admin/user_management.py:626"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-00898e8703bb67e3", "name": "Flask mutation route `update_user_org_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:683", "shortDescription": {"text": "Flask mutation route `update_user_org_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:683"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bec6f5ff7aad7843", "name": "Flask mutation route `update_org_user_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:753", "shortDescription": {"text": "Flask mutation route `update_org_user_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:753"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c2c2a369cacff343", "name": "Flask mutation route `assign_advisor_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:925", "shortDescription": {"text": "Flask mutation route `assign_advisor_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:925"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07387b0c18c2b2e1", "name": "Flask mutation route `revoke_advisor_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:1017", "shortDescription": {"text": "Flask mutation route `revoke_advisor_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:1017"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e34700cfecbc7f2b", "name": "Flask mutation route `add_observer_link` without `@login_required` \u2014 backend/routes/admin/user_management.py:1175", "shortDescription": {"text": "Flask mutation route `add_observer_link` without `@login_required` \u2014 backend/routes/admin/user_management.py:1175"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-01e832c70e42e749", "name": "Flask mutation route `remove_observer_link` without `@login_required` \u2014 backend/routes/admin/user_management.py:1217", "shortDescription": {"text": "Flask mutation route `remove_observer_link` without `@login_required` \u2014 backend/routes/admin/user_management.py:1217"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8d1b3d93913f0a86", "name": "Flask mutation route `save_transfer_credits` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:125", "shortDescription": {"text": "Flask mutation route `save_transfer_credits` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:125"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d11aa1569ecdf081", "name": "Flask mutation route `upload_transcript` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:265", "shortDescription": {"text": "Flask mutation route `upload_transcript` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:265"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1d814bb7c788351c", "name": "Flask mutation route `delete_single_transfer_credit` without `@login_required` \u2014 backend/routes/admin/transfer_credits.p", "shortDescription": {"text": "Flask mutation route `delete_single_transfer_credit` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:380"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6edd97b5fcbb8169", "name": "Flask mutation route `delete_all_transfer_credits` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:", "shortDescription": {"text": "Flask mutation route `delete_all_transfer_credits` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:408"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-97155cfd3c472e6a", "name": "Flask mutation route `link_participant` without `@login_required` \u2014 backend/routes/admin/poe.py:152", "shortDescription": {"text": "Flask mutation route `link_participant` without `@login_required` \u2014 backend/routes/admin/poe.py:152"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6b8d988762548513", "name": "Flask mutation route `award_credit` without `@login_required` \u2014 backend/routes/admin/poe.py:295", "shortDescription": {"text": "Flask mutation route `award_credit` without `@login_required` \u2014 backend/routes/admin/poe.py:295"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7a1cc6282f50b8d3", "name": "Flask mutation route `start_plan_session` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:69", "shortDescription": {"text": "Flask mutation route `start_plan_session` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:69"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6c2217c0ab810058", "name": "Flask mutation route `refine_outline` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:136", "shortDescription": {"text": "Flask mutation route `refine_outline` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:136"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-06bbebb90b189799", "name": "Flask mutation route `update_session` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:280", "shortDescription": {"text": "Flask mutation route `update_session` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:280"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-060a1f7d83b3023b", "name": "Flask mutation route `approve_and_generate` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:340", "shortDescription": {"text": "Flask mutation route `approve_and_generate` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:340"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1e882241972f4f2b", "name": "Flask mutation route `upload_curriculum` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:278", "shortDescription": {"text": "Flask mutation route `upload_curriculum` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:278"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-95bb57c2091b3939", "name": "Flask mutation route `generate_course` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:704", "shortDescription": {"text": "Flask mutation route `generate_course` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:704"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5771df3169b2d3e9", "name": "Flask mutation route `resume_curriculum_upload` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:85", "shortDescription": {"text": "Flask mutation route `resume_curriculum_upload` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:854"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e193c2b6b7de785", "name": "Flask mutation route `approve_structure` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:919", "shortDescription": {"text": "Flask mutation route `approve_structure` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:919"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6463b6dea401a5b1", "name": "Flask mutation route `delete_upload` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:1187", "shortDescription": {"text": "Flask mutation route `delete_upload` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:1187"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ffd6d2d515c56f81", "name": "Flask mutation route `diagnose_curriculum` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:1319", "shortDescription": {"text": "Flask mutation route `diagnose_curriculum` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:1319"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8255a2c0b327f4ed", "name": "Flask mutation route `upload_quest_image` without `@login_required` \u2014 backend/routes/admin/quest_management/images.py:47", "shortDescription": {"text": "Flask mutation route `upload_quest_image` without `@login_required` \u2014 backend/routes/admin/quest_management/images.py:47"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5be722fd983b5873", "name": "Flask mutation route `refresh_quest_image` without `@login_required` \u2014 backend/routes/admin/quest_management/images.py:1", "shortDescription": {"text": "Flask mutation route `refresh_quest_image` without `@login_required` \u2014 backend/routes/admin/quest_management/images.py:140"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-17b4daf8f67f953b", "name": "Flask mutation route `bulk_generate_images` without `@login_required` \u2014 backend/routes/admin/quest_management/images.py:", "shortDescription": {"text": "Flask mutation route `bulk_generate_images` without `@login_required` \u2014 backend/routes/admin/quest_management/images.py:201"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e8bdb8801c99d56f", "name": "Flask mutation route `clone_quest_to_optio` without `@login_required` \u2014 backend/routes/admin/quest_management/tools.py:1", "shortDescription": {"text": "Flask mutation route `clone_quest_to_optio` without `@login_required` \u2014 backend/routes/admin/quest_management/tools.py:100"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ae4904f9edf26bcc", "name": "Flask mutation route `fix_course_quest_enrollments` without `@login_required` \u2014 backend/routes/admin/quest_management/to", "shortDescription": {"text": "Flask mutation route `fix_course_quest_enrollments` without `@login_required` \u2014 backend/routes/admin/quest_management/tools.py:198"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-08d573b3bb839d33", "name": "Flask mutation route `create_quest_v3_clean` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:7", "shortDescription": {"text": "Flask mutation route `create_quest_v3_clean` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:70"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-03d863d7aa538579", "name": "Flask mutation route `create_quest_v3_clean` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:7", "shortDescription": {"text": "Flask mutation route `create_quest_v3_clean` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:71"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bcdb64a40c6d23f3", "name": "Flask mutation route `bulk_delete_quests` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:208", "shortDescription": {"text": "Flask mutation route `bulk_delete_quests` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:208"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0ba1a77daadb6cfa", "name": "Flask mutation route `bulk_update_quests` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:252", "shortDescription": {"text": "Flask mutation route `bulk_update_quests` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:252"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cf69e5057410e0ed", "name": "Flask mutation route `update_quest` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:311", "shortDescription": {"text": "Flask mutation route `update_quest` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:311"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-85698d410368d152", "name": "Flask mutation route `ai_cleanup_quest` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:445", "shortDescription": {"text": "Flask mutation route `ai_cleanup_quest` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:445"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c0d9e31cce461323", "name": "Flask mutation route `delete_quest` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:503", "shortDescription": {"text": "Flask mutation route `delete_quest` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:503"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baf58abf0b0875f", "name": "Flask mutation route `generate_outline` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/outline.py:", "shortDescription": {"text": "Flask mutation route `generate_outline` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/outline.py:65"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d3460233b3b20843", "name": "Flask mutation route `select_outline` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/outline.py:12", "shortDescription": {"text": "Flask mutation route `select_outline` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/outline.py:126"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b840781377ef5500", "name": "Flask mutation route `regenerate_outline` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/outline.p", "shortDescription": {"text": "Flask mutation route `regenerate_outline` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/outline.py:235"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d18d868ee62c0018", "name": "Flask mutation route `generate_tasks` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:60", "shortDescription": {"text": "Flask mutation route `generate_tasks` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:60"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f7ab5f629d691cf5", "name": "Flask mutation route `generate_tasks_for_lesson` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/ta", "shortDescription": {"text": "Flask mutation route `generate_tasks_for_lesson` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:101"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ece979ffc2f0dfa9", "name": "Flask mutation route `regenerate_tasks` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:15", "shortDescription": {"text": "Flask mutation route `regenerate_tasks` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:157"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7bd032b984791118", "name": "Flask mutation route `save_task` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:220", "shortDescription": {"text": "Flask mutation route `save_task` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:220"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1c4309e207c2622a", "name": "Flask mutation route `bulk_generate` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/bulk.py:60", "shortDescription": {"text": "Flask mutation route `bulk_generate` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/bulk.py:60"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d75c76fa95a924a5", "name": "Flask mutation route `fix_images` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/bulk.py:203", "shortDescription": {"text": "Flask mutation route `fix_images` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/bulk.py:203"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-059be33a6fdddc72", "name": "Flask mutation route `queue_generation` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:60", "shortDescription": {"text": "Flask mutation route `queue_generation` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:60"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f2b192758be35731", "name": "Flask mutation route `start_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:234", "shortDescription": {"text": "Flask mutation route `start_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:234"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-34a5aad1b15987a9", "name": "Flask mutation route `cancel_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:303", "shortDescription": {"text": "Flask mutation route `cancel_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:303"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bb99f32ff398ef75", "name": "Flask mutation route `retry_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:332", "shortDescription": {"text": "Flask mutation route `retry_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:332"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b75ab59280c3da40", "name": "Flask mutation route `process_next_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:363", "shortDescription": {"text": "Flask mutation route `process_next_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:363"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-00c29d610370a778", "name": "Flask mutation route `finalize_course` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/finalize.py:", "shortDescription": {"text": "Flask mutation route `finalize_course` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/finalize.py:60"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d64ab0ddf53fb16f", "name": "Flask mutation route `delete_draft` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/finalize.py:94", "shortDescription": {"text": "Flask mutation route `delete_draft` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/finalize.py:94"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3ed321e05ede290e", "name": "Flask mutation route `generate_lessons` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:", "shortDescription": {"text": "Flask mutation route `generate_lessons` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:60"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aabdf461cbd1db0f", "name": "Flask mutation route `generate_lessons_for_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate", "shortDescription": {"text": "Flask mutation route `generate_lessons_for_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:101"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a6b2a0af94647ec1", "name": "Flask mutation route `generate_lesson_content_all` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/", "shortDescription": {"text": "Flask mutation route `generate_lesson_content_all` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:136"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0c5bf740247eb4cb", "name": "Flask mutation route `generate_lesson_content_single` without `@login_required` \u2014 backend/routes/admin/curriculum_genera", "shortDescription": {"text": "Flask mutation route `generate_lesson_content_single` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:182"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-71a16e41af40e5b1", "name": "Flask mutation route `regenerate_lesson` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py", "shortDescription": {"text": "Flask mutation route `regenerate_lesson` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:224"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-391aa57b71dab684", "name": "Flask mutation route `save_lesson` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:283", "shortDescription": {"text": "Flask mutation route `save_lesson` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:283"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7fe690d8dae88de7", "name": "Flask mutation route `add_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/project.py:60", "shortDescription": {"text": "Flask mutation route `add_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/project.py:60"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-441188fe62947cde", "name": "Flask mutation route `update_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/project.py:15", "shortDescription": {"text": "Flask mutation route `update_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/project.py:151"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-302308bdc821b6be", "name": "Flask mutation route `delete_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/project.py:19", "shortDescription": {"text": "Flask mutation route `delete_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/project.py:195"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-973fd1c8dc899ddf", "name": "Flask mutation route `admin_create_link` without `@login_required` \u2014 backend/routes/parent_linking/admin.py:45", "shortDescription": {"text": "Flask mutation route `admin_create_link` without `@login_required` \u2014 backend/routes/parent_linking/admin.py:45"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-46e504da91565bb6", "name": "Flask mutation route `admin_delete_link` without `@login_required` \u2014 backend/routes/parent_linking/admin.py:116", "shortDescription": {"text": "Flask mutation route `admin_delete_link` without `@login_required` \u2014 backend/routes/parent_linking/admin.py:116"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-327732b12901c230", "name": "Flask mutation route `submit_connection_requests` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:", "shortDescription": {"text": "Flask mutation route `submit_connection_requests` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:45"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5e8e0e8e9ffa746c", "name": "Flask mutation route `approve_connection_request` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:", "shortDescription": {"text": "Flask mutation route `approve_connection_request` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:239"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-afe6e2797a27677b", "name": "Flask mutation route `reject_connection_request` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:2", "shortDescription": {"text": "Flask mutation route `reject_connection_request` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:293"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-37b9eea6ccc08565", "name": "Flask mutation route `promote_observer_to_parent` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:", "shortDescription": {"text": "Flask mutation route `promote_observer_to_parent` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:350"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9a5e7a9e06e87ab2", "name": "Flask mutation route `end_quest` without `@login_required` \u2014 backend/routes/quest/completion.py:422", "shortDescription": {"text": "Flask mutation route `end_quest` without `@login_required` \u2014 backend/routes/quest/completion.py:422"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-43ac405af93bf979", "name": "Flask mutation route `reopen_quest` without `@login_required` \u2014 backend/routes/quest/completion.py:645", "shortDescription": {"text": "Flask mutation route `reopen_quest` without `@login_required` \u2014 backend/routes/quest/completion.py:645"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d8ea92dcdc892ee", "name": "Flask mutation route `reorder_quest_tasks` without `@login_required` \u2014 backend/routes/quest/completion.py:707", "shortDescription": {"text": "Flask mutation route `reorder_quest_tasks` without `@login_required` \u2014 backend/routes/quest/completion.py:707"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9c811cf54ccea9c3", "name": "Flask mutation route `update_display_mode` without `@login_required` \u2014 backend/routes/quest/completion.py:776", "shortDescription": {"text": "Flask mutation route `update_display_mode` without `@login_required` \u2014 backend/routes/quest/completion.py:776"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ff7625a1762a4c77", "name": "Flask mutation route `class_task_suggestions` without `@login_required` \u2014 backend/routes/quest/classes.py:30", "shortDescription": {"text": "Flask mutation route `class_task_suggestions` without `@login_required` \u2014 backend/routes/quest/classes.py:30"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-83f63e0d5efda770", "name": "Flask mutation route `submit_class_for_review` without `@login_required` \u2014 backend/routes/quest/classes.py:219", "shortDescription": {"text": "Flask mutation route `submit_class_for_review` without `@login_required` \u2014 backend/routes/quest/classes.py:219"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f3b1e4e00a955c6b", "name": "Flask mutation route `backfill_quest_topics` without `@login_required` \u2014 backend/routes/quest/listing.py:410", "shortDescription": {"text": "Flask mutation route `backfill_quest_topics` without `@login_required` \u2014 backend/routes/quest/listing.py:410"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f50e3593302e5042", "name": "Flask mutation route `enroll_in_quest` without `@login_required` \u2014 backend/routes/quest/enrollment.py:24", "shortDescription": {"text": "Flask mutation route `enroll_in_quest` without `@login_required` \u2014 backend/routes/quest/enrollment.py:24"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5bbc9650b74a2960", "name": "Flask mutation route `create_user_quest` without `@login_required` \u2014 backend/routes/quest/enrollment.py:481", "shortDescription": {"text": "Flask mutation route `create_user_quest` without `@login_required` \u2014 backend/routes/quest/enrollment.py:481"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-96fa000ef7c05503", "name": "Flask mutation route `mark_kickoff_attended` without `@login_required` \u2014 backend/routes/courses/kickoff.py:81", "shortDescription": {"text": "Flask mutation route `mark_kickoff_attended` without `@login_required` \u2014 backend/routes/courses/kickoff.py:81"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e11e28a4203c97e9", "name": "Flask mutation route `add_quest_to_course` without `@login_required` \u2014 backend/routes/courses/quests.py:81", "shortDescription": {"text": "Flask mutation route `add_quest_to_course` without `@login_required` \u2014 backend/routes/courses/quests.py:81"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-058724498eb9bdbc", "name": "Flask mutation route `remove_quest_from_course` without `@login_required` \u2014 backend/routes/courses/quests.py:158", "shortDescription": {"text": "Flask mutation route `remove_quest_from_course` without `@login_required` \u2014 backend/routes/courses/quests.py:158"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-067ba610c0f206c0", "name": "Flask mutation route `update_course_quest` without `@login_required` \u2014 backend/routes/courses/quests.py:242", "shortDescription": {"text": "Flask mutation route `update_course_quest` without `@login_required` \u2014 backend/routes/courses/quests.py:242"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-faf1df39ec04c9d3", "name": "Flask mutation route `update_project_details` without `@login_required` \u2014 backend/routes/courses/quests.py:317", "shortDescription": {"text": "Flask mutation route `update_project_details` without `@login_required` \u2014 backend/routes/courses/quests.py:317"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ffdca9ee94145317", "name": "Flask mutation route `reorder_course_quests` without `@login_required` \u2014 backend/routes/courses/quests.py:421", "shortDescription": {"text": "Flask mutation route `reorder_course_quests` without `@login_required` \u2014 backend/routes/courses/quests.py:421"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1f1b02f0c0839b29", "name": "Flask mutation route `publish_course` without `@login_required` \u2014 backend/routes/courses/publishing.py:28", "shortDescription": {"text": "Flask mutation route `publish_course` without `@login_required` \u2014 backend/routes/courses/publishing.py:28"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b41c304add736690", "name": "Flask mutation route `create_course` without `@login_required` \u2014 backend/routes/courses/crud.py:167", "shortDescription": {"text": "Flask mutation route `create_course` without `@login_required` \u2014 backend/routes/courses/crud.py:167"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f67caf829f09e177", "name": "Flask mutation route `create_course` without `@login_required` \u2014 backend/routes/courses/crud.py:168", "shortDescription": {"text": "Flask mutation route `create_course` without `@login_required` \u2014 backend/routes/courses/crud.py:168"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9a13f3d41767645e", "name": "Flask mutation route `update_course` without `@login_required` \u2014 backend/routes/courses/crud.py:312", "shortDescription": {"text": "Flask mutation route `update_course` without `@login_required` \u2014 backend/routes/courses/crud.py:312"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8d7568e2ea899616", "name": "Flask mutation route `generate_showcase_fields` without `@login_required` \u2014 backend/routes/courses/crud.py:440", "shortDescription": {"text": "Flask mutation route `generate_showcase_fields` without `@login_required` \u2014 backend/routes/courses/crud.py:440"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d49d3312e1c32cde", "name": "Flask mutation route `generate_course_cover_image` without `@login_required` \u2014 backend/routes/courses/crud.py:521", "shortDescription": {"text": "Flask mutation route `generate_course_cover_image` without `@login_required` \u2014 backend/routes/courses/crud.py:521"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-15f9661370ed87e0", "name": "Flask mutation route `upload_course_cover_image` without `@login_required` \u2014 backend/routes/courses/crud.py:572", "shortDescription": {"text": "Flask mutation route `upload_course_cover_image` without `@login_required` \u2014 backend/routes/courses/crud.py:572"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-98575e45b1e5f275", "name": "Flask mutation route `upload_quest_header_image` without `@login_required` \u2014 backend/routes/courses/crud.py:642", "shortDescription": {"text": "Flask mutation route `upload_quest_header_image` without `@login_required` \u2014 backend/routes/courses/crud.py:642"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7aed4c5b3aacc7cb", "name": "Flask mutation route `delete_course` without `@login_required` \u2014 backend/routes/courses/crud.py:714", "shortDescription": {"text": "Flask mutation route `delete_course` without `@login_required` \u2014 backend/routes/courses/crud.py:714"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-776c2ccd7179ecae", "name": "Flask mutation route `enroll_in_course` without `@login_required` \u2014 backend/routes/courses/enrollment.py:29", "shortDescription": {"text": "Flask mutation route `enroll_in_course` without `@login_required` \u2014 backend/routes/courses/enrollment.py:29"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e5755fbc245b269f", "name": "Flask mutation route `unenroll_from_course` without `@login_required` \u2014 backend/routes/courses/enrollment.py:198", "shortDescription": {"text": "Flask mutation route `unenroll_from_course` without `@login_required` \u2014 backend/routes/courses/enrollment.py:198"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-960f1835d1ad2ade", "name": "Flask mutation route `end_course` without `@login_required` \u2014 backend/routes/courses/enrollment.py:273", "shortDescription": {"text": "Flask mutation route `end_course` without `@login_required` \u2014 backend/routes/courses/enrollment.py:273"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-382e20574046748f", "name": "Flask mutation route `create_invite` without `@login_required` \u2014 backend/routes/courses/invites.py:31", "shortDescription": {"text": "Flask mutation route `create_invite` without `@login_required` \u2014 backend/routes/courses/invites.py:31"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3bcd731c94e2a6ca", "name": "Flask mutation route `revoke_invite` without `@login_required` \u2014 backend/routes/courses/invites.py:130", "shortDescription": {"text": "Flask mutation route `revoke_invite` without `@login_required` \u2014 backend/routes/courses/invites.py:130"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-970ff8e83830fa82", "name": "Flask mutation route `generate_ai_tasks` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:48", "shortDescription": {"text": "Flask mutation route `generate_ai_tasks` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:48"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5085bce0707a20a9", "name": "Flask mutation route `activate_task` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:219", "shortDescription": {"text": "Flask mutation route `activate_task` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:219"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a8ca3131a372f951", "name": "Flask mutation route `link_task_to_lesson` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:317", "shortDescription": {"text": "Flask mutation route `link_task_to_lesson` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:317"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-67df153df4e44579", "name": "Flask mutation route `unlink_task_from_lesson` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:359", "shortDescription": {"text": "Flask mutation route `unlink_task_from_lesson` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:359"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-db1791b15b8e7134", "name": "Flask mutation route `create_curriculum_tasks` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:390", "shortDescription": {"text": "Flask mutation route `create_curriculum_tasks` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:390"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b9ba92cfe5845e5", "name": "Flask mutation route `create_lesson` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:48", "shortDescription": {"text": "Flask mutation route `create_lesson` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:48"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e6c53c0148d63389", "name": "Flask mutation route `update_lesson` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:181", "shortDescription": {"text": "Flask mutation route `update_lesson` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:181"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4aa00e97504dbb11", "name": "Flask mutation route `delete_lesson` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:223", "shortDescription": {"text": "Flask mutation route `delete_lesson` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:223"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-406470e774f9003a", "name": "Flask mutation route `move_lesson_to_project` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:256", "shortDescription": {"text": "Flask mutation route `move_lesson_to_project` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:256"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-91d2334e871392e6", "name": "Flask mutation route `reorder_lessons` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:329", "shortDescription": {"text": "Flask mutation route `reorder_lessons` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:329"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1da63c34b6573bf3", "name": "Flask mutation route `save_curriculum` without `@login_required` \u2014 backend/routes/curriculum/core.py:82", "shortDescription": {"text": "Flask mutation route `save_curriculum` without `@login_required` \u2014 backend/routes/curriculum/core.py:82"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8b24c63573f642eb", "name": "Flask mutation route `update_lesson_progress` without `@login_required` \u2014 backend/routes/curriculum/progress.py:79", "shortDescription": {"text": "Flask mutation route `update_lesson_progress` without `@login_required` \u2014 backend/routes/curriculum/progress.py:79"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f1c226a1b66d1ba", "name": "Flask mutation route `delete_lesson_progress` without `@login_required` \u2014 backend/routes/curriculum/progress.py:133", "shortDescription": {"text": "Flask mutation route `delete_lesson_progress` without `@login_required` \u2014 backend/routes/curriculum/progress.py:133"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-037f80e9c51e3519", "name": "Flask mutation route `upload_attachment` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:48", "shortDescription": {"text": "Flask mutation route `upload_attachment` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:48"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-557979d140e76f1b", "name": "Flask mutation route `upload_image` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:128", "shortDescription": {"text": "Flask mutation route `upload_image` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:128"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f5a04f332e496aca", "name": "Flask mutation route `rename_attachment` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:181", "shortDescription": {"text": "Flask mutation route `rename_attachment` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:181"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c3434466c6bd8628", "name": "Flask mutation route `delete_attachment` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:231", "shortDescription": {"text": "Flask mutation route `delete_attachment` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:231"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-42aa562c2b65bd4b", "name": "Flask mutation route `respond_to_visibility_request` without `@login_required` \u2014 backend/routes/parental_consent/visibil", "shortDescription": {"text": "Flask mutation route `respond_to_visibility_request` without `@login_required` \u2014 backend/routes/parental_consent/visibility.py:119"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ecbbad47eebc3596", "name": "Flask mutation route `approve_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/admin_review", "shortDescription": {"text": "Flask mutation route `approve_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/admin_review.py:113"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-064731d306c35ba5", "name": "Flask mutation route `reject_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/admin_review.", "shortDescription": {"text": "Flask mutation route `reject_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/admin_review.py:194"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-157aef6fcd882f6c", "name": "Flask mutation route `send_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/requests.py:65", "shortDescription": {"text": "Flask mutation route `send_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/requests.py:65"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-452fa63aea63f9f3", "name": "Flask mutation route `verify_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/requests.py:1", "shortDescription": {"text": "Flask mutation route `verify_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/requests.py:148"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fb7e2110a0e6d555", "name": "Flask mutation route `resend_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/requests.py:2", "shortDescription": {"text": "Flask mutation route `resend_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/requests.py:237"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ff870d511b8b293b", "name": "Flask mutation route `submit_consent_documents` without `@login_required` \u2014 backend/routes/parental_consent/documents.py", "shortDescription": {"text": "Flask mutation route `submit_consent_documents` without `@login_required` \u2014 backend/routes/parental_consent/documents.py:65"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65cc9040a70cd2de", "name": "Flask mutation route `create_student_learning_moment` without `@login_required` \u2014 backend/routes/advisor/learning_moment", "shortDescription": {"text": "Flask mutation route `create_student_learning_moment` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:19"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-de2b9896df0deb8d", "name": "Flask mutation route `upload_moment_media` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:157", "shortDescription": {"text": "Flask mutation route `upload_moment_media` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:157"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4d19ee4d7832af8d", "name": "Flask mutation route `init_moment_signed_upload` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:", "shortDescription": {"text": "Flask mutation route `init_moment_signed_upload` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:201"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-792bd4a5bb5eb145", "name": "Flask mutation route `finalize_moment_signed_upload` without `@login_required` \u2014 backend/routes/advisor/learning_moments", "shortDescription": {"text": "Flask mutation route `finalize_moment_signed_upload` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:240"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c86f83f3e1d4d75b", "name": "Flask mutation route `update_student_learning_moment` without `@login_required` \u2014 backend/routes/advisor/learning_moment", "shortDescription": {"text": "Flask mutation route `update_student_learning_moment` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:364"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4e7a58cd499157c3", "name": "Flask mutation route `delete_student_learning_moment` without `@login_required` \u2014 backend/routes/advisor/learning_moment", "shortDescription": {"text": "Flask mutation route `delete_student_learning_moment` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:443"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`backend/app.py` declares `ANY /` 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-8ece8c987ff9c424", "name": "Unused endpoint: ANY /api/health", "shortDescription": {"text": "Unused endpoint: ANY /api/health"}, "fullDescription": {"text": "`backend/app.py` declares `ANY /api/health` 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-8f9078a196c76715", "name": "Unused endpoint: ANY /csrf-token", "shortDescription": {"text": "Unused endpoint: ANY /csrf-token"}, "fullDescription": {"text": "`backend/app.py` declares `ANY /csrf-token` 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-c3e511781c514a67", "name": "Unused endpoint: ANY /api/health/memory", "shortDescription": {"text": "Unused endpoint: ANY /api/health/memory"}, "fullDescription": {"text": "`backend/middleware/memory_monitor.py` declares `ANY /api/health/memory` 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-bf6b3c61dc77380a", "name": "Unused endpoint: ANY /unread-count", "shortDescription": {"text": "Unused endpoint: ANY /unread-count"}, "fullDescription": {"text": "`backend/routes/notifications.py` declares `ANY /unread-count` 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-356c424001ac6c47", "name": "Unused endpoint: ANY /<notification_id>/read", "shortDescription": {"text": "Unused endpoint: ANY /<notification_id>/read"}, "fullDescription": {"text": "`backend/routes/notifications.py` declares `ANY /<notification_id>/read` 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-c7e6ce38c8d4a362", "name": "Unused endpoint: ANY /mark-all-read", "shortDescription": {"text": "Unused endpoint: ANY /mark-all-read"}, "fullDescription": {"text": "`backend/routes/notifications.py` declares `ANY /mark-all-read` 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-44aa1676480e8118", "name": "Unused endpoint: ANY /<notification_id>", "shortDescription": {"text": "Unused endpoint: ANY /<notification_id>"}, "fullDescription": {"text": "`backend/routes/notifications.py` declares `ANY /<notification_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-9e8271584188dedb", "name": "Unused endpoint: ANY /delete-all", "shortDescription": {"text": "Unused endpoint: ANY /delete-all"}, "fullDescription": {"text": "`backend/routes/notifications.py` declares `ANY /delete-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-3bf0af9b202498f6", "name": "Unused endpoint: ANY /send", "shortDescription": {"text": "Unused endpoint: ANY /send"}, "fullDescription": {"text": "`backend/routes/notifications.py` declares `ANY /send` 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-31e40ac64ab0fdec", "name": "Unused endpoint: ANY /preferences", "shortDescription": {"text": "Unused endpoint: ANY /preferences"}, "fullDescription": {"text": "`backend/routes/notifications.py` declares `ANY /preferences` 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-4ff7cc8419d53d58", "name": "Unused endpoint: ANY /broadcast", "shortDescription": {"text": "Unused endpoint: ANY /broadcast"}, "fullDescription": {"text": "`backend/routes/notifications.py` declares `ANY /broadcast` 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-9c185f8e457dd425", "name": "Unused endpoint: ANY /users/delete-account", "shortDescription": {"text": "Unused endpoint: ANY /users/delete-account"}, "fullDescription": {"text": "`backend/routes/account_deletion.py` declares `ANY /users/delete-account` 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-eb05a6cb360a61d5", "name": "Unused endpoint: ANY /users/cancel-deletion", "shortDescription": {"text": "Unused endpoint: ANY /users/cancel-deletion"}, "fullDescription": {"text": "`backend/routes/account_deletion.py` declares `ANY /users/cancel-deletion` 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-3c70245bc00543f2", "name": "Unused endpoint: ANY /users/deletion-status", "shortDescription": {"text": "Unused endpoint: ANY /users/deletion-status"}, "fullDescription": {"text": "`backend/routes/account_deletion.py` declares `ANY /users/deletion-status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-24458e8ba8fc3a73", "name": "Unused endpoint: ANY /users/export-data", "shortDescription": {"text": "Unused endpoint: ANY /users/export-data"}, "fullDescription": {"text": "`backend/routes/account_deletion.py` declares `ANY /users/export-data` 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-fe8fb15414841eb5", "name": "Unused endpoint: ANY /users/delete-account-permanent", "shortDescription": {"text": "Unused endpoint: ANY /users/delete-account-permanent"}, "fullDescription": {"text": "`backend/routes/account_deletion.py` declares `ANY /users/delete-account-permanent` 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-434ffefbcc20ad6c", "name": "Unused endpoint: ANY /pillars", "shortDescription": {"text": "Unused endpoint: ANY /pillars"}, "fullDescription": {"text": "`backend/routes/pillars.py` declares `ANY /pillars` 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-3b32aa92a76acf48", "name": "Unused endpoint: ANY /pillars/<pillar_key>", "shortDescription": {"text": "Unused endpoint: ANY /pillars/<pillar_key>"}, "fullDescription": {"text": "`backend/routes/pillars.py` declares `ANY /pillars/<pillar_key>` 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-974c85f0193c5491", "name": "Unused endpoint: ANY /pillars/validate/<pillar_key>", "shortDescription": {"text": "Unused endpoint: ANY /pillars/validate/<pillar_key>"}, "fullDescription": {"text": "`backend/routes/pillars.py` declares `ANY /pillars/validate/<pillar_key>` 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-baebe42c1606eaf4", "name": "Unused endpoint: ANY /home", "shortDescription": {"text": "Unused endpoint: ANY /home"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /home` 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-d62eec5460d767d4", "name": "Unused endpoint: ANY /quests", "shortDescription": {"text": "Unused endpoint: ANY /quests"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /quests` 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-243f53e43b32e9c4", "name": "Unused endpoint: ANY /signals", "shortDescription": {"text": "Unused endpoint: ANY /signals"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /signals` 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-5c9e0c8aa7c00837", "name": "Unused endpoint: ANY /signals/<signal_id>/resolve", "shortDescription": {"text": "Unused endpoint: ANY /signals/<signal_id>/resolve"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /signals/<signal_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-40dab092926bc636", "name": "Unused endpoint: ANY /students", "shortDescription": {"text": "Unused endpoint: ANY /students"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /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-1ff87a911dc46b6a", "name": "Unused endpoint: ANY /pins", "shortDescription": {"text": "Unused endpoint: ANY /pins"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /pins` 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-aaaea17d80be2d8c", "name": "Unused endpoint: ANY /pins/mark", "shortDescription": {"text": "Unused endpoint: ANY /pins/mark"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /pins/mark` 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-6b92323ac12d132a", "name": "Unused endpoint: ANY /students/<student_id>/balance", "shortDescription": {"text": "Unused endpoint: ANY /students/<student_id>/balance"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /students/<student_id>/balance` 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-0aa922526dc78343", "name": "Unused endpoint: ANY /students/<student_id>/balance/adjust", "shortDescription": {"text": "Unused endpoint: ANY /students/<student_id>/balance/adjust"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /students/<student_id>/balance/adjust` 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-7b3e7452e656316e", "name": "Unused endpoint: ANY /showcase/events", "shortDescription": {"text": "Unused endpoint: ANY /showcase/events"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /showcase/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-3c97ba449653ee1d", "name": "Unused endpoint: ANY /showcase/events/<event_id>", "shortDescription": {"text": "Unused endpoint: ANY /showcase/events/<event_id>"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /showcase/events/<event_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-e5d5abfbc8e8100a", "name": "Unused endpoint: ANY /showcase/events/<event_id>/roster", "shortDescription": {"text": "Unused endpoint: ANY /showcase/events/<event_id>/roster"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /showcase/events/<event_id>/roster` 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-10e8704ac9fac2f8", "name": "Unused endpoint: ANY /showcase/events/<event_id>/join", "shortDescription": {"text": "Unused endpoint: ANY /showcase/events/<event_id>/join"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /showcase/events/<event_id>/join` 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-0648a051866ddfde", "name": "Unused endpoint: ANY /kiosk/devices", "shortDescription": {"text": "Unused endpoint: ANY /kiosk/devices"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /kiosk/devices` 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-a3c5830efa311d93", "name": "Unused endpoint: ANY /kiosk/roster", "shortDescription": {"text": "Unused endpoint: ANY /kiosk/roster"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /kiosk/roster` 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-339dc832893e730d", "name": "Unused endpoint: ANY /kiosk/login", "shortDescription": {"text": "Unused endpoint: ANY /kiosk/login"}, "fullDescription": {"text": "`backend/routes/treehouse.py` declares `ANY /kiosk/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-dcc9969b51c3eb1a", "name": "Unused endpoint: ANY /enhance", "shortDescription": {"text": "Unused endpoint: ANY /enhance"}, "fullDescription": {"text": "`backend/routes/curriculum_enhance.py` declares `ANY /enhance` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a87050a57ffb05d5", "name": "Unused endpoint: ANY /<quest_id>/start-personalization", "shortDescription": {"text": "Unused endpoint: ANY /<quest_id>/start-personalization"}, "fullDescription": {"text": "`backend/routes/quest_personalization.py` declares `ANY /<quest_id>/start-personalization` 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-1ad942c3e466642c", "name": "Unused endpoint: ANY /<quest_id>/generate-tasks", "shortDescription": {"text": "Unused endpoint: ANY /<quest_id>/generate-tasks"}, "fullDescription": {"text": "`backend/routes/quest_personalization.py` declares `ANY /<quest_id>/generate-tasks` 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-570effe7ff1bbddd", "name": "Unused endpoint: ANY /<quest_id>/refine-tasks", "shortDescription": {"text": "Unused endpoint: ANY /<quest_id>/refine-tasks"}, "fullDescription": {"text": "`backend/routes/quest_personalization.py` declares `ANY /<quest_id>/refine-tasks` 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-7b91c0e8f5e87308", "name": "Unused endpoint: ANY /<quest_id>/edit-task", "shortDescription": {"text": "Unused endpoint: ANY /<quest_id>/edit-task"}, "fullDescription": {"text": "`backend/routes/quest_personalization.py` declares `ANY /<quest_id>/edit-task` 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-deeda44048b18868", "name": "Unused endpoint: ANY /<quest_id>/analyze-manual-task", "shortDescription": {"text": "Unused endpoint: ANY /<quest_id>/analyze-manual-task"}, "fullDescription": {"text": "`backend/routes/quest_personalization.py` declares `ANY /<quest_id>/analyze-manual-task` 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-8e7e280178d496f6", "name": "Unused endpoint: ANY /<quest_id>/add-manual-tasks", "shortDescription": {"text": "Unused endpoint: ANY /<quest_id>/add-manual-tasks"}, "fullDescription": {"text": "`backend/routes/quest_personalization.py` declares `ANY /<quest_id>/add-manual-tasks` 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-f7c70500765bd133", "name": "Unused endpoint: ANY /<quest_id>/finalize-tasks", "shortDescription": {"text": "Unused endpoint: ANY /<quest_id>/finalize-tasks"}, "fullDescription": {"text": "`backend/routes/quest_personalization.py` declares `ANY /<quest_id>/finalize-tasks` 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-edf975342a9eae65", "name": "Unused endpoint: ANY /<quest_id>/personalization/accept-task", "shortDescription": {"text": "Unused endpoint: ANY /<quest_id>/personalization/accept-task"}, "fullDescription": {"text": "`backend/routes/quest_personalization.py` declares `ANY /<quest_id>/personalization/accept-task` 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-fda2f436ac1290a6", "name": "Unused endpoint: ANY /<quest_id>/personalization/skip-task", "shortDescription": {"text": "Unused endpoint: ANY /<quest_id>/personalization/skip-task"}, "fullDescription": {"text": "`backend/routes/quest_personalization.py` declares `ANY /<quest_id>/personalization/skip-task` 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-d50a731befaad055", "name": "Unused endpoint: ANY /<quest_id>/personalization-status", "shortDescription": {"text": "Unused endpoint: ANY /<quest_id>/personalization-status"}, "fullDescription": {"text": "`backend/routes/quest_personalization.py` declares `ANY /<quest_id>/personalization-status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81af1c2152952965", "name": "Unused endpoint: ANY /search-quest", "shortDescription": {"text": "Unused endpoint: ANY /search-quest"}, "fullDescription": {"text": "`backend/routes/images.py` declares `ANY /search-quest` 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-a4fd78cfc9522311", "name": "Unused endpoint: ANY /generate", "shortDescription": {"text": "Unused endpoint: ANY /generate"}, "fullDescription": {"text": "`backend/routes/quest_ai.py` declares `ANY /generate` 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-98cc4fc4637ea99d", "name": "Unused endpoint: ANY /suggest-tasks", "shortDescription": {"text": "Unused endpoint: ANY /suggest-tasks"}, "fullDescription": {"text": "`backend/routes/quest_ai.py` declares `ANY /suggest-tasks` 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/19568"}, "properties": {"repository": "shortbird/pathweaver_2.0", "repoUrl": "https://github.com/shortbird/pathweaver_2.0", "branch": "main"}, "results": [{"ruleId": "scanner-6919543de5e8c458", "level": "note", "message": {"text": "Possibly dead Python function: replace_auth"}, "properties": {"repobilityId": "d166d82ab30cb8f9", "scanner": "scanner-primary", "fingerprint": "6919543de5e8c458", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/fix_auth.py:11"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2f4924c09c70c0ec", "level": "note", "message": {"text": "Possibly dead Python function: footer"}, "properties": {"repobilityId": "9f0be3db8aae782f", "scanner": "scanner-primary", "fingerprint": "2f4924c09c70c0ec", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_disclosure_pdfs.py:78"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-26e7b930013fe201", "level": "note", "message": {"text": "Possibly dead Python function: handle_optio_exceptions"}, "properties": {"repobilityId": "6512c90ed6e93efb", "scanner": "scanner-primary", "fingerprint": "26e7b930013fe201", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/exceptions.py:510"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ef5a93360724be42", "level": "note", "message": {"text": "Possibly dead Python function: cleanup_expired"}, "properties": {"repobilityId": "98ee9ab532cc8ab3", "scanner": "scanner-primary", "fingerprint": "ef5a93360724be42", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/cache.py:45"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b41d9831ef835bce", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "b41d9831ef835bce", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/cache.py:65"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-01fec0352224526d", "level": "note", "message": {"text": "Possibly dead Python function: when_ready"}, "properties": {"repobilityId": "df01800f5374b1e5", "scanner": "scanner-primary", "fingerprint": "01fec0352224526d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gunicorn.conf.py:74"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-57527694d9c45cc6", "level": "note", "message": {"text": "Possibly dead Python function: worker_int"}, "properties": {"repobilityId": "0228d46359b5edc3", "scanner": "scanner-primary", "fingerprint": "57527694d9c45cc6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gunicorn.conf.py:78"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9b9eef234128434c", "level": "note", "message": {"text": "Possibly dead Python function: pre_fork"}, "properties": {"repobilityId": "a6eb819c75b48281", "scanner": "scanner-primary", "fingerprint": "9b9eef234128434c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gunicorn.conf.py:82"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-73e46c813b288758", "level": "note", "message": {"text": "Possibly dead Python function: post_fork"}, "properties": {"repobilityId": "9a8de6da8a28d13c", "scanner": "scanner-primary", "fingerprint": "73e46c813b288758", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gunicorn.conf.py:86"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0e827c484f0e2c8a", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "0e827c484f0e2c8a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/rate_limiter.py:374"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-46c233bef5a1e719", "level": "note", "message": {"text": "Possibly dead Python function: apply_rate_limiting_to_blueprint"}, "properties": {"repobilityId": "04ee2ba1e389dfe6", "scanner": "scanner-primary", "fingerprint": "46c233bef5a1e719", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/rate_limiter.py:445"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a715498ee05905b", "level": "note", "message": {"text": "Possibly dead Python function: add_rate_limit_headers"}, "properties": {"repobilityId": "1a8e6fedecbb393c", "scanner": "scanner-primary", "fingerprint": "7a715498ee05905b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/rate_limiter.py:451"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dc37becad89e3acd", "level": "note", "message": {"text": "Possibly dead Python function: audit_log"}, "properties": {"repobilityId": "59a73a0225585e9e", "scanner": "scanner-primary", "fingerprint": "dc37becad89e3acd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/audit_logger.py:17"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ec341c375173b914", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "ec341c375173b914", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/audit_logger.py:45"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4cf9716632313d0e", "level": "note", "message": {"text": "Possibly dead Python function: log_admin_action"}, "properties": {"repobilityId": "0977e7a3736ad180", "scanner": "scanner-primary", "fingerprint": "4cf9716632313d0e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/audit_logger.py:113"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-af38dafbc18be956", "level": "note", "message": {"text": "Possibly dead Python function: cleanup_context"}, "properties": {"repobilityId": "162d2934a32c35a2", "scanner": "scanner-primary", "fingerprint": "af38dafbc18be956", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/memory_monitor.py:95"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1dd112b263d3f85e", "level": "note", "message": {"text": "Possibly dead Python function: validate_csrf_token"}, "properties": {"repobilityId": "026ade433572de80", "scanner": "scanner-primary", "fingerprint": "1dd112b263d3f85e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/csrf_protection.py:115"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c6c0677d15836c51", "level": "note", "message": {"text": "Possibly dead Python function: add_request_id"}, "properties": {"repobilityId": "dd9910ee23ecb7e9", "scanner": "scanner-primary", "fingerprint": "c6c0677d15836c51", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/error_handler.py:141"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a57aff0624aeb62a", "level": "note", "message": {"text": "Possibly dead Python function: handle_app_error"}, "properties": {"repobilityId": "e4bd0ade7840b442", "scanner": "scanner-primary", "fingerprint": "a57aff0624aeb62a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/error_handler.py:155"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-30b9b3d7ac004f83", "level": "note", "message": {"text": "Possibly dead Python function: handle_http_error"}, "properties": {"repobilityId": "d9562e3d2989a7e3", "scanner": "scanner-primary", "fingerprint": "30b9b3d7ac004f83", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/error_handler.py:167"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-65d8aa438117e1b2", "level": "note", "message": {"text": "Possibly dead Python function: handle_generic_error"}, "properties": {"repobilityId": "96c3ff168437aba3", "scanner": "scanner-primary", "fingerprint": "65d8aa438117e1b2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/middleware/error_handler.py:178"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e1c182735ff34afb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/vite.config.js:35"}, "properties": {"repobilityId": "c5eba1bf370541f0", "scanner": "scanner-primary", "fingerprint": "e1c182735ff34afb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9acd8cba9a0c3d2a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/migrate-icons.js:310"}, "properties": {"repobilityId": "5b83a39ecd9aa199", "scanner": "scanner-primary", "fingerprint": "9acd8cba9a0c3d2a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e766e85c688aa4d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/fix-unmapped-icons.js:84"}, "properties": {"repobilityId": "e5012db975a302d9", "scanner": "scanner-primary", "fingerprint": "0e766e85c688aa4d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1a9d9857fcf4e6f6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/scripts/refactor-modals.js:57"}, "properties": {"repobilityId": "228eb28cc7c3b27a", "scanner": "scanner-primary", "fingerprint": "1a9d9857fcf4e6f6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-046147e1e01d0893", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/public/sw.js:16"}, "properties": {"repobilityId": "27dc6e6fcac3502d", "scanner": "scanner-primary", "fingerprint": "046147e1e01d0893", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-50ffbfb7045dc551", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/public/generate-icons.js:24"}, "properties": {"repobilityId": "af9738f799a0f36c", "scanner": "scanner-primary", "fingerprint": "50ffbfb7045dc551", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4f8478d524856cbb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/main.jsx:19"}, "properties": {"repobilityId": "c88b1d5a41c77725", "scanner": "scanner-primary", "fingerprint": "4f8478d524856cbb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b72c4254a714d22c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/utils/logger.js:36"}, "properties": {"repobilityId": "ae0a58671b6d0a9a", "scanner": "scanner-primary", "fingerprint": "b72c4254a714d22c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b6d550d5180c10d5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/utils/sanitize.js:61"}, "properties": {"repobilityId": "4f01bf63bb864675", "scanner": "scanner-primary", "fingerprint": "b6d550d5180c10d5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-86fad3d3a171e41f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/utils/__tests__/dangerouslySetInnerHTML.lint.test.js:2"}, "properties": {"repobilityId": "a2334fa1ae2bc0ba", "scanner": "scanner-primary", "fingerprint": "86fad3d3a171e41f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0007eee394d3c138", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CoursePreview.jsx:110"}, "properties": {"repobilityId": "12dfef96e6d793ab", "scanner": "scanner-primary", "fingerprint": "0007eee394d3c138", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae5a50d046315d8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/LessonEditor.jsx:181"}, "properties": {"repobilityId": "4869a9dec9524ea8", "scanner": "scanner-primary", "fingerprint": "ae5a50d046315d8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d65826953d54aaf0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SimilarQuestAutocomplete.jsx:138"}, "properties": {"repobilityId": "e2d9889e113116f2", "scanner": "scanner-primary", "fingerprint": "d65826953d54aaf0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-538974d5e83c65a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/DemoPortfolio.jsx:93"}, "properties": {"repobilityId": "4b9fa8b88f36a328", "scanner": "scanner-primary", "fingerprint": "538974d5e83c65a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a0dbe20c23be899", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/demo/QuestSelector.jsx:147"}, "properties": {"repobilityId": "1adda1ac9e8ba5e0", "scanner": "scanner-primary", "fingerprint": "2a0dbe20c23be899", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b28049eeebf6c5c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ActingAsBanner.jsx:77"}, "properties": {"repobilityId": "ea908667e9840d1b", "scanner": "scanner-primary", "fingerprint": "4b28049eeebf6c5c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-156ad2343309c15f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ParentMessageViewer.jsx:166"}, "properties": {"repobilityId": "7fea48f8f8ad14d1", "scanner": "scanner-primary", "fingerprint": "156ad2343309c15f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-894a52641f096cb6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ParentConversationsViewer.jsx:217"}, "properties": {"repobilityId": "0940dd2a50b2ceb8", "scanner": "scanner-primary", "fingerprint": "894a52641f096cb6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1fb61cd6c68866a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/FamilyQuestChildSelector.jsx:102"}, "properties": {"repobilityId": "3f1aa35b31aaaf02", "scanner": "scanner-primary", "fingerprint": "1fb61cd6c68866a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02aa109f10bb8148", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/FamilySettingsModal.jsx:533"}, "properties": {"repobilityId": "dc900253d75184ca", "scanner": "scanner-primary", "fingerprint": "02aa109f10bb8148", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4814e867553996a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/ShowcaseFamilySection.jsx:113"}, "properties": {"repobilityId": "6db8db897c4d4d21", "scanner": "scanner-primary", "fingerprint": "4814e867553996a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-32783fa782b360ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/parent/DependentSettingsModal.jsx:711"}, "properties": {"repobilityId": "6761fa6a564b382e", "scanner": "scanner-primary", "fingerprint": "32783fa782b360ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-145deebbde2f16af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/docs/DocsSidebar.jsx:98"}, "properties": {"repobilityId": "6f42536d330d1ec2", "scanner": "scanner-primary", "fingerprint": "145deebbde2f16af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-faab7ea41e410a71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/shared/AttachmentPreviewList.jsx:47"}, "properties": {"repobilityId": "f7fbcbc6bb52b0c8", "scanner": "scanner-primary", "fingerprint": "faab7ea41e410a71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f3238dfff309331", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/StatsCard.jsx:117"}, "properties": {"repobilityId": "ff8ef07c50dcc2a1", "scanner": "scanner-primary", "fingerprint": "4f3238dfff309331", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d67c6ba4a8465507", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/EmptyStates.jsx:81"}, "properties": {"repobilityId": "9a3db772dc85849b", "scanner": "scanner-primary", "fingerprint": "d67c6ba4a8465507", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fdfab29111fc3de6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/SkillsChart.jsx:167"}, "properties": {"repobilityId": "2850252123a629a7", "scanner": "scanner-primary", "fingerprint": "fdfab29111fc3de6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a218e303b2337927", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 frontend/src/components/philosophy/MindMap.jsx:274"}, "properties": {"repobilityId": "347f09dbc2fd5071", "scanner": "scanner-primary", "fingerprint": "a218e303b2337927", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-b3e6225edd449083", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 frontend/src/components/philosophy/MindMap.jsx:273"}, "properties": {"repobilityId": "8a2536205b154056", "scanner": "scanner-primary", "fingerprint": "b3e6225edd449083", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-e4afb2b4f5885b7e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/philosophy/NodeDetailPanel.jsx:103"}, "properties": {"repobilityId": "6d779ae4d58ad71d", "scanner": "scanner-primary", "fingerprint": "e4afb2b4f5885b7e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-52b21480962677c2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/philosophy/PhilosophySEOFallback.jsx:31"}, "properties": {"repobilityId": "32c5b7d7f56b9fe0", "scanner": "scanner-primary", "fingerprint": "52b21480962677c2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d3a8bb921f1b316d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/philosophy/MobileMindMap.jsx:230"}, "properties": {"repobilityId": "68dd96e58c2fc538", "scanner": "scanner-primary", "fingerprint": "d3a8bb921f1b316d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-30ab0b3392155cb1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/lti/LtiEvidenceEditor.jsx:182"}, "properties": {"repobilityId": "f3b07d13470e5358", "scanner": "scanner-primary", "fingerprint": "30ab0b3392155cb1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f27dc8a23a7dbcf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/FeedCard.jsx:350"}, "properties": {"repobilityId": "6056561c5dacd427", "scanner": "scanner-primary", "fingerprint": "6f27dc8a23a7dbcf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aac40a55f05b1a22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/DocumentPreview.jsx:229"}, "properties": {"repobilityId": "4e17849b3d2b7ded", "scanner": "scanner-primary", "fingerprint": "aac40a55f05b1a22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49389b7f9eff5a3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/VideoLinkPreview.jsx:25"}, "properties": {"repobilityId": "4dd87fea8b756dbc", "scanner": "scanner-primary", "fingerprint": "49389b7f9eff5a3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-856da6d28f8b9d4f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/observer/LinkPreviewCard.jsx:119"}, "properties": {"repobilityId": "d78bf69c8ec395f4", "scanner": "scanner-primary", "fingerprint": "856da6d28f8b9d4f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5bf040d7e92e7f1f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tutor/ParentDashboard.jsx:282"}, "properties": {"repobilityId": "25dc0d69a065df13", "scanner": "scanner-primary", "fingerprint": "5bf040d7e92e7f1f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec7e071ec6236198", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/tutor/ChatInterface.jsx:363"}, "properties": {"repobilityId": "7fe7f8b833518757", "scanner": "scanner-primary", "fingerprint": "ec7e071ec6236198", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-abceb36dc609904a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tutor/ConversationHistory.jsx:134"}, "properties": {"repobilityId": "ba2ed6bbbca1ce99", "scanner": "scanner-primary", "fingerprint": "abceb36dc609904a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b487ce55cb13572c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence-report/ReportCard.jsx:86"}, "properties": {"repobilityId": "bfb1495e4dc85e27", "scanner": "scanner-primary", "fingerprint": "b487ce55cb13572c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0768826b24bdf833", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/AddQuestModal.jsx:290"}, "properties": {"repobilityId": "d18c64737ed60815", "scanner": "scanner-primary", "fingerprint": "0768826b24bdf833", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-133c4fb53603e448", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/StudentClassesView.jsx:128"}, "properties": {"repobilityId": "e173373a2e320b00", "scanner": "scanner-primary", "fingerprint": "133c4fb53603e448", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-711face676b56f56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/StudentAgenda.jsx:79"}, "properties": {"repobilityId": "f25fa158b3a791a5", "scanner": "scanner-primary", "fingerprint": "711face676b56f56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00ca1123bbaafa9b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/ClassAdvisorsTab.jsx:142"}, "properties": {"repobilityId": "16dc1ff7c53b8da2", "scanner": "scanner-primary", "fingerprint": "00ca1123bbaafa9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ab57533d5f0f4ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/ClassCard.jsx:40"}, "properties": {"repobilityId": "1092f300e4e6939b", "scanner": "scanner-primary", "fingerprint": "9ab57533d5f0f4ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36b5f911c4df31da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/AddStudentsModal.jsx:198"}, "properties": {"repobilityId": "f2776301ab7ca5e4", "scanner": "scanner-primary", "fingerprint": "36b5f911c4df31da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0bbf6d14e23487e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/classes/ClassQuestsTab.jsx:118"}, "properties": {"repobilityId": "b51a0bfa24b3be85", "scanner": "scanner-primary", "fingerprint": "0bbf6d14e23487e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7eb468d8e6993b12", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/learning-events/PromoteToTaskModal.jsx:81"}, "properties": {"repobilityId": "b916db8284c5778e", "scanner": "scanner-primary", "fingerprint": "7eb468d8e6993b12", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3848021ed3267507", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/learning-events/RequestXpModal.jsx:220"}, "properties": {"repobilityId": "72fddcbe62647f27", "scanner": "scanner-primary", "fingerprint": "3848021ed3267507", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0389866c84b0f04d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/learning-events/LearningEventCard.jsx:321"}, "properties": {"repobilityId": "6afbfe55947457b5", "scanner": "scanner-primary", "fingerprint": "0389866c84b0f04d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-475f9dbb36d01fc1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/marketing/AnnouncementBanner.jsx:13"}, "properties": {"repobilityId": "a90470770677bd30", "scanner": "scanner-primary", "fingerprint": "475f9dbb36d01fc1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6334309e68d52b9e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/DiplomaCreditTracker.jsx:213"}, "properties": {"repobilityId": "ba4278bc64d196ec", "scanner": "scanner-primary", "fingerprint": "6334309e68d52b9e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d0a6f49a198b0e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/EvidenceMasonryGallery.jsx:333"}, "properties": {"repobilityId": "54c510754083d0b6", "scanner": "scanner-primary", "fingerprint": "1d0a6f49a198b0e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e402819ab667f52", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/EvidenceDetailModal.jsx:67"}, "properties": {"repobilityId": "629f0c5a93c84074", "scanner": "scanner-primary", "fingerprint": "4e402819ab667f52", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-630e42b403dfaff5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/CompactSidebar.jsx:215"}, "properties": {"repobilityId": "6c1b301699eab8ae", "scanner": "scanner-primary", "fingerprint": "630e42b403dfaff5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9dfc3731fb68c94d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/SkillsRadarChart.jsx:258"}, "properties": {"repobilityId": "fa9343b2670ce136", "scanner": "scanner-primary", "fingerprint": "9dfc3731fb68c94d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9940ceb653184439", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/diploma/evidence/EvidenceContentGrid.jsx:221"}, "properties": {"repobilityId": "9dd54f8ee1084c92", "scanner": "scanner-primary", "fingerprint": "9940ceb653184439", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f72dd2b4e0d9ab2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/AdminUsers.jsx:534"}, "properties": {"repobilityId": "0ff7074412a718b8", "scanner": "scanner-primary", "fingerprint": "0f72dd2b4e0d9ab2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c3bb1275684790a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/UserEnrollmentsTab.jsx:172"}, "properties": {"repobilityId": "eef78c99a1481f7b", "scanner": "scanner-primary", "fingerprint": "6c3bb1275684790a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aedf731d188cf364", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/UserDetailsModal.jsx:367"}, "properties": {"repobilityId": "8fe531a90526acd2", "scanner": "scanner-primary", "fingerprint": "aedf731d188cf364", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b48326c7dbf6d1a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/admin/UserDetailsModal.jsx:54"}, "properties": {"repobilityId": "dc06255fc74f3d68", "scanner": "scanner-primary", "fingerprint": "4b48326c7dbf6d1a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f0b0537697f56e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/DocsManager.jsx:411"}, "properties": {"repobilityId": "2912add744cbf02b", "scanner": "scanner-primary", "fingerprint": "0f0b0537697f56e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c58fc384db05680", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/AdminConnections.jsx:441"}, "properties": {"repobilityId": "99893ef28b9bfe69", "scanner": "scanner-primary", "fingerprint": "3c58fc384db05680", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aff9c14802e6cbb2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/DocsAIPanel.jsx:130"}, "properties": {"repobilityId": "f3bf5996510ad782", "scanner": "scanner-primary", "fingerprint": "aff9c14802e6cbb2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-649b3265ac295b9e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/AdminQuests.jsx:756"}, "properties": {"repobilityId": "56b3ac807b4521db", "scanner": "scanner-primary", "fingerprint": "649b3265ac295b9e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-88db66285facc6f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/ChatLogsModal.jsx:125"}, "properties": {"repobilityId": "a411633a815661b1", "scanner": "scanner-primary", "fingerprint": "88db66285facc6f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3be4169230401977", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/MasqueradeBanner.jsx:69"}, "properties": {"repobilityId": "bfbef44225e806ff", "scanner": "scanner-primary", "fingerprint": "3be4169230401977", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1405b6d31e3c47a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/UserConnectionsTab.jsx:405"}, "properties": {"repobilityId": "8165b8866b85460b", "scanner": "scanner-primary", "fingerprint": "1405b6d31e3c47a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e4f7176bb4abbbc", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/quests/QuestPersonalizationWizard.jsx:282"}, "properties": {"repobilityId": "f703abdc6c60643c", "scanner": "scanner-primary", "fingerprint": "1e4f7176bb4abbbc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-a0f84244a7048570", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/EvidenceDisplay.jsx:218"}, "properties": {"repobilityId": "9e0965597f57adc4", "scanner": "scanner-primary", "fingerprint": "a0f84244a7048570", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c379b35c9a26fcd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/EvidenceBlockRenderer.jsx:376"}, "properties": {"repobilityId": "910018d9ae5aa73e", "scanner": "scanner-primary", "fingerprint": "0c379b35c9a26fcd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7b2db64159f9d34", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/EvidenceContentEditor.jsx:488"}, "properties": {"repobilityId": "38c9ab5946d2609b", "scanner": "scanner-primary", "fingerprint": "a7b2db64159f9d34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d95d50a9a49a8447", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/ImprovedEvidenceUploader.jsx:382"}, "properties": {"repobilityId": "ea3327e694a16007", "scanner": "scanner-primary", "fingerprint": "d95d50a9a49a8447", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4d42862d996bf1eb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/blocks/VideoBlock.jsx:131"}, "properties": {"repobilityId": "9cb4c4caca34c352", "scanner": "scanner-primary", "fingerprint": "4d42862d996bf1eb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7d2b2a2b96bfa16", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/blocks/DocumentBlock.jsx:83"}, "properties": {"repobilityId": "5965d8145384610f", "scanner": "scanner-primary", "fingerprint": "c7d2b2a2b96bfa16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22ab38fdba8b998a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/evidence/blocks/LinkBlock.jsx:49"}, "properties": {"repobilityId": "c986edbb570157e0", "scanner": "scanner-primary", "fingerprint": "22ab38fdba8b998a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bae7c544d2d8624c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/CourseTab.jsx:1073"}, "properties": {"repobilityId": "e8b6f7dbe48d165a", "scanner": "scanner-primary", "fingerprint": "bae7c544d2d8624c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-297b2b6c946c5e82", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/AdvisorsTab.jsx:279"}, "properties": {"repobilityId": "26fcecda4233efb8", "scanner": "scanner-primary", "fingerprint": "297b2b6c946c5e82", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-774ba04c2d58eabc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/OverviewTab.jsx:383"}, "properties": {"repobilityId": "b1cd1bf22e0f4b24", "scanner": "scanner-primary", "fingerprint": "774ba04c2d58eabc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d2e2cffc33c7c40", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/connections/AdvisorStudentSection.jsx:93"}, "properties": {"repobilityId": "1a0cf93133c22c12", "scanner": "scanner-primary", "fingerprint": "5d2e2cffc33c7c40", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3ad252cc3af176b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/people/InvitationLinksSection.jsx:138"}, "properties": {"repobilityId": "26f816eeae37cb06", "scanner": "scanner-primary", "fingerprint": "e3ad252cc3af176b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fbbc8c4036cf14ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/people/PendingInvitationsSection.jsx:46"}, "properties": {"repobilityId": "58bd58bffbc7edff", "scanner": "scanner-primary", "fingerprint": "fbbc8c4036cf14ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-32a779de36ea9006", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/organization/people/RelationshipsSection.jsx:164"}, "properties": {"repobilityId": "75546f97304e15e6", "scanner": "scanner-primary", "fingerprint": "32a779de36ea9006", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-573cc223e94b769d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/interest-tracks/TrackSelector.jsx:229"}, "properties": {"repobilityId": "9a2990e075d32445", "scanner": "scanner-primary", "fingerprint": "573cc223e94b769d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a1b6c900115c5b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/interest-tracks/InterestTracksList.jsx:230"}, "properties": {"repobilityId": "42e1c88bf16aa1e2", "scanner": "scanner-primary", "fingerprint": "2a1b6c900115c5b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94dd86fbfe5be659", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/interest-tracks/InterestTracksList.jsx:112"}, "properties": {"repobilityId": "d7357f791cb101f8", "scanner": "scanner-primary", "fingerprint": "94dd86fbfe5be659", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7a2db9708b8eb39c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/quest/QuestCardSimple.jsx:221"}, "properties": {"repobilityId": "c4a0945053edfff4", "scanner": "scanner-primary", "fingerprint": "7a2db9708b8eb39c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-669dfc2d423a520c", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 frontend/src/components/quest/QuestMap/QuestMap.jsx:171"}, "properties": {"repobilityId": "234a1b0d306369bf", "scanner": "scanner-primary", "fingerprint": "669dfc2d423a520c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-78ca1dae99a6beb1", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 frontend/src/components/quest/QuestMap/QuestMap.jsx:165"}, "properties": {"repobilityId": "12e5a3b4fc34d850", "scanner": "scanner-primary", "fingerprint": "78ca1dae99a6beb1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-c8300eb2b136e870", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 frontend/src/components/quest/QuestMap/QuestMap.jsx:69"}, "properties": {"repobilityId": "a2e460683e946cce", "scanner": "scanner-primary", "fingerprint": "c8300eb2b136e870", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-d70e6700bc7d5108", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/quest/improved/QuestCard.jsx:165"}, "properties": {"repobilityId": "af409c130138f844", "scanner": "scanner-primary", "fingerprint": "d70e6700bc7d5108", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8cff7ff8dd0a0a21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/quest/improved/QuestListItem.jsx:112"}, "properties": {"repobilityId": "f1ac83965e154cff", "scanner": "scanner-primary", "fingerprint": "8cff7ff8dd0a0a21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48a56240a4d49ce7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/MergeModal.jsx:110"}, "properties": {"repobilityId": "9d917cc1f092d557", "scanner": "scanner-primary", "fingerprint": "48a56240a4d49ce7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd97e88c2c928415", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/CreditDataTable.jsx:110"}, "properties": {"repobilityId": "249ac510b9e156fd", "scanner": "scanner-primary", "fingerprint": "bd97e88c2c928415", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b7da9e80739c848", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/ItemList.jsx:73"}, "properties": {"repobilityId": "a497dd763e3c387d", "scanner": "scanner-primary", "fingerprint": "6b7da9e80739c848", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c9933c55095bf4b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/StudentContext.jsx:134"}, "properties": {"repobilityId": "6d7fda5a46d2b479", "scanner": "scanner-primary", "fingerprint": "c9933c55095bf4b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b5ccd5d0234a746c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/credit-dashboard/ClassReviewsSection.jsx:128"}, "properties": {"repobilityId": "69d3c97bae188cb3", "scanner": "scanner-primary", "fingerprint": "b5ccd5d0234a746c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cc80cf92a58e447d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/CurriculumEditor.jsx:79"}, "properties": {"repobilityId": "91f10ed00f795540", "scanner": "scanner-primary", "fingerprint": "cc80cf92a58e447d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18abcad94b7c5d99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonViewer.jsx:186"}, "properties": {"repobilityId": "695dccae6ab22405", "scanner": "scanner-primary", "fingerprint": "18abcad94b7c5d99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a9eed9b0f0c110eb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonContentRenderer.jsx:164"}, "properties": {"repobilityId": "e422218b7045b27c", "scanner": "scanner-primary", "fingerprint": "a9eed9b0f0c110eb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9fe7cfceff2ab862", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/curriculum/LessonContentRenderer.jsx:120"}, "properties": {"repobilityId": "66bc72121ee4c2cc", "scanner": "scanner-primary", "fingerprint": "9fe7cfceff2ab862", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9404ce00fd032ee2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/CurriculumView.jsx:558"}, "properties": {"repobilityId": "761fb1c976761792", "scanner": "scanner-primary", "fingerprint": "9404ce00fd032ee2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-865df68e99727ea3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/TaskLinker.jsx:459"}, "properties": {"repobilityId": "973c5595ac793459", "scanner": "scanner-primary", "fingerprint": "865df68e99727ea3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fff68e86cb463137", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/FileUploader.jsx:228"}, "properties": {"repobilityId": "8e513ff43e819ad6", "scanner": "scanner-primary", "fingerprint": "fff68e86cb463137", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57cca633529e1339", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonItem.jsx:103"}, "properties": {"repobilityId": "3812fbafd8bd303c", "scanner": "scanner-primary", "fingerprint": "57cca633529e1339", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9952323529e96bbc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/StepEditor.jsx:346"}, "properties": {"repobilityId": "f6d91212f0d9b855", "scanner": "scanner-primary", "fingerprint": "9952323529e96bbc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-327060ae61c7b6c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonBlockEditor.jsx:728"}, "properties": {"repobilityId": "6529aa8992a39262", "scanner": "scanner-primary", "fingerprint": "327060ae61c7b6c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7193d35a17513fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonTaskPanel.jsx:41"}, "properties": {"repobilityId": "a15fd77d5f04a762", "scanner": "scanner-primary", "fingerprint": "a7193d35a17513fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4cf6766e3a70e59", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/LessonPreviewModal.jsx:315"}, "properties": {"repobilityId": "3e32c207cdcd4d56", "scanner": "scanner-primary", "fingerprint": "f4cf6766e3a70e59", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6a0317669f5e01b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/curriculum/LessonPreviewModal.jsx:202"}, "properties": {"repobilityId": "4e1d9450dd155fc2", "scanner": "scanner-primary", "fingerprint": "f6a0317669f5e01b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-532886094c57933d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/curriculum/content/FileStepContent.jsx:77"}, "properties": {"repobilityId": "f20a60a6bf3804d5", "scanner": "scanner-primary", "fingerprint": "532886094c57933d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0db22deb350b02ac", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/curriculum/content/TextStepContent.jsx:16"}, "properties": {"repobilityId": "e3181973e1b41fe7", "scanner": "scanner-primary", "fingerprint": "0db22deb350b02ac", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-dc185694b16342b0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/CourseCardWithQuests.jsx:190"}, "properties": {"repobilityId": "b325136689557126", "scanner": "scanner-primary", "fingerprint": "dc185694b16342b0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c1038a40590ad4d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/course/StudentPreviewModal.jsx:186"}, "properties": {"repobilityId": "47c3769189c38ac8", "scanner": "scanner-primary", "fingerprint": "2c1038a40590ad4d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-71f8b9d1132e52c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/AllTasksModal.jsx:279"}, "properties": {"repobilityId": "60c82a2a17d878ff", "scanner": "scanner-primary", "fingerprint": "71f8b9d1132e52c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf27a2e870819d22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/SortableLessonItem.jsx:80"}, "properties": {"repobilityId": "126e6689429ce0c9", "scanner": "scanner-primary", "fingerprint": "bf27a2e870819d22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dabeaf408c91fd68", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/CourseBuilderHeader.jsx:74"}, "properties": {"repobilityId": "68be736012957188", "scanner": "scanner-primary", "fingerprint": "dabeaf408c91fd68", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d595d8aac0c66aa4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/refine/ChangePreview.jsx:236"}, "properties": {"repobilityId": "474e9b7747a9ef7d", "scanner": "scanner-primary", "fingerprint": "d595d8aac0c66aa4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4dbf08f982260417", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/outline/OutlineTreeItem.jsx:217"}, "properties": {"repobilityId": "fa40fee7d040af42", "scanner": "scanner-primary", "fingerprint": "4dbf08f982260417", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d677caa6f0ed7ed0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/course/outline/OutlineEditor.jsx:152"}, "properties": {"repobilityId": "29b7eb73eca44f2d", "scanner": "scanner-primary", "fingerprint": "d677caa6f0ed7ed0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4987dbded684e1c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/QuestAccordionGallery.jsx:239"}, "properties": {"repobilityId": "fd5c71de6e6f2478", "scanner": "scanner-primary", "fingerprint": "e4987dbded684e1c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bfb75a107016a742", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/ConnectionsSection.jsx:20"}, "properties": {"repobilityId": "96e6b1db79b395d1", "scanner": "scanner-primary", "fingerprint": "bfb75a107016a742", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a6f151bf3b178ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/LearningSnapshot.jsx:193"}, "properties": {"repobilityId": "ca7b611127b11b01", "scanner": "scanner-primary", "fingerprint": "8a6f151bf3b178ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a69e42ba3baf6a8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/LearningJournalSection.jsx:464"}, "properties": {"repobilityId": "73a246e7dc2c31e7", "scanner": "scanner-primary", "fingerprint": "a69e42ba3baf6a8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e24ef238cb9aad94", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/overview/PortfolioSection.jsx:308"}, "properties": {"repobilityId": "94d4b411e69a7773", "scanner": "scanner-primary", "fingerprint": "e24ef238cb9aad94", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f978dceb4a248e2d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/advisor/AddEvidenceModal.jsx:142"}, "properties": {"repobilityId": "6454b77550c16a27", "scanner": "scanner-primary", "fingerprint": "f978dceb4a248e2d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25844e8fcd717ccf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/AuthCallback.jsx:37"}, "properties": {"repobilityId": "4f8c168fbbad0a20", "scanner": "scanner-primary", "fingerprint": "25844e8fcd717ccf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5c862a533db30113", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/pages/ShowcasePage.jsx:479"}, "properties": {"repobilityId": "3d4f639865246ae2", "scanner": "scanner-primary", "fingerprint": "5c862a533db30113", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-cc116ab67a3d6b60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ShowcasePage.jsx:99"}, "properties": {"repobilityId": "10a1e80e3edb94b4", "scanner": "scanner-primary", "fingerprint": "cc116ab67a3d6b60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42232515f55f1ca1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/ObserverFeedPage.jsx:41"}, "properties": {"repobilityId": "7d21ea013902b1eb", "scanner": "scanner-primary", "fingerprint": "42232515f55f1ca1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-895d5537753f430d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DashboardPage.jsx:163"}, "properties": {"repobilityId": "898fe54ad5682f1e", "scanner": "scanner-primary", "fingerprint": "895d5537753f430d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-54170e392e5c53a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/StudentFeedbackPage.jsx:238"}, "properties": {"repobilityId": "cbdf6cc5cb633e66", "scanner": "scanner-primary", "fingerprint": "54170e392e5c53a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7dfbf23b950277a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/classes/AdminClassReviewQueue.jsx:119"}, "properties": {"repobilityId": "89ae0d1730a91feb", "scanner": "scanner-primary", "fingerprint": "7dfbf23b950277a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b999bce3842aa3a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/classes/StudentClassForm.jsx:698"}, "properties": {"repobilityId": "aff30df3a09806ff", "scanner": "scanner-primary", "fingerprint": "9b999bce3842aa3a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a7e6c1b13631d77", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/pages/classes/StudentClassForm.jsx:695"}, "properties": {"repobilityId": "fd3060b6cc3832d6", "scanner": "scanner-primary", "fingerprint": "8a7e6c1b13631d77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-0804aed1d3b1bbcc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/classes/MyClasses.jsx:106"}, "properties": {"repobilityId": "c6548f95387f483f", "scanner": "scanner-primary", "fingerprint": "0804aed1d3b1bbcc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-662a7efc8557f9ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/oea/OEACreditsView.jsx:278"}, "properties": {"repobilityId": "73c6e9ea3300891e", "scanner": "scanner-primary", "fingerprint": "662a7efc8557f9ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42e7f75fe8a6ab8a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/PhilosophyEditor.jsx:331"}, "properties": {"repobilityId": "ff935d3592b1131f", "scanner": "scanner-primary", "fingerprint": "42e7f75fe8a6ab8a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-274b0daa018ac362", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/pages/admin/CourseGeneratorWizard.jsx:1024"}, "properties": {"repobilityId": "4625273f980c57d6", "scanner": "scanner-primary", "fingerprint": "274b0daa018ac362", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d41e62ed145247e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/admin/CourseGeneratorWizard.jsx:829"}, "properties": {"repobilityId": "ef8468acee71bfe2", "scanner": "scanner-primary", "fingerprint": "d41e62ed145247e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-73e57080acc6a0bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/ShowcaseConsentPanel.jsx:32"}, "properties": {"repobilityId": "d592ff0d83479083", "scanner": "scanner-primary", "fingerprint": "73e57080acc6a0bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60f8afa3a9819241", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/BulkCourseGeneration.jsx:353"}, "properties": {"repobilityId": "bbf2393c8a9a0adc", "scanner": "scanner-primary", "fingerprint": "60f8afa3a9819241", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6858718b88e981c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/treehouse/TreehouseFacilitatorPage.jsx:296"}, "properties": {"repobilityId": "42f70257e1926ffc", "scanner": "scanner-primary", "fingerprint": "b6858718b88e981c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c1817f8dd64bcb3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/courses/CourseHomepage.jsx:89"}, "properties": {"repobilityId": "e3a5a18227ed202c", "scanner": "scanner-primary", "fingerprint": "5c1817f8dd64bcb3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea5385d77b0608b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/curriculum/CurriculumBuilder.jsx:78"}, "properties": {"repobilityId": "85879ebef345cfe7", "scanner": "scanner-primary", "fingerprint": "ea5385d77b0608b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e161e2bf2e4041e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/advisor/QuestInvitations.jsx:248"}, "properties": {"repobilityId": "64ba6b9fe82259bc", "scanner": "scanner-primary", "fingerprint": "e161e2bf2e4041e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb0669ec5fdd06ae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/hooks/useHomepageImages.js:104"}, "properties": {"repobilityId": "a213280be57d2111", "scanner": "scanner-primary", "fingerprint": "bb0669ec5fdd06ae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-358557ad63bbe2e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/services/authService.js:303"}, "properties": {"repobilityId": "d2e1ac1ae6383350", "scanner": "scanner-primary", "fingerprint": "358557ad63bbe2e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ba112435a4172e64", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/services/evidenceDocumentService.js:181"}, "properties": {"repobilityId": "d31bc43cd1b9a14a", "scanner": "scanner-primary", "fingerprint": "ba112435a4172e64", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-18d11f642d7fa308", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend-v2/app/(app)/(tabs)/feed.tsx:545"}, "properties": {"repobilityId": "c80d810e3a18399d", "scanner": "scanner-primary", "fingerprint": "18d11f642d7fa308", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-a2d7fbf79f816188", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-v2/src/components/curriculum/sanitizeLessonHtml.ts:3"}, "properties": {"repobilityId": "bf8de46edc7c785d", "scanner": "scanner-primary", "fingerprint": "a2d7fbf79f816188", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ef7da95e44274e96", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-v2/src/components/curriculum/LessonViewer.tsx:76"}, "properties": {"repobilityId": "bce4e00c97bc6eab", "scanner": "scanner-primary", "fingerprint": "ef7da95e44274e96", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5d34962e0a4b9e25", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-v2/src/components/curriculum/__tests__/LessonViewer.sanitize.test.tsx:8"}, "properties": {"repobilityId": "d9a5fe3bf1e999e5", "scanner": "scanner-primary", "fingerprint": "5d34962e0a4b9e25", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2e55fce621089e26", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend-v2/src/hooks/useQuestDetail.ts:65"}, "properties": {"repobilityId": "205d4587d73391ff", "scanner": "scanner-primary", "fingerprint": "2e55fce621089e26", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1a8f27493ee1a201", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend-v2/e2e/global-teardown.ts:35"}, "properties": {"repobilityId": "0d4804b00664998e", "scanner": "scanner-primary", "fingerprint": "1a8f27493ee1a201", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-20bd4b403f51820f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend-v2/e2e/global-setup.ts:72"}, "properties": {"repobilityId": "1a38b7e4f9783324", "scanner": "scanner-primary", "fingerprint": "20bd4b403f51820f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3d0ea43de9860c29", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/ai-quest-cycle/index.ts:25"}, "properties": {"repobilityId": "dbc472603b329aa2", "scanner": "scanner-primary", "fingerprint": "3d0ea43de9860c29", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d202763c2b1e2270", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in CLAUDE.md:426"}, "properties": {"repobilityId": "1783b797ca111d4d", "scanner": "scanner-primary", "fingerprint": "d202763c2b1e2270", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 426}}}]}, {"ruleId": "scanner-c2cd0a83d532a18e", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/utils/browserDetection.js:181"}, "properties": {"repobilityId": "b09f18c98feb8899", "scanner": "scanner-primary", "fingerprint": "c2cd0a83d532a18e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/utils/browserDetection.js"}, "region": {"startLine": 181}}}]}, {"ruleId": "scanner-70a38938b307d45a", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/utils/__tests__/browserDetection.test.js:135"}, "properties": {"repobilityId": "fd88e22996b322d9", "scanner": "scanner-primary", "fingerprint": "70a38938b307d45a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/utils/__tests__/browserDetection.test.js"}, "region": {"startLine": 135}}}]}, {"ruleId": "scanner-cc10ced3fb0a6093", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/philosophy/NodeDetailPanel.jsx:103"}, "properties": {"repobilityId": "aa8c8f212cf9678c", "scanner": "scanner-primary", "fingerprint": "cc10ced3fb0a6093", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/philosophy/NodeDetailPanel.jsx"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-205008174b6a52ca", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/philosophy/PhilosophySEOFallback.jsx:31"}, "properties": {"repobilityId": "9d8a78f9baaafbd3", "scanner": "scanner-primary", "fingerprint": "205008174b6a52ca", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/philosophy/PhilosophySEOFallback.jsx"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-bd164b8cdac97970", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/philosophy/MobileMindMap.jsx:230"}, "properties": {"repobilityId": "21790e1ed246e232", "scanner": "scanner-primary", "fingerprint": "bd164b8cdac97970", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/philosophy/MobileMindMap.jsx"}, "region": {"startLine": 230}}}]}, {"ruleId": "scanner-d27ea2e149a20a69", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in frontend/src/components/quest/QuestDetailHeader.jsx:26"}, "properties": {"repobilityId": "d0014d2c8444991a", "scanner": "scanner-primary", "fingerprint": "d27ea2e149a20a69", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/quest/QuestDetailHeader.jsx"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-9193b15316283a0c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/curriculum/LessonContentRenderer.jsx:120"}, "properties": {"repobilityId": "212ea39af43982b4", "scanner": "scanner-primary", "fingerprint": "9193b15316283a0c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/curriculum/LessonContentRenderer.jsx"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-a39005b425d2dc6a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/curriculum/LessonPreviewModal.jsx:202"}, "properties": {"repobilityId": "eb1a5614670f19a1", "scanner": "scanner-primary", "fingerprint": "a39005b425d2dc6a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/curriculum/LessonPreviewModal.jsx"}, "region": {"startLine": 202}}}]}, {"ruleId": "scanner-f1ab4d0f4f8c3769", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/curriculum/content/TextStepContent.jsx:16"}, "properties": {"repobilityId": "a5efb6c85a8b039a", "scanner": "scanner-primary", "fingerprint": "f1ab4d0f4f8c3769", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/curriculum/content/TextStepContent.jsx"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-08c4de15a5324b10", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/course/StudentPreviewModal.jsx:186"}, "properties": {"repobilityId": "c9cad3750e0a0558", "scanner": "scanner-primary", "fingerprint": "08c4de15a5324b10", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/course/StudentPreviewModal.jsx"}, "region": {"startLine": 186}}}]}, {"ruleId": "scanner-9c089ce93d9bee92", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/contexts/AuthContext.jsx:157"}, "properties": {"repobilityId": "79ddd34cc639b25d", "scanner": "scanner-primary", "fingerprint": "9c089ce93d9bee92", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/contexts/AuthContext.jsx"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-bf5c3be09b37235b", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/contexts/AuthContext.test.jsx:457"}, "properties": {"repobilityId": "bca216c51b5bf7ed", "scanner": "scanner-primary", "fingerprint": "bf5c3be09b37235b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/contexts/AuthContext.test.jsx"}, "region": {"startLine": 457}}}]}, {"ruleId": "scanner-01cc33616b8a3f44", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/contexts/ActingAsContext.jsx:139"}, "properties": {"repobilityId": "19ecf8239847416e", "scanner": "scanner-primary", "fingerprint": "01cc33616b8a3f44", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/contexts/ActingAsContext.jsx"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-267b12178c62c702", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/pages/AuthCallback.jsx:199"}, "properties": {"repobilityId": "6266d45301ba20e4", "scanner": "scanner-primary", "fingerprint": "267b12178c62c702", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/AuthCallback.jsx"}, "region": {"startLine": 199}}}]}, {"ruleId": "scanner-2c41e0811ab7c027", "level": "error", "message": {"text": "Possible secret in frontend/src/pages/AcceptInvitationPage.jsx"}, "properties": {"repobilityId": "be21536af6a643f5", "scanner": "scanner-primary", "fingerprint": "2c41e0811ab7c027", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/AcceptInvitationPage.jsx"}, "region": {"startLine": 169}}}]}, {"ruleId": "scanner-2c41e0811ab7c027", "level": "error", "message": {"text": "Possible secret in frontend/src/pages/AcceptInvitationPage.jsx"}, "properties": {"repobilityId": "be21536af6a643f5", "scanner": "scanner-primary", "fingerprint": "2c41e0811ab7c027", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/AcceptInvitationPage.jsx"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-2c41e0811ab7c027", "level": "error", "message": {"text": "Possible secret in frontend/src/pages/AcceptInvitationPage.jsx"}, "properties": {"repobilityId": "be21536af6a643f5", "scanner": "scanner-primary", "fingerprint": "2c41e0811ab7c027", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/AcceptInvitationPage.jsx"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-67125eda76ebd917", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in frontend/src/pages/courses/CourseHomepage.jsx:34"}, "properties": {"repobilityId": "d19469484be2911c", "scanner": "scanner-primary", "fingerprint": "67125eda76ebd917", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/courses/CourseHomepage.jsx"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-b9ec726cb6467b19", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/services/api.test.js:44"}, "properties": {"repobilityId": "2c2744f173590fd2", "scanner": "scanner-primary", "fingerprint": "b9ec726cb6467b19", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/services/api.test.js"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-e3b525f820003f83", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend-v2/README.md:29"}, "properties": {"repobilityId": "06c00f96e8e7fb93", "scanner": "scanner-primary", "fingerprint": "e3b525f820003f83", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-v2/README.md"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-d65c9b2d7d492cb9", "level": "error", "message": {"text": "Possible secret in frontend-v2/app/invite/[code].tsx"}, "properties": {"repobilityId": "02e0c4b1fcedbde8", "scanner": "scanner-primary", "fingerprint": "d65c9b2d7d492cb9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-v2/app/invite/[code].tsx"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-d65c9b2d7d492cb9", "level": "error", "message": {"text": "Possible secret in frontend-v2/app/invite/[code].tsx"}, "properties": {"repobilityId": "02e0c4b1fcedbde8", "scanner": "scanner-primary", "fingerprint": "d65c9b2d7d492cb9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-v2/app/invite/[code].tsx"}, "region": {"startLine": 116}}}]}, {"ruleId": "scanner-d65c9b2d7d492cb9", "level": "error", "message": {"text": "Possible secret in frontend-v2/app/invite/[code].tsx"}, "properties": {"repobilityId": "02e0c4b1fcedbde8", "scanner": "scanner-primary", "fingerprint": "d65c9b2d7d492cb9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-v2/app/invite/[code].tsx"}, "region": {"startLine": 117}}}]}, {"ruleId": "scanner-8bfc788a47e75510", "level": "error", "message": {"text": "Possible secret in frontend-v2/app/(app)/(tabs)/family.tsx"}, "properties": {"repobilityId": "47099892ca38f6c3", "scanner": "scanner-primary", "fingerprint": "8bfc788a47e75510", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-v2/app/(app)/(tabs)/family.tsx"}, "region": {"startLine": 414}}}]}, {"ruleId": "scanner-8bfc788a47e75510", "level": "error", "message": {"text": "Possible secret in frontend-v2/app/(app)/(tabs)/family.tsx"}, "properties": {"repobilityId": "47099892ca38f6c3", "scanner": "scanner-primary", "fingerprint": "8bfc788a47e75510", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-v2/app/(app)/(tabs)/family.tsx"}, "region": {"startLine": 434}}}]}, {"ruleId": "scanner-8d7290a51d5813e0", "level": "error", "message": {"text": "Possible secret in frontend-v2/app/(auth)/register.tsx"}, "properties": {"repobilityId": "c6a4e33a9f338293", "scanner": "scanner-primary", "fingerprint": "8d7290a51d5813e0", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-v2/app/(auth)/register.tsx"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-8d7290a51d5813e0", "level": "error", "message": {"text": "Possible secret in frontend-v2/app/(auth)/register.tsx"}, "properties": {"repobilityId": "c6a4e33a9f338293", "scanner": "scanner-primary", "fingerprint": "8d7290a51d5813e0", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-v2/app/(auth)/register.tsx"}, "region": {"startLine": 140}}}]}, {"ruleId": "scanner-d78ad6fd101d659f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend-v2/src/components/curriculum/LessonViewer.tsx:76"}, "properties": {"repobilityId": "955cc04986bbc875", "scanner": "scanner-primary", "fingerprint": "d78ad6fd101d659f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-v2/src/components/curriculum/LessonViewer.tsx"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-60a5746a7a817338", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend-v2/src/services/__tests__/tokenStore.web.test.ts:34"}, "properties": {"repobilityId": "f405e5ebc2436fa4", "scanner": "scanner-primary", "fingerprint": "60a5746a7a817338", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-v2/src/services/__tests__/tokenStore.web.test.ts"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-dcde435f89f7640e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-quest-cycle/index.ts:5"}, "properties": {"repobilityId": "fd9b94efdce8d178", "scanner": "scanner-primary", "fingerprint": "dcde435f89f7640e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/ai-quest-cycle/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-ac579b8732a90e64", "level": "error", "message": {"text": "Possible secret in backend/scripts/seed_demo_family.py"}, "properties": {"repobilityId": "e8653955cd9a67bc", "scanner": "scanner-primary", "fingerprint": "ac579b8732a90e64", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/seed_demo_family.py"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-4b9d557ff314d9b3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0aa84f587e8d31e2", "scanner": "scanner-primary", "fingerprint": "4b9d557ff314d9b3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/eas-update.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-4b9d557ff314d9b3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "44e90430d992fe6b", "scanner": "scanner-primary", "fingerprint": "4b9d557ff314d9b3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/eas-update.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-4b9d557ff314d9b3", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "95bc29bb64d1e53c", "scanner": "scanner-primary", "fingerprint": "4b9d557ff314d9b3", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/eas-update.yml"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0ad86557a2848db6", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eeb76410cc935c30", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eeb76410cc935c30", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 117}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 152}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eeb76410cc935c30", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d625c131747c3177", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 160}}}]}, {"ruleId": "scanner-fd0f32f49d62d185", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fd60ce9008c2ff38", "scanner": "scanner-primary", "fingerprint": "fd0f32f49d62d185", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/frontend-v2-e2e.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-fd0f32f49d62d185", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6d5d74ab733472e4", "scanner": "scanner-primary", "fingerprint": "fd0f32f49d62d185", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/frontend-v2-e2e.yml"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-fd0f32f49d62d185", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "42632735ab40383b", "scanner": "scanner-primary", "fingerprint": "fd0f32f49d62d185", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/frontend-v2-e2e.yml"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-ddc5d31c0b737152", "level": "note", "message": {"text": "Very large file: frontend/src/components/organization/CourseTab.jsx (1166 lines)"}, "properties": {"repobilityId": "2a15de94fca95e04", "scanner": "scanner-primary", "fingerprint": "ddc5d31c0b737152", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-54040086187bcb81", "level": "note", "message": {"text": "Very large file: frontend/src/pages/courses/CourseHomepage.jsx (1485 lines)"}, "properties": {"repobilityId": "19ea3db1d3f6cd88", "scanner": "scanner-primary", "fingerprint": "54040086187bcb81", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-16d1dbee98b3b1b6", "level": "note", "message": {"text": "Very large file: frontend-v2/app/(app)/(tabs)/admin.tsx (1618 lines)"}, "properties": {"repobilityId": "c31c7f5bbca66859", "scanner": "scanner-primary", "fingerprint": "16d1dbee98b3b1b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b274bed0b1981184", "level": "note", "message": {"text": "Very large file: backend/routes/evidence_documents.py (1525 lines)"}, "properties": {"repobilityId": "838981c3a7303358", "scanner": "scanner-primary", "fingerprint": "b274bed0b1981184", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7606dc7fe1759efa", "level": "note", "message": {"text": "Very large file: backend/routes/parent/learning_moments.py (1239 lines)"}, "properties": {"repobilityId": "6ff313e3f2e6aa1f", "scanner": "scanner-primary", "fingerprint": "7606dc7fe1759efa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a4c104d273b61e91", "level": "note", "message": {"text": "Very large file: backend/routes/admin/curriculum_upload.py (1400 lines)"}, "properties": {"repobilityId": "31ef85cf952daa68", "scanner": "scanner-primary", "fingerprint": "a4c104d273b61e91", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4c2cc75ed562e74f", "level": "note", "message": {"text": "Very large file: backend/services/interest_tracks_service.py (1930 lines)"}, "properties": {"repobilityId": "05ee27509d6266a5", "scanner": "scanner-primary", "fingerprint": "4c2cc75ed562e74f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-68e1523d0b55fe95", "level": "note", "message": {"text": "Very large file: backend/services/base_ai_service.py (1419 lines)"}, "properties": {"repobilityId": "2db0d8287efc3fdc", "scanner": "scanner-primary", "fingerprint": "68e1523d0b55fe95", "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": "fa543d2440602ed1", "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": "53eaa3b98d32837b", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "3029c3a734f8bd67", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "1c86221acde04738", "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": "873e0f20fa7add57", "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": "aee12f05382ffef3", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 431}}}]}, {"ruleId": "scanner-24f2ea4bd14badc1", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: CLAUDE.md"}, "properties": {"repobilityId": "0f6049734704e537", "scanner": "scanner-primary", "fingerprint": "24f2ea4bd14badc1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 567}}}]}, {"ruleId": "scanner-505bc666a82f9849", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/settings.local.json"}, "properties": {"repobilityId": "777970b0fce0a93b", "scanner": "scanner-primary", "fingerprint": "505bc666a82f9849", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-6700aacbc07a66df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/utils/errorHandling.js:59"}, "properties": {"repobilityId": "2f5b86cf3441ddc6", "scanner": "scanner-primary", "fingerprint": "6700aacbc07a66df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-01e8c0bfe24b0b1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/utils/retryHelper.js:50"}, "properties": {"repobilityId": "d072a4c9f7deb9a4", "scanner": "scanner-primary", "fingerprint": "01e8c0bfe24b0b1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9e6ec91cc25f209", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/Layout.jsx:86"}, "properties": {"repobilityId": "4ff115cff1c2bf61", "scanner": "scanner-primary", "fingerprint": "d9e6ec91cc25f209", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d4d3d5a880b63bb4", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/notifications/PushNotificationBanner.jsx:60"}, "properties": {"repobilityId": "099faa5ac4472c58", "scanner": "scanner-primary", "fingerprint": "d4d3d5a880b63bb4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-786643409675728f", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/navigation/BackButton.jsx:65"}, "properties": {"repobilityId": "021759c996fcdd6d", "scanner": "scanner-primary", "fingerprint": "786643409675728f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18a28ecd345bc5f3", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/components/navigation/Sidebar.jsx:146"}, "properties": {"repobilityId": "9f20c82233433f4b", "scanner": "scanner-primary", "fingerprint": "18a28ecd345bc5f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f18bfd43a10a71b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/admin/QuestForm.jsx:453"}, "properties": {"repobilityId": "15a16ef3131ac6bd", "scanner": "scanner-primary", "fingerprint": "3f18bfd43a10a71b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9c4c32d2a513df4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/quest/TaskCompletionModal.jsx:47"}, "properties": {"repobilityId": "1f4684b618a33912", "scanner": "scanner-primary", "fingerprint": "a9c4c32d2a513df4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-28c7e08695cbd5a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/credit-dashboard/StatusTimeline.jsx:16"}, "properties": {"repobilityId": "a224e1a5fa7aa305", "scanner": "scanner-primary", "fingerprint": "28c7e08695cbd5a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17803c32a8ddb059", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/credit-dashboard/evidenceDiff.js:27"}, "properties": {"repobilityId": "dcc13d91fae7d385", "scanner": "scanner-primary", "fingerprint": "17803c32a8ddb059", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6db576856447b97", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/BountyBoardPage.jsx:310"}, "properties": {"repobilityId": "115c2ef66908797a", "scanner": "scanner-primary", "fingerprint": "f6db576856447b97", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eace6b6dd9865128", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/AuthCallback.jsx:325"}, "properties": {"repobilityId": "8135ea464e30a213", "scanner": "scanner-primary", "fingerprint": "eace6b6dd9865128", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb71301246d8a769", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/DiplomaPage.jsx:745"}, "properties": {"repobilityId": "ba565838cc47d3c6", "scanner": "scanner-primary", "fingerprint": "bb71301246d8a769", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0ee4b051f178155", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/pages/ParentDashboardPage.jsx:70"}, "properties": {"repobilityId": "dd0b6b32ab6397fe", "scanner": "scanner-primary", "fingerprint": "e0ee4b051f178155", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6dee06ee31dc0d64", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/lti/LtiQuestPage.jsx:32"}, "properties": {"repobilityId": "a6ce05a46991f866", "scanner": "scanner-primary", "fingerprint": "6dee06ee31dc0d64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10bea32d491611d0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/lti/LtiEvidencePage.jsx:11"}, "properties": {"repobilityId": "1b9264dd99897733", "scanner": "scanner-primary", "fingerprint": "10bea32d491611d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8ddd6be676b9347a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/lti/__tests__/LtiEvidencePage.test.jsx:3"}, "properties": {"repobilityId": "ead14f4275a88015", "scanner": "scanner-primary", "fingerprint": "8ddd6be676b9347a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d064dc587174043", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/api/useNotifications.js:62"}, "properties": {"repobilityId": "74aab51a977c0a17", "scanner": "scanner-primary", "fingerprint": "3d064dc587174043", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-431e95d86b78b306", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/services/api.js:15"}, "properties": {"repobilityId": "d48af0bb665af5b1", "scanner": "scanner-primary", "fingerprint": "431e95d86b78b306", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3618dcfc18cdb093", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/e2e/specs/02-login.spec.js:91"}, "properties": {"repobilityId": "4f9dec7b89c0f20d", "scanner": "scanner-primary", "fingerprint": "3618dcfc18cdb093", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b7284fc7a499bc5", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/app/_layout.tsx:107"}, "properties": {"repobilityId": "10d36927228680a8", "scanner": "scanner-primary", "fingerprint": "0b7284fc7a499bc5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0379dd0b585d75ba", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/app/(lti)/lti-evidence.tsx:118"}, "properties": {"repobilityId": "4a7a167c7bb4f4f8", "scanner": "scanner-primary", "fingerprint": "0379dd0b585d75ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-06683042b8c35a15", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend-v2/app/(app)/_layout.tsx:52"}, "properties": {"repobilityId": "000f73017caf1047", "scanner": "scanner-primary", "fingerprint": "06683042b8c35a15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d61aa91fcafafeba", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/app/(app)/notifications.tsx:185"}, "properties": {"repobilityId": "1178556062c0958d", "scanner": "scanner-primary", "fingerprint": "d61aa91fcafafeba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8ad319ed209c7cf", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend-v2/app/(app)/bounties/[id].tsx:160"}, "properties": {"repobilityId": "7bb6cccbab776013", "scanner": "scanner-primary", "fingerprint": "f8ad319ed209c7cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47d3ec22bd9753cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/app/(app)/bounties/__tests__/create.test.tsx:55"}, "properties": {"repobilityId": "a1b056c1a98fa2fd", "scanner": "scanner-primary", "fingerprint": "47d3ec22bd9753cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-08e2520bca596f4e", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend-v2/app/(app)/(tabs)/messages.tsx:86"}, "properties": {"repobilityId": "b67c343cbc7e37af", "scanner": "scanner-primary", "fingerprint": "08e2520bca596f4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-597197407c0c1fe9", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend-v2/app/(app)/(tabs)/journal.tsx:105"}, "properties": {"repobilityId": "1e36fd3134f9a2e5", "scanner": "scanner-primary", "fingerprint": "597197407c0c1fe9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bcaa1c890b51d16d", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/app/(app)/(tabs)/feed.tsx:430"}, "properties": {"repobilityId": "67e65c9d47e85cb7", "scanner": "scanner-primary", "fingerprint": "bcaa1c890b51d16d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-89a5015e9268640a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/app/(app)/(tabs)/dashboard.tsx:265"}, "properties": {"repobilityId": "aa865cf230ee2f9d", "scanner": "scanner-primary", "fingerprint": "89a5015e9268640a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fce9fc8cd300e6db", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend-v2/src/__tests__/setup.tsx:347"}, "properties": {"repobilityId": "4eeb82e20c5d413e", "scanner": "scanner-primary", "fingerprint": "fce9fc8cd300e6db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e9bb1797856516c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/stores/authStore.ts:204"}, "properties": {"repobilityId": "df04a75ac5dfe498", "scanner": "scanner-primary", "fingerprint": "9e9bb1797856516c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b1d44b214c70aed", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend-v2/src/stores/actingAsStore.ts:291"}, "properties": {"repobilityId": "5009bfc6894a4b5d", "scanner": "scanner-primary", "fingerprint": "1b1d44b214c70aed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd0264816f3ee6bf", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend-v2/src/components/bounties/BountiesView.tsx:212"}, "properties": {"repobilityId": "a90bfe33694aae79", "scanner": "scanner-primary", "fingerprint": "bd0264816f3ee6bf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ca5b336b4de0e4b4", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/components/parent/InviteObserverSheet.tsx:322"}, "properties": {"repobilityId": "7eab1293347e688c", "scanner": "scanner-primary", "fingerprint": "ca5b336b4de0e4b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c92122dcf3930c4f", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/components/journal/LearningEventCard.tsx:136"}, "properties": {"repobilityId": "8965f4fb9ab1891c", "scanner": "scanner-primary", "fingerprint": "c92122dcf3930c4f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53462a1e4478ee4e", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend-v2/src/components/journal/EditMomentModal.tsx:241"}, "properties": {"repobilityId": "065f6bf77f62d0aa", "scanner": "scanner-primary", "fingerprint": "53462a1e4478ee4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7de721d99eea6bb3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/components/ui/bottom-sheet.tsx:63"}, "properties": {"repobilityId": "0c477a1e5129f5b8", "scanner": "scanner-primary", "fingerprint": "7de721d99eea6bb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f2d1eefa7eb0593", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend-v2/src/components/ui/button.tsx:105"}, "properties": {"repobilityId": "5a6793b0def65270", "scanner": "scanner-primary", "fingerprint": "1f2d1eefa7eb0593", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06e6bcd98be97327", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend-v2/src/components/feed/FeedCard.tsx:36"}, "properties": {"repobilityId": "aed5a9303a36bed0", "scanner": "scanner-primary", "fingerprint": "06e6bcd98be97327", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0612165f896a33ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/components/capture/CaptureSheet.tsx:106"}, "properties": {"repobilityId": "8d18dbc23b3c555d", "scanner": "scanner-primary", "fingerprint": "0612165f896a33ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e8b377b0330d484", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/components/communication/ChatWindow.tsx:121"}, "properties": {"repobilityId": "e7cd5cf8a457fd19", "scanner": "scanner-primary", "fingerprint": "5e8b377b0330d484", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0844bc93ad9cf334", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/hooks/useDashboard.ts:110"}, "properties": {"repobilityId": "b43b00273c347c8f", "scanner": "scanner-primary", "fingerprint": "0844bc93ad9cf334", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01f76da26bc44344", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/hooks/useJournal.ts:257"}, "properties": {"repobilityId": "acd72e53023c8801", "scanner": "scanner-primary", "fingerprint": "01f76da26bc44344", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c21511f3e7e04b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/src/hooks/useMessages.ts:108"}, "properties": {"repobilityId": "021d8d860801c236", "scanner": "scanner-primary", "fingerprint": "0c21511f3e7e04b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-624f9ce62d18e070", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend-v2/src/hooks/useQuests.ts:61"}, "properties": {"repobilityId": "f5131a9507d16937", "scanner": "scanner-primary", "fingerprint": "624f9ce62d18e070", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-762b0faf7665dfc9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/src/hooks/useQuests.ts:245"}, "properties": {"repobilityId": "8f2df93ba5725be7", "scanner": "scanner-primary", "fingerprint": "762b0faf7665dfc9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ff912cc9b8b1a253", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/hooks/useParent.ts:63"}, "properties": {"repobilityId": "2a02541a18aac6f3", "scanner": "scanner-primary", "fingerprint": "ff912cc9b8b1a253", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bdb7c6043b7cb02", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend-v2/src/services/api.ts:15"}, "properties": {"repobilityId": "91ecf1bb4ea40a76", "scanner": "scanner-primary", "fingerprint": "6bdb7c6043b7cb02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40990d2fbdbc3e56", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/src/services/api.ts:444"}, "properties": {"repobilityId": "569f988ea8a6dfa3", "scanner": "scanner-primary", "fingerprint": "40990d2fbdbc3e56", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea30e72624ff4dad", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend-v2/src/services/signedUpload.ts:85"}, "properties": {"repobilityId": "c3b6b6003460b3ff", "scanner": "scanner-primary", "fingerprint": "ea30e72624ff4dad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef290d0ee4c67439", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend-v2/src/services/sentry.ts:116"}, "properties": {"repobilityId": "60630745e7eac0f0", "scanner": "scanner-primary", "fingerprint": "ef290d0ee4c67439", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b205265e7645038", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/services/diagnostics.ts:125"}, "properties": {"repobilityId": "d37490c4b9c62024", "scanner": "scanner-primary", "fingerprint": "7b205265e7645038", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54df9a10958caed4", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-v2/src/services/documentScanner.ts:42"}, "properties": {"repobilityId": "8375bdbfe584ab35", "scanner": "scanner-primary", "fingerprint": "54df9a10958caed4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-606d1a47bc8bf255", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/e2e/global-teardown.ts:20"}, "properties": {"repobilityId": "945719573e9d1c9d", "scanner": "scanner-primary", "fingerprint": "606d1a47bc8bf255", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ac11c5baf122a66", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-v2/e2e/global-setup.ts:49"}, "properties": {"repobilityId": "38712ea445382456", "scanner": "scanner-primary", "fingerprint": "6ac11c5baf122a66", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38249beff6c794f7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/ai-quest-cycle/index.ts:28"}, "properties": {"repobilityId": "ff0adeea4ce94965", "scanner": "scanner-primary", "fingerprint": "38249beff6c794f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b9fd427d053ac869", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/database.py:40"}, "properties": {"repobilityId": "e725af93c0067990", "scanner": "scanner-primary", "fingerprint": "b9fd427d053ac869", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a43aa50c69b6c41d", "level": "note", "message": {"text": "Legacy-named symbol `auth_login_v1` in backend/api_spec_generator.py:28"}, "properties": {"repobilityId": "c38081d5a6c8d9b6", "scanner": "scanner-primary", "fingerprint": "a43aa50c69b6c41d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-192e863cd8d07aa2", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app_config.py:117"}, "properties": {"repobilityId": "3a8b4845f73b66ca", "scanner": "scanner-primary", "fingerprint": "192e863cd8d07aa2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de42a20ae5f2375c", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/gunicorn.conf.py:37"}, "properties": {"repobilityId": "469fc8e63ef0f972", "scanner": "scanner-primary", "fingerprint": "de42a20ae5f2375c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7868a5db5454bf03", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/config/constants.py:34"}, "properties": {"repobilityId": "dece4e62008d0647", "scanner": "scanner-primary", "fingerprint": "7868a5db5454bf03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-158489e0667f6f76", "level": "note", "message": {"text": "Legacy-named symbol `test_invalid_too_old` in backend/tests/unit/test_bulk_import.py:195"}, "properties": {"repobilityId": "29ab3d65eceaf774", "scanner": "scanner-primary", "fingerprint": "158489e0667f6f76", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d3368feebceff518", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/tests/unit/test_quest_detail_moments.py:164"}, "properties": {"repobilityId": "fc9b1234767c3311", "scanner": "scanner-primary", "fingerprint": "d3368feebceff518", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b2014f3d67a5dac", "level": "note", "message": {"text": "Legacy-named symbol `speech_v1` in backend/tests/services/test_transcription_service.py:33"}, "properties": {"repobilityId": "a1812d53e79063b1", "scanner": "scanner-primary", "fingerprint": "2b2014f3d67a5dac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2d16f0c11090db4e", "level": "note", "message": {"text": "Legacy-named symbol `pw_v2` in backend/tests/manual/test_imscc_parser.py:12"}, "properties": {"repobilityId": "157d1d04ea2b4b46", "scanner": "scanner-primary", "fingerprint": "2d16f0c11090db4e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8bccb833fb393ed2", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/middleware/memory_monitor.py:155"}, "properties": {"repobilityId": "0fc25e549ed69608", "scanner": "scanner-primary", "fingerprint": "8bccb833fb393ed2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce5901d7f515880d", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/scripts/seed_demo_family.py:430"}, "properties": {"repobilityId": "c1409336034cf90b", "scanner": "scanner-primary", "fingerprint": "ce5901d7f515880d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f4ee85a5f45690cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/utils/session_manager.py:788"}, "properties": {"repobilityId": "02878388b0c7cae3", "scanner": "scanner-primary", "fingerprint": "f4ee85a5f45690cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df681813558b620e", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/routes/quest_personalization.py:436"}, "properties": {"repobilityId": "15d5b64a9454d6cb", "scanner": "scanner-primary", "fingerprint": "df681813558b620e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e0ebeffe47ffbf4", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/evidence_reports.py:24"}, "properties": {"repobilityId": "fca0b5eb8f6a9345", "scanner": "scanner-primary", "fingerprint": "8e0ebeffe47ffbf4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ae4a91470219052b", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/evidence_documents.py:288"}, "properties": {"repobilityId": "098fb3e5158a6848", "scanner": "scanner-primary", "fingerprint": "ae4a91470219052b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c22767ec855ae8f", "level": "note", "message": {"text": "Legacy-named symbol `create_quest_v2` in backend/routes/admin_core.py:70"}, "properties": {"repobilityId": "409bb946ea0be0d9", "scanner": "scanner-primary", "fingerprint": "8c22767ec855ae8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-62440771fe677ace", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/routes/admin_core.py:68"}, "properties": {"repobilityId": "9821d412f5e6f09f", "scanner": "scanner-primary", "fingerprint": "62440771fe677ace", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec0d14a7864708da", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/routes/family_quests.py:207"}, "properties": {"repobilityId": "51433bb04598cbcc", "scanner": "scanner-primary", "fingerprint": "ec0d14a7864708da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1e5bfa3fe4a915c", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/portfolio.py:12"}, "properties": {"repobilityId": "cf9d481541693c28", "scanner": "scanner-primary", "fingerprint": "b1e5bfa3fe4a915c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a809bc4eb74546b9", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/google_oauth.py:17"}, "properties": {"repobilityId": "c31d9e0064f001da", "scanner": "scanner-primary", "fingerprint": "a809bc4eb74546b9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d1bc58008347a59e", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/auth/google_oauth.py:501"}, "properties": {"repobilityId": "899bc826460a4ee3", "scanner": "scanner-primary", "fingerprint": "d1bc58008347a59e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f33bb9f867a08fd8", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/registration.py:19"}, "properties": {"repobilityId": "15fd683fb5186cc8", "scanner": "scanner-primary", "fingerprint": "f33bb9f867a08fd8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7ee9d937f9053b51", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/routes/auth/registration.py:399"}, "properties": {"repobilityId": "2b7d39de18843024", "scanner": "scanner-primary", "fingerprint": "7ee9d937f9053b51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72de50a6d1a7ff87", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/apple_oauth.py:22"}, "properties": {"repobilityId": "548595708bd31681", "scanner": "scanner-primary", "fingerprint": "72de50a6d1a7ff87", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0162004c70b41ee1", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/routes/auth/password.py:55"}, "properties": {"repobilityId": "c03ca042e8d67fd3", "scanner": "scanner-primary", "fingerprint": "0162004c70b41ee1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c206ff4750099d81", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/diagnostics.py:20"}, "properties": {"repobilityId": "f1b1477fbf25359c", "scanner": "scanner-primary", "fingerprint": "c206ff4750099d81", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-36cd67026d27ce3b", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/tokens.py:20"}, "properties": {"repobilityId": "b3ee98947ba20c1b", "scanner": "scanner-primary", "fingerprint": "36cd67026d27ce3b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e9b43faa139cf217", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/core.py:20"}, "properties": {"repobilityId": "c3db011ab04ccbe8", "scanner": "scanner-primary", "fingerprint": "e9b43faa139cf217", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2c975887b389cb88", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/routes/auth/login/core.py:342"}, "properties": {"repobilityId": "95cd6b1d00f9cf15", "scanner": "scanner-primary", "fingerprint": "2c975887b389cb88", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c99de7d1bcb3e47a", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/settings.py:20"}, "properties": {"repobilityId": "19075df583fa6927", "scanner": "scanner-primary", "fingerprint": "c99de7d1bcb3e47a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2d2ca080ba7dbc07", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/auth/login/security.py:20"}, "properties": {"repobilityId": "5c7974f210e2028f", "scanner": "scanner-primary", "fingerprint": "2d2ca080ba7dbc07", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aee188a64ef15391", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/parent/learning_moments.py:751"}, "properties": {"repobilityId": "32b41faaa2a755e1", "scanner": "scanner-primary", "fingerprint": "aee188a64ef15391", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1dd93bafdc2ed7c7", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/learning_events/crud.py:170"}, "properties": {"repobilityId": "4caf4a319954e432", "scanner": "scanner-primary", "fingerprint": "1dd93bafdc2ed7c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57e1dda2cb77c808", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/lti/launch.py:115"}, "properties": {"repobilityId": "b617d8160f94e5cd", "scanner": "scanner-primary", "fingerprint": "57e1dda2cb77c808", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb918d38b7f1f829", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/routes/lti/deep_linking.py:161"}, "properties": {"repobilityId": "6be94bc700e36d3d", "scanner": "scanner-primary", "fingerprint": "fb918d38b7f1f829", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d03a98a21141b13", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/observer/feed.py:252"}, "properties": {"repobilityId": "d6d94d33ba91942c", "scanner": "scanner-primary", "fingerprint": "3d03a98a21141b13", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-28e58bb47ae137e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/observer/family.py:326"}, "properties": {"repobilityId": "a66071f3d0476b88", "scanner": "scanner-primary", "fingerprint": "28e58bb47ae137e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e3909f916188c964", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/observer/acceptance.py:188"}, "properties": {"repobilityId": "0aadfc4203afa0c4", "scanner": "scanner-primary", "fingerprint": "e3909f916188c964", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6af05bdbd85bcea4", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/org_admin_actions.py:15"}, "properties": {"repobilityId": "e10478a21ef8d80e", "scanner": "scanner-primary", "fingerprint": "6af05bdbd85bcea4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e4fc25b8ccb7b296", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/merge.py:11"}, "properties": {"repobilityId": "3bdfa4067d0907ba", "scanner": "scanner-primary", "fingerprint": "e4fc25b8ccb7b296", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-807847f35f48fecb", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/items.py:20"}, "properties": {"repobilityId": "0919e4f94c166fe4", "scanner": "scanner-primary", "fingerprint": "807847f35f48fecb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b7584e087bc79e8a", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/routes/credit_dashboard/items.py:12"}, "properties": {"repobilityId": "6220737c7f644b00", "scanner": "scanner-primary", "fingerprint": "b7584e087bc79e8a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-83630b61546ae583", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/credit_dashboard/superadmin_actions.py:19"}, "properties": {"repobilityId": "b8d9b7affc09c11f", "scanner": "scanner-primary", "fingerprint": "83630b61546ae583", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e77d0c7f0e7c6419", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/tasks/completion.py:18"}, "properties": {"repobilityId": "6f9dc27e5cbf76b1", "scanner": "scanner-primary", "fingerprint": "e77d0c7f0e7c6419", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-48b6ae92a354c0a5", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/tasks/completion.py:106"}, "properties": {"repobilityId": "4724a469f1eb8d76", "scanner": "scanner-primary", "fingerprint": "48b6ae92a354c0a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33359cd66c3e2ca5", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/routes/tasks/crud.py:108"}, "properties": {"repobilityId": "ec20b16fc0f175ad", "scanner": "scanner-primary", "fingerprint": "33359cd66c3e2ca5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f64f477d0ce62a4", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/tasks/credit.py:14"}, "properties": {"repobilityId": "23418bd85c7fa26d", "scanner": "scanner-primary", "fingerprint": "4f64f477d0ce62a4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-46c3a7a8da84ee0f", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/admin/class_reviews.py:19"}, "properties": {"repobilityId": "3de54c776c53149e", "scanner": "scanner-primary", "fingerprint": "46c3a7a8da84ee0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-630cc3a847cf2f15", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/admin/poe.py:32"}, "properties": {"repobilityId": "f2a619f5406dd715", "scanner": "scanner-primary", "fingerprint": "630cc3a847cf2f15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d22d817f75a09870", "level": "note", "message": {"text": "Legacy-named symbol `days_old` in backend/routes/admin/ai_jobs.py:117"}, "properties": {"repobilityId": "f771a13cac116392", "scanner": "scanner-primary", "fingerprint": "d22d817f75a09870", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-35e10da100c5452e", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/admin/ai_jobs.py:104"}, "properties": {"repobilityId": "ccb6ccab288c7f48", "scanner": "scanner-primary", "fingerprint": "35e10da100c5452e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b89002caa360334c", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/quest/completion.py:495"}, "properties": {"repobilityId": "ef5e9e20e1901ad0", "scanner": "scanner-primary", "fingerprint": "b89002caa360334c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e240458eb1fa49c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/quest/detail.py:140"}, "properties": {"repobilityId": "dcd27319820032b1", "scanner": "scanner-primary", "fingerprint": "e240458eb1fa49c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56ad29e6405b3d67", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/quest/classes.py:19"}, "properties": {"repobilityId": "4d4f5a5a6cc1a7cf", "scanner": "scanner-primary", "fingerprint": "56ad29e6405b3d67", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b10c42a64f36b8e7", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/quest/listing.py:15"}, "properties": {"repobilityId": "035e760f069a488f", "scanner": "scanner-primary", "fingerprint": "b10c42a64f36b8e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-534dabc169a446ac", "level": "note", "message": {"text": "Legacy-named symbol `api_response_v1` in backend/routes/quest/enrollment.py:17"}, "properties": {"repobilityId": "d0459885078cf77e", "scanner": "scanner-primary", "fingerprint": "534dabc169a446ac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b388300a917d399b", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/routes/courses/crud.py:54"}, "properties": {"repobilityId": "4f4ae9b7311b5e64", "scanner": "scanner-primary", "fingerprint": "b388300a917d399b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd14c52b890d827f", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/personalization_service.py:219"}, "properties": {"repobilityId": "87d6b7fd6a092821", "scanner": "scanner-primary", "fingerprint": "fd14c52b890d827f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d8161bce7f18973", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/media_upload_service.py:352"}, "properties": {"repobilityId": "4a37c8894ed15466", "scanner": "scanner-primary", "fingerprint": "0d8161bce7f18973", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb13257b1d6d8b3f", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/services/dashboard_service.py:390"}, "properties": {"repobilityId": "01edb511a81f79d2", "scanner": "scanner-primary", "fingerprint": "eb13257b1d6d8b3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fba373bf4e5ddb3", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/video_processing_service.py:225"}, "properties": {"repobilityId": "0ab73587a1e42338", "scanner": "scanner-primary", "fingerprint": "0fba373bf4e5ddb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14ee8b32ba787b69", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 backend/services/video_processing_service.py:439"}, "properties": {"repobilityId": "78935a1818f33c82", "scanner": "scanner-primary", "fingerprint": "14ee8b32ba787b69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-03ae0f114532795b", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/services/interest_tracks_service.py:1867"}, "properties": {"repobilityId": "5418b5f3387f19b6", "scanner": "scanner-primary", "fingerprint": "03ae0f114532795b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1ad00b59298338ef", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/base_service.py:287"}, "properties": {"repobilityId": "dc27163ea29b0e13", "scanner": "scanner-primary", "fingerprint": "1ad00b59298338ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7846e2ef035ce159", "level": "note", "message": {"text": "Stub function `update_status` (body is just `pass`/`return`) \u2014 backend/services/base_service.py:337"}, "properties": {"repobilityId": "c6028ad59d404cc0", "scanner": "scanner-primary", "fingerprint": "7846e2ef035ce159", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-36012b1cf97bdbca", "level": "note", "message": {"text": "Legacy-named symbol `is_legacy` in backend/services/portfolio_service.py:1138"}, "properties": {"repobilityId": "9130a4060924b351", "scanner": "scanner-primary", "fingerprint": "36012b1cf97bdbca", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a8e1cc7a62f637a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/lti_service.py:211"}, "properties": {"repobilityId": "63015c0acbfa24f7", "scanner": "scanner-primary", "fingerprint": "a8e1cc7a62f637a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a408e26681ed69c", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 backend/services/lti_service.py:447"}, "properties": {"repobilityId": "af401fd80f9f14d1", "scanner": "scanner-primary", "fingerprint": "0a408e26681ed69c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-723430c9d413482e", "level": "none", "message": {"text": "Commented-code block (10 lines) in backend/services/base_ai_service.py:551"}, "properties": {"repobilityId": "f09c910269d116e2", "scanner": "scanner-primary", "fingerprint": "723430c9d413482e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef45b670a5445c4c", "level": "note", "message": {"text": "Legacy-named symbol `task_ids_to_copy` in backend/services/course_enrollment_service.py:258"}, "properties": {"repobilityId": "7be2f08096a77cd3", "scanner": "scanner-primary", "fingerprint": "ef45b670a5445c4c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fff481fad90391b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/notification_service.py:19"}, "properties": {"repobilityId": "f97e1d2623f84ac1", "scanner": "scanner-primary", "fingerprint": "fff481fad90391b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e78e89c0247950e1", "level": "note", "message": {"text": "Legacy-named symbol `load_copy` in backend/services/email_copy_loader.py:20"}, "properties": {"repobilityId": "9a8a7e247ed875a6", "scanner": "scanner-primary", "fingerprint": "e78e89c0247950e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7896955cd31bfe3f", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/services/xp_service.py:334"}, "properties": {"repobilityId": "e12406de88aa5769", "scanner": "scanner-primary", "fingerprint": "7896955cd31bfe3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cdc3d1b990f846d5", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/task_library_service.py:347"}, "properties": {"repobilityId": "7c09c73cfefc31c5", "scanner": "scanner-primary", "fingerprint": "cdc3d1b990f846d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37bdbbaf02c5e621", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/bounty_service.py:146"}, "properties": {"repobilityId": "fc41989997a7d6da", "scanner": "scanner-primary", "fingerprint": "37bdbbaf02c5e621", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-61220822e2c2767c", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/services/learning_events_service.py:494"}, "properties": {"repobilityId": "2a56bf70113020d6", "scanner": "scanner-primary", "fingerprint": "61220822e2c2767c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-97721a6db5af3f86", "level": "note", "message": {"text": "Legacy-named symbol `get_email_copy` in backend/services/email_service.py:218"}, "properties": {"repobilityId": "b1aa12c7212dd99b", "scanner": "scanner-primary", "fingerprint": "97721a6db5af3f86", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c8691169aa26b127", "level": "note", "message": {"text": "Legacy-named symbol `speech_v1` in backend/services/transcription_service.py:29"}, "properties": {"repobilityId": "d3e88df20c311cec", "scanner": "scanner-primary", "fingerprint": "c8691169aa26b127", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-04ad83de8020b40c", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/repositories/quest_repository.py:485"}, "properties": {"repobilityId": "9470ba3e8f773599", "scanner": "scanner-primary", "fingerprint": "04ad83de8020b40c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36c2c4215462fb87", "level": "note", "message": {"text": "Legacy-named symbol `nOld` in backend/migrations/personalized_quests_migration.py:71"}, "properties": {"repobilityId": "7282db9dbb3b1707", "scanner": "scanner-primary", "fingerprint": "36c2c4215462fb87", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-79ff44a7be2591de", "level": "note", "message": {"text": "Legacy-named symbol `days_old` in backend/jobs/scheduler.py:320"}, "properties": {"repobilityId": "a78415cfecb55011", "scanner": "scanner-primary", "fingerprint": "79ff44a7be2591de", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0f2d921ecc4b3313", "level": "note", "message": {"text": "111 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "86d178202ea6a64d", "scanner": "scanner-primary", "fingerprint": "0f2d921ecc4b3313", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f1b925d3429391a1", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6a7af79781d166a3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "67bba6e31bfabd3b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-380b7cb95b387b9c", "level": "note", "message": {"text": "Near-duplicate function bodies in 11 places"}, "properties": {"repobilityId": "ce1e4101803a4cac", "scanner": "scanner-primary", "fingerprint": "380b7cb95b387b9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b6c3d50ea4691e5b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "651abdeb4f2f7e6d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "de55e3e11cdf500b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "759df9ab73154b07", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4d0defee0d0db3be", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4ee4ebea0214587a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f7e5697cf4b8fdeb", "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": "1f767852ad1a8d54", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c38c02b9cbaf6bac", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "7469f8dc69fdad5f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "a9847ad42cf802c3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "03293e780c3104f2", "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": "49222f543dbe2410", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "95d6cbbd5bc6e539", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "ec28f0b77d97ed42", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "3d0e94708291dcf5", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-ec95304c94c48f43", "level": "warning", "message": {"text": "Frontend route `for-students` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "42f1363d49960960", "scanner": "scanner-primary", "fingerprint": "ec95304c94c48f43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f0afa32af4fba308", "level": "warning", "message": {"text": "Frontend route `for-families` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "1f31fad90a9c4793", "scanner": "scanner-primary", "fingerprint": "f0afa32af4fba308", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-af5514d5ad9e00f5", "level": "warning", "message": {"text": "Frontend route `for-schools` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d73dacfc2addd62a", "scanner": "scanner-primary", "fingerprint": "af5514d5ad9e00f5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f85fcee616bb4d17", "level": "warning", "message": {"text": "Frontend route `how-it-works` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "34195a4fed356559", "scanner": "scanner-primary", "fingerprint": "f85fcee616bb4d17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7d532d8bf70f9af2", "level": "warning", "message": {"text": "Frontend route `academy` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "1fe35e2458effe61", "scanner": "scanner-primary", "fingerprint": "7d532d8bf70f9af2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f42c8dad6e453e1e", "level": "warning", "message": {"text": "Frontend route `poe` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "1aab1c23abceed3b", "scanner": "scanner-primary", "fingerprint": "f42c8dad6e453e1e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-440112a750e540fa", "level": "warning", "message": {"text": "Frontend route `lti-launch` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "ae9de746c70ccd76", "scanner": "scanner-primary", "fingerprint": "440112a750e540fa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f4d515e44b5eba8c", "level": "warning", "message": {"text": "Frontend route `lti-deep-link` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "0a135ce65cd8ff3b", "scanner": "scanner-primary", "fingerprint": "f4d515e44b5eba8c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-958c55a3f6dd85a9", "level": "warning", "message": {"text": "Frontend route `lti-quest/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "7a95304ff4e83e19", "scanner": "scanner-primary", "fingerprint": "958c55a3f6dd85a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d2cef4d78dc8d3da", "level": "warning", "message": {"text": "Frontend route `lti-evidence` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "b5c0abce09c7107d", "scanner": "scanner-primary", "fingerprint": "d2cef4d78dc8d3da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fefb0f31ec81e6aa", "level": "warning", "message": {"text": "Frontend route `lti-error` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "7909482b19a08d7d", "scanner": "scanner-primary", "fingerprint": "fefb0f31ec81e6aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6c11f718caf19ee1", "level": "warning", "message": {"text": "Frontend route `demo` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "df3e653768eacd1d", "scanner": "scanner-primary", "fingerprint": "6c11f718caf19ee1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ce76e2ea005be3b3", "level": "warning", "message": {"text": "Frontend route `login` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "04727729d5691a90", "scanner": "scanner-primary", "fingerprint": "ce76e2ea005be3b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-000ae1b4385638cf", "level": "warning", "message": {"text": "Frontend route `login/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "a680a538378fc2f9", "scanner": "scanner-primary", "fingerprint": "000ae1b4385638cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bdcf15ab7e263148", "level": "warning", "message": {"text": "Frontend route `register` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "400358fa42818292", "scanner": "scanner-primary", "fingerprint": "bdcf15ab7e263148", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-82d678f812272510", "level": "warning", "message": {"text": "Frontend route `join/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "3b91a2b8d7c96b4b", "scanner": "scanner-primary", "fingerprint": "82d678f812272510", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ff618c2ebd152ead", "level": "warning", "message": {"text": "Frontend route `forgot-password` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "89da9a00e68e4ca5", "scanner": "scanner-primary", "fingerprint": "ff618c2ebd152ead", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-396d166db5d3c612", "level": "warning", "message": {"text": "Frontend route `reset-password` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "7124c006755234cf", "scanner": "scanner-primary", "fingerprint": "396d166db5d3c612", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-08911e4af00d9562", "level": "warning", "message": {"text": "Frontend route `auth/callback` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "f2a804e498bf00d2", "scanner": "scanner-primary", "fingerprint": "08911e4af00d9562", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b0b0053c1871184d", "level": "warning", "message": {"text": "Frontend route `email-verification` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "4263889714d57f8d", "scanner": "scanner-primary", "fingerprint": "b0b0053c1871184d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-689a5a04c00025ed", "level": "warning", "message": {"text": "Frontend route `terms` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "2fecd5c7ecefe01a", "scanner": "scanner-primary", "fingerprint": "689a5a04c00025ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1000a7c5a271d7d6", "level": "warning", "message": {"text": "Frontend route `privacy` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "09674a7ec6da75d5", "scanner": "scanner-primary", "fingerprint": "1000a7c5a271d7d6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-640a594205799bab", "level": "warning", "message": {"text": "Frontend route `support` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "1055c5cdb0c9a7da", "scanner": "scanner-primary", "fingerprint": "640a594205799bab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-40ac1a0516ec4902", "level": "warning", "message": {"text": "Frontend route `academy-agreement` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "e19be38f78efddea", "scanner": "scanner-primary", "fingerprint": "40ac1a0516ec4902", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7ebe6858f7b57f06", "level": "warning", "message": {"text": "Frontend route `academy-handbook` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "f9466b4fcec9ab11", "scanner": "scanner-primary", "fingerprint": "7ebe6858f7b57f06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5f91a47e3b222b6f", "level": "warning", "message": {"text": "Frontend route `parental-consent` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "fdbf12870fb8d44b", "scanner": "scanner-primary", "fingerprint": "5f91a47e3b222b6f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2e871598f476fac8", "level": "warning", "message": {"text": "Frontend route `catalog` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "87f22fbe30cc2963", "scanner": "scanner-primary", "fingerprint": "2e871598f476fac8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-aa1e699227a6007b", "level": "warning", "message": {"text": "Frontend route `course/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "1d8a5822956f5d77", "scanner": "scanner-primary", "fingerprint": "aa1e699227a6007b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3b944f7883ec806d", "level": "warning", "message": {"text": "Frontend route `class/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "b7120d5a1363f25f", "scanner": "scanner-primary", "fingerprint": "3b944f7883ec806d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-70afaceecf10f60e", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "2f33234b28aa677b", "scanner": "scanner-primary", "fingerprint": "70afaceecf10f60e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c6168643d72143ee", "level": "warning", "message": {"text": "Frontend route `quests` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "aab6787a6b1c4ea8", "scanner": "scanner-primary", "fingerprint": "c6168643d72143ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8f7f47d9549f3646", "level": "warning", "message": {"text": "Frontend route `quests/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "b3fc7d03043048c3", "scanner": "scanner-primary", "fingerprint": "8f7f47d9549f3646", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d4d06c036eaa41dc", "level": "warning", "message": {"text": "Frontend route `quests/:id/curriculum` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "7f2a3cde33484c94", "scanner": "scanner-primary", "fingerprint": "d4d06c036eaa41dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d627823b44e9d08c", "level": "warning", "message": {"text": "Frontend route `quests/:questId/library` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "a0fc333b6c043560", "scanner": "scanner-primary", "fingerprint": "d627823b44e9d08c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f45fd93154add838", "level": "warning", "message": {"text": "Frontend route `constellation` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d7a9e4fd234e615f", "scanner": "scanner-primary", "fingerprint": "f45fd93154add838", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b837931c4e5134a6", "level": "warning", "message": {"text": "Frontend route `courses` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d081e160a5abd2bb", "scanner": "scanner-primary", "fingerprint": "b837931c4e5134a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7f6d386d3df63c51", "level": "warning", "message": {"text": "Frontend route `courses/:courseId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "3c7ac5830048a97b", "scanner": "scanner-primary", "fingerprint": "7f6d386d3df63c51", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-acaca80911d71a40", "level": "warning", "message": {"text": "Frontend route `courses/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "e456bdb0c5cc6618", "scanner": "scanner-primary", "fingerprint": "acaca80911d71a40", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-58c91b48aa020a1a", "level": "warning", "message": {"text": "Frontend route `courses/new` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "31a8acf3c5e6f4c9", "scanner": "scanner-primary", "fingerprint": "58c91b48aa020a1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0ba6a17688868dae", "level": "warning", "message": {"text": "Frontend route `my-classes` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "53bf10c5c6d44d89", "scanner": "scanner-primary", "fingerprint": "0ba6a17688868dae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6a402f2c6bbef4bd", "level": "warning", "message": {"text": "Frontend route `classes/new` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "caff83217ddfe13c", "scanner": "scanner-primary", "fingerprint": "6a402f2c6bbef4bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a396d076069bfdbc", "level": "warning", "message": {"text": "Frontend route `classes/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "8bad19cea5981d46", "scanner": "scanner-primary", "fingerprint": "a396d076069bfdbc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-515ca6210695a1a9", "level": "warning", "message": {"text": "Frontend route `credits` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "aab9129a574c757e", "scanner": "scanner-primary", "fingerprint": "515ca6210695a1a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-51e6d362f20cd155", "level": "warning", "message": {"text": "Frontend route `transcript` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "4c29f653c68b78cb", "scanner": "scanner-primary", "fingerprint": "51e6d362f20cd155", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c419c33befa5df1d", "level": "warning", "message": {"text": "Frontend route `overview` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "8b2ec1e8957fc277", "scanner": "scanner-primary", "fingerprint": "c419c33befa5df1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0650c16c2cf18347", "level": "warning", "message": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "40ac3e9f7d4b76a1", "scanner": "scanner-primary", "fingerprint": "0650c16c2cf18347", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4f839994bbc0d755", "level": "warning", "message": {"text": "Frontend route `friends` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "5560b3f23e297951", "scanner": "scanner-primary", "fingerprint": "4f839994bbc0d755", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6139869fc0e8bad0", "level": "warning", "message": {"text": "Frontend route `connections` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "1142a34d3f96475c", "scanner": "scanner-primary", "fingerprint": "6139869fc0e8bad0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d45da13a67b909f7", "level": "warning", "message": {"text": "Frontend route `messages` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "25f840925d3db98d", "scanner": "scanner-primary", "fingerprint": "d45da13a67b909f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-037a0602049c74b8", "level": "warning", "message": {"text": "Frontend route `communication` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "434f00c34617d69f", "scanner": "scanner-primary", "fingerprint": "037a0602049c74b8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cdcf36154d03c487", "level": "warning", "message": {"text": "Frontend route `learning-journal` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "5b83d3c187c7db6a", "scanner": "scanner-primary", "fingerprint": "cdcf36154d03c487", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e6422814e88974f7", "level": "warning", "message": {"text": "Frontend route `invitations` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "c25ba424aee10f53", "scanner": "scanner-primary", "fingerprint": "e6422814e88974f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-71e373a3e1c087f3", "level": "warning", "message": {"text": "Frontend route `notifications` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "3b3986f670044658", "scanner": "scanner-primary", "fingerprint": "71e373a3e1c087f3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3a3b81fd252c966e", "level": "warning", "message": {"text": "Frontend route `feedback` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "57a2258e9d9b7c5b", "scanner": "scanner-primary", "fingerprint": "3a3b81fd252c966e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0736a64cb1f13eb9", "level": "warning", "message": {"text": "Frontend route `observer/feed` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "91af226b62d1debd", "scanner": "scanner-primary", "fingerprint": "0736a64cb1f13eb9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fe93e2cd8a7344ef", "level": "warning", "message": {"text": "Frontend route `observer/welcome` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "0385399a051c28a2", "scanner": "scanner-primary", "fingerprint": "fe93e2cd8a7344ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a117b92c02a92d54", "level": "warning", "message": {"text": "Frontend route `observer/student/:studentId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "c7da983d51a18595", "scanner": "scanner-primary", "fingerprint": "a117b92c02a92d54", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cbdadf30d498774d", "level": "warning", "message": {"text": "Frontend route `evidence-reports` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "9337754c8ca7a7e6", "scanner": "scanner-primary", "fingerprint": "cbdadf30d498774d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-63d4dc626532ad32", "level": "warning", "message": {"text": "Frontend route `evidence-reports/new` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d08e2d5a1c69e3a3", "scanner": "scanner-primary", "fingerprint": "63d4dc626532ad32", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cfa365fca68c61ed", "level": "warning", "message": {"text": "Frontend route `evidence-reports/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "98c7664beedbcd94", "scanner": "scanner-primary", "fingerprint": "cfa365fca68c61ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-39a64b0601434aee", "level": "warning", "message": {"text": "Frontend route `bounties` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "fe94005e40fbec6e", "scanner": "scanner-primary", "fingerprint": "39a64b0601434aee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ffcbdd66fe18cc31", "level": "warning", "message": {"text": "Frontend route `bounties/create` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "dd805b75cf32282c", "scanner": "scanner-primary", "fingerprint": "ffcbdd66fe18cc31", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6640263d1f37ade1", "level": "warning", "message": {"text": "Frontend route `bounties/:bountyId/edit` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "c59645af3488f759", "scanner": "scanner-primary", "fingerprint": "6640263d1f37ade1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d00a9e98b7d80030", "level": "warning", "message": {"text": "Frontend route `bounties/:bountyId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "7caf05872287d8a8", "scanner": "scanner-primary", "fingerprint": "d00a9e98b7d80030", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5d81190afb63b319", "level": "warning", "message": {"text": "Frontend route `buddy` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "887a82917c50543b", "scanner": "scanner-primary", "fingerprint": "5d81190afb63b319", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-54e4823cdaee7864", "level": "warning", "message": {"text": "Frontend route `opened-academy` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "68a1350d34414b3d", "scanner": "scanner-primary", "fingerprint": "54e4823cdaee7864", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c6dc06e12a2155ac", "level": "warning", "message": {"text": "Frontend route `opened-academy/student/:studentId/pathway` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "787b7da55beab7a6", "scanner": "scanner-primary", "fingerprint": "c6dc06e12a2155ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b78b2e6236aa3e67", "level": "warning", "message": {"text": "Frontend route `opened-academy/student/:studentId/credits` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "525d159609593f7c", "scanner": "scanner-primary", "fingerprint": "b78b2e6236aa3e67", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-418c55c930ce75ec", "level": "warning", "message": {"text": "Frontend route `treehouse` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "f52a9c25fe39c923", "scanner": "scanner-primary", "fingerprint": "418c55c930ce75ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d323326fbf011281", "level": "warning", "message": {"text": "Frontend route `treehouse/browse` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "5634bf3b6c6d2736", "scanner": "scanner-primary", "fingerprint": "d323326fbf011281", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d7766831315924ea", "level": "warning", "message": {"text": "Frontend route `treehouse/showcase` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "9d797e5963890504", "scanner": "scanner-primary", "fingerprint": "d7766831315924ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4af9701e7b171812", "level": "warning", "message": {"text": "Frontend route `treehouse/facilitator` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "0230a54657130e6a", "scanner": "scanner-primary", "fingerprint": "4af9701e7b171812", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-07bbd48508ed2049", "level": "warning", "message": {"text": "Frontend route `gryffin` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "dbc0506864287164", "scanner": "scanner-primary", "fingerprint": "07bbd48508ed2049", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3b3b6a42ed27bc9d", "level": "warning", "message": {"text": "Frontend route `gryffin/:classId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "32a1cafd9822d3f8", "scanner": "scanner-primary", "fingerprint": "3b3b6a42ed27bc9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f201b815c7d6f9fa", "level": "warning", "message": {"text": "Frontend route `admin/*` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "0a61af2838d2496f", "scanner": "scanner-primary", "fingerprint": "f201b815c7d6f9fa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6f7eaf9abf563776", "level": "warning", "message": {"text": "Frontend route `course-plan` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "fcaf03fe9ecec1ec", "scanner": "scanner-primary", "fingerprint": "6f7eaf9abf563776", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-822eae0c5aebad0e", "level": "warning", "message": {"text": "Frontend route `course-plan/:sessionId` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "cadeee3933ce191f", "scanner": "scanner-primary", "fingerprint": "822eae0c5aebad0e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-53873e4b0f606e48", "level": "warning", "message": {"text": "Frontend route `showcase` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "eb93070460869477", "scanner": "scanner-primary", "fingerprint": "53873e4b0f606e48", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-61aa80739a280968", "level": "warning", "message": {"text": "Frontend route `organization` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "ea6ada8a08702c11", "scanner": "scanner-primary", "fingerprint": "61aa80739a280968", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d25b744ee8ad13ba", "level": "warning", "message": {"text": "Frontend route `admin/organizations/:orgId/student/:studentId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "6111c54614abe5d4", "scanner": "scanner-primary", "fingerprint": "d25b744ee8ad13ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ef0c9b7fe3d8e7fc", "level": "warning", "message": {"text": "Frontend route `org-classes` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "cc03b575a0ea3727", "scanner": "scanner-primary", "fingerprint": "ef0c9b7fe3d8e7fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-66a5be0163efbe70", "level": "warning", "message": {"text": "Frontend route `org-classes/:classId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "710113f3842fc30e", "scanner": "scanner-primary", "fingerprint": "66a5be0163efbe70", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-541bad7b83657e70", "level": "warning", "message": {"text": "Frontend route `advisor` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "c7fc60b6106c80b6", "scanner": "scanner-primary", "fingerprint": "541bad7b83657e70", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-65e885e2382a77be", "level": "warning", "message": {"text": "Frontend route `advisor/dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "1fc762af45ba206b", "scanner": "scanner-primary", "fingerprint": "65e885e2382a77be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e33b71f98782fdc3", "level": "warning", "message": {"text": "Frontend route `advisor/checkin/:studentId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "24ca105b9b2c94b2", "scanner": "scanner-primary", "fingerprint": "e33b71f98782fdc3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a27879adcf9128f0", "level": "warning", "message": {"text": "Frontend route `advisor/verification` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "634a53986f1017dd", "scanner": "scanner-primary", "fingerprint": "a27879adcf9128f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-91ae8dc67fe275dc", "level": "warning", "message": {"text": "Frontend route `advisor/invitations` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "6f3f44bff3ec13d6", "scanner": "scanner-primary", "fingerprint": "91ae8dc67fe275dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-943689d07fd49ac0", "level": "warning", "message": {"text": "Frontend route `quests/:questId/curriculum/edit` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "13b032d9af294efc", "scanner": "scanner-primary", "fingerprint": "943689d07fd49ac0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-973c5b8b9eeee69c", "level": "warning", "message": {"text": "Frontend route `credit-dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "094b95cf6b65ab86", "scanner": "scanner-primary", "fingerprint": "973c5b8b9eeee69c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9575bb8b9ef66260", "level": "warning", "message": {"text": "Frontend route `parent/dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "fdba0e92783a83b3", "scanner": "scanner-primary", "fingerprint": "9575bb8b9ef66260", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-35b089c29898d797", "level": "warning", "message": {"text": "Frontend route `parent/dashboard/:studentId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "a4cf77ba5c9dbfcf", "scanner": "scanner-primary", "fingerprint": "35b089c29898d797", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a1bac4b384d555d1", "level": "warning", "message": {"text": "Frontend route `parent/quest/:studentId/:questId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "c479724eea046c15", "scanner": "scanner-primary", "fingerprint": "a1bac4b384d555d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a8b6c28fe162e5b9", "level": "warning", "message": {"text": "Frontend route `parent/child/:childId/journal` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "35e71d24974a72ae", "scanner": "scanner-primary", "fingerprint": "a8b6c28fe162e5b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-46e3213a887f1393", "level": "warning", "message": {"text": "Frontend route `parent/students/:studentId/report` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "359673bec55fdeee", "scanner": "scanner-primary", "fingerprint": "46e3213a887f1393", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-23e93c1581645325", "level": "warning", "message": {"text": "Frontend route `docs/:categorySlug` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "cde290a3a13a813d", "scanner": "scanner-primary", "fingerprint": "23e93c1581645325", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c24d3108a0a321a6", "level": "warning", "message": {"text": "Frontend route `docs/:categorySlug/:articleSlug` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "df86e2d2f3850e96", "scanner": "scanner-primary", "fingerprint": "c24d3108a0a321a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-982857b4b8969048", "level": "warning", "message": {"text": "Frontend route `diploma` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "87d5cf5e615df13e", "scanner": "scanner-primary", "fingerprint": "982857b4b8969048", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-37f590443a23d667", "level": "warning", "message": {"text": "Frontend route `portfolio/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "67e2eb2953b7eb42", "scanner": "scanner-primary", "fingerprint": "37f590443a23d667", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e1c3c1e73cb27e54", "level": "warning", "message": {"text": "Frontend route `public/diploma/:userId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "f5c66c886c001969", "scanner": "scanner-primary", "fingerprint": "e1c3c1e73cb27e54", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dc1dad5e759cc9a6", "level": "warning", "message": {"text": "Frontend route `public/transcript/:userId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "5053427109edfb73", "scanner": "scanner-primary", "fingerprint": "dc1dad5e759cc9a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cf8334a3acf1154d", "level": "warning", "message": {"text": "Frontend route `treehouse-kiosk` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "2fdf91e54c20ffce", "scanner": "scanner-primary", "fingerprint": "cf8334a3acf1154d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e2ad532e02a43730", "level": "warning", "message": {"text": "Frontend route `report/:token` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "9ae2dde4b30f0600", "scanner": "scanner-primary", "fingerprint": "e2ad532e02a43730", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-89363dff4b8de607", "level": "warning", "message": {"text": "Frontend route `shared/feed/:token` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "b30a2e1e740a5afb", "scanner": "scanner-primary", "fingerprint": "89363dff4b8de607", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8134549b0fed0e6c", "level": "warning", "message": {"text": "Frontend route `invitation/:code` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "8e494f3d1f2b57d7", "scanner": "scanner-primary", "fingerprint": "8134549b0fed0e6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d4e813ae5d648a95", "level": "warning", "message": {"text": "Frontend route `observer/accept/:invitationCode` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "6c326e2e297197c1", "scanner": "scanner-primary", "fingerprint": "d4e813ae5d648a95", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-38ec5a91aeff9404", "level": "warning", "message": {"text": "Frontend route `mobile` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d742c99388120ae6", "scanner": "scanner-primary", "fingerprint": "38ec5a91aeff9404", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bf8aa77fe5039b6b", "level": "warning", "message": {"text": "Frontend route `/protected` has no Link/navigate to it \u2014 frontend/src/components/PrivateRoute.test.jsx"}, "properties": {"repobilityId": "285dd5402157aa48", "scanner": "scanner-primary", "fingerprint": "bf8aa77fe5039b6b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-115317e5b8699bfc", "level": "warning", "message": {"text": "Frontend route `/quests/:id` has no Link/navigate to it \u2014 frontend/src/pages/QuestDetail.test.jsx"}, "properties": {"repobilityId": "d746c13c47d8300a", "scanner": "scanner-primary", "fingerprint": "115317e5b8699bfc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-45b5107ea1e203e9", "level": "warning", "message": {"text": "Frontend route `flagged-tasks` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "8a7b8428e21c4992", "scanner": "scanner-primary", "fingerprint": "45b5107ea1e203e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-21ac8f8ffe827302", "level": "warning", "message": {"text": "Frontend route `user/:userId/transfer-credits` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "942f263b54139657", "scanner": "scanner-primary", "fingerprint": "21ac8f8ffe827302", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1707d1d74085d30c", "level": "warning", "message": {"text": "Frontend route `user/:userId/transcript` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "2ad5cff3d6a28212", "scanner": "scanner-primary", "fingerprint": "1707d1d74085d30c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-00b7e3e9e36558ad", "level": "warning", "message": {"text": "Frontend route `organizations/:orgId` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "badae32e6a10430f", "scanner": "scanner-primary", "fingerprint": "00b7e3e9e36558ad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-896909cdaa7d81f1", "level": "warning", "message": {"text": "Frontend route `generate-course` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "ca4e39a286f55eb3", "scanner": "scanner-primary", "fingerprint": "896909cdaa7d81f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6704e8d0ee7a0212", "level": "warning", "message": {"text": "Frontend route `generate-course/:courseId` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "4cbd4f9bef3f6093", "scanner": "scanner-primary", "fingerprint": "6704e8d0ee7a0212", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a1cb6db859a34b53", "level": "warning", "message": {"text": "Frontend route `course-generation-queue` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "224aaf5b9db3007c", "scanner": "scanner-primary", "fingerprint": "a1cb6db859a34b53", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d144692e4ab8afc5", "level": "warning", "message": {"text": "Frontend route `classes/*` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.jsx"}, "properties": {"repobilityId": "52caeb416a681547", "scanner": "scanner-primary", "fingerprint": "d144692e4ab8afc5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a21d6a7dda433645", "level": "warning", "message": {"text": "Frontend route `/admin/*` has no Link/navigate to it \u2014 frontend/src/pages/AdminPage.test.jsx"}, "properties": {"repobilityId": "6ad968ef4831d0ed", "scanner": "scanner-primary", "fingerprint": "a21d6a7dda433645", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fe277d67cec46969", "level": "warning", "message": {"text": "Frontend route `/admin/organizations/:orgId` has no Link/navigate to it \u2014 frontend/src/pages/admin/OrganizationManagement.test.jsx"}, "properties": {"repobilityId": "2f19e7cf617d0103", "scanner": "scanner-primary", "fingerprint": "fe277d67cec46969", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ccc09eb0d5f7b2ef", "level": "warning", "message": {"text": "Frontend route `/admin/organizations/` has no Link/navigate to it \u2014 frontend/src/pages/admin/OrganizationManagement.test.jsx"}, "properties": {"repobilityId": "46b37848701ebb85", "scanner": "scanner-primary", "fingerprint": "ccc09eb0d5f7b2ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-41af5d63c59849b9", "level": "warning", "message": {"text": "Frontend route `/courses/:courseId` has no Link/navigate to it \u2014 frontend/src/pages/courses/CourseHomepage.test.jsx"}, "properties": {"repobilityId": "49fe73bb0c1bf483", "scanner": "scanner-primary", "fingerprint": "41af5d63c59849b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-914f1f00606620fc", "level": "warning", "message": {"text": "Frontend route `/curriculum/:questId/build` has no Link/navigate to it \u2014 frontend/src/pages/curriculum/CurriculumBuilder.test.jsx"}, "properties": {"repobilityId": "52ef14ab87d74772", "scanner": "scanner-primary", "fingerprint": "914f1f00606620fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-49b6fda1503d17e6", "level": "error", "message": {"text": "Flask mutation route `mark_as_read` without `@login_required` \u2014 backend/routes/notifications.py:92"}, "properties": {"repobilityId": "7bbd4fd27c9d804e", "scanner": "scanner-primary", "fingerprint": "49b6fda1503d17e6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/notifications.py"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-5ca421b5f9a3300b", "level": "error", "message": {"text": "Flask mutation route `mark_all_as_read` without `@login_required` \u2014 backend/routes/notifications.py:119"}, "properties": {"repobilityId": "5462d8b9b1cc3259", "scanner": "scanner-primary", "fingerprint": "5ca421b5f9a3300b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/notifications.py"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-7b101937399049ed", "level": "error", "message": {"text": "Flask mutation route `delete_notification` without `@login_required` \u2014 backend/routes/notifications.py:145"}, "properties": {"repobilityId": "33d3b35156e50cb6", "scanner": "scanner-primary", "fingerprint": "7b101937399049ed", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/notifications.py"}, "region": {"startLine": 145}}}]}, {"ruleId": "scanner-0fd3bd975ca9360a", "level": "error", "message": {"text": "Flask mutation route `delete_all_notifications` without `@login_required` \u2014 backend/routes/notifications.py:172"}, "properties": {"repobilityId": "c85de4ff281c54e2", "scanner": "scanner-primary", "fingerprint": "0fd3bd975ca9360a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/notifications.py"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-6cddbf71ba9bdf7d", "level": "error", "message": {"text": "Flask mutation route `send_notification` without `@login_required` \u2014 backend/routes/notifications.py:198"}, "properties": {"repobilityId": "d70fc2a7959f9698", "scanner": "scanner-primary", "fingerprint": "6cddbf71ba9bdf7d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/notifications.py"}, "region": {"startLine": 198}}}]}, {"ruleId": "scanner-64a55f9eb5022ece", "level": "error", "message": {"text": "Flask mutation route `update_preferences` without `@login_required` \u2014 backend/routes/notifications.py:299"}, "properties": {"repobilityId": "e218989b589e3323", "scanner": "scanner-primary", "fingerprint": "64a55f9eb5022ece", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/notifications.py"}, "region": {"startLine": 299}}}]}, {"ruleId": "scanner-0b6d62e7825f2008", "level": "error", "message": {"text": "Flask mutation route `broadcast_notification` without `@login_required` \u2014 backend/routes/notifications.py:331"}, "properties": {"repobilityId": "8da6ffbf581508d6", "scanner": "scanner-primary", "fingerprint": "0b6d62e7825f2008", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/notifications.py"}, "region": {"startLine": 331}}}]}, {"ruleId": "scanner-56d86041e6cff508", "level": "error", "message": {"text": "Flask mutation route `request_account_deletion` without `@login_required` \u2014 backend/routes/account_deletion.py:36"}, "properties": {"repobilityId": "737dd15f99078097", "scanner": "scanner-primary", "fingerprint": "56d86041e6cff508", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/account_deletion.py"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-360ebbe761670f40", "level": "error", "message": {"text": "Flask mutation route `cancel_account_deletion` without `@login_required` \u2014 backend/routes/account_deletion.py:116"}, "properties": {"repobilityId": "43b88546bd9649e7", "scanner": "scanner-primary", "fingerprint": "360ebbe761670f40", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/account_deletion.py"}, "region": {"startLine": 116}}}]}, {"ruleId": "scanner-884288561178d57d", "level": "error", "message": {"text": "Flask mutation route `delete_user_account_permanent` without `@login_required` \u2014 backend/routes/account_deletion.py:422"}, "properties": {"repobilityId": "207f8bcb3a296657", "scanner": "scanner-primary", "fingerprint": "884288561178d57d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/account_deletion.py"}, "region": {"startLine": 422}}}]}, {"ruleId": "scanner-a1c2c738470ad585", "level": "error", "message": {"text": "Flask mutation route `create_signal` without `@login_required` \u2014 backend/routes/treehouse.py:200"}, "properties": {"repobilityId": "3656522427326710", "scanner": "scanner-primary", "fingerprint": "a1c2c738470ad585", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/treehouse.py"}, "region": {"startLine": 200}}}]}, {"ruleId": "scanner-ec13a0b787c3a559", "level": "error", "message": {"text": "Flask mutation route `resolve_signal` without `@login_required` \u2014 backend/routes/treehouse.py:267"}, "properties": {"repobilityId": "344ecc88376ef361", "scanner": "scanner-primary", "fingerprint": "ec13a0b787c3a559", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/treehouse.py"}, "region": {"startLine": 267}}}]}, {"ruleId": "scanner-a3b7b5f88e93fabf", "level": "error", "message": {"text": "Flask mutation route `mark_pins` without `@login_required` \u2014 backend/routes/treehouse.py:349"}, "properties": {"repobilityId": "b8ada2330cab71ea", "scanner": "scanner-primary", "fingerprint": "a3b7b5f88e93fabf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/treehouse.py"}, "region": {"startLine": 349}}}]}, {"ruleId": "scanner-f2f709f8fffd9299", "level": "error", "message": {"text": "Flask mutation route `adjust_balance` without `@login_required` \u2014 backend/routes/treehouse.py:387"}, "properties": {"repobilityId": "a1c98898a4331e5f", "scanner": "scanner-primary", "fingerprint": "f2f709f8fffd9299", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/treehouse.py"}, "region": {"startLine": 387}}}]}, {"ruleId": "scanner-777516f464d24356", "level": "error", "message": {"text": "Flask mutation route `create_showcase` without `@login_required` \u2014 backend/routes/treehouse.py:430"}, "properties": {"repobilityId": "c02091f2e1647211", "scanner": "scanner-primary", "fingerprint": "777516f464d24356", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/treehouse.py"}, "region": {"startLine": 430}}}]}, {"ruleId": "scanner-a09dfa335e4179b2", "level": "error", "message": {"text": "Flask mutation route `update_showcase` without `@login_required` \u2014 backend/routes/treehouse.py:454"}, "properties": {"repobilityId": "d10a3a0d0b211a5c", "scanner": "scanner-primary", "fingerprint": "a09dfa335e4179b2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/treehouse.py"}, "region": {"startLine": 454}}}]}, {"ruleId": "scanner-a99a3ede6a69878c", "level": "error", "message": {"text": "Flask mutation route `join_showcase` without `@login_required` \u2014 backend/routes/treehouse.py:496"}, "properties": {"repobilityId": "17dec347087a4ab2", "scanner": "scanner-primary", "fingerprint": "a99a3ede6a69878c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/treehouse.py"}, "region": {"startLine": 496}}}]}, {"ruleId": "scanner-c7211cc12137b841", "level": "error", "message": {"text": "Flask mutation route `create_kiosk_device` without `@login_required` \u2014 backend/routes/treehouse.py:543"}, "properties": {"repobilityId": "11399497e943a600", "scanner": "scanner-primary", "fingerprint": "c7211cc12137b841", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/treehouse.py"}, "region": {"startLine": 543}}}]}, {"ruleId": "scanner-1b85490cd55560b0", "level": "error", "message": {"text": "Flask mutation route `kiosk_roster` without `@login_required` \u2014 backend/routes/treehouse.py:564"}, "properties": {"repobilityId": "2358548a18244a12", "scanner": "scanner-primary", "fingerprint": "1b85490cd55560b0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/treehouse.py"}, "region": {"startLine": 564}}}]}, {"ruleId": "scanner-7f77f664d3b190b8", "level": "error", "message": {"text": "Flask mutation route `kiosk_login` without `@login_required` \u2014 backend/routes/treehouse.py:594"}, "properties": {"repobilityId": "a78ec591244f5de8", "scanner": "scanner-primary", "fingerprint": "7f77f664d3b190b8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/treehouse.py"}, "region": {"startLine": 594}}}]}, {"ruleId": "scanner-c4420986572cd9a5", "level": "error", "message": {"text": "Flask mutation route `enhance_content` without `@login_required` \u2014 backend/routes/curriculum_enhance.py:20"}, "properties": {"repobilityId": "84a3ea596952b6b6", "scanner": "scanner-primary", "fingerprint": "c4420986572cd9a5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum_enhance.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-1cceb3f39e1424da", "level": "error", "message": {"text": "Flask mutation route `start_personalization` without `@login_required` \u2014 backend/routes/quest_personalization.py:71"}, "properties": {"repobilityId": "aa14436fc33ed658", "scanner": "scanner-primary", "fingerprint": "1cceb3f39e1424da", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_personalization.py"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-ac7040c7b2a04cf8", "level": "error", "message": {"text": "Flask mutation route `generate_tasks` without `@login_required` \u2014 backend/routes/quest_personalization.py:120"}, "properties": {"repobilityId": "db086b4adee27f07", "scanner": "scanner-primary", "fingerprint": "ac7040c7b2a04cf8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_personalization.py"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-25a2949ef37f1656", "level": "error", "message": {"text": "Flask mutation route `refine_tasks` without `@login_required` \u2014 backend/routes/quest_personalization.py:248"}, "properties": {"repobilityId": "4b14e7ce2aeb7a3a", "scanner": "scanner-primary", "fingerprint": "25a2949ef37f1656", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_personalization.py"}, "region": {"startLine": 248}}}]}, {"ruleId": "scanner-bf48cd878d496db8", "level": "error", "message": {"text": "Flask mutation route `edit_task` without `@login_required` \u2014 backend/routes/quest_personalization.py:294"}, "properties": {"repobilityId": "aa8adfd8edc6ba78", "scanner": "scanner-primary", "fingerprint": "bf48cd878d496db8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_personalization.py"}, "region": {"startLine": 294}}}]}, {"ruleId": "scanner-c5bd94a65a99bce2", "level": "error", "message": {"text": "Flask mutation route `analyze_manual_task` without `@login_required` \u2014 backend/routes/quest_personalization.py:338"}, "properties": {"repobilityId": "f45b6724c16ba64b", "scanner": "scanner-primary", "fingerprint": "c5bd94a65a99bce2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_personalization.py"}, "region": {"startLine": 338}}}]}, {"ruleId": "scanner-51c76b3dc10832ee", "level": "error", "message": {"text": "Flask mutation route `add_manual_tasks_batch` without `@login_required` \u2014 backend/routes/quest_personalization.py:389"}, "properties": {"repobilityId": "2847be6d548e9e6f", "scanner": "scanner-primary", "fingerprint": "51c76b3dc10832ee", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_personalization.py"}, "region": {"startLine": 389}}}]}, {"ruleId": "scanner-cd539815365c266a", "level": "error", "message": {"text": "Flask mutation route `finalize_tasks` without `@login_required` \u2014 backend/routes/quest_personalization.py:508"}, "properties": {"repobilityId": "50cf1afc10bb9e3b", "scanner": "scanner-primary", "fingerprint": "cd539815365c266a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_personalization.py"}, "region": {"startLine": 508}}}]}, {"ruleId": "scanner-da38c381a5134c14", "level": "error", "message": {"text": "Flask mutation route `accept_task_immediate` without `@login_required` \u2014 backend/routes/quest_personalization.py:561"}, "properties": {"repobilityId": "9415573775b2aa6c", "scanner": "scanner-primary", "fingerprint": "da38c381a5134c14", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_personalization.py"}, "region": {"startLine": 561}}}]}, {"ruleId": "scanner-9c0feec94a472613", "level": "error", "message": {"text": "Flask mutation route `skip_task_save_to_library` without `@login_required` \u2014 backend/routes/quest_personalization.py:689"}, "properties": {"repobilityId": "288a4ebfa7a4150b", "scanner": "scanner-primary", "fingerprint": "9c0feec94a472613", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_personalization.py"}, "region": {"startLine": 689}}}]}, {"ruleId": "scanner-5ee2d9890d0854a1", "level": "error", "message": {"text": "Flask mutation route `search_quest_image_route` without `@login_required` \u2014 backend/routes/images.py:20"}, "properties": {"repobilityId": "fe5d63380749ec9d", "scanner": "scanner-primary", "fingerprint": "5ee2d9890d0854a1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/images.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-37510be6bbb3d81f", "level": "error", "message": {"text": "Flask mutation route `generate_quest_from_topic` without `@login_required` \u2014 backend/routes/quest_ai.py:36"}, "properties": {"repobilityId": "e34bd28a3acb7009", "scanner": "scanner-primary", "fingerprint": "37510be6bbb3d81f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_ai.py"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-9e12bf4146651ab8", "level": "error", "message": {"text": "Flask mutation route `enhance_quest_description` without `@login_required` \u2014 backend/routes/quest_ai.py:130"}, "properties": {"repobilityId": "0668eaf924f0fbac", "scanner": "scanner-primary", "fingerprint": "9e12bf4146651ab8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_ai.py"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-4de07540cb82c64d", "level": "error", "message": {"text": "Flask mutation route `suggest_tasks_for_quest` without `@login_required` \u2014 backend/routes/quest_ai.py:187"}, "properties": {"repobilityId": "c0c52313678888a4", "scanner": "scanner-primary", "fingerprint": "4de07540cb82c64d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_ai.py"}, "region": {"startLine": 187}}}]}, {"ruleId": "scanner-8ab9a88c0074ed8c", "level": "error", "message": {"text": "Flask mutation route `validate_quest_quality` without `@login_required` \u2014 backend/routes/quest_ai.py:247"}, "properties": {"repobilityId": "40c989004d362897", "scanner": "scanner-primary", "fingerprint": "8ab9a88c0074ed8c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_ai.py"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-f95fb69e3f4a8be2", "level": "error", "message": {"text": "Flask mutation route `enhance_student_quest_idea` without `@login_required` \u2014 backend/routes/quest_ai.py:296"}, "properties": {"repobilityId": "c7cc7f2966cfeb50", "scanner": "scanner-primary", "fingerprint": "f95fb69e3f4a8be2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_ai.py"}, "region": {"startLine": 296}}}]}, {"ruleId": "scanner-68e00634f0109467", "level": "error", "message": {"text": "Flask mutation route `accept_approach` without `@login_required` \u2014 backend/routes/quest_ai.py:471"}, "properties": {"repobilityId": "fecb5c8e65f9d7c2", "scanner": "scanner-primary", "fingerprint": "68e00634f0109467", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_ai.py"}, "region": {"startLine": 471}}}]}, {"ruleId": "scanner-bdec2fe6ee08c59a", "level": "error", "message": {"text": "Flask mutation route `create_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:39"}, "properties": {"repobilityId": "fd8dea55c29d249f", "scanner": "scanner-primary", "fingerprint": "bdec2fe6ee08c59a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_reports.py"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-1a106b96ef15a75e", "level": "error", "message": {"text": "Flask mutation route `update_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:177"}, "properties": {"repobilityId": "65bd1db8cde7d261", "scanner": "scanner-primary", "fingerprint": "1a106b96ef15a75e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_reports.py"}, "region": {"startLine": 177}}}]}, {"ruleId": "scanner-7d56ae115dda9986", "level": "error", "message": {"text": "Flask mutation route `delete_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:227"}, "properties": {"repobilityId": "61372d460bfe41f5", "scanner": "scanner-primary", "fingerprint": "7d56ae115dda9986", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_reports.py"}, "region": {"startLine": 227}}}]}, {"ruleId": "scanner-30dc6672618618a5", "level": "error", "message": {"text": "Flask mutation route `approve_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:315"}, "properties": {"repobilityId": "c841467b172f3662", "scanner": "scanner-primary", "fingerprint": "30dc6672618618a5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_reports.py"}, "region": {"startLine": 315}}}]}, {"ruleId": "scanner-400f456969d109e6", "level": "error", "message": {"text": "Flask mutation route `deny_evidence_report` without `@login_required` \u2014 backend/routes/evidence_reports.py:347"}, "properties": {"repobilityId": "9b780a68a3a0ffc1", "scanner": "scanner-primary", "fingerprint": "400f456969d109e6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_reports.py"}, "region": {"startLine": 347}}}]}, {"ruleId": "scanner-d646a0b8ebc24fd7", "level": "error", "message": {"text": "Flask mutation route `update_settings` without `@login_required` \u2014 backend/routes/platform_settings.py:49"}, "properties": {"repobilityId": "bca7f64a858aefe3", "scanner": "scanner-primary", "fingerprint": "d646a0b8ebc24fd7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/platform_settings.py"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-6e560558e6eee6b5", "level": "error", "message": {"text": "Flask mutation route `save_evidence_document` without `@login_required` \u2014 backend/routes/evidence_documents.py:119"}, "properties": {"repobilityId": "4375cf477c8b74d3", "scanner": "scanner-primary", "fingerprint": "6e560558e6eee6b5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-bba5869e73e5bc3c", "level": "error", "message": {"text": "Flask mutation route `upload_task_file` without `@login_required` \u2014 backend/routes/evidence_documents.py:364"}, "properties": {"repobilityId": "ca40c682a8c2dd15", "scanner": "scanner-primary", "fingerprint": "bba5869e73e5bc3c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 364}}}]}, {"ruleId": "scanner-c437d00ccaf26722", "level": "error", "message": {"text": "Flask mutation route `init_task_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:425"}, "properties": {"repobilityId": "4c66d2f1e681718a", "scanner": "scanner-primary", "fingerprint": "c437d00ccaf26722", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 425}}}]}, {"ruleId": "scanner-85bb7525dba6225c", "level": "error", "message": {"text": "Flask mutation route `finalize_task_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:479"}, "properties": {"repobilityId": "95af968427f7f02e", "scanner": "scanner-primary", "fingerprint": "85bb7525dba6225c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 479}}}]}, {"ruleId": "scanner-67c1d6caeb460119", "level": "error", "message": {"text": "Flask mutation route `init_block_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:545"}, "properties": {"repobilityId": "354c2512c309a233", "scanner": "scanner-primary", "fingerprint": "67c1d6caeb460119", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 545}}}]}, {"ruleId": "scanner-2c23acba0dd341f8", "level": "error", "message": {"text": "Flask mutation route `finalize_block_signed_upload` without `@login_required` \u2014 backend/routes/evidence_documents.py:609"}, "properties": {"repobilityId": "6bd12f1a815e8250", "scanner": "scanner-primary", "fingerprint": "2c23acba0dd341f8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 609}}}]}, {"ruleId": "scanner-cb0ef48f37181b3f", "level": "error", "message": {"text": "Flask mutation route `upload_block_file` without `@login_required` \u2014 backend/routes/evidence_documents.py:715"}, "properties": {"repobilityId": "9da0e1b1b372ec3d", "scanner": "scanner-primary", "fingerprint": "cb0ef48f37181b3f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 715}}}]}, {"ruleId": "scanner-41775af54992f156", "level": "error", "message": {"text": "Flask mutation route `delete_block_file` without `@login_required` \u2014 backend/routes/evidence_documents.py:1279"}, "properties": {"repobilityId": "bd9a7b0368db2ced", "scanner": "scanner-primary", "fingerprint": "41775af54992f156", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 1279}}}]}, {"ruleId": "scanner-ed882bf91629644a", "level": "error", "message": {"text": "Flask mutation route `delete_storage_urls` without `@login_required` \u2014 backend/routes/evidence_documents.py:1345"}, "properties": {"repobilityId": "5f97ccc36916aac6", "scanner": "scanner-primary", "fingerprint": "ed882bf91629644a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 1345}}}]}, {"ruleId": "scanner-bb223f0ada31377d", "level": "error", "message": {"text": "Flask mutation route `delete_evidence_block` without `@login_required` \u2014 backend/routes/evidence_documents.py:1384"}, "properties": {"repobilityId": "1e7cf66cea90d108", "scanner": "scanner-primary", "fingerprint": "bb223f0ada31377d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 1384}}}]}, {"ruleId": "scanner-343fbb20466659ef", "level": "error", "message": {"text": "Flask mutation route `complete_task_with_evidence` without `@login_required` \u2014 backend/routes/evidence_documents.py:1457"}, "properties": {"repobilityId": "14c03807e25e0bdd", "scanner": "scanner-primary", "fingerprint": "343fbb20466659ef", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/evidence_documents.py"}, "region": {"startLine": 1457}}}]}, {"ruleId": "scanner-60b5736ad77d5ea3", "level": "error", "message": {"text": "Flask mutation route `select_pathway` without `@login_required` \u2014 backend/routes/oea.py:189"}, "properties": {"repobilityId": "63e8d3f1c861ef80", "scanner": "scanner-primary", "fingerprint": "60b5736ad77d5ea3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/oea.py"}, "region": {"startLine": 189}}}]}, {"ruleId": "scanner-1fdec0c1982090d8", "level": "error", "message": {"text": "Flask mutation route `add_student_credit` without `@login_required` \u2014 backend/routes/oea.py:283"}, "properties": {"repobilityId": "5e66ccf596ee2ee4", "scanner": "scanner-primary", "fingerprint": "1fdec0c1982090d8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/oea.py"}, "region": {"startLine": 283}}}]}, {"ruleId": "scanner-0cc3ebf1db3b85f2", "level": "error", "message": {"text": "Flask mutation route `update_student_credit` without `@login_required` \u2014 backend/routes/oea.py:351"}, "properties": {"repobilityId": "3612992573e64ad7", "scanner": "scanner-primary", "fingerprint": "0cc3ebf1db3b85f2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/oea.py"}, "region": {"startLine": 351}}}]}, {"ruleId": "scanner-7bc1b1e9fbf14077", "level": "error", "message": {"text": "Flask mutation route `delete_student_credit` without `@login_required` \u2014 backend/routes/oea.py:427"}, "properties": {"repobilityId": "50174cb425e6383f", "scanner": "scanner-primary", "fingerprint": "7bc1b1e9fbf14077", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/oea.py"}, "region": {"startLine": 427}}}]}, {"ruleId": "scanner-57a4bd97db18b626", "level": "error", "message": {"text": "Flask mutation route `ensure_credit_quest` without `@login_required` \u2014 backend/routes/oea.py:453"}, "properties": {"repobilityId": "fb2cc5c5af9aab26", "scanner": "scanner-primary", "fingerprint": "57a4bd97db18b626", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/oea.py"}, "region": {"startLine": 453}}}]}, {"ruleId": "scanner-9f25705a0c5d56d9", "level": "error", "message": {"text": "Flask mutation route `add_credit_evidence` without `@login_required` \u2014 backend/routes/oea.py:516"}, "properties": {"repobilityId": "47c30001b08baf7e", "scanner": "scanner-primary", "fingerprint": "9f25705a0c5d56d9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/oea.py"}, "region": {"startLine": 516}}}]}, {"ruleId": "scanner-1377a078d8337d3e", "level": "error", "message": {"text": "Flask mutation route `delete_credit_evidence` without `@login_required` \u2014 backend/routes/oea.py:572"}, "properties": {"repobilityId": "28823a6ef21995df", "scanner": "scanner-primary", "fingerprint": "1377a078d8337d3e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/oea.py"}, "region": {"startLine": 572}}}]}, {"ruleId": "scanner-67e356f6dd033a56", "level": "error", "message": {"text": "Flask mutation route `update_user_profile` without `@login_required` \u2014 backend/routes/admin_core.py:172"}, "properties": {"repobilityId": "8261e8d79c05215f", "scanner": "scanner-primary", "fingerprint": "67e356f6dd033a56", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin_core.py"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-d285011847f02053", "level": "error", "message": {"text": "Flask mutation route `update_user_role` without `@login_required` \u2014 backend/routes/admin_core.py:233"}, "properties": {"repobilityId": "9c90b1cfdf0a9086", "scanner": "scanner-primary", "fingerprint": "d285011847f02053", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin_core.py"}, "region": {"startLine": 233}}}]}, {"ruleId": "scanner-1aa8d042ba88582b", "level": "error", "message": {"text": "Flask mutation route `reset_user_password` without `@login_required` \u2014 backend/routes/admin_core.py:276"}, "properties": {"repobilityId": "bcf5436df37433a4", "scanner": "scanner-primary", "fingerprint": "1aa8d042ba88582b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin_core.py"}, "region": {"startLine": 276}}}]}, {"ruleId": "scanner-b3da881da9127603", "level": "error", "message": {"text": "Flask mutation route `toggle_user_status` without `@login_required` \u2014 backend/routes/admin_core.py:344"}, "properties": {"repobilityId": "b1ba64ab340cfeea", "scanner": "scanner-primary", "fingerprint": "b3da881da9127603", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin_core.py"}, "region": {"startLine": 344}}}]}, {"ruleId": "scanner-1990506d1acb33e6", "level": "error", "message": {"text": "Flask mutation route `delete_user_account` without `@login_required` \u2014 backend/routes/admin_core.py:381"}, "properties": {"repobilityId": "da02d308e32027ea", "scanner": "scanner-primary", "fingerprint": "1990506d1acb33e6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin_core.py"}, "region": {"startLine": 381}}}]}, {"ruleId": "scanner-8dbc44f708c13d61", "level": "error", "message": {"text": "Flask mutation route `send_bulk_email` without `@login_required` \u2014 backend/routes/admin_core.py:418"}, "properties": {"repobilityId": "26c6e16f4b31c8c6", "scanner": "scanner-primary", "fingerprint": "8dbc44f708c13d61", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin_core.py"}, "region": {"startLine": 418}}}]}, {"ruleId": "scanner-b5dabf2648ea93bd", "level": "error", "message": {"text": "Flask mutation route `generate_tasks` without `@login_required` \u2014 backend/routes/demo.py:191"}, "properties": {"repobilityId": "0202f98f8a1f5de2", "scanner": "scanner-primary", "fingerprint": "b5dabf2648ea93bd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/demo.py"}, "region": {"startLine": 191}}}]}, {"ruleId": "scanner-e2437c082d7cb06c", "level": "error", "message": {"text": "Flask mutation route `verify_task_completion` without `@login_required` \u2014 backend/routes/teacher_verification.py:171"}, "properties": {"repobilityId": "cff2aefb58d24c01", "scanner": "scanner-primary", "fingerprint": "e2437c082d7cb06c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/teacher_verification.py"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-1983c08b700bdd7a", "level": "error", "message": {"text": "Flask mutation route `send_message` without `@login_required` \u2014 backend/routes/direct_messages.py:170"}, "properties": {"repobilityId": "4081e5aa070f36c0", "scanner": "scanner-primary", "fingerprint": "1983c08b700bdd7a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/direct_messages.py"}, "region": {"startLine": 170}}}]}, {"ruleId": "scanner-d322292c3aba8317", "level": "error", "message": {"text": "Flask mutation route `mark_message_as_read` without `@login_required` \u2014 backend/routes/direct_messages.py:216"}, "properties": {"repobilityId": "e332a33e21fcf37a", "scanner": "scanner-primary", "fingerprint": "d322292c3aba8317", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/direct_messages.py"}, "region": {"startLine": 216}}}]}, {"ruleId": "scanner-f161fedd0dcb005f", "level": "error", "message": {"text": "Flask mutation route `post_credit_message` without `@login_required` \u2014 backend/routes/credit_messages.py:103"}, "properties": {"repobilityId": "205ad53db62208e1", "scanner": "scanner-primary", "fingerprint": "f161fedd0dcb005f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/credit_messages.py"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-84608689bfef22d7", "level": "error", "message": {"text": "Flask mutation route `upload_evidence_for_student` without `@login_required` \u2014 backend/routes/helper_evidence.py:113"}, "properties": {"repobilityId": "7f26186784843bec", "scanner": "scanner-primary", "fingerprint": "84608689bfef22d7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/helper_evidence.py"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-eedfde11de38c653", "level": "error", "message": {"text": "Flask mutation route `upload_evidence_batch` without `@login_required` \u2014 backend/routes/helper_evidence.py:253"}, "properties": {"repobilityId": "5e9dd7e9e02b9d57", "scanner": "scanner-primary", "fingerprint": "eedfde11de38c653", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/helper_evidence.py"}, "region": {"startLine": 253}}}]}, {"ruleId": "scanner-cb519a901ec7e051", "level": "error", "message": {"text": "Flask mutation route `delete_helper_evidence_block` without `@login_required` \u2014 backend/routes/helper_evidence.py:448"}, "properties": {"repobilityId": "e504696040e94500", "scanner": "scanner-primary", "fingerprint": "cb519a901ec7e051", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/helper_evidence.py"}, "region": {"startLine": 448}}}]}, {"ruleId": "scanner-ad71b13293e2b71f", "level": "error", "message": {"text": "Flask mutation route `helper_signed_upload_init` without `@login_required` \u2014 backend/routes/helper_evidence.py:661"}, "properties": {"repobilityId": "beb746a6f79f0c42", "scanner": "scanner-primary", "fingerprint": "ad71b13293e2b71f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/helper_evidence.py"}, "region": {"startLine": 661}}}]}, {"ruleId": "scanner-63c6db8e697dc6eb", "level": "error", "message": {"text": "Flask mutation route `helper_signed_upload_finalize` without `@login_required` \u2014 backend/routes/helper_evidence.py:722"}, "properties": {"repobilityId": "d608975c7b5b8d73", "scanner": "scanner-primary", "fingerprint": "63c6db8e697dc6eb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/helper_evidence.py"}, "region": {"startLine": 722}}}]}, {"ruleId": "scanner-c9d39e711b11e73d", "level": "error", "message": {"text": "Flask mutation route `create_bug_report` without `@login_required` \u2014 backend/routes/bug_reports.py:99"}, "properties": {"repobilityId": "6bb8e60e47d6bfc7", "scanner": "scanner-primary", "fingerprint": "c9d39e711b11e73d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/bug_reports.py"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-4aa8d8399eb87778", "level": "error", "message": {"text": "Flask mutation route `update_bug_report` without `@login_required` \u2014 backend/routes/bug_reports.py:203"}, "properties": {"repobilityId": "19a7d05fb12f8e80", "scanner": "scanner-primary", "fingerprint": "4aa8d8399eb87778", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/bug_reports.py"}, "region": {"startLine": 203}}}]}, {"ruleId": "scanner-f611083e36c467aa", "level": "error", "message": {"text": "Flask mutation route `track_client_events` without `@login_required` \u2014 backend/routes/activity.py:61"}, "properties": {"repobilityId": "e3e922878da14a97", "scanner": "scanner-primary", "fingerprint": "f611083e36c467aa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/activity.py"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-c89c744284e11f33", "level": "error", "message": {"text": "Flask mutation route `generate_steps` without `@login_required` \u2014 backend/routes/task_steps.py:20"}, "properties": {"repobilityId": "fef16d21d3e84c1d", "scanner": "scanner-primary", "fingerprint": "c89c744284e11f33", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/task_steps.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-f6fdad572d3f58e1", "level": "error", "message": {"text": "Flask mutation route `drill_down_step` without `@login_required` \u2014 backend/routes/task_steps.py:74"}, "properties": {"repobilityId": "e4a1656fc4a205cd", "scanner": "scanner-primary", "fingerprint": "f6fdad572d3f58e1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/task_steps.py"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-0f74fc6b43a51c4f", "level": "error", "message": {"text": "Flask mutation route `toggle_step` without `@login_required` \u2014 backend/routes/task_steps.py:151"}, "properties": {"repobilityId": "341aeb82245170a1", "scanner": "scanner-primary", "fingerprint": "0f74fc6b43a51c4f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/task_steps.py"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-4a4824e8e5be6aa6", "level": "error", "message": {"text": "Flask mutation route `delete_all_steps` without `@login_required` \u2014 backend/routes/task_steps.py:186"}, "properties": {"repobilityId": "db6bb59526169d44", "scanner": "scanner-primary", "fingerprint": "4a4824e8e5be6aa6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/task_steps.py"}, "region": {"startLine": 186}}}]}, {"ruleId": "scanner-d864ace6b343f25e", "level": "error", "message": {"text": "Flask mutation route `upload_evidence` without `@login_required` \u2014 backend/routes/uploads.py:54"}, "properties": {"repobilityId": "a79ed05ed40be1f0", "scanner": "scanner-primary", "fingerprint": "d864ace6b343f25e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/uploads.py"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-866324466d384538", "level": "error", "message": {"text": "Flask mutation route `upload_evidence_base64` without `@login_required` \u2014 backend/routes/uploads.py:94"}, "properties": {"repobilityId": "1dcc21bf7e0d4456", "scanner": "scanner-primary", "fingerprint": "866324466d384538", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/uploads.py"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-bb56ca912d78ba36", "level": "error", "message": {"text": "Flask mutation route `request_upload_session` without `@login_required` \u2014 backend/routes/uploads.py:151"}, "properties": {"repobilityId": "575c08a1a2b99a4d", "scanner": "scanner-primary", "fingerprint": "bb56ca912d78ba36", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/uploads.py"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-c2d2f0085ccb2f29", "level": "error", "message": {"text": "Flask mutation route `finalize_signed_upload` without `@login_required` \u2014 backend/routes/uploads.py:196"}, "properties": {"repobilityId": "fe6d17ab1a909a5f", "scanner": "scanner-primary", "fingerprint": "c2d2f0085ccb2f29", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/uploads.py"}, "region": {"startLine": 196}}}]}, {"ruleId": "scanner-c45b19ee2bb39e32", "level": "error", "message": {"text": "Flask mutation route `request_signed_upload_url` without `@login_required` \u2014 backend/routes/uploads.py:258"}, "properties": {"repobilityId": "598271e8961eedc2", "scanner": "scanner-primary", "fingerprint": "c45b19ee2bb39e32", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/uploads.py"}, "region": {"startLine": 258}}}]}, {"ruleId": "scanner-dfea685f1ef38260", "level": "error", "message": {"text": "Flask mutation route `process_uploaded_file` without `@login_required` \u2014 backend/routes/uploads.py:329"}, "properties": {"repobilityId": "af06f3cb6e29a9e1", "scanner": "scanner-primary", "fingerprint": "dfea685f1ef38260", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/uploads.py"}, "region": {"startLine": 329}}}]}, {"ruleId": "scanner-6f08bb3b69b433e7", "level": "error", "message": {"text": "Flask mutation route `patch_status` without `@login_required` \u2014 backend/routes/showcase.py:102"}, "properties": {"repobilityId": "ef3012e620dde581", "scanner": "scanner-primary", "fingerprint": "6f08bb3b69b433e7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/showcase.py"}, "region": {"startLine": 102}}}]}, {"ruleId": "scanner-db54b3c6ba205c17", "level": "error", "message": {"text": "Flask mutation route `record_post` without `@login_required` \u2014 backend/routes/showcase.py:121"}, "properties": {"repobilityId": "9fa95d85fd16ad17", "scanner": "scanner-primary", "fingerprint": "db54b3c6ba205c17", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/showcase.py"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-a085178ba265350f", "level": "error", "message": {"text": "Flask mutation route `patch_post` without `@login_required` \u2014 backend/routes/showcase.py:148"}, "properties": {"repobilityId": "4f0a0b196da06e02", "scanner": "scanner-primary", "fingerprint": "a085178ba265350f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/showcase.py"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-06e98e4c69cc53f7", "level": "error", "message": {"text": "Flask mutation route `ai_captions` without `@login_required` \u2014 backend/routes/showcase.py:177"}, "properties": {"repobilityId": "4f9d9c482da89c42", "scanner": "scanner-primary", "fingerprint": "06e98e4c69cc53f7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/showcase.py"}, "region": {"startLine": 177}}}]}, {"ruleId": "scanner-49fd62836950bea2", "level": "error", "message": {"text": "Flask mutation route `ai_alt_text` without `@login_required` \u2014 backend/routes/showcase.py:195"}, "properties": {"repobilityId": "de4ae87e0ac10cb4", "scanner": "scanner-primary", "fingerprint": "49fd62836950bea2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/showcase.py"}, "region": {"startLine": 195}}}]}, {"ruleId": "scanner-629b3ee4039dbec2", "level": "error", "message": {"text": "Flask mutation route `ai_quote_pull` without `@login_required` \u2014 backend/routes/showcase.py:213"}, "properties": {"repobilityId": "d6931bcfe50bc8c2", "scanner": "scanner-primary", "fingerprint": "629b3ee4039dbec2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/showcase.py"}, "region": {"startLine": 213}}}]}, {"ruleId": "scanner-af1ed28f172aced4", "level": "error", "message": {"text": "Flask mutation route `parent_self_revoke` without `@login_required` \u2014 backend/routes/showcase.py:281"}, "properties": {"repobilityId": "5fa412adbf3bf920", "scanner": "scanner-primary", "fingerprint": "af1ed28f172aced4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/showcase.py"}, "region": {"startLine": 281}}}]}, {"ruleId": "scanner-344f0c7ac18e865e", "level": "error", "message": {"text": "Flask mutation route `create_family_quest` without `@login_required` \u2014 backend/routes/family_quests.py:50"}, "properties": {"repobilityId": "b4b1912dfcda2293", "scanner": "scanner-primary", "fingerprint": "344f0c7ac18e865e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/family_quests.py"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-8b8b1642191589a0", "level": "error", "message": {"text": "Flask mutation route `update_family_quest_template_tasks` without `@login_required` \u2014 backend/routes/family_quests.py:112"}, "properties": {"repobilityId": "1bda15aabe823960", "scanner": "scanner-primary", "fingerprint": "8b8b1642191589a0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/family_quests.py"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-04c57ccb078e89f3", "level": "error", "message": {"text": "Flask mutation route `enroll_children_in_family_quest` without `@login_required` \u2014 backend/routes/family_quests.py:186"}, "properties": {"repobilityId": "37b848212024aac6", "scanner": "scanner-primary", "fingerprint": "04c57ccb078e89f3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/family_quests.py"}, "region": {"startLine": 186}}}]}, {"ruleId": "scanner-64286c76524b8a7d", "level": "error", "message": {"text": "Flask mutation route `create_task_for_dependent` without `@login_required` \u2014 backend/routes/family_quests.py:292"}, "properties": {"repobilityId": "7df33be6c73f612b", "scanner": "scanner-primary", "fingerprint": "64286c76524b8a7d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/family_quests.py"}, "region": {"startLine": 292}}}]}, {"ruleId": "scanner-dec505149540ef42", "level": "error", "message": {"text": "Flask mutation route `uncomplete_task_for_dependent` without `@login_required` \u2014 backend/routes/family_quests.py:389"}, "properties": {"repobilityId": "1f6ab0c2d2f16762", "scanner": "scanner-primary", "fingerprint": "dec505149540ef42", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/family_quests.py"}, "region": {"startLine": 389}}}]}, {"ruleId": "scanner-950debe6e9cd553d", "level": "error", "message": {"text": "Flask mutation route `create_announcement` without `@login_required` \u2014 backend/routes/announcements.py:29"}, "properties": {"repobilityId": "0954923c0401cbfd", "scanner": "scanner-primary", "fingerprint": "950debe6e9cd553d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/announcements.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-3787a40f63390e35", "level": "error", "message": {"text": "Flask mutation route `create_group` without `@login_required` \u2014 backend/routes/group_messages.py:30"}, "properties": {"repobilityId": "3365c8963f4f4e58", "scanner": "scanner-primary", "fingerprint": "3787a40f63390e35", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/group_messages.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-7ba71d17381b383f", "level": "error", "message": {"text": "Flask mutation route `update_group` without `@login_required` \u2014 backend/routes/group_messages.py:139"}, "properties": {"repobilityId": "3ff76b4c4147a78a", "scanner": "scanner-primary", "fingerprint": "7ba71d17381b383f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/group_messages.py"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-2b0f0f52d3dc747e", "level": "error", "message": {"text": "Flask mutation route `delete_group` without `@login_required` \u2014 backend/routes/group_messages.py:191"}, "properties": {"repobilityId": "3528a5a48cc337cc", "scanner": "scanner-primary", "fingerprint": "2b0f0f52d3dc747e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/group_messages.py"}, "region": {"startLine": 191}}}]}, {"ruleId": "scanner-4a289aaabb03766b", "level": "error", "message": {"text": "Flask mutation route `add_member` without `@login_required` \u2014 backend/routes/group_messages.py:219"}, "properties": {"repobilityId": "ce1a4617b66dc905", "scanner": "scanner-primary", "fingerprint": "4a289aaabb03766b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/group_messages.py"}, "region": {"startLine": 219}}}]}, {"ruleId": "scanner-097fd79527e20814", "level": "error", "message": {"text": "Flask mutation route `remove_member` without `@login_required` \u2014 backend/routes/group_messages.py:256"}, "properties": {"repobilityId": "1636b1e36e369457", "scanner": "scanner-primary", "fingerprint": "097fd79527e20814", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/group_messages.py"}, "region": {"startLine": 256}}}]}, {"ruleId": "scanner-5fefce550032f655", "level": "error", "message": {"text": "Flask mutation route `leave_group` without `@login_required` \u2014 backend/routes/group_messages.py:283"}, "properties": {"repobilityId": "a245717a210bcd20", "scanner": "scanner-primary", "fingerprint": "5fefce550032f655", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/group_messages.py"}, "region": {"startLine": 283}}}]}, {"ruleId": "scanner-76380dda775e80c1", "level": "error", "message": {"text": "Flask mutation route `send_message` without `@login_required` \u2014 backend/routes/group_messages.py:349"}, "properties": {"repobilityId": "e75c7d7da309f48d", "scanner": "scanner-primary", "fingerprint": "76380dda775e80c1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/group_messages.py"}, "region": {"startLine": 349}}}]}, {"ruleId": "scanner-13aebee1170af02a", "level": "error", "message": {"text": "Flask mutation route `mark_as_read` without `@login_required` \u2014 backend/routes/group_messages.py:395"}, "properties": {"repobilityId": "9a952666fedd9526", "scanner": "scanner-primary", "fingerprint": "13aebee1170af02a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/group_messages.py"}, "region": {"startLine": 395}}}]}, {"ruleId": "scanner-8bda958f6b294aaf", "level": "error", "message": {"text": "Flask mutation route `submit_contact` without `@login_required` \u2014 backend/routes/contact.py:18"}, "properties": {"repobilityId": "c69f4e3dae57ff27", "scanner": "scanner-primary", "fingerprint": "8bda958f6b294aaf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/contact.py"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-cf55f479efed7880", "level": "error", "message": {"text": "Flask mutation route `create_dependent` without `@login_required` \u2014 backend/routes/dependents.py:121"}, "properties": {"repobilityId": "7be37d08bec2708e", "scanner": "scanner-primary", "fingerprint": "cf55f479efed7880", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/dependents.py"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-f3ba1a339eca1f39", "level": "error", "message": {"text": "Flask mutation route `update_dependent` without `@login_required` \u2014 backend/routes/dependents.py:231"}, "properties": {"repobilityId": "02bf567a9f2bb4d6", "scanner": "scanner-primary", "fingerprint": "f3ba1a339eca1f39", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/dependents.py"}, "region": {"startLine": 231}}}]}, {"ruleId": "scanner-32ffee160f79f345", "level": "error", "message": {"text": "Flask mutation route `upload_dependent_avatar` without `@login_required` \u2014 backend/routes/dependents.py:304"}, "properties": {"repobilityId": "ac535a1140e54c2b", "scanner": "scanner-primary", "fingerprint": "32ffee160f79f345", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/dependents.py"}, "region": {"startLine": 304}}}]}, {"ruleId": "scanner-0ebc0bb6e7a66c2b", "level": "error", "message": {"text": "Flask mutation route `delete_dependent` without `@login_required` \u2014 backend/routes/dependents.py:393"}, "properties": {"repobilityId": "06c91f7532908677", "scanner": "scanner-primary", "fingerprint": "0ebc0bb6e7a66c2b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/dependents.py"}, "region": {"startLine": 393}}}]}, {"ruleId": "scanner-8478b6c30439de76", "level": "error", "message": {"text": "Flask mutation route `promote_dependent` without `@login_required` \u2014 backend/routes/dependents.py:435"}, "properties": {"repobilityId": "517af9ed807a8af1", "scanner": "scanner-primary", "fingerprint": "8478b6c30439de76", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/dependents.py"}, "region": {"startLine": 435}}}]}, {"ruleId": "scanner-616e0a5e2bfb36e0", "level": "error", "message": {"text": "Flask mutation route `add_dependent_login` without `@login_required` \u2014 backend/routes/dependents.py:512"}, "properties": {"repobilityId": "ea7d75a1e52192eb", "scanner": "scanner-primary", "fingerprint": "616e0a5e2bfb36e0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/dependents.py"}, "region": {"startLine": 512}}}]}, {"ruleId": "scanner-64f6e39b96ecdf95", "level": "error", "message": {"text": "Flask mutation route `toggle_child_ai_access` without `@login_required` \u2014 backend/routes/dependents.py:635"}, "properties": {"repobilityId": "679206c887f3826a", "scanner": "scanner-primary", "fingerprint": "64f6e39b96ecdf95", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/dependents.py"}, "region": {"startLine": 635}}}]}, {"ruleId": "scanner-d20fb023a51a4c05", "level": "error", "message": {"text": "Flask mutation route `update_child_ai_features` without `@login_required` \u2014 backend/routes/dependents.py:730"}, "properties": {"repobilityId": "655e57f5dc46006d", "scanner": "scanner-primary", "fingerprint": "d20fb023a51a4c05", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/dependents.py"}, "region": {"startLine": 730}}}]}, {"ruleId": "scanner-33f6278470d85f95", "level": "error", "message": {"text": "Flask mutation route `generate_acting_as_token` without `@login_required` \u2014 backend/routes/dependents.py:828"}, "properties": {"repobilityId": "ef9a07dd7b45c497", "scanner": "scanner-primary", "fingerprint": "33f6278470d85f95", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/dependents.py"}, "region": {"startLine": 828}}}]}, {"ruleId": "scanner-13ebaf47d7222307", "level": "error", "message": {"text": "Flask mutation route `stop_acting_as` without `@login_required` \u2014 backend/routes/dependents.py:880"}, "properties": {"repobilityId": "5a766e571e194a1a", "scanner": "scanner-primary", "fingerprint": "13ebaf47d7222307", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/dependents.py"}, "region": {"startLine": 880}}}]}, {"ruleId": "scanner-b5e00129574d49c2", "level": "error", "message": {"text": "Flask mutation route `report_content` without `@login_required` \u2014 backend/routes/moderation.py:24"}, "properties": {"repobilityId": "26fdf7af4a8a6c94", "scanner": "scanner-primary", "fingerprint": "b5e00129574d49c2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/moderation.py"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-95b4d168748c3894", "level": "error", "message": {"text": "Flask mutation route `block_user` without `@login_required` \u2014 backend/routes/moderation.py:81"}, "properties": {"repobilityId": "9ef3012448dfaf19", "scanner": "scanner-primary", "fingerprint": "95b4d168748c3894", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/moderation.py"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-5626d155cff0e9cd", "level": "error", "message": {"text": "Flask mutation route `unblock_user` without `@login_required` \u2014 backend/routes/moderation.py:113"}, "properties": {"repobilityId": "9d855ea8601c9e08", "scanner": "scanner-primary", "fingerprint": "5626d155cff0e9cd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/moderation.py"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-ff2c85bb41f8454c", "level": "error", "message": {"text": "Flask mutation route `enroll_in_poe` without `@login_required` \u2014 backend/routes/poe.py:83"}, "properties": {"repobilityId": "d4f5d1fed86269c7", "scanner": "scanner-primary", "fingerprint": "ff2c85bb41f8454c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/poe.py"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-7e622c521b12cb91", "level": "error", "message": {"text": "Flask mutation route `add_sample_task_to_user_quest` without `@login_required` \u2014 backend/routes/quest_types.py:28"}, "properties": {"repobilityId": "093b20a5684277f4", "scanner": "scanner-primary", "fingerprint": "7e622c521b12cb91", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest_types.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-7816786149e218b3", "level": "error", "message": {"text": "Flask mutation route `calculate_credits` without `@login_required` \u2014 backend/routes/credits.py:256"}, "properties": {"repobilityId": "2065faae9fbaae95", "scanner": "scanner-primary", "fingerprint": "7816786149e218b3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/credits.py"}, "region": {"startLine": 256}}}]}, {"ruleId": "scanner-bdd3b6b6c47741a0", "level": "error", "message": {"text": "Flask mutation route `update_portfolio_privacy` without `@login_required` \u2014 backend/routes/portfolio.py:183"}, "properties": {"repobilityId": "80686800e77ca76b", "scanner": "scanner-primary", "fingerprint": "bdd3b6b6c47741a0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/portfolio.py"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-3fb7db148de51929", "level": "error", "message": {"text": "Flask mutation route `submit_interest` without `@login_required` \u2014 backend/routes/promo.py:15"}, "properties": {"repobilityId": "78f34ee527cf6537", "scanner": "scanner-primary", "fingerprint": "3fb7db148de51929", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/promo.py"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-34a7dcb472a9d97e", "level": "error", "message": {"text": "Flask mutation route `subscribe` without `@login_required` \u2014 backend/routes/push_subscriptions.py:44"}, "properties": {"repobilityId": "e8bfe2d5efc1a561", "scanner": "scanner-primary", "fingerprint": "34a7dcb472a9d97e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/push_subscriptions.py"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-abab743e1a03da98", "level": "error", "message": {"text": "Flask mutation route `unsubscribe` without `@login_required` \u2014 backend/routes/push_subscriptions.py:112"}, "properties": {"repobilityId": "a9bf6762a5101f21", "scanner": "scanner-primary", "fingerprint": "abab743e1a03da98", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/push_subscriptions.py"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-85e40545a7246628", "level": "error", "message": {"text": "Flask mutation route `register_expo_token` without `@login_required` \u2014 backend/routes/push_subscriptions.py:196"}, "properties": {"repobilityId": "189852b86f25fb2b", "scanner": "scanner-primary", "fingerprint": "85e40545a7246628", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/push_subscriptions.py"}, "region": {"startLine": 196}}}]}, {"ruleId": "scanner-4dc8a2da94d1a30d", "level": "error", "message": {"text": "Flask mutation route `deactivate_expo_token` without `@login_required` \u2014 backend/routes/push_subscriptions.py:241"}, "properties": {"repobilityId": "ece1ddada43fcfa1", "scanner": "scanner-primary", "fingerprint": "4dc8a2da94d1a30d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/push_subscriptions.py"}, "region": {"startLine": 241}}}]}, {"ruleId": "scanner-8877c6290f91059e", "level": "error", "message": {"text": "Flask mutation route `test_push` without `@login_required` \u2014 backend/routes/push_subscriptions.py:274"}, "properties": {"repobilityId": "c03d49bfbdc41794", "scanner": "scanner-primary", "fingerprint": "8877c6290f91059e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/push_subscriptions.py"}, "region": {"startLine": 274}}}]}, {"ruleId": "scanner-38dffbf73a8f175b", "level": "error", "message": {"text": "Flask mutation route `google_oauth_callback` without `@login_required` \u2014 backend/routes/auth/google_oauth.py:110"}, "properties": {"repobilityId": "db565904f967a414", "scanner": "scanner-primary", "fingerprint": "38dffbf73a8f175b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/google_oauth.py"}, "region": {"startLine": 110}}}]}, {"ruleId": "scanner-3a5f1bc59ec73aac", "level": "error", "message": {"text": "Flask mutation route `accept_tos` without `@login_required` \u2014 backend/routes/auth/google_oauth.py:375"}, "properties": {"repobilityId": "66b2cf593ab3bacb", "scanner": "scanner-primary", "fingerprint": "3a5f1bc59ec73aac", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/google_oauth.py"}, "region": {"startLine": 375}}}]}, {"ruleId": "scanner-d179ec6b79090ab7", "level": "error", "message": {"text": "Flask mutation route `register` without `@login_required` \u2014 backend/routes/auth/registration.py:111"}, "properties": {"repobilityId": "8c26372b6f819356", "scanner": "scanner-primary", "fingerprint": "d179ec6b79090ab7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/registration.py"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-f7c28ac13fadbd62", "level": "error", "message": {"text": "Flask mutation route `verify_email_otp` without `@login_required` \u2014 backend/routes/auth/registration.py:582"}, "properties": {"repobilityId": "b40fced480ad298d", "scanner": "scanner-primary", "fingerprint": "f7c28ac13fadbd62", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/registration.py"}, "region": {"startLine": 582}}}]}, {"ruleId": "scanner-c63b50d36afcf663", "level": "error", "message": {"text": "Flask mutation route `resend_verification` without `@login_required` \u2014 backend/routes/auth/registration.py:653"}, "properties": {"repobilityId": "49204ec5bc5b06db", "scanner": "scanner-primary", "fingerprint": "c63b50d36afcf663", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/registration.py"}, "region": {"startLine": 653}}}]}, {"ruleId": "scanner-99e4305f0fd45354", "level": "error", "message": {"text": "Flask mutation route `apple_oauth_callback` without `@login_required` \u2014 backend/routes/auth/apple_oauth.py:36"}, "properties": {"repobilityId": "992f3d210d415f4f", "scanner": "scanner-primary", "fingerprint": "99e4305f0fd45354", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/apple_oauth.py"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-ac434fed98ba176d", "level": "error", "message": {"text": "Flask mutation route `mark_tutorial_completed` without `@login_required` \u2014 backend/routes/auth/session.py:58"}, "properties": {"repobilityId": "a1e5079293c9f307", "scanner": "scanner-primary", "fingerprint": "ac434fed98ba176d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/session.py"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-3f30a08f5bf31d3c", "level": "error", "message": {"text": "Flask mutation route `forgot_password` without `@login_required` \u2014 backend/routes/auth/password.py:165"}, "properties": {"repobilityId": "2ed9a09f7790bcc0", "scanner": "scanner-primary", "fingerprint": "3f30a08f5bf31d3c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/password.py"}, "region": {"startLine": 165}}}]}, {"ruleId": "scanner-0909343e294e6a4f", "level": "error", "message": {"text": "Flask mutation route `reset_password` without `@login_required` \u2014 backend/routes/auth/password.py:332"}, "properties": {"repobilityId": "da72577fee16a924", "scanner": "scanner-primary", "fingerprint": "0909343e294e6a4f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/password.py"}, "region": {"startLine": 332}}}]}, {"ruleId": "scanner-52a0409666c292d6", "level": "error", "message": {"text": "Flask mutation route `token` without `@login_required` \u2014 backend/routes/auth/oauth.py:142"}, "properties": {"repobilityId": "ee76558198af74f2", "scanner": "scanner-primary", "fingerprint": "52a0409666c292d6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/oauth.py"}, "region": {"startLine": 142}}}]}, {"ruleId": "scanner-3d989e3a9aa56c4d", "level": "error", "message": {"text": "Flask mutation route `revoke` without `@login_required` \u2014 backend/routes/auth/oauth.py:346"}, "properties": {"repobilityId": "ee4c8d50aa360fd5", "scanner": "scanner-primary", "fingerprint": "3d989e3a9aa56c4d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/oauth.py"}, "region": {"startLine": 346}}}]}, {"ruleId": "scanner-ec91521c7e5cec2c", "level": "error", "message": {"text": "Flask mutation route `create_client` without `@login_required` \u2014 backend/routes/auth/oauth.py:432"}, "properties": {"repobilityId": "24571098690b5fd7", "scanner": "scanner-primary", "fingerprint": "ec91521c7e5cec2c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/oauth.py"}, "region": {"startLine": 432}}}]}, {"ruleId": "scanner-d787fa951a0a7059", "level": "error", "message": {"text": "Flask mutation route `refresh_token` without `@login_required` \u2014 backend/routes/auth/login/tokens.py:36"}, "properties": {"repobilityId": "e078a581aa27b96d", "scanner": "scanner-primary", "fingerprint": "d787fa951a0a7059", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/login/tokens.py"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-23e3c158edbf7aca", "level": "error", "message": {"text": "Flask mutation route `login` without `@login_required` \u2014 backend/routes/auth/login/core.py:180"}, "properties": {"repobilityId": "de147758809c20f7", "scanner": "scanner-primary", "fingerprint": "23e3c158edbf7aca", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/login/core.py"}, "region": {"startLine": 180}}}]}, {"ruleId": "scanner-a3b0f24f63d28759", "level": "error", "message": {"text": "Flask mutation route `org_login` without `@login_required` \u2014 backend/routes/auth/login/core.py:451"}, "properties": {"repobilityId": "2ad48c3b17d0ccc0", "scanner": "scanner-primary", "fingerprint": "a3b0f24f63d28759", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/login/core.py"}, "region": {"startLine": 451}}}]}, {"ruleId": "scanner-51bd49b350e1ed3d", "level": "error", "message": {"text": "Flask mutation route `logout` without `@login_required` \u2014 backend/routes/auth/login/core.py:722"}, "properties": {"repobilityId": "16478f536f72b485", "scanner": "scanner-primary", "fingerprint": "51bd49b350e1ed3d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/login/core.py"}, "region": {"startLine": 722}}}]}, {"ruleId": "scanner-b452249cc0d94819", "level": "error", "message": {"text": "Flask mutation route `update_ai_settings` without `@login_required` \u2014 backend/routes/auth/login/settings.py:75"}, "properties": {"repobilityId": "535891fd9dd44733", "scanner": "scanner-primary", "fingerprint": "b452249cc0d94819", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/auth/login/settings.py"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-9eab43cd7df1f46a", "level": "error", "message": {"text": "Flask mutation route `upload_child_avatar` without `@login_required` \u2014 backend/routes/parent/child_overview.py:588"}, "properties": {"repobilityId": "eb44ef418cfc323e", "scanner": "scanner-primary", "fingerprint": "9eab43cd7df1f46a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/child_overview.py"}, "region": {"startLine": 588}}}]}, {"ruleId": "scanner-7e6c3dd1f8f96013", "level": "error", "message": {"text": "Flask mutation route `create_child_learning_moment` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:22"}, "properties": {"repobilityId": "b87780a48cd96761", "scanner": "scanner-primary", "fingerprint": "7e6c3dd1f8f96013", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-3f2be8d15b304670", "level": "error", "message": {"text": "Flask mutation route `upload_moment_media` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:176"}, "properties": {"repobilityId": "d73beae0c7a51097", "scanner": "scanner-primary", "fingerprint": "3f2be8d15b304670", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-acb991e7ccdecfc5", "level": "error", "message": {"text": "Flask mutation route `init_moment_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:225"}, "properties": {"repobilityId": "042b2754e2205955", "scanner": "scanner-primary", "fingerprint": "acb991e7ccdecfc5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 225}}}]}, {"ruleId": "scanner-99e32dcc9177abd9", "level": "error", "message": {"text": "Flask mutation route `finalize_moment_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:264"}, "properties": {"repobilityId": "83f8b7c46b0b51a3", "scanner": "scanner-primary", "fingerprint": "99e32dcc9177abd9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 264}}}]}, {"ruleId": "scanner-357d15d3199b45e6", "level": "error", "message": {"text": "Flask mutation route `create_child_topic` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:447"}, "properties": {"repobilityId": "cf2eede7f1ba5228", "scanner": "scanner-primary", "fingerprint": "357d15d3199b45e6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 447}}}]}, {"ruleId": "scanner-8291339bc830d2be", "level": "error", "message": {"text": "Flask mutation route `assign_child_moment_to_topic` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:633"}, "properties": {"repobilityId": "4d9f3982102dd6fe", "scanner": "scanner-primary", "fingerprint": "8291339bc830d2be", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 633}}}]}, {"ruleId": "scanner-b15db09e66ad3318", "level": "error", "message": {"text": "Flask mutation route `update_child_learning_moment` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:705"}, "properties": {"repobilityId": "32025889f6c7091e", "scanner": "scanner-primary", "fingerprint": "b15db09e66ad3318", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 705}}}]}, {"ruleId": "scanner-58f0e31d05959d23", "level": "error", "message": {"text": "Flask mutation route `delete_child_learning_moment` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:848"}, "properties": {"repobilityId": "43b89ce96328d842", "scanner": "scanner-primary", "fingerprint": "58f0e31d05959d23", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 848}}}]}, {"ruleId": "scanner-863185cda93ac1c5", "level": "error", "message": {"text": "Flask mutation route `save_child_moment_evidence` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:935"}, "properties": {"repobilityId": "19dfd19fc3e43fcb", "scanner": "scanner-primary", "fingerprint": "863185cda93ac1c5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 935}}}]}, {"ruleId": "scanner-d028244d6a778317", "level": "error", "message": {"text": "Flask mutation route `upload_child_moment_file` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:1052"}, "properties": {"repobilityId": "7238d02baaf38367", "scanner": "scanner-primary", "fingerprint": "d028244d6a778317", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 1052}}}]}, {"ruleId": "scanner-2347bddc778a446e", "level": "error", "message": {"text": "Flask mutation route `init_moment_block_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:1127"}, "properties": {"repobilityId": "7043adf40924bc69", "scanner": "scanner-primary", "fingerprint": "2347bddc778a446e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 1127}}}]}, {"ruleId": "scanner-950f804f2661b18e", "level": "error", "message": {"text": "Flask mutation route `finalize_moment_block_signed_upload` without `@login_required` \u2014 backend/routes/parent/learning_moments.py:1178"}, "properties": {"repobilityId": "e8cee2f4f65bf02e", "scanner": "scanner-primary", "fingerprint": "950f804f2661b18e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/learning_moments.py"}, "region": {"startLine": 1178}}}]}, {"ruleId": "scanner-23af614ecd98ba34", "level": "error", "message": {"text": "Flask mutation route `generate_family_quest_ideas` without `@login_required` \u2014 backend/routes/parent/family_quest_ai.py:30"}, "properties": {"repobilityId": "7873869e92fac2d6", "scanner": "scanner-primary", "fingerprint": "23af614ecd98ba34", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/family_quest_ai.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-fe9609f3fa22e0fe", "level": "error", "message": {"text": "Flask mutation route `refine_family_quest_idea` without `@login_required` \u2014 backend/routes/parent/family_quest_ai.py:89"}, "properties": {"repobilityId": "e555f7f6eeee9b0b", "scanner": "scanner-primary", "fingerprint": "fe9609f3fa22e0fe", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/family_quest_ai.py"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-7955e25302476929", "level": "error", "message": {"text": "Flask mutation route `accept_family_quest_idea` without `@login_required` \u2014 backend/routes/parent/family_quest_ai.py:128"}, "properties": {"repobilityId": "31c67dbe0cc15eff", "scanner": "scanner-primary", "fingerprint": "7955e25302476929", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent/family_quest_ai.py"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-0982bdce7f2f1c63", "level": "error", "message": {"text": "Flask mutation route `oidc_login_init` without `@login_required` \u2014 backend/routes/lti/launch.py:60"}, "properties": {"repobilityId": "0937b7a25ddc90cd", "scanner": "scanner-primary", "fingerprint": "0982bdce7f2f1c63", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/lti/launch.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-37eb2f2a332955cb", "level": "error", "message": {"text": "Flask mutation route `lti_launch` without `@login_required` \u2014 backend/routes/lti/launch.py:151"}, "properties": {"repobilityId": "8453abba120d06df", "scanner": "scanner-primary", "fingerprint": "37eb2f2a332955cb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/lti/launch.py"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-ccb93b4f230f368c", "level": "error", "message": {"text": "Flask mutation route `deep_link_submit` without `@login_required` \u2014 backend/routes/lti/deep_linking.py:120"}, "properties": {"repobilityId": "1a3934cae58addc7", "scanner": "scanner-primary", "fingerprint": "ccb93b4f230f368c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/lti/deep_linking.py"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-da8824958966adce", "level": "error", "message": {"text": "Flask mutation route `exchange_auth_code` without `@login_required` \u2014 backend/routes/lti/token.py:38"}, "properties": {"repobilityId": "f7b7054a2201e220", "scanner": "scanner-primary", "fingerprint": "da8824958966adce", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/lti/token.py"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-61b860947f364c0a", "level": "error", "message": {"text": "Flask mutation route `generate_observer_invite_link` without `@login_required` \u2014 backend/routes/observer/student_invitations.py:23"}, "properties": {"repobilityId": "3d9f1fa7e5d35b65", "scanner": "scanner-primary", "fingerprint": "61b860947f364c0a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/student_invitations.py"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-67fc94775e5c5818", "level": "error", "message": {"text": "Flask mutation route `cancel_observer_invitation` without `@login_required` \u2014 backend/routes/observer/student_invitations.py:115"}, "properties": {"repobilityId": "907850a4a1a69f53", "scanner": "scanner-primary", "fingerprint": "67fc94775e5c5818", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/student_invitations.py"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-a7e7f2aad7311a8e", "level": "error", "message": {"text": "Flask mutation route `remove_observer` without `@login_required` \u2014 backend/routes/observer/student_invitations.py:338"}, "properties": {"repobilityId": "3737ef952fc99d4b", "scanner": "scanner-primary", "fingerprint": "a7e7f2aad7311a8e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/student_invitations.py"}, "region": {"startLine": 338}}}]}, {"ruleId": "scanner-9d0579b52560d7e5", "level": "error", "message": {"text": "Flask mutation route `create_share_token` without `@login_required` \u2014 backend/routes/observer/sharing.py:76"}, "properties": {"repobilityId": "5d8216305dfd154a", "scanner": "scanner-primary", "fingerprint": "9d0579b52560d7e5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/sharing.py"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-bf0ce3ad22be26e8", "level": "error", "message": {"text": "Flask mutation route `record_feed_views` without `@login_required` \u2014 backend/routes/observer/social.py:24"}, "properties": {"repobilityId": "9e73f41dd2aa7e87", "scanner": "scanner-primary", "fingerprint": "bf0ce3ad22be26e8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/social.py"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-d1b5b4885b823966", "level": "error", "message": {"text": "Flask mutation route `toggle_feed_item_visibility` without `@login_required` \u2014 backend/routes/observer/activity.py:519"}, "properties": {"repobilityId": "6a40831c5ef9dcbb", "scanner": "scanner-primary", "fingerprint": "d1b5b4885b823966", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/activity.py"}, "region": {"startLine": 519}}}]}, {"ruleId": "scanner-c626bb7a16d69ac5", "level": "error", "message": {"text": "Flask mutation route `post_observer_comment` without `@login_required` \u2014 backend/routes/observer/comments.py:79"}, "properties": {"repobilityId": "55601841dcd105c5", "scanner": "scanner-primary", "fingerprint": "c626bb7a16d69ac5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/comments.py"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-df2de856c5d484cc", "level": "error", "message": {"text": "Flask mutation route `delete_observer_comment` without `@login_required` \u2014 backend/routes/observer/comments.py:196"}, "properties": {"repobilityId": "2372b863f7309031", "scanner": "scanner-primary", "fingerprint": "df2de856c5d484cc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/comments.py"}, "region": {"startLine": 196}}}]}, {"ruleId": "scanner-d383cd79b2a74cca", "level": "error", "message": {"text": "Flask mutation route `family_invite` without `@login_required` \u2014 backend/routes/observer/family.py:29"}, "properties": {"repobilityId": "801cdca0017b92cb", "scanner": "scanner-primary", "fingerprint": "d383cd79b2a74cca", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/family.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-5e677872f2d73ec8", "level": "error", "message": {"text": "Flask mutation route `family_invite_email` without `@login_required` \u2014 backend/routes/observer/family.py:153"}, "properties": {"repobilityId": "019eea3aec325227", "scanner": "scanner-primary", "fingerprint": "5e677872f2d73ec8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/family.py"}, "region": {"startLine": 153}}}]}, {"ruleId": "scanner-409915b7b3c5c973", "level": "error", "message": {"text": "Flask mutation route `toggle_child_access` without `@login_required` \u2014 backend/routes/observer/family.py:455"}, "properties": {"repobilityId": "ada26575377b2649", "scanner": "scanner-primary", "fingerprint": "409915b7b3c5c973", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/family.py"}, "region": {"startLine": 455}}}]}, {"ruleId": "scanner-e7cedfc8138f73ec", "level": "error", "message": {"text": "Flask mutation route `remove_family_observer` without `@login_required` \u2014 backend/routes/observer/family.py:557"}, "properties": {"repobilityId": "832b259cbbae087e", "scanner": "scanner-primary", "fingerprint": "e7cedfc8138f73ec", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/family.py"}, "region": {"startLine": 557}}}]}, {"ruleId": "scanner-ccea6f343485eba0", "level": "error", "message": {"text": "Flask mutation route `revoke_pending_family_invite` without `@login_required` \u2014 backend/routes/observer/family.py:691"}, "properties": {"repobilityId": "c192b7df838e84da", "scanner": "scanner-primary", "fingerprint": "ccea6f343485eba0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/family.py"}, "region": {"startLine": 691}}}]}, {"ruleId": "scanner-aedc97e01300b9c6", "level": "error", "message": {"text": "Flask mutation route `parent_send_observer_invitation` without `@login_required` \u2014 backend/routes/observer/parent_management.py:23"}, "properties": {"repobilityId": "433096d14ab0db7d", "scanner": "scanner-primary", "fingerprint": "aedc97e01300b9c6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/parent_management.py"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-b0c2a9c7b4500da2", "level": "error", "message": {"text": "Flask mutation route `remove_observer_for_student` without `@login_required` \u2014 backend/routes/observer/parent_management.py:272"}, "properties": {"repobilityId": "8a8c9dda9f87da45", "scanner": "scanner-primary", "fingerprint": "b0c2a9c7b4500da2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/parent_management.py"}, "region": {"startLine": 272}}}]}, {"ruleId": "scanner-7de54a0f754aed7e", "level": "error", "message": {"text": "Flask mutation route `accept_observer_invitation` without `@login_required` \u2014 backend/routes/observer/acceptance.py:115"}, "properties": {"repobilityId": "50354ac6435fe09b", "scanner": "scanner-primary", "fingerprint": "7de54a0f754aed7e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/observer/acceptance.py"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-4b077e0b73a07cbc", "level": "error", "message": {"text": "Flask mutation route `exchange_auth_code` without `@login_required` \u2014 backend/routes/spark_integration/sso.py:196"}, "properties": {"repobilityId": "46df02e24f2e180d", "scanner": "scanner-primary", "fingerprint": "4b077e0b73a07cbc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/spark_integration/sso.py"}, "region": {"startLine": 196}}}]}, {"ruleId": "scanner-ca4cacef31115586", "level": "error", "message": {"text": "Flask mutation route `course_sync_webhook` without `@login_required` \u2014 backend/routes/spark_integration/webhooks.py:54"}, "properties": {"repobilityId": "6e58053fa5879cfc", "scanner": "scanner-primary", "fingerprint": "ca4cacef31115586", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/spark_integration/webhooks.py"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-edff38b6541bbaeb", "level": "error", "message": {"text": "Flask mutation route `submission_webhook` without `@login_required` \u2014 backend/routes/spark_integration/webhooks.py:147"}, "properties": {"repobilityId": "69fa09339416c100", "scanner": "scanner-primary", "fingerprint": "edff38b6541bbaeb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/spark_integration/webhooks.py"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-d520f52ce4d70f5e", "level": "error", "message": {"text": "Flask mutation route `create_class_group` without `@login_required` \u2014 backend/routes/classes/messaging.py:29"}, "properties": {"repobilityId": "4d59aa04a46749cf", "scanner": "scanner-primary", "fingerprint": "d520f52ce4d70f5e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/messaging.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-2464fbcc65ea476f", "level": "error", "message": {"text": "Flask mutation route `add_class_quest` without `@login_required` \u2014 backend/routes/classes/quests.py:85"}, "properties": {"repobilityId": "610e23c7409ab667", "scanner": "scanner-primary", "fingerprint": "2464fbcc65ea476f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/quests.py"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-a6d1cfa4065a51a1", "level": "error", "message": {"text": "Flask mutation route `remove_class_quest` without `@login_required` \u2014 backend/routes/classes/quests.py:183"}, "properties": {"repobilityId": "99e192d378aa71de", "scanner": "scanner-primary", "fingerprint": "a6d1cfa4065a51a1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/quests.py"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-95360580463c2555", "level": "error", "message": {"text": "Flask mutation route `set_class_quest_schedule` without `@login_required` \u2014 backend/routes/classes/quests.py:227"}, "properties": {"repobilityId": "e60b4a63114064bb", "scanner": "scanner-primary", "fingerprint": "95360580463c2555", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/quests.py"}, "region": {"startLine": 227}}}]}, {"ruleId": "scanner-915db5f0ee0f4a4c", "level": "error", "message": {"text": "Flask mutation route `set_class_quest_due_date` without `@login_required` \u2014 backend/routes/classes/quests.py:279"}, "properties": {"repobilityId": "e436f8b5ffefe98e", "scanner": "scanner-primary", "fingerprint": "915db5f0ee0f4a4c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/quests.py"}, "region": {"startLine": 279}}}]}, {"ruleId": "scanner-68674d983423cac1", "level": "error", "message": {"text": "Flask mutation route `reorder_class_quests` without `@login_required` \u2014 backend/routes/classes/quests.py:346"}, "properties": {"repobilityId": "9aa926ebf2342949", "scanner": "scanner-primary", "fingerprint": "68674d983423cac1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/quests.py"}, "region": {"startLine": 346}}}]}, {"ruleId": "scanner-f3e6d8c5997aef3d", "level": "error", "message": {"text": "Flask mutation route `create_and_add_class_quest` without `@login_required` \u2014 backend/routes/classes/quests.py:395"}, "properties": {"repobilityId": "c58e1a86ef97298e", "scanner": "scanner-primary", "fingerprint": "f3e6d8c5997aef3d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/quests.py"}, "region": {"startLine": 395}}}]}, {"ruleId": "scanner-e69eb34ef2561b8a", "level": "error", "message": {"text": "Flask mutation route `create_class` without `@login_required` \u2014 backend/routes/classes/crud.py:70"}, "properties": {"repobilityId": "b6795f75c6dc3154", "scanner": "scanner-primary", "fingerprint": "e69eb34ef2561b8a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/crud.py"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-8af121915aa753ae", "level": "error", "message": {"text": "Flask mutation route `update_class` without `@login_required` \u2014 backend/routes/classes/crud.py:166"}, "properties": {"repobilityId": "d04ddb6a4564d3f3", "scanner": "scanner-primary", "fingerprint": "8af121915aa753ae", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/crud.py"}, "region": {"startLine": 166}}}]}, {"ruleId": "scanner-52846b71f69f4c33", "level": "error", "message": {"text": "Flask mutation route `archive_class` without `@login_required` \u2014 backend/routes/classes/crud.py:226"}, "properties": {"repobilityId": "16ddd36ade907bbb", "scanner": "scanner-primary", "fingerprint": "52846b71f69f4c33", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/crud.py"}, "region": {"startLine": 226}}}]}, {"ruleId": "scanner-e566e083f86c9b01", "level": "error", "message": {"text": "Flask mutation route `enroll_students` without `@login_required` \u2014 backend/routes/classes/students.py:95"}, "properties": {"repobilityId": "fb2fb79e5a35ff77", "scanner": "scanner-primary", "fingerprint": "e566e083f86c9b01", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/students.py"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-795a680482d757f7", "level": "error", "message": {"text": "Flask mutation route `withdraw_student` without `@login_required` \u2014 backend/routes/classes/students.py:180"}, "properties": {"repobilityId": "1ab6f6830c84f47d", "scanner": "scanner-primary", "fingerprint": "795a680482d757f7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/students.py"}, "region": {"startLine": 180}}}]}, {"ruleId": "scanner-ebf2044f53bb6c0b", "level": "error", "message": {"text": "Flask mutation route `add_class_advisor` without `@login_required` \u2014 backend/routes/classes/advisors.py:78"}, "properties": {"repobilityId": "ce176f7224d37b82", "scanner": "scanner-primary", "fingerprint": "ebf2044f53bb6c0b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/advisors.py"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-fdef0cb55e6295a0", "level": "error", "message": {"text": "Flask mutation route `remove_class_advisor` without `@login_required` \u2014 backend/routes/classes/advisors.py:151"}, "properties": {"repobilityId": "71d33dae03071027", "scanner": "scanner-primary", "fingerprint": "fdef0cb55e6295a0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/classes/advisors.py"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-597ccf4276341a68", "level": "error", "message": {"text": "Flask mutation route `org_approve_credit` without `@login_required` \u2014 backend/routes/credit_dashboard/org_admin_actions.py:64"}, "properties": {"repobilityId": "df90b2ff308430bd", "scanner": "scanner-primary", "fingerprint": "597ccf4276341a68", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/credit_dashboard/org_admin_actions.py"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-c21ea036b95df650", "level": "error", "message": {"text": "Flask mutation route `org_grow_this` without `@login_required` \u2014 backend/routes/credit_dashboard/org_admin_actions.py:303"}, "properties": {"repobilityId": "78ec1f3f9841d0c6", "scanner": "scanner-primary", "fingerprint": "c21ea036b95df650", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/credit_dashboard/org_admin_actions.py"}, "region": {"startLine": 303}}}]}, {"ruleId": "scanner-b45a361a0379c1e0", "level": "error", "message": {"text": "Flask mutation route `merge_tasks` without `@login_required` \u2014 backend/routes/credit_dashboard/merge.py:21"}, "properties": {"repobilityId": "5449f7345a4e08e4", "scanner": "scanner-primary", "fingerprint": "b45a361a0379c1e0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/credit_dashboard/merge.py"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-cc4c472e677deaac", "level": "error", "message": {"text": "Flask mutation route `approve_credit` without `@login_required` \u2014 backend/routes/credit_dashboard/superadmin_actions.py:30"}, "properties": {"repobilityId": "5f28b44824e671af", "scanner": "scanner-primary", "fingerprint": "cc4c472e677deaac", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/credit_dashboard/superadmin_actions.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-61eeea64db9f74b9", "level": "error", "message": {"text": "Flask mutation route `grow_this` without `@login_required` \u2014 backend/routes/credit_dashboard/superadmin_actions.py:176"}, "properties": {"repobilityId": "237a341b3cc4c3d6", "scanner": "scanner-primary", "fingerprint": "61eeea64db9f74b9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/credit_dashboard/superadmin_actions.py"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-2b48206d43e7b5a6", "level": "error", "message": {"text": "Flask mutation route `suggest_grow_this_feedback` without `@login_required` \u2014 backend/routes/credit_dashboard/superadmin_actions.py:321"}, "properties": {"repobilityId": "4291f8fef7db3e49", "scanner": "scanner-primary", "fingerprint": "2b48206d43e7b5a6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/credit_dashboard/superadmin_actions.py"}, "region": {"startLine": 321}}}]}, {"ruleId": "scanner-d75521eb8fbca7ea", "level": "error", "message": {"text": "Flask mutation route `complete_task` without `@login_required` \u2014 backend/routes/tasks/completion.py:29"}, "properties": {"repobilityId": "716731509630e903", "scanner": "scanner-primary", "fingerprint": "d75521eb8fbca7ea", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/tasks/completion.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-05ba463c9ed04565", "level": "error", "message": {"text": "Flask mutation route `finalize_task` without `@login_required` \u2014 backend/routes/tasks/completion.py:354"}, "properties": {"repobilityId": "49bf8560b25c86b6", "scanner": "scanner-primary", "fingerprint": "05ba463c9ed04565", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/tasks/completion.py"}, "region": {"startLine": 354}}}]}, {"ruleId": "scanner-44c1c87979be500c", "level": "error", "message": {"text": "Flask mutation route `update_task` without `@login_required` \u2014 backend/routes/tasks/crud.py:19"}, "properties": {"repobilityId": "7ac4c1368967b2a7", "scanner": "scanner-primary", "fingerprint": "44c1c87979be500c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/tasks/crud.py"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-ad84ed040e84bce8", "level": "error", "message": {"text": "Flask mutation route `drop_task` without `@login_required` \u2014 backend/routes/tasks/crud.py:257"}, "properties": {"repobilityId": "04edaf4bf6b956ad", "scanner": "scanner-primary", "fingerprint": "ad84ed040e84bce8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/tasks/crud.py"}, "region": {"startLine": 257}}}]}, {"ruleId": "scanner-bf37136e8e5fb772", "level": "error", "message": {"text": "Flask mutation route `request_diploma_credit` without `@login_required` \u2014 backend/routes/tasks/credit.py:53"}, "properties": {"repobilityId": "f5c97e5e58d786e5", "scanner": "scanner-primary", "fingerprint": "bf37136e8e5fb772", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/tasks/credit.py"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-5f35be5d0e9155ad", "level": "error", "message": {"text": "Flask mutation route `bulk_import_users` without `@login_required` \u2014 backend/routes/admin/bulk_import.py:136"}, "properties": {"repobilityId": "4e4723fdee8fee34", "scanner": "scanner-primary", "fingerprint": "5f35be5d0e9155ad", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/bulk_import.py"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-80577701d6877751", "level": "error", "message": {"text": "Flask mutation route `validate_import_file` without `@login_required` \u2014 backend/routes/admin/bulk_import.py:425"}, "properties": {"repobilityId": "9a3d3ae501a9511d", "scanner": "scanner-primary", "fingerprint": "80577701d6877751", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/bulk_import.py"}, "region": {"startLine": 425}}}]}, {"ruleId": "scanner-2a83f32c9f2016b1", "level": "error", "message": {"text": "Flask mutation route `upsert_consent` without `@login_required` \u2014 backend/routes/admin/showcase_consent.py:70"}, "properties": {"repobilityId": "36564da05a92dbf3", "scanner": "scanner-primary", "fingerprint": "2a83f32c9f2016b1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/showcase_consent.py"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-e6ef8c9b75304f74", "level": "error", "message": {"text": "Flask mutation route `revoke_consent` without `@login_required` \u2014 backend/routes/admin/showcase_consent.py:98"}, "properties": {"repobilityId": "4f620dc5ba086ac5", "scanner": "scanner-primary", "fingerprint": "e6ef8c9b75304f74", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/showcase_consent.py"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-72e525c2d1bc7626", "level": "error", "message": {"text": "Flask mutation route `set_permission` without `@login_required` \u2014 backend/routes/admin/showcase_consent.py:115"}, "properties": {"repobilityId": "9fd004911fa8cdb6", "scanner": "scanner-primary", "fingerprint": "72e525c2d1bc7626", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/showcase_consent.py"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-530b09e0e2f32f8c", "level": "error", "message": {"text": "Flask mutation route `approve_class_review` without `@login_required` \u2014 backend/routes/admin/class_reviews.py:194"}, "properties": {"repobilityId": "5a9ad8a3b66991cf", "scanner": "scanner-primary", "fingerprint": "530b09e0e2f32f8c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/class_reviews.py"}, "region": {"startLine": 194}}}]}, {"ruleId": "scanner-18e9caf48438d36f", "level": "error", "message": {"text": "Flask mutation route `reject_class_review` without `@login_required` \u2014 backend/routes/admin/class_reviews.py:226"}, "properties": {"repobilityId": "d66b35558c852c6a", "scanner": "scanner-primary", "fingerprint": "18e9caf48438d36f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/class_reviews.py"}, "region": {"startLine": 226}}}]}, {"ruleId": "scanner-933b4419e245f2fe", "level": "error", "message": {"text": "Flask mutation route `create_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:88"}, "properties": {"repobilityId": "6fc69d0df863b20c", "scanner": "scanner-primary", "fingerprint": "933b4419e245f2fe", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-9286bf71441d216b", "level": "error", "message": {"text": "Flask mutation route `update_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:139"}, "properties": {"repobilityId": "2f976a54c2e4bf4b", "scanner": "scanner-primary", "fingerprint": "9286bf71441d216b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-a2324be3397d7466", "level": "error", "message": {"text": "Flask mutation route `grant_quest_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:206"}, "properties": {"repobilityId": "489956f57a629e12", "scanner": "scanner-primary", "fingerprint": "a2324be3397d7466", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 206}}}]}, {"ruleId": "scanner-9180563f58294211", "level": "error", "message": {"text": "Flask mutation route `revoke_quest_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:232"}, "properties": {"repobilityId": "0b1477433a325fa1", "scanner": "scanner-primary", "fingerprint": "9180563f58294211", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 232}}}]}, {"ruleId": "scanner-20dba48123b56afc", "level": "error", "message": {"text": "Flask mutation route `grant_course_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:299"}, "properties": {"repobilityId": "b99748559b01bb34", "scanner": "scanner-primary", "fingerprint": "20dba48123b56afc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 299}}}]}, {"ruleId": "scanner-8e62891a4964a646", "level": "error", "message": {"text": "Flask mutation route `revoke_course_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:325"}, "properties": {"repobilityId": "1f5b5ebdf4c04079", "scanner": "scanner-primary", "fingerprint": "8e62891a4964a646", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 325}}}]}, {"ruleId": "scanner-13233268ecab4fd3", "level": "error", "message": {"text": "Flask mutation route `toggle_organization_ai_access` without `@login_required` \u2014 backend/routes/admin/organization_management.py:395"}, "properties": {"repobilityId": "a020fb69b2833a6d", "scanner": "scanner-primary", "fingerprint": "13233268ecab4fd3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 395}}}]}, {"ruleId": "scanner-029d156c46122be2", "level": "error", "message": {"text": "Flask mutation route `add_users_to_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:453"}, "properties": {"repobilityId": "3780c36a9d252579", "scanner": "scanner-primary", "fingerprint": "029d156c46122be2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 453}}}]}, {"ruleId": "scanner-a1e243dfebac2b55", "level": "error", "message": {"text": "Flask mutation route `remove_user_from_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:519"}, "properties": {"repobilityId": "8de050e35c1e84bc", "scanner": "scanner-primary", "fingerprint": "a1e243dfebac2b55", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 519}}}]}, {"ruleId": "scanner-66007c946a862824", "level": "error", "message": {"text": "Flask mutation route `bulk_remove_users_from_organization` without `@login_required` \u2014 backend/routes/admin/organization_management.py:579"}, "properties": {"repobilityId": "5940b73e7bb47fb7", "scanner": "scanner-primary", "fingerprint": "66007c946a862824", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 579}}}]}, {"ruleId": "scanner-716ffbaf7e024828", "level": "error", "message": {"text": "Flask mutation route `create_username_student` without `@login_required` \u2014 backend/routes/admin/organization_management.py:860"}, "properties": {"repobilityId": "9a9d1374f14c80db", "scanner": "scanner-primary", "fingerprint": "716ffbaf7e024828", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 860}}}]}, {"ruleId": "scanner-82e32741e42764ed", "level": "error", "message": {"text": "Flask mutation route `reset_user_password` without `@login_required` \u2014 backend/routes/admin/organization_management.py:1020"}, "properties": {"repobilityId": "27f055f177b4ad82", "scanner": "scanner-primary", "fingerprint": "82e32741e42764ed", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/organization_management.py"}, "region": {"startLine": 1020}}}]}, {"ruleId": "scanner-f7a096d6b3ca0e99", "level": "error", "message": {"text": "Flask mutation route `create_course_quest` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:37"}, "properties": {"repobilityId": "4fc1e6bc0fcfa194", "scanner": "scanner-primary", "fingerprint": "f7a096d6b3ca0e99", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_quest_management.py"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-39870f38ca216de0", "level": "error", "message": {"text": "Flask mutation route `update_course_tasks` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:298"}, "properties": {"repobilityId": "a71922580543f41c", "scanner": "scanner-primary", "fingerprint": "39870f38ca216de0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_quest_management.py"}, "region": {"startLine": 298}}}]}, {"ruleId": "scanner-3a2717b5e6bb6f4c", "level": "error", "message": {"text": "Flask mutation route `delete_course_task` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:499"}, "properties": {"repobilityId": "b0396b685eb0f559", "scanner": "scanner-primary", "fingerprint": "3a2717b5e6bb6f4c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_quest_management.py"}, "region": {"startLine": 499}}}]}, {"ruleId": "scanner-852d976fae142c36", "level": "error", "message": {"text": "Flask mutation route `update_template_tasks` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:605"}, "properties": {"repobilityId": "4d58896a8752c9f4", "scanner": "scanner-primary", "fingerprint": "852d976fae142c36", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_quest_management.py"}, "region": {"startLine": 605}}}]}, {"ruleId": "scanner-5d67c23cd5ae11d7", "level": "error", "message": {"text": "Flask mutation route `delete_template_task` without `@login_required` \u2014 backend/routes/admin/course_quest_management.py:719"}, "properties": {"repobilityId": "0c43d44390993684", "scanner": "scanner-primary", "fingerprint": "5d67c23cd5ae11d7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_quest_management.py"}, "region": {"startLine": 719}}}]}, {"ruleId": "scanner-9794239bd4156035", "level": "error", "message": {"text": "Flask mutation route `assign_student_to_advisor` without `@login_required` \u2014 backend/routes/admin/advisor_management.py:190"}, "properties": {"repobilityId": "0c5aefca04e782bf", "scanner": "scanner-primary", "fingerprint": "9794239bd4156035", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/advisor_management.py"}, "region": {"startLine": 190}}}]}, {"ruleId": "scanner-041cf1a92f3f72b2", "level": "error", "message": {"text": "Flask mutation route `unassign_student_from_advisor` without `@login_required` \u2014 backend/routes/admin/advisor_management.py:318"}, "properties": {"repobilityId": "3de3ac49b522102a", "scanner": "scanner-primary", "fingerprint": "041cf1a92f3f72b2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/advisor_management.py"}, "region": {"startLine": 318}}}]}, {"ruleId": "scanner-424c311158688ce6", "level": "error", "message": {"text": "Flask mutation route `assign_org_student_to_advisor` without `@login_required` \u2014 backend/routes/admin/org_connections.py:168"}, "properties": {"repobilityId": "624ff0ebc25b77a3", "scanner": "scanner-primary", "fingerprint": "424c311158688ce6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/org_connections.py"}, "region": {"startLine": 168}}}]}, {"ruleId": "scanner-693232823808f802", "level": "error", "message": {"text": "Flask mutation route `unassign_org_student_from_advisor` without `@login_required` \u2014 backend/routes/admin/org_connections.py:268"}, "properties": {"repobilityId": "3eb75cb76b001989", "scanner": "scanner-primary", "fingerprint": "693232823808f802", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/org_connections.py"}, "region": {"startLine": 268}}}]}, {"ruleId": "scanner-3e0c98250962ad95", "level": "error", "message": {"text": "Flask mutation route `unassign_advisor_from_student` without `@login_required` \u2014 backend/routes/admin/org_connections.py:470"}, "properties": {"repobilityId": "b8213eb1af196ae2", "scanner": "scanner-primary", "fingerprint": "3e0c98250962ad95", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/org_connections.py"}, "region": {"startLine": 470}}}]}, {"ruleId": "scanner-d5cff2319f7b4774", "level": "error", "message": {"text": "Flask mutation route `disconnect_org_parent_link` without `@login_required` \u2014 backend/routes/admin/org_connections.py:627"}, "properties": {"repobilityId": "ca573705cf65e065", "scanner": "scanner-primary", "fingerprint": "d5cff2319f7b4774", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/org_connections.py"}, "region": {"startLine": 627}}}]}, {"ruleId": "scanner-1337e6e5f12870ef", "level": "error", "message": {"text": "Flask mutation route `create_org_manual_parent_link` without `@login_required` \u2014 backend/routes/admin/org_connections.py:670"}, "properties": {"repobilityId": "5a8d47b90cf5811a", "scanner": "scanner-primary", "fingerprint": "1337e6e5f12870ef", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/org_connections.py"}, "region": {"startLine": 670}}}]}, {"ruleId": "scanner-db0881e57c647904", "level": "error", "message": {"text": "Flask mutation route `approve_connection_request` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:69"}, "properties": {"repobilityId": "5aaa91535538e796", "scanner": "scanner-primary", "fingerprint": "db0881e57c647904", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/parent_connections.py"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-2bae7730b34a96e6", "level": "error", "message": {"text": "Flask mutation route `reject_connection_request` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:124"}, "properties": {"repobilityId": "07274c7952c2368e", "scanner": "scanner-primary", "fingerprint": "2bae7730b34a96e6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/parent_connections.py"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-32fcebf4199d1b47", "level": "error", "message": {"text": "Flask mutation route `disconnect_link` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:205"}, "properties": {"repobilityId": "44b032affbd3757f", "scanner": "scanner-primary", "fingerprint": "32fcebf4199d1b47", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/parent_connections.py"}, "region": {"startLine": 205}}}]}, {"ruleId": "scanner-da589028815a1e00", "level": "error", "message": {"text": "Flask mutation route `create_manual_link` without `@login_required` \u2014 backend/routes/admin/parent_connections.py:237"}, "properties": {"repobilityId": "d1a19ae787b46375", "scanner": "scanner-primary", "fingerprint": "da589028815a1e00", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/parent_connections.py"}, "region": {"startLine": 237}}}]}, {"ruleId": "scanner-d31bd78160d2c0a6", "level": "error", "message": {"text": "Flask mutation route `create_student_task` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:53"}, "properties": {"repobilityId": "1bae5a692e9aa8d8", "scanner": "scanner-primary", "fingerprint": "d31bd78160d2c0a6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/student_task_management.py"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-4016de7cf32447df", "level": "error", "message": {"text": "Flask mutation route `batch_copy_tasks` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:254"}, "properties": {"repobilityId": "17278bab8da5433a", "scanner": "scanner-primary", "fingerprint": "4016de7cf32447df", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/student_task_management.py"}, "region": {"startLine": 254}}}]}, {"ruleId": "scanner-9885c246f3511461", "level": "error", "message": {"text": "Flask mutation route `update_student_task` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:465"}, "properties": {"repobilityId": "4cc4716c4f820312", "scanner": "scanner-primary", "fingerprint": "9885c246f3511461", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/student_task_management.py"}, "region": {"startLine": 465}}}]}, {"ruleId": "scanner-5a49793f49d2f9a2", "level": "error", "message": {"text": "Flask mutation route `delete_student_task` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:588"}, "properties": {"repobilityId": "4a51e32d34964b59", "scanner": "scanner-primary", "fingerprint": "5a49793f49d2f9a2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/student_task_management.py"}, "region": {"startLine": 588}}}]}, {"ruleId": "scanner-793514be680f7536", "level": "error", "message": {"text": "Flask mutation route `reorder_student_tasks` without `@login_required` \u2014 backend/routes/admin/student_task_management.py:658"}, "properties": {"repobilityId": "0be120ff413fac3b", "scanner": "scanner-primary", "fingerprint": "793514be680f7536", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/student_task_management.py"}, "region": {"startLine": 658}}}]}, {"ruleId": "scanner-ea41f2a5807c2796", "level": "error", "message": {"text": "Flask mutation route `create_registration` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:57"}, "properties": {"repobilityId": "a188ee95f52b8f2b", "scanner": "scanner-primary", "fingerprint": "ea41f2a5807c2796", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/lti_registrations.py"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-e2054f196bc4ad71", "level": "error", "message": {"text": "Flask mutation route `update_registration` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:79"}, "properties": {"repobilityId": "961c62ae412ff62f", "scanner": "scanner-primary", "fingerprint": "e2054f196bc4ad71", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/lti_registrations.py"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-dff9e5d96a8d53a2", "level": "error", "message": {"text": "Flask mutation route `delete_registration` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:112"}, "properties": {"repobilityId": "b683353f1af5444c", "scanner": "scanner-primary", "fingerprint": "dff9e5d96a8d53a2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/lti_registrations.py"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-513f1a57381467f9", "level": "error", "message": {"text": "Flask mutation route `poll_canvas_grades` without `@login_required` \u2014 backend/routes/admin/lti_registrations.py:125"}, "properties": {"repobilityId": "168058ceb129a08e", "scanner": "scanner-primary", "fingerprint": "513f1a57381467f9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/lti_registrations.py"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-b9a2de4bcd7e697e", "level": "error", "message": {"text": "Flask mutation route `add_planned_credit` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:220"}, "properties": {"repobilityId": "d696f7072e4f1405", "scanner": "scanner-primary", "fingerprint": "b9a2de4bcd7e697e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/transcript_generator.py"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-5c8c4cc121e46b9c", "level": "error", "message": {"text": "Flask mutation route `update_planned_credit` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:265"}, "properties": {"repobilityId": "1cb03968b7e5b19a", "scanner": "scanner-primary", "fingerprint": "5c8c4cc121e46b9c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/transcript_generator.py"}, "region": {"startLine": 265}}}]}, {"ruleId": "scanner-2e6062edf1630030", "level": "error", "message": {"text": "Flask mutation route `delete_planned_credit` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:305"}, "properties": {"repobilityId": "d7fee9790e059534", "scanner": "scanner-primary", "fingerprint": "2e6062edf1630030", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/transcript_generator.py"}, "region": {"startLine": 305}}}]}, {"ruleId": "scanner-d18ee9a6729f52ec", "level": "error", "message": {"text": "Flask mutation route `update_course_names` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:322"}, "properties": {"repobilityId": "32edb7b59891ec0f", "scanner": "scanner-primary", "fingerprint": "d18ee9a6729f52ec", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/transcript_generator.py"}, "region": {"startLine": 322}}}]}, {"ruleId": "scanner-2c2191c04dc0e42e", "level": "error", "message": {"text": "Flask mutation route `save_overrides` without `@login_required` \u2014 backend/routes/admin/transcript_generator.py:413"}, "properties": {"repobilityId": "c9a7e0af977c5f81", "scanner": "scanner-primary", "fingerprint": "2c2191c04dc0e42e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/transcript_generator.py"}, "region": {"startLine": 413}}}]}, {"ruleId": "scanner-c70af34dc05f9564", "level": "error", "message": {"text": "Flask mutation route `backfill_single_task` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:22"}, "properties": {"repobilityId": "0908d27a9ac5185c", "scanner": "scanner-primary", "fingerprint": "c70af34dc05f9564", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/subject_backfill.py"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-c4b31b312975bc85", "level": "error", "message": {"text": "Flask mutation route `backfill_all_tasks` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:56"}, "properties": {"repobilityId": "b6b7d40c5506457a", "scanner": "scanner-primary", "fingerprint": "c4b31b312975bc85", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/subject_backfill.py"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-560e3a1b00d95295", "level": "error", "message": {"text": "Flask mutation route `update_task_distribution` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:261"}, "properties": {"repobilityId": "77a3c4d8ae5173bb", "scanner": "scanner-primary", "fingerprint": "560e3a1b00d95295", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/subject_backfill.py"}, "region": {"startLine": 261}}}]}, {"ruleId": "scanner-00d457c0370148c5", "level": "error", "message": {"text": "Flask mutation route `regenerate_task_distribution` without `@login_required` \u2014 backend/routes/admin/subject_backfill.py:332"}, "properties": {"repobilityId": "2a1d204908cdda4d", "scanner": "scanner-primary", "fingerprint": "00d457c0370148c5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/subject_backfill.py"}, "region": {"startLine": 332}}}]}, {"ruleId": "scanner-c98481b88d53178f", "level": "error", "message": {"text": "Flask mutation route `bulk_enroll_users` without `@login_required` \u2014 backend/routes/admin/course_enrollments.py:111"}, "properties": {"repobilityId": "dca8092a2e388482", "scanner": "scanner-primary", "fingerprint": "c98481b88d53178f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_enrollments.py"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-206b4fa6d6679426", "level": "error", "message": {"text": "Flask mutation route `bulk_unenroll_users` without `@login_required` \u2014 backend/routes/admin/course_enrollments.py:364"}, "properties": {"repobilityId": "1f512b6138090dd4", "scanner": "scanner-primary", "fingerprint": "206b4fa6d6679426", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_enrollments.py"}, "region": {"startLine": 364}}}]}, {"ruleId": "scanner-c5f7c7f59418516a", "level": "error", "message": {"text": "Flask mutation route `preview_imscc_import` without `@login_required` \u2014 backend/routes/admin/course_import.py:28"}, "properties": {"repobilityId": "45e20d2b1229f8d7", "scanner": "scanner-primary", "fingerprint": "c5f7c7f59418516a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_import.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-c3dfabc24a92fb87", "level": "error", "message": {"text": "Flask mutation route `confirm_imscc_import` without `@login_required` \u2014 backend/routes/admin/course_import.py:119"}, "properties": {"repobilityId": "8f4f3c99ab0cba64", "scanner": "scanner-primary", "fingerprint": "c3dfabc24a92fb87", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_import.py"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-209e68daec85b309", "level": "error", "message": {"text": "Flask mutation route `validate_imscc_file_endpoint` without `@login_required` \u2014 backend/routes/admin/course_import.py:213"}, "properties": {"repobilityId": "3f43899dc8a5722c", "scanner": "scanner-primary", "fingerprint": "209e68daec85b309", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_import.py"}, "region": {"startLine": 213}}}]}, {"ruleId": "scanner-de7ad760e28f0d3d", "level": "error", "message": {"text": "Flask mutation route `approve_flagged_task` without `@login_required` \u2014 backend/routes/admin/task_flags.py:80"}, "properties": {"repobilityId": "7734434bb89b7644", "scanner": "scanner-primary", "fingerprint": "de7ad760e28f0d3d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/task_flags.py"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-029a5889b646a44c", "level": "error", "message": {"text": "Flask mutation route `delete_flagged_task` without `@login_required` \u2014 backend/routes/admin/task_flags.py:114"}, "properties": {"repobilityId": "e5befbbabe4586f1", "scanner": "scanner-primary", "fingerprint": "029a5889b646a44c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/task_flags.py"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-701db207318c51d3", "level": "error", "message": {"text": "Flask mutation route `update_report` without `@login_required` \u2014 backend/routes/admin/moderation_queue.py:53"}, "properties": {"repobilityId": "97cbf581eb9f88b4", "scanner": "scanner-primary", "fingerprint": "701db207318c51d3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/moderation_queue.py"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-dd93314b9a0ce0df", "level": "error", "message": {"text": "Flask mutation route `reconcile_user_xp` without `@login_required` \u2014 backend/routes/admin/xp_reconciliation.py:183"}, "properties": {"repobilityId": "94293a15aa6b6b09", "scanner": "scanner-primary", "fingerprint": "dd93314b9a0ce0df", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/xp_reconciliation.py"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-f1813ea331c74870", "level": "error", "message": {"text": "Flask mutation route `batch_reconcile` without `@login_required` \u2014 backend/routes/admin/xp_reconciliation.py:346"}, "properties": {"repobilityId": "523a8ea09bf621c0", "scanner": "scanner-primary", "fingerprint": "f1813ea331c74870", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/xp_reconciliation.py"}, "region": {"startLine": 346}}}]}, {"ruleId": "scanner-126015b24712c761", "level": "error", "message": {"text": "Flask mutation route `retry_failed_awards` without `@login_required` \u2014 backend/routes/admin/xp_reconciliation.py:493"}, "properties": {"repobilityId": "c8264f4d6ed3f324", "scanner": "scanner-primary", "fingerprint": "126015b24712c761", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/xp_reconciliation.py"}, "region": {"startLine": 493}}}]}, {"ruleId": "scanner-0a0b5bbc1fc4f024", "level": "error", "message": {"text": "Flask mutation route `approve_task` without `@login_required` \u2014 backend/routes/admin/task_approval.py:78"}, "properties": {"repobilityId": "7a68af7c53f0f140", "scanner": "scanner-primary", "fingerprint": "0a0b5bbc1fc4f024", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/task_approval.py"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-da942314e72d7d35", "level": "error", "message": {"text": "Flask mutation route `reject_task` without `@login_required` \u2014 backend/routes/admin/task_approval.py:117"}, "properties": {"repobilityId": "d8baf08025cc046c", "scanner": "scanner-primary", "fingerprint": "da942314e72d7d35", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/task_approval.py"}, "region": {"startLine": 117}}}]}, {"ruleId": "scanner-92a91b850772ed03", "level": "error", "message": {"text": "Flask mutation route `delete_task` without `@login_required` \u2014 backend/routes/admin/task_approval.py:178"}, "properties": {"repobilityId": "97c8cc64dd4a253f", "scanner": "scanner-primary", "fingerprint": "92a91b850772ed03", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/task_approval.py"}, "region": {"startLine": 178}}}]}, {"ruleId": "scanner-f673864eff938c41", "level": "error", "message": {"text": "Flask mutation route `start_refine_session` without `@login_required` \u2014 backend/routes/admin/course_refine.py:78"}, "properties": {"repobilityId": "cf97dfd1a793b81d", "scanner": "scanner-primary", "fingerprint": "f673864eff938c41", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_refine.py"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-198c1883141c81ac", "level": "error", "message": {"text": "Flask mutation route `process_answers` without `@login_required` \u2014 backend/routes/admin/course_refine.py:154"}, "properties": {"repobilityId": "eca1b3091b088b87", "scanner": "scanner-primary", "fingerprint": "198c1883141c81ac", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_refine.py"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-1ef5e2bf1b95555b", "level": "error", "message": {"text": "Flask mutation route `apply_changes` without `@login_required` \u2014 backend/routes/admin/course_refine.py:247"}, "properties": {"repobilityId": "5c39a159fc76d5f3", "scanner": "scanner-primary", "fingerprint": "1ef5e2bf1b95555b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_refine.py"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-fd203e000d2bfca6", "level": "error", "message": {"text": "Flask mutation route `generate_prompt_update` without `@login_required` \u2014 backend/routes/admin/course_refine.py:306"}, "properties": {"repobilityId": "a4dcd63c30549eab", "scanner": "scanner-primary", "fingerprint": "fd203e000d2bfca6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_refine.py"}, "region": {"startLine": 306}}}]}, {"ruleId": "scanner-4a257108a3c025bb", "level": "error", "message": {"text": "Flask mutation route `cancel_session` without `@login_required` \u2014 backend/routes/admin/course_refine.py:430"}, "properties": {"repobilityId": "16f3af5244500ac3", "scanner": "scanner-primary", "fingerprint": "4a257108a3c025bb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/course_refine.py"}, "region": {"startLine": 430}}}]}, {"ruleId": "scanner-0c2cc32a7b3e22ea", "level": "error", "message": {"text": "Flask mutation route `create_parent_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:98"}, "properties": {"repobilityId": "24d6e95d725bdb3b", "scanner": "scanner-primary", "fingerprint": "0c2cc32a7b3e22ea", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_invitations.py"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-a13f5192b80fc0fd", "level": "error", "message": {"text": "Flask mutation route `create_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:315"}, "properties": {"repobilityId": "d4e8e73817ad6e74", "scanner": "scanner-primary", "fingerprint": "a13f5192b80fc0fd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_invitations.py"}, "region": {"startLine": 315}}}]}, {"ruleId": "scanner-6a97310c96d83c19", "level": "error", "message": {"text": "Flask mutation route `resend_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:473"}, "properties": {"repobilityId": "ae3702a1c8c921fd", "scanner": "scanner-primary", "fingerprint": "6a97310c96d83c19", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_invitations.py"}, "region": {"startLine": 473}}}]}, {"ruleId": "scanner-1e10283a1a92af3a", "level": "error", "message": {"text": "Flask mutation route `generate_invitation_link` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:574"}, "properties": {"repobilityId": "84120429497dda10", "scanner": "scanner-primary", "fingerprint": "1e10283a1a92af3a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_invitations.py"}, "region": {"startLine": 574}}}]}, {"ruleId": "scanner-62292f1e2ff0d610", "level": "error", "message": {"text": "Flask mutation route `cancel_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:663"}, "properties": {"repobilityId": "84d2896cf2e35ffc", "scanner": "scanner-primary", "fingerprint": "62292f1e2ff0d610", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_invitations.py"}, "region": {"startLine": 663}}}]}, {"ruleId": "scanner-c457331e5e69e4bf", "level": "error", "message": {"text": "Flask mutation route `check_email_exists` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:842"}, "properties": {"repobilityId": "9ea3efdad146eb5c", "scanner": "scanner-primary", "fingerprint": "c457331e5e69e4bf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_invitations.py"}, "region": {"startLine": 842}}}]}, {"ruleId": "scanner-9ef3e59afc0c0382", "level": "error", "message": {"text": "Flask mutation route `accept_invitation` without `@login_required` \u2014 backend/routes/admin/user_invitations.py:891"}, "properties": {"repobilityId": "370b95b6c95edd31", "scanner": "scanner-primary", "fingerprint": "9ef3e59afc0c0382", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_invitations.py"}, "region": {"startLine": 891}}}]}, {"ruleId": "scanner-1fee59749617d3dd", "level": "error", "message": {"text": "Flask mutation route `update_user` without `@login_required` \u2014 backend/routes/admin/user_management.py:117"}, "properties": {"repobilityId": "0170f9307ce456da", "scanner": "scanner-primary", "fingerprint": "1fee59749617d3dd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 117}}}]}, {"ruleId": "scanner-e7634e7a601003e8", "level": "error", "message": {"text": "Flask mutation route `update_user_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:190"}, "properties": {"repobilityId": "ef1cc4a8599b68f4", "scanner": "scanner-primary", "fingerprint": "e7634e7a601003e8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 190}}}]}, {"ruleId": "scanner-c8778856b5b2066f", "level": "error", "message": {"text": "Flask mutation route `delete_user` without `@login_required` \u2014 backend/routes/admin/user_management.py:267"}, "properties": {"repobilityId": "2eedc015f38c1906", "scanner": "scanner-primary", "fingerprint": "c8778856b5b2066f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 267}}}]}, {"ruleId": "scanner-34cf83c5314d9f49", "level": "error", "message": {"text": "Flask mutation route `bulk_delete_users` without `@login_required` \u2014 backend/routes/admin/user_management.py:299"}, "properties": {"repobilityId": "0fc9ba1c605994b5", "scanner": "scanner-primary", "fingerprint": "34cf83c5314d9f49", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 299}}}]}, {"ruleId": "scanner-7d514d52d7b12046", "level": "error", "message": {"text": "Flask mutation route `admin_reset_password` without `@login_required` \u2014 backend/routes/admin/user_management.py:333"}, "properties": {"repobilityId": "2dcd0d88c983843a", "scanner": "scanner-primary", "fingerprint": "7d514d52d7b12046", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 333}}}]}, {"ruleId": "scanner-fdbad7d22ceae0fc", "level": "error", "message": {"text": "Flask mutation route `admin_verify_email` without `@login_required` \u2014 backend/routes/admin/user_management.py:401"}, "properties": {"repobilityId": "8f74a6341f9c1dac", "scanner": "scanner-primary", "fingerprint": "fdbad7d22ceae0fc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 401}}}]}, {"ruleId": "scanner-6de00d156d185665", "level": "error", "message": {"text": "Flask mutation route `upload_user_avatar` without `@login_required` \u2014 backend/routes/admin/user_management.py:545"}, "properties": {"repobilityId": "b5dc63992ecb65ea", "scanner": "scanner-primary", "fingerprint": "6de00d156d185665", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 545}}}]}, {"ruleId": "scanner-bd223c2907d20e4e", "level": "error", "message": {"text": "Flask mutation route `assign_user_to_organization` without `@login_required` \u2014 backend/routes/admin/user_management.py:626"}, "properties": {"repobilityId": "e0c1950831ef2f06", "scanner": "scanner-primary", "fingerprint": "bd223c2907d20e4e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 626}}}]}, {"ruleId": "scanner-00898e8703bb67e3", "level": "error", "message": {"text": "Flask mutation route `update_user_org_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:683"}, "properties": {"repobilityId": "05766b86d26508df", "scanner": "scanner-primary", "fingerprint": "00898e8703bb67e3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 683}}}]}, {"ruleId": "scanner-bec6f5ff7aad7843", "level": "error", "message": {"text": "Flask mutation route `update_org_user_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:753"}, "properties": {"repobilityId": "623ab393ddc9fbbf", "scanner": "scanner-primary", "fingerprint": "bec6f5ff7aad7843", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 753}}}]}, {"ruleId": "scanner-c2c2a369cacff343", "level": "error", "message": {"text": "Flask mutation route `assign_advisor_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:925"}, "properties": {"repobilityId": "a23988b8ad848373", "scanner": "scanner-primary", "fingerprint": "c2c2a369cacff343", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 925}}}]}, {"ruleId": "scanner-07387b0c18c2b2e1", "level": "error", "message": {"text": "Flask mutation route `revoke_advisor_role` without `@login_required` \u2014 backend/routes/admin/user_management.py:1017"}, "properties": {"repobilityId": "4b9d15da43e0a1f6", "scanner": "scanner-primary", "fingerprint": "07387b0c18c2b2e1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 1017}}}]}, {"ruleId": "scanner-e34700cfecbc7f2b", "level": "error", "message": {"text": "Flask mutation route `add_observer_link` without `@login_required` \u2014 backend/routes/admin/user_management.py:1175"}, "properties": {"repobilityId": "07733196f3a96636", "scanner": "scanner-primary", "fingerprint": "e34700cfecbc7f2b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 1175}}}]}, {"ruleId": "scanner-01e832c70e42e749", "level": "error", "message": {"text": "Flask mutation route `remove_observer_link` without `@login_required` \u2014 backend/routes/admin/user_management.py:1217"}, "properties": {"repobilityId": "71e9c2be8ce48e2d", "scanner": "scanner-primary", "fingerprint": "01e832c70e42e749", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/user_management.py"}, "region": {"startLine": 1217}}}]}, {"ruleId": "scanner-8d1b3d93913f0a86", "level": "error", "message": {"text": "Flask mutation route `save_transfer_credits` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:125"}, "properties": {"repobilityId": "08701d0b1e416313", "scanner": "scanner-primary", "fingerprint": "8d1b3d93913f0a86", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/transfer_credits.py"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-d11aa1569ecdf081", "level": "error", "message": {"text": "Flask mutation route `upload_transcript` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:265"}, "properties": {"repobilityId": "34cae5b9c2ebf442", "scanner": "scanner-primary", "fingerprint": "d11aa1569ecdf081", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/transfer_credits.py"}, "region": {"startLine": 265}}}]}, {"ruleId": "scanner-1d814bb7c788351c", "level": "error", "message": {"text": "Flask mutation route `delete_single_transfer_credit` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:380"}, "properties": {"repobilityId": "5b33a9c0de5799aa", "scanner": "scanner-primary", "fingerprint": "1d814bb7c788351c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/transfer_credits.py"}, "region": {"startLine": 380}}}]}, {"ruleId": "scanner-6edd97b5fcbb8169", "level": "error", "message": {"text": "Flask mutation route `delete_all_transfer_credits` without `@login_required` \u2014 backend/routes/admin/transfer_credits.py:408"}, "properties": {"repobilityId": "1c48e78c8e04dfd9", "scanner": "scanner-primary", "fingerprint": "6edd97b5fcbb8169", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/transfer_credits.py"}, "region": {"startLine": 408}}}]}, {"ruleId": "scanner-97155cfd3c472e6a", "level": "error", "message": {"text": "Flask mutation route `link_participant` without `@login_required` \u2014 backend/routes/admin/poe.py:152"}, "properties": {"repobilityId": "0bcb81aacd29b643", "scanner": "scanner-primary", "fingerprint": "97155cfd3c472e6a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/poe.py"}, "region": {"startLine": 152}}}]}, {"ruleId": "scanner-6b8d988762548513", "level": "error", "message": {"text": "Flask mutation route `award_credit` without `@login_required` \u2014 backend/routes/admin/poe.py:295"}, "properties": {"repobilityId": "9c90bb9b827f9974", "scanner": "scanner-primary", "fingerprint": "6b8d988762548513", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/poe.py"}, "region": {"startLine": 295}}}]}, {"ruleId": "scanner-7a1cc6282f50b8d3", "level": "error", "message": {"text": "Flask mutation route `start_plan_session` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:69"}, "properties": {"repobilityId": "62d24a99ef76ec4b", "scanner": "scanner-primary", "fingerprint": "7a1cc6282f50b8d3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/plan_mode.py"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-6c2217c0ab810058", "level": "error", "message": {"text": "Flask mutation route `refine_outline` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:136"}, "properties": {"repobilityId": "c214326e08d975bf", "scanner": "scanner-primary", "fingerprint": "6c2217c0ab810058", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/plan_mode.py"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-06bbebb90b189799", "level": "error", "message": {"text": "Flask mutation route `update_session` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:280"}, "properties": {"repobilityId": "ad5bd2ee608efd61", "scanner": "scanner-primary", "fingerprint": "06bbebb90b189799", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/plan_mode.py"}, "region": {"startLine": 280}}}]}, {"ruleId": "scanner-060a1f7d83b3023b", "level": "error", "message": {"text": "Flask mutation route `approve_and_generate` without `@login_required` \u2014 backend/routes/admin/plan_mode.py:340"}, "properties": {"repobilityId": "0e538bbdfeb05310", "scanner": "scanner-primary", "fingerprint": "060a1f7d83b3023b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/plan_mode.py"}, "region": {"startLine": 340}}}]}, {"ruleId": "scanner-1e882241972f4f2b", "level": "error", "message": {"text": "Flask mutation route `upload_curriculum` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:278"}, "properties": {"repobilityId": "2ca2f200137cdf0d", "scanner": "scanner-primary", "fingerprint": "1e882241972f4f2b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_upload.py"}, "region": {"startLine": 278}}}]}, {"ruleId": "scanner-95bb57c2091b3939", "level": "error", "message": {"text": "Flask mutation route `generate_course` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:704"}, "properties": {"repobilityId": "78bd202cd31563dc", "scanner": "scanner-primary", "fingerprint": "95bb57c2091b3939", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_upload.py"}, "region": {"startLine": 704}}}]}, {"ruleId": "scanner-5771df3169b2d3e9", "level": "error", "message": {"text": "Flask mutation route `resume_curriculum_upload` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:854"}, "properties": {"repobilityId": "b67164b86ff85739", "scanner": "scanner-primary", "fingerprint": "5771df3169b2d3e9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_upload.py"}, "region": {"startLine": 854}}}]}, {"ruleId": "scanner-2e193c2b6b7de785", "level": "error", "message": {"text": "Flask mutation route `approve_structure` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:919"}, "properties": {"repobilityId": "435de5cb0a27648a", "scanner": "scanner-primary", "fingerprint": "2e193c2b6b7de785", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_upload.py"}, "region": {"startLine": 919}}}]}, {"ruleId": "scanner-6463b6dea401a5b1", "level": "error", "message": {"text": "Flask mutation route `delete_upload` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:1187"}, "properties": {"repobilityId": "faa8ac389ca874cb", "scanner": "scanner-primary", "fingerprint": "6463b6dea401a5b1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_upload.py"}, "region": {"startLine": 1187}}}]}, {"ruleId": "scanner-ffd6d2d515c56f81", "level": "error", "message": {"text": "Flask mutation route `diagnose_curriculum` without `@login_required` \u2014 backend/routes/admin/curriculum_upload.py:1319"}, "properties": {"repobilityId": "be0b34e41ffc16d5", "scanner": "scanner-primary", "fingerprint": "ffd6d2d515c56f81", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_upload.py"}, "region": {"startLine": 1319}}}]}, {"ruleId": "scanner-8255a2c0b327f4ed", "level": "error", "message": {"text": "Flask mutation route `upload_quest_image` without `@login_required` \u2014 backend/routes/admin/quest_management/images.py:47"}, "properties": {"repobilityId": "afe6e989329571c1", "scanner": "scanner-primary", "fingerprint": "8255a2c0b327f4ed", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/images.py"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-5be722fd983b5873", "level": "error", "message": {"text": "Flask mutation route `refresh_quest_image` without `@login_required` \u2014 backend/routes/admin/quest_management/images.py:140"}, "properties": {"repobilityId": "41090afc28732e0e", "scanner": "scanner-primary", "fingerprint": "5be722fd983b5873", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/images.py"}, "region": {"startLine": 140}}}]}, {"ruleId": "scanner-17b4daf8f67f953b", "level": "error", "message": {"text": "Flask mutation route `bulk_generate_images` without `@login_required` \u2014 backend/routes/admin/quest_management/images.py:201"}, "properties": {"repobilityId": "a0941d60d430cf01", "scanner": "scanner-primary", "fingerprint": "17b4daf8f67f953b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/images.py"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-e8bdb8801c99d56f", "level": "error", "message": {"text": "Flask mutation route `clone_quest_to_optio` without `@login_required` \u2014 backend/routes/admin/quest_management/tools.py:100"}, "properties": {"repobilityId": "cb100eb59e96f9aa", "scanner": "scanner-primary", "fingerprint": "e8bdb8801c99d56f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/tools.py"}, "region": {"startLine": 100}}}]}, {"ruleId": "scanner-ae4904f9edf26bcc", "level": "error", "message": {"text": "Flask mutation route `fix_course_quest_enrollments` without `@login_required` \u2014 backend/routes/admin/quest_management/tools.py:198"}, "properties": {"repobilityId": "5cffd9c7507f0d03", "scanner": "scanner-primary", "fingerprint": "ae4904f9edf26bcc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/tools.py"}, "region": {"startLine": 198}}}]}, {"ruleId": "scanner-08d573b3bb839d33", "level": "error", "message": {"text": "Flask mutation route `create_quest_v3_clean` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:70"}, "properties": {"repobilityId": "f556555ccb55034c", "scanner": "scanner-primary", "fingerprint": "08d573b3bb839d33", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/crud.py"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-03d863d7aa538579", "level": "error", "message": {"text": "Flask mutation route `create_quest_v3_clean` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:71"}, "properties": {"repobilityId": "2d91a3ff8b27d10d", "scanner": "scanner-primary", "fingerprint": "03d863d7aa538579", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/crud.py"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-bcdb64a40c6d23f3", "level": "error", "message": {"text": "Flask mutation route `bulk_delete_quests` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:208"}, "properties": {"repobilityId": "520ddd75bc70c768", "scanner": "scanner-primary", "fingerprint": "bcdb64a40c6d23f3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/crud.py"}, "region": {"startLine": 208}}}]}, {"ruleId": "scanner-0ba1a77daadb6cfa", "level": "error", "message": {"text": "Flask mutation route `bulk_update_quests` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:252"}, "properties": {"repobilityId": "ffe5522279eefe8f", "scanner": "scanner-primary", "fingerprint": "0ba1a77daadb6cfa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/crud.py"}, "region": {"startLine": 252}}}]}, {"ruleId": "scanner-cf69e5057410e0ed", "level": "error", "message": {"text": "Flask mutation route `update_quest` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:311"}, "properties": {"repobilityId": "b130c394c0dcfb42", "scanner": "scanner-primary", "fingerprint": "cf69e5057410e0ed", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/crud.py"}, "region": {"startLine": 311}}}]}, {"ruleId": "scanner-85698d410368d152", "level": "error", "message": {"text": "Flask mutation route `ai_cleanup_quest` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:445"}, "properties": {"repobilityId": "7f8485ac706e2e7c", "scanner": "scanner-primary", "fingerprint": "85698d410368d152", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/crud.py"}, "region": {"startLine": 445}}}]}, {"ruleId": "scanner-c0d9e31cce461323", "level": "error", "message": {"text": "Flask mutation route `delete_quest` without `@login_required` \u2014 backend/routes/admin/quest_management/crud.py:503"}, "properties": {"repobilityId": "09384cb84f44c57e", "scanner": "scanner-primary", "fingerprint": "c0d9e31cce461323", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/quest_management/crud.py"}, "region": {"startLine": 503}}}]}, {"ruleId": "scanner-5baf58abf0b0875f", "level": "error", "message": {"text": "Flask mutation route `generate_outline` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/outline.py:65"}, "properties": {"repobilityId": "e09f96670c256d75", "scanner": "scanner-primary", "fingerprint": "5baf58abf0b0875f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/outline.py"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-d3460233b3b20843", "level": "error", "message": {"text": "Flask mutation route `select_outline` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/outline.py:126"}, "properties": {"repobilityId": "46ff279eb27fb088", "scanner": "scanner-primary", "fingerprint": "d3460233b3b20843", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/outline.py"}, "region": {"startLine": 126}}}]}, {"ruleId": "scanner-b840781377ef5500", "level": "error", "message": {"text": "Flask mutation route `regenerate_outline` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/outline.py:235"}, "properties": {"repobilityId": "1633a056f563a30d", "scanner": "scanner-primary", "fingerprint": "b840781377ef5500", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/outline.py"}, "region": {"startLine": 235}}}]}, {"ruleId": "scanner-d18d868ee62c0018", "level": "error", "message": {"text": "Flask mutation route `generate_tasks` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:60"}, "properties": {"repobilityId": "8e2abacab6190b4e", "scanner": "scanner-primary", "fingerprint": "d18d868ee62c0018", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/tasks.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-f7ab5f629d691cf5", "level": "error", "message": {"text": "Flask mutation route `generate_tasks_for_lesson` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:101"}, "properties": {"repobilityId": "8baedb53b9d35c46", "scanner": "scanner-primary", "fingerprint": "f7ab5f629d691cf5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/tasks.py"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-ece979ffc2f0dfa9", "level": "error", "message": {"text": "Flask mutation route `regenerate_tasks` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:157"}, "properties": {"repobilityId": "a82c29e799894270", "scanner": "scanner-primary", "fingerprint": "ece979ffc2f0dfa9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/tasks.py"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-7bd032b984791118", "level": "error", "message": {"text": "Flask mutation route `save_task` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/tasks.py:220"}, "properties": {"repobilityId": "ca2c5a1ad2a25875", "scanner": "scanner-primary", "fingerprint": "7bd032b984791118", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/tasks.py"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-1c4309e207c2622a", "level": "error", "message": {"text": "Flask mutation route `bulk_generate` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/bulk.py:60"}, "properties": {"repobilityId": "fff577ac13d1f775", "scanner": "scanner-primary", "fingerprint": "1c4309e207c2622a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/bulk.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-d75c76fa95a924a5", "level": "error", "message": {"text": "Flask mutation route `fix_images` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/bulk.py:203"}, "properties": {"repobilityId": "3ff9bf9692ce5938", "scanner": "scanner-primary", "fingerprint": "d75c76fa95a924a5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/bulk.py"}, "region": {"startLine": 203}}}]}, {"ruleId": "scanner-059be33a6fdddc72", "level": "error", "message": {"text": "Flask mutation route `queue_generation` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:60"}, "properties": {"repobilityId": "23eaab9abc35fe8d", "scanner": "scanner-primary", "fingerprint": "059be33a6fdddc72", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/jobs.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-f2b192758be35731", "level": "error", "message": {"text": "Flask mutation route `start_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:234"}, "properties": {"repobilityId": "9562efae52763745", "scanner": "scanner-primary", "fingerprint": "f2b192758be35731", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/jobs.py"}, "region": {"startLine": 234}}}]}, {"ruleId": "scanner-34a5aad1b15987a9", "level": "error", "message": {"text": "Flask mutation route `cancel_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:303"}, "properties": {"repobilityId": "e46db1565eb6f784", "scanner": "scanner-primary", "fingerprint": "34a5aad1b15987a9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/jobs.py"}, "region": {"startLine": 303}}}]}, {"ruleId": "scanner-bb99f32ff398ef75", "level": "error", "message": {"text": "Flask mutation route `retry_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:332"}, "properties": {"repobilityId": "c759754c0bf1ed2a", "scanner": "scanner-primary", "fingerprint": "bb99f32ff398ef75", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/jobs.py"}, "region": {"startLine": 332}}}]}, {"ruleId": "scanner-b75ab59280c3da40", "level": "error", "message": {"text": "Flask mutation route `process_next_job` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/jobs.py:363"}, "properties": {"repobilityId": "6758eae62aeb914f", "scanner": "scanner-primary", "fingerprint": "b75ab59280c3da40", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/jobs.py"}, "region": {"startLine": 363}}}]}, {"ruleId": "scanner-00c29d610370a778", "level": "error", "message": {"text": "Flask mutation route `finalize_course` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/finalize.py:60"}, "properties": {"repobilityId": "d1b2fb71b2907898", "scanner": "scanner-primary", "fingerprint": "00c29d610370a778", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/finalize.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-d64ab0ddf53fb16f", "level": "error", "message": {"text": "Flask mutation route `delete_draft` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/finalize.py:94"}, "properties": {"repobilityId": "a97eca4ff6073aa0", "scanner": "scanner-primary", "fingerprint": "d64ab0ddf53fb16f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/finalize.py"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-3ed321e05ede290e", "level": "error", "message": {"text": "Flask mutation route `generate_lessons` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:60"}, "properties": {"repobilityId": "9c34076a6e8d5faa", "scanner": "scanner-primary", "fingerprint": "3ed321e05ede290e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/lessons.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-aabdf461cbd1db0f", "level": "error", "message": {"text": "Flask mutation route `generate_lessons_for_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:101"}, "properties": {"repobilityId": "973ce8864c211351", "scanner": "scanner-primary", "fingerprint": "aabdf461cbd1db0f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/lessons.py"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-a6b2a0af94647ec1", "level": "error", "message": {"text": "Flask mutation route `generate_lesson_content_all` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:136"}, "properties": {"repobilityId": "687c31ead6997a5a", "scanner": "scanner-primary", "fingerprint": "a6b2a0af94647ec1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/lessons.py"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-0c5bf740247eb4cb", "level": "error", "message": {"text": "Flask mutation route `generate_lesson_content_single` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:182"}, "properties": {"repobilityId": "b0e6241f4f91f2ea", "scanner": "scanner-primary", "fingerprint": "0c5bf740247eb4cb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/lessons.py"}, "region": {"startLine": 182}}}]}, {"ruleId": "scanner-71a16e41af40e5b1", "level": "error", "message": {"text": "Flask mutation route `regenerate_lesson` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:224"}, "properties": {"repobilityId": "23351e1183a2972d", "scanner": "scanner-primary", "fingerprint": "71a16e41af40e5b1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/lessons.py"}, "region": {"startLine": 224}}}]}, {"ruleId": "scanner-391aa57b71dab684", "level": "error", "message": {"text": "Flask mutation route `save_lesson` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/lessons.py:283"}, "properties": {"repobilityId": "c70779f6ccf34882", "scanner": "scanner-primary", "fingerprint": "391aa57b71dab684", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/lessons.py"}, "region": {"startLine": 283}}}]}, {"ruleId": "scanner-7fe690d8dae88de7", "level": "error", "message": {"text": "Flask mutation route `add_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/project.py:60"}, "properties": {"repobilityId": "65345544506b1c8a", "scanner": "scanner-primary", "fingerprint": "7fe690d8dae88de7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/project.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-441188fe62947cde", "level": "error", "message": {"text": "Flask mutation route `update_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/project.py:151"}, "properties": {"repobilityId": "b3329e12e60175b7", "scanner": "scanner-primary", "fingerprint": "441188fe62947cde", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/project.py"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-302308bdc821b6be", "level": "error", "message": {"text": "Flask mutation route `delete_project` without `@login_required` \u2014 backend/routes/admin/curriculum_generate/project.py:195"}, "properties": {"repobilityId": "735a7e33fbb6b5c5", "scanner": "scanner-primary", "fingerprint": "302308bdc821b6be", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/admin/curriculum_generate/project.py"}, "region": {"startLine": 195}}}]}, {"ruleId": "scanner-973fd1c8dc899ddf", "level": "error", "message": {"text": "Flask mutation route `admin_create_link` without `@login_required` \u2014 backend/routes/parent_linking/admin.py:45"}, "properties": {"repobilityId": "4e0c2dd6ebaa6135", "scanner": "scanner-primary", "fingerprint": "973fd1c8dc899ddf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent_linking/admin.py"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-46e504da91565bb6", "level": "error", "message": {"text": "Flask mutation route `admin_delete_link` without `@login_required` \u2014 backend/routes/parent_linking/admin.py:116"}, "properties": {"repobilityId": "64ef425a5103ddbf", "scanner": "scanner-primary", "fingerprint": "46e504da91565bb6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent_linking/admin.py"}, "region": {"startLine": 116}}}]}, {"ruleId": "scanner-327732b12901c230", "level": "error", "message": {"text": "Flask mutation route `submit_connection_requests` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:45"}, "properties": {"repobilityId": "30415373ea832365", "scanner": "scanner-primary", "fingerprint": "327732b12901c230", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent_linking/requests.py"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-5e8e0e8e9ffa746c", "level": "error", "message": {"text": "Flask mutation route `approve_connection_request` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:239"}, "properties": {"repobilityId": "aee58a0817d43140", "scanner": "scanner-primary", "fingerprint": "5e8e0e8e9ffa746c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent_linking/requests.py"}, "region": {"startLine": 239}}}]}, {"ruleId": "scanner-afe6e2797a27677b", "level": "error", "message": {"text": "Flask mutation route `reject_connection_request` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:293"}, "properties": {"repobilityId": "0a8cfebf1a6aa87e", "scanner": "scanner-primary", "fingerprint": "afe6e2797a27677b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent_linking/requests.py"}, "region": {"startLine": 293}}}]}, {"ruleId": "scanner-37b9eea6ccc08565", "level": "error", "message": {"text": "Flask mutation route `promote_observer_to_parent` without `@login_required` \u2014 backend/routes/parent_linking/requests.py:350"}, "properties": {"repobilityId": "48d2777d9398af59", "scanner": "scanner-primary", "fingerprint": "37b9eea6ccc08565", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parent_linking/requests.py"}, "region": {"startLine": 350}}}]}, {"ruleId": "scanner-9a5e7a9e06e87ab2", "level": "error", "message": {"text": "Flask mutation route `end_quest` without `@login_required` \u2014 backend/routes/quest/completion.py:422"}, "properties": {"repobilityId": "0d4ece93a7d37146", "scanner": "scanner-primary", "fingerprint": "9a5e7a9e06e87ab2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest/completion.py"}, "region": {"startLine": 422}}}]}, {"ruleId": "scanner-43ac405af93bf979", "level": "error", "message": {"text": "Flask mutation route `reopen_quest` without `@login_required` \u2014 backend/routes/quest/completion.py:645"}, "properties": {"repobilityId": "3f30f5fbd4ecd554", "scanner": "scanner-primary", "fingerprint": "43ac405af93bf979", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest/completion.py"}, "region": {"startLine": 645}}}]}, {"ruleId": "scanner-6d8ea92dcdc892ee", "level": "error", "message": {"text": "Flask mutation route `reorder_quest_tasks` without `@login_required` \u2014 backend/routes/quest/completion.py:707"}, "properties": {"repobilityId": "52f224aa3b5ce4d9", "scanner": "scanner-primary", "fingerprint": "6d8ea92dcdc892ee", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest/completion.py"}, "region": {"startLine": 707}}}]}, {"ruleId": "scanner-9c811cf54ccea9c3", "level": "error", "message": {"text": "Flask mutation route `update_display_mode` without `@login_required` \u2014 backend/routes/quest/completion.py:776"}, "properties": {"repobilityId": "4d70d2f4400ef6da", "scanner": "scanner-primary", "fingerprint": "9c811cf54ccea9c3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest/completion.py"}, "region": {"startLine": 776}}}]}, {"ruleId": "scanner-ff7625a1762a4c77", "level": "error", "message": {"text": "Flask mutation route `class_task_suggestions` without `@login_required` \u2014 backend/routes/quest/classes.py:30"}, "properties": {"repobilityId": "796496a357b4ad11", "scanner": "scanner-primary", "fingerprint": "ff7625a1762a4c77", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest/classes.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-83f63e0d5efda770", "level": "error", "message": {"text": "Flask mutation route `submit_class_for_review` without `@login_required` \u2014 backend/routes/quest/classes.py:219"}, "properties": {"repobilityId": "913d554494c8f11b", "scanner": "scanner-primary", "fingerprint": "83f63e0d5efda770", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest/classes.py"}, "region": {"startLine": 219}}}]}, {"ruleId": "scanner-f3b1e4e00a955c6b", "level": "error", "message": {"text": "Flask mutation route `backfill_quest_topics` without `@login_required` \u2014 backend/routes/quest/listing.py:410"}, "properties": {"repobilityId": "68cf87f34effe397", "scanner": "scanner-primary", "fingerprint": "f3b1e4e00a955c6b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest/listing.py"}, "region": {"startLine": 410}}}]}, {"ruleId": "scanner-f50e3593302e5042", "level": "error", "message": {"text": "Flask mutation route `enroll_in_quest` without `@login_required` \u2014 backend/routes/quest/enrollment.py:24"}, "properties": {"repobilityId": "59dcb42c357f039b", "scanner": "scanner-primary", "fingerprint": "f50e3593302e5042", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest/enrollment.py"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-5bbc9650b74a2960", "level": "error", "message": {"text": "Flask mutation route `create_user_quest` without `@login_required` \u2014 backend/routes/quest/enrollment.py:481"}, "properties": {"repobilityId": "fac69b0b3a198e1d", "scanner": "scanner-primary", "fingerprint": "5bbc9650b74a2960", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/quest/enrollment.py"}, "region": {"startLine": 481}}}]}, {"ruleId": "scanner-96fa000ef7c05503", "level": "error", "message": {"text": "Flask mutation route `mark_kickoff_attended` without `@login_required` \u2014 backend/routes/courses/kickoff.py:81"}, "properties": {"repobilityId": "c35dbf7d24cca943", "scanner": "scanner-primary", "fingerprint": "96fa000ef7c05503", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/kickoff.py"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-e11e28a4203c97e9", "level": "error", "message": {"text": "Flask mutation route `add_quest_to_course` without `@login_required` \u2014 backend/routes/courses/quests.py:81"}, "properties": {"repobilityId": "7e4f6f55e44af207", "scanner": "scanner-primary", "fingerprint": "e11e28a4203c97e9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/quests.py"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-058724498eb9bdbc", "level": "error", "message": {"text": "Flask mutation route `remove_quest_from_course` without `@login_required` \u2014 backend/routes/courses/quests.py:158"}, "properties": {"repobilityId": "c196b9a0f20e44de", "scanner": "scanner-primary", "fingerprint": "058724498eb9bdbc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/quests.py"}, "region": {"startLine": 158}}}]}, {"ruleId": "scanner-067ba610c0f206c0", "level": "error", "message": {"text": "Flask mutation route `update_course_quest` without `@login_required` \u2014 backend/routes/courses/quests.py:242"}, "properties": {"repobilityId": "9b4769f8dded3873", "scanner": "scanner-primary", "fingerprint": "067ba610c0f206c0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/quests.py"}, "region": {"startLine": 242}}}]}, {"ruleId": "scanner-faf1df39ec04c9d3", "level": "error", "message": {"text": "Flask mutation route `update_project_details` without `@login_required` \u2014 backend/routes/courses/quests.py:317"}, "properties": {"repobilityId": "15d0e387aabaf131", "scanner": "scanner-primary", "fingerprint": "faf1df39ec04c9d3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/quests.py"}, "region": {"startLine": 317}}}]}, {"ruleId": "scanner-ffdca9ee94145317", "level": "error", "message": {"text": "Flask mutation route `reorder_course_quests` without `@login_required` \u2014 backend/routes/courses/quests.py:421"}, "properties": {"repobilityId": "9f37ec0d6321e567", "scanner": "scanner-primary", "fingerprint": "ffdca9ee94145317", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/quests.py"}, "region": {"startLine": 421}}}]}, {"ruleId": "scanner-1f1b02f0c0839b29", "level": "error", "message": {"text": "Flask mutation route `publish_course` without `@login_required` \u2014 backend/routes/courses/publishing.py:28"}, "properties": {"repobilityId": "44e6fd1052f08184", "scanner": "scanner-primary", "fingerprint": "1f1b02f0c0839b29", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/publishing.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-b41c304add736690", "level": "error", "message": {"text": "Flask mutation route `create_course` without `@login_required` \u2014 backend/routes/courses/crud.py:167"}, "properties": {"repobilityId": "5075c8cdcd97d953", "scanner": "scanner-primary", "fingerprint": "b41c304add736690", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/crud.py"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-f67caf829f09e177", "level": "error", "message": {"text": "Flask mutation route `create_course` without `@login_required` \u2014 backend/routes/courses/crud.py:168"}, "properties": {"repobilityId": "28b09b09cb2ce0b6", "scanner": "scanner-primary", "fingerprint": "f67caf829f09e177", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/crud.py"}, "region": {"startLine": 168}}}]}, {"ruleId": "scanner-9a13f3d41767645e", "level": "error", "message": {"text": "Flask mutation route `update_course` without `@login_required` \u2014 backend/routes/courses/crud.py:312"}, "properties": {"repobilityId": "5b89f8e6d4d51278", "scanner": "scanner-primary", "fingerprint": "9a13f3d41767645e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/crud.py"}, "region": {"startLine": 312}}}]}, {"ruleId": "scanner-8d7568e2ea899616", "level": "error", "message": {"text": "Flask mutation route `generate_showcase_fields` without `@login_required` \u2014 backend/routes/courses/crud.py:440"}, "properties": {"repobilityId": "01d1a6402df11c8f", "scanner": "scanner-primary", "fingerprint": "8d7568e2ea899616", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/crud.py"}, "region": {"startLine": 440}}}]}, {"ruleId": "scanner-d49d3312e1c32cde", "level": "error", "message": {"text": "Flask mutation route `generate_course_cover_image` without `@login_required` \u2014 backend/routes/courses/crud.py:521"}, "properties": {"repobilityId": "2a6adba2d2dd1c69", "scanner": "scanner-primary", "fingerprint": "d49d3312e1c32cde", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/crud.py"}, "region": {"startLine": 521}}}]}, {"ruleId": "scanner-15f9661370ed87e0", "level": "error", "message": {"text": "Flask mutation route `upload_course_cover_image` without `@login_required` \u2014 backend/routes/courses/crud.py:572"}, "properties": {"repobilityId": "3dfec99338156ccc", "scanner": "scanner-primary", "fingerprint": "15f9661370ed87e0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/crud.py"}, "region": {"startLine": 572}}}]}, {"ruleId": "scanner-98575e45b1e5f275", "level": "error", "message": {"text": "Flask mutation route `upload_quest_header_image` without `@login_required` \u2014 backend/routes/courses/crud.py:642"}, "properties": {"repobilityId": "8b30ac3c26a1c6fb", "scanner": "scanner-primary", "fingerprint": "98575e45b1e5f275", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/crud.py"}, "region": {"startLine": 642}}}]}, {"ruleId": "scanner-7aed4c5b3aacc7cb", "level": "error", "message": {"text": "Flask mutation route `delete_course` without `@login_required` \u2014 backend/routes/courses/crud.py:714"}, "properties": {"repobilityId": "50ac89f8b967b628", "scanner": "scanner-primary", "fingerprint": "7aed4c5b3aacc7cb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/crud.py"}, "region": {"startLine": 714}}}]}, {"ruleId": "scanner-776c2ccd7179ecae", "level": "error", "message": {"text": "Flask mutation route `enroll_in_course` without `@login_required` \u2014 backend/routes/courses/enrollment.py:29"}, "properties": {"repobilityId": "915773cdd854d77f", "scanner": "scanner-primary", "fingerprint": "776c2ccd7179ecae", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/enrollment.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-e5755fbc245b269f", "level": "error", "message": {"text": "Flask mutation route `unenroll_from_course` without `@login_required` \u2014 backend/routes/courses/enrollment.py:198"}, "properties": {"repobilityId": "9bd8c6d04b410dfe", "scanner": "scanner-primary", "fingerprint": "e5755fbc245b269f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/enrollment.py"}, "region": {"startLine": 198}}}]}, {"ruleId": "scanner-960f1835d1ad2ade", "level": "error", "message": {"text": "Flask mutation route `end_course` without `@login_required` \u2014 backend/routes/courses/enrollment.py:273"}, "properties": {"repobilityId": "315ffc38ab17eb91", "scanner": "scanner-primary", "fingerprint": "960f1835d1ad2ade", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/enrollment.py"}, "region": {"startLine": 273}}}]}, {"ruleId": "scanner-382e20574046748f", "level": "error", "message": {"text": "Flask mutation route `create_invite` without `@login_required` \u2014 backend/routes/courses/invites.py:31"}, "properties": {"repobilityId": "476acfb3f144f79c", "scanner": "scanner-primary", "fingerprint": "382e20574046748f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/invites.py"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-3bcd731c94e2a6ca", "level": "error", "message": {"text": "Flask mutation route `revoke_invite` without `@login_required` \u2014 backend/routes/courses/invites.py:130"}, "properties": {"repobilityId": "b81416edb77111a6", "scanner": "scanner-primary", "fingerprint": "3bcd731c94e2a6ca", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/courses/invites.py"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-970ff8e83830fa82", "level": "error", "message": {"text": "Flask mutation route `generate_ai_tasks` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:48"}, "properties": {"repobilityId": "4d63ead3832c52cb", "scanner": "scanner-primary", "fingerprint": "970ff8e83830fa82", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/tasks.py"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-5085bce0707a20a9", "level": "error", "message": {"text": "Flask mutation route `activate_task` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:219"}, "properties": {"repobilityId": "5be28cf0946d55a2", "scanner": "scanner-primary", "fingerprint": "5085bce0707a20a9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/tasks.py"}, "region": {"startLine": 219}}}]}, {"ruleId": "scanner-a8ca3131a372f951", "level": "error", "message": {"text": "Flask mutation route `link_task_to_lesson` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:317"}, "properties": {"repobilityId": "bba10380831c4213", "scanner": "scanner-primary", "fingerprint": "a8ca3131a372f951", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/tasks.py"}, "region": {"startLine": 317}}}]}, {"ruleId": "scanner-67df153df4e44579", "level": "error", "message": {"text": "Flask mutation route `unlink_task_from_lesson` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:359"}, "properties": {"repobilityId": "d5ecd8cd8f54843b", "scanner": "scanner-primary", "fingerprint": "67df153df4e44579", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/tasks.py"}, "region": {"startLine": 359}}}]}, {"ruleId": "scanner-db1791b15b8e7134", "level": "error", "message": {"text": "Flask mutation route `create_curriculum_tasks` without `@login_required` \u2014 backend/routes/curriculum/tasks.py:390"}, "properties": {"repobilityId": "30aa8ab029605134", "scanner": "scanner-primary", "fingerprint": "db1791b15b8e7134", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/tasks.py"}, "region": {"startLine": 390}}}]}, {"ruleId": "scanner-4b9ba92cfe5845e5", "level": "error", "message": {"text": "Flask mutation route `create_lesson` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:48"}, "properties": {"repobilityId": "5c64273cb9795caa", "scanner": "scanner-primary", "fingerprint": "4b9ba92cfe5845e5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/lessons.py"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-e6c53c0148d63389", "level": "error", "message": {"text": "Flask mutation route `update_lesson` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:181"}, "properties": {"repobilityId": "8dd49ad2f80c0e07", "scanner": "scanner-primary", "fingerprint": "e6c53c0148d63389", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/lessons.py"}, "region": {"startLine": 181}}}]}, {"ruleId": "scanner-4aa00e97504dbb11", "level": "error", "message": {"text": "Flask mutation route `delete_lesson` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:223"}, "properties": {"repobilityId": "9f60e08a9993e4a1", "scanner": "scanner-primary", "fingerprint": "4aa00e97504dbb11", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/lessons.py"}, "region": {"startLine": 223}}}]}, {"ruleId": "scanner-406470e774f9003a", "level": "error", "message": {"text": "Flask mutation route `move_lesson_to_project` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:256"}, "properties": {"repobilityId": "93778de2f51979a6", "scanner": "scanner-primary", "fingerprint": "406470e774f9003a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/lessons.py"}, "region": {"startLine": 256}}}]}, {"ruleId": "scanner-91d2334e871392e6", "level": "error", "message": {"text": "Flask mutation route `reorder_lessons` without `@login_required` \u2014 backend/routes/curriculum/lessons.py:329"}, "properties": {"repobilityId": "22d98dc61357ab89", "scanner": "scanner-primary", "fingerprint": "91d2334e871392e6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/lessons.py"}, "region": {"startLine": 329}}}]}, {"ruleId": "scanner-1da63c34b6573bf3", "level": "error", "message": {"text": "Flask mutation route `save_curriculum` without `@login_required` \u2014 backend/routes/curriculum/core.py:82"}, "properties": {"repobilityId": "17fa5f6792df8259", "scanner": "scanner-primary", "fingerprint": "1da63c34b6573bf3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/core.py"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-8b24c63573f642eb", "level": "error", "message": {"text": "Flask mutation route `update_lesson_progress` without `@login_required` \u2014 backend/routes/curriculum/progress.py:79"}, "properties": {"repobilityId": "cc691e2ede7a0cad", "scanner": "scanner-primary", "fingerprint": "8b24c63573f642eb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/progress.py"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-3f1c226a1b66d1ba", "level": "error", "message": {"text": "Flask mutation route `delete_lesson_progress` without `@login_required` \u2014 backend/routes/curriculum/progress.py:133"}, "properties": {"repobilityId": "c76bb0790158b288", "scanner": "scanner-primary", "fingerprint": "3f1c226a1b66d1ba", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/progress.py"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-037f80e9c51e3519", "level": "error", "message": {"text": "Flask mutation route `upload_attachment` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:48"}, "properties": {"repobilityId": "6a617ab0464f3a69", "scanner": "scanner-primary", "fingerprint": "037f80e9c51e3519", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/attachments.py"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-557979d140e76f1b", "level": "error", "message": {"text": "Flask mutation route `upload_image` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:128"}, "properties": {"repobilityId": "3425368c9b5d959c", "scanner": "scanner-primary", "fingerprint": "557979d140e76f1b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/attachments.py"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-f5a04f332e496aca", "level": "error", "message": {"text": "Flask mutation route `rename_attachment` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:181"}, "properties": {"repobilityId": "0a7379e4586590bf", "scanner": "scanner-primary", "fingerprint": "f5a04f332e496aca", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/attachments.py"}, "region": {"startLine": 181}}}]}, {"ruleId": "scanner-c3434466c6bd8628", "level": "error", "message": {"text": "Flask mutation route `delete_attachment` without `@login_required` \u2014 backend/routes/curriculum/attachments.py:231"}, "properties": {"repobilityId": "4d3d3eac2c5a6f2c", "scanner": "scanner-primary", "fingerprint": "c3434466c6bd8628", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/curriculum/attachments.py"}, "region": {"startLine": 231}}}]}, {"ruleId": "scanner-42aa562c2b65bd4b", "level": "error", "message": {"text": "Flask mutation route `respond_to_visibility_request` without `@login_required` \u2014 backend/routes/parental_consent/visibility.py:119"}, "properties": {"repobilityId": "dcfb75a5ed391314", "scanner": "scanner-primary", "fingerprint": "42aa562c2b65bd4b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parental_consent/visibility.py"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-ecbbad47eebc3596", "level": "error", "message": {"text": "Flask mutation route `approve_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/admin_review.py:113"}, "properties": {"repobilityId": "f0883111ff616972", "scanner": "scanner-primary", "fingerprint": "ecbbad47eebc3596", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parental_consent/admin_review.py"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-064731d306c35ba5", "level": "error", "message": {"text": "Flask mutation route `reject_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/admin_review.py:194"}, "properties": {"repobilityId": "7809a681b6035ab4", "scanner": "scanner-primary", "fingerprint": "064731d306c35ba5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parental_consent/admin_review.py"}, "region": {"startLine": 194}}}]}, {"ruleId": "scanner-157aef6fcd882f6c", "level": "error", "message": {"text": "Flask mutation route `send_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/requests.py:65"}, "properties": {"repobilityId": "3d0b2c2d9fcedbfa", "scanner": "scanner-primary", "fingerprint": "157aef6fcd882f6c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parental_consent/requests.py"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-452fa63aea63f9f3", "level": "error", "message": {"text": "Flask mutation route `verify_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/requests.py:148"}, "properties": {"repobilityId": "fc527d2573809d5e", "scanner": "scanner-primary", "fingerprint": "452fa63aea63f9f3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parental_consent/requests.py"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-fb7e2110a0e6d555", "level": "error", "message": {"text": "Flask mutation route `resend_parental_consent` without `@login_required` \u2014 backend/routes/parental_consent/requests.py:237"}, "properties": {"repobilityId": "99f9a88031a9ff14", "scanner": "scanner-primary", "fingerprint": "fb7e2110a0e6d555", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parental_consent/requests.py"}, "region": {"startLine": 237}}}]}, {"ruleId": "scanner-ff870d511b8b293b", "level": "error", "message": {"text": "Flask mutation route `submit_consent_documents` without `@login_required` \u2014 backend/routes/parental_consent/documents.py:65"}, "properties": {"repobilityId": "67879bbb49fe2f5a", "scanner": "scanner-primary", "fingerprint": "ff870d511b8b293b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/parental_consent/documents.py"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-65cc9040a70cd2de", "level": "error", "message": {"text": "Flask mutation route `create_student_learning_moment` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:19"}, "properties": {"repobilityId": "5fdca9c7c381c300", "scanner": "scanner-primary", "fingerprint": "65cc9040a70cd2de", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/advisor/learning_moments.py"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-de2b9896df0deb8d", "level": "error", "message": {"text": "Flask mutation route `upload_moment_media` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:157"}, "properties": {"repobilityId": "484aacc82b3e58ab", "scanner": "scanner-primary", "fingerprint": "de2b9896df0deb8d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/advisor/learning_moments.py"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-4d19ee4d7832af8d", "level": "error", "message": {"text": "Flask mutation route `init_moment_signed_upload` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:201"}, "properties": {"repobilityId": "c65285254c6f9444", "scanner": "scanner-primary", "fingerprint": "4d19ee4d7832af8d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/advisor/learning_moments.py"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-792bd4a5bb5eb145", "level": "error", "message": {"text": "Flask mutation route `finalize_moment_signed_upload` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:240"}, "properties": {"repobilityId": "4bf1b07d33c2770f", "scanner": "scanner-primary", "fingerprint": "792bd4a5bb5eb145", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/advisor/learning_moments.py"}, "region": {"startLine": 240}}}]}, {"ruleId": "scanner-c86f83f3e1d4d75b", "level": "error", "message": {"text": "Flask mutation route `update_student_learning_moment` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:364"}, "properties": {"repobilityId": "ec333786893445e9", "scanner": "scanner-primary", "fingerprint": "c86f83f3e1d4d75b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/advisor/learning_moments.py"}, "region": {"startLine": 364}}}]}, {"ruleId": "scanner-4e7a58cd499157c3", "level": "error", "message": {"text": "Flask mutation route `delete_student_learning_moment` without `@login_required` \u2014 backend/routes/advisor/learning_moments.py:443"}, "properties": {"repobilityId": "d642077139581bf9", "scanner": "scanner-primary", "fingerprint": "4e7a58cd499157c3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routes/advisor/learning_moments.py"}, "region": {"startLine": 443}}}]}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "9096192b61efe7c5", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ece8c987ff9c424", "level": "note", "message": {"text": "Unused endpoint: ANY /api/health"}, "properties": {"repobilityId": "4214faefbd997e33", "scanner": "scanner-primary", "fingerprint": "8ece8c987ff9c424", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8f9078a196c76715", "level": "note", "message": {"text": "Unused endpoint: ANY /csrf-token"}, "properties": {"repobilityId": "572e273050c317a3", "scanner": "scanner-primary", "fingerprint": "8f9078a196c76715", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3e511781c514a67", "level": "note", "message": {"text": "Unused endpoint: ANY /api/health/memory"}, "properties": {"repobilityId": "74927db645193790", "scanner": "scanner-primary", "fingerprint": "c3e511781c514a67", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf6b3c61dc77380a", "level": "note", "message": {"text": "Unused endpoint: ANY /unread-count"}, "properties": {"repobilityId": "dba5521676958471", "scanner": "scanner-primary", "fingerprint": "bf6b3c61dc77380a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-356c424001ac6c47", "level": "note", "message": {"text": "Unused endpoint: ANY /<notification_id>/read"}, "properties": {"repobilityId": "e2ed87321487f1f2", "scanner": "scanner-primary", "fingerprint": "356c424001ac6c47", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7e6ce38c8d4a362", "level": "note", "message": {"text": "Unused endpoint: ANY /mark-all-read"}, "properties": {"repobilityId": "84569e9e842468e9", "scanner": "scanner-primary", "fingerprint": "c7e6ce38c8d4a362", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44aa1676480e8118", "level": "note", "message": {"text": "Unused endpoint: ANY /<notification_id>"}, "properties": {"repobilityId": "cc843eba05a4d2c8", "scanner": "scanner-primary", "fingerprint": "44aa1676480e8118", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9e8271584188dedb", "level": "note", "message": {"text": "Unused endpoint: ANY /delete-all"}, "properties": {"repobilityId": "93c8d3c6fe3f42e9", "scanner": "scanner-primary", "fingerprint": "9e8271584188dedb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3bf0af9b202498f6", "level": "note", "message": {"text": "Unused endpoint: ANY /send"}, "properties": {"repobilityId": "852d2644cafbc236", "scanner": "scanner-primary", "fingerprint": "3bf0af9b202498f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-31e40ac64ab0fdec", "level": "note", "message": {"text": "Unused endpoint: ANY /preferences"}, "properties": {"repobilityId": "949458ae0f451e2d", "scanner": "scanner-primary", "fingerprint": "31e40ac64ab0fdec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4ff7cc8419d53d58", "level": "note", "message": {"text": "Unused endpoint: ANY /broadcast"}, "properties": {"repobilityId": "d7f56f86bfdbe070", "scanner": "scanner-primary", "fingerprint": "4ff7cc8419d53d58", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c185f8e457dd425", "level": "note", "message": {"text": "Unused endpoint: ANY /users/delete-account"}, "properties": {"repobilityId": "12caaaf14f37f0d2", "scanner": "scanner-primary", "fingerprint": "9c185f8e457dd425", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb05a6cb360a61d5", "level": "note", "message": {"text": "Unused endpoint: ANY /users/cancel-deletion"}, "properties": {"repobilityId": "e4eb5ea233305a64", "scanner": "scanner-primary", "fingerprint": "eb05a6cb360a61d5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3c70245bc00543f2", "level": "note", "message": {"text": "Unused endpoint: ANY /users/deletion-status"}, "properties": {"repobilityId": "dfcb1072e265424d", "scanner": "scanner-primary", "fingerprint": "3c70245bc00543f2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24458e8ba8fc3a73", "level": "note", "message": {"text": "Unused endpoint: ANY /users/export-data"}, "properties": {"repobilityId": "2c7e6dfa09fa9a9b", "scanner": "scanner-primary", "fingerprint": "24458e8ba8fc3a73", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fe8fb15414841eb5", "level": "note", "message": {"text": "Unused endpoint: ANY /users/delete-account-permanent"}, "properties": {"repobilityId": "1925a7958533b2e4", "scanner": "scanner-primary", "fingerprint": "fe8fb15414841eb5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-434ffefbcc20ad6c", "level": "note", "message": {"text": "Unused endpoint: ANY /pillars"}, "properties": {"repobilityId": "a76a5a9c00e81618", "scanner": "scanner-primary", "fingerprint": "434ffefbcc20ad6c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b32aa92a76acf48", "level": "note", "message": {"text": "Unused endpoint: ANY /pillars/<pillar_key>"}, "properties": {"repobilityId": "8438737572c2dd1a", "scanner": "scanner-primary", "fingerprint": "3b32aa92a76acf48", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-974c85f0193c5491", "level": "note", "message": {"text": "Unused endpoint: ANY /pillars/validate/<pillar_key>"}, "properties": {"repobilityId": "610a4b7d006f9cee", "scanner": "scanner-primary", "fingerprint": "974c85f0193c5491", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-baebe42c1606eaf4", "level": "note", "message": {"text": "Unused endpoint: ANY /home"}, "properties": {"repobilityId": "b09217ecb6d7d768", "scanner": "scanner-primary", "fingerprint": "baebe42c1606eaf4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d62eec5460d767d4", "level": "note", "message": {"text": "Unused endpoint: ANY /quests"}, "properties": {"repobilityId": "5d88afaf68984c5b", "scanner": "scanner-primary", "fingerprint": "d62eec5460d767d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-243f53e43b32e9c4", "level": "note", "message": {"text": "Unused endpoint: ANY /signals"}, "properties": {"repobilityId": "5e6800b1b076b46b", "scanner": "scanner-primary", "fingerprint": "243f53e43b32e9c4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5c9e0c8aa7c00837", "level": "note", "message": {"text": "Unused endpoint: ANY /signals/<signal_id>/resolve"}, "properties": {"repobilityId": "7783e80e1a3eff1a", "scanner": "scanner-primary", "fingerprint": "5c9e0c8aa7c00837", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-40dab092926bc636", "level": "note", "message": {"text": "Unused endpoint: ANY /students"}, "properties": {"repobilityId": "0a7a12057c17a650", "scanner": "scanner-primary", "fingerprint": "40dab092926bc636", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ff87a911dc46b6a", "level": "note", "message": {"text": "Unused endpoint: ANY /pins"}, "properties": {"repobilityId": "d4919631653c934d", "scanner": "scanner-primary", "fingerprint": "1ff87a911dc46b6a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aaaea17d80be2d8c", "level": "note", "message": {"text": "Unused endpoint: ANY /pins/mark"}, "properties": {"repobilityId": "65c6baa1a1933408", "scanner": "scanner-primary", "fingerprint": "aaaea17d80be2d8c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b92323ac12d132a", "level": "note", "message": {"text": "Unused endpoint: ANY /students/<student_id>/balance"}, "properties": {"repobilityId": "b0a83a07030d7fd2", "scanner": "scanner-primary", "fingerprint": "6b92323ac12d132a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0aa922526dc78343", "level": "note", "message": {"text": "Unused endpoint: ANY /students/<student_id>/balance/adjust"}, "properties": {"repobilityId": "8cdf3fe27516aab1", "scanner": "scanner-primary", "fingerprint": "0aa922526dc78343", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b3e7452e656316e", "level": "note", "message": {"text": "Unused endpoint: ANY /showcase/events"}, "properties": {"repobilityId": "f8c2132691dd36cf", "scanner": "scanner-primary", "fingerprint": "7b3e7452e656316e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3c97ba449653ee1d", "level": "note", "message": {"text": "Unused endpoint: ANY /showcase/events/<event_id>"}, "properties": {"repobilityId": "0d3975fee16b895f", "scanner": "scanner-primary", "fingerprint": "3c97ba449653ee1d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5d5abfbc8e8100a", "level": "note", "message": {"text": "Unused endpoint: ANY /showcase/events/<event_id>/roster"}, "properties": {"repobilityId": "04fd21e6ecf8f1d6", "scanner": "scanner-primary", "fingerprint": "e5d5abfbc8e8100a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-10e8704ac9fac2f8", "level": "note", "message": {"text": "Unused endpoint: ANY /showcase/events/<event_id>/join"}, "properties": {"repobilityId": "834601b28e929a5d", "scanner": "scanner-primary", "fingerprint": "10e8704ac9fac2f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0648a051866ddfde", "level": "note", "message": {"text": "Unused endpoint: ANY /kiosk/devices"}, "properties": {"repobilityId": "19ce913a890ad414", "scanner": "scanner-primary", "fingerprint": "0648a051866ddfde", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a3c5830efa311d93", "level": "note", "message": {"text": "Unused endpoint: ANY /kiosk/roster"}, "properties": {"repobilityId": "8b92bab786cb9cdb", "scanner": "scanner-primary", "fingerprint": "a3c5830efa311d93", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-339dc832893e730d", "level": "note", "message": {"text": "Unused endpoint: ANY /kiosk/login"}, "properties": {"repobilityId": "4f7d04be6836b96c", "scanner": "scanner-primary", "fingerprint": "339dc832893e730d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dcc9969b51c3eb1a", "level": "note", "message": {"text": "Unused endpoint: ANY /enhance"}, "properties": {"repobilityId": "966115bb63b88f46", "scanner": "scanner-primary", "fingerprint": "dcc9969b51c3eb1a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a87050a57ffb05d5", "level": "note", "message": {"text": "Unused endpoint: ANY /<quest_id>/start-personalization"}, "properties": {"repobilityId": "98488bbf7e08ec7d", "scanner": "scanner-primary", "fingerprint": "a87050a57ffb05d5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ad942c3e466642c", "level": "note", "message": {"text": "Unused endpoint: ANY /<quest_id>/generate-tasks"}, "properties": {"repobilityId": "42c1cadf605e3321", "scanner": "scanner-primary", "fingerprint": "1ad942c3e466642c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-570effe7ff1bbddd", "level": "note", "message": {"text": "Unused endpoint: ANY /<quest_id>/refine-tasks"}, "properties": {"repobilityId": "1e861f015788c29e", "scanner": "scanner-primary", "fingerprint": "570effe7ff1bbddd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b91c0e8f5e87308", "level": "note", "message": {"text": "Unused endpoint: ANY /<quest_id>/edit-task"}, "properties": {"repobilityId": "dbc0c5353934eb37", "scanner": "scanner-primary", "fingerprint": "7b91c0e8f5e87308", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-deeda44048b18868", "level": "note", "message": {"text": "Unused endpoint: ANY /<quest_id>/analyze-manual-task"}, "properties": {"repobilityId": "ebd1d2123a71d069", "scanner": "scanner-primary", "fingerprint": "deeda44048b18868", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e7e280178d496f6", "level": "note", "message": {"text": "Unused endpoint: ANY /<quest_id>/add-manual-tasks"}, "properties": {"repobilityId": "dc407cb270148846", "scanner": "scanner-primary", "fingerprint": "8e7e280178d496f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f7c70500765bd133", "level": "note", "message": {"text": "Unused endpoint: ANY /<quest_id>/finalize-tasks"}, "properties": {"repobilityId": "3aad275f7c9783a2", "scanner": "scanner-primary", "fingerprint": "f7c70500765bd133", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-edf975342a9eae65", "level": "note", "message": {"text": "Unused endpoint: ANY /<quest_id>/personalization/accept-task"}, "properties": {"repobilityId": "7b8a7ddcfbf45c93", "scanner": "scanner-primary", "fingerprint": "edf975342a9eae65", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fda2f436ac1290a6", "level": "note", "message": {"text": "Unused endpoint: ANY /<quest_id>/personalization/skip-task"}, "properties": {"repobilityId": "ec26e137271c7d9b", "scanner": "scanner-primary", "fingerprint": "fda2f436ac1290a6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d50a731befaad055", "level": "note", "message": {"text": "Unused endpoint: ANY /<quest_id>/personalization-status"}, "properties": {"repobilityId": "96e569fb66c762d6", "scanner": "scanner-primary", "fingerprint": "d50a731befaad055", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-81af1c2152952965", "level": "note", "message": {"text": "Unused endpoint: ANY /search-quest"}, "properties": {"repobilityId": "3178de35111eec4c", "scanner": "scanner-primary", "fingerprint": "81af1c2152952965", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a4fd78cfc9522311", "level": "note", "message": {"text": "Unused endpoint: ANY /generate"}, "properties": {"repobilityId": "87f8350c8f1c8ee0", "scanner": "scanner-primary", "fingerprint": "a4fd78cfc9522311", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98cc4fc4637ea99d", "level": "note", "message": {"text": "Unused endpoint: ANY /suggest-tasks"}, "properties": {"repobilityId": "6839d6aff3c3cdbf", "scanner": "scanner-primary", "fingerprint": "98cc4fc4637ea99d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}