{"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-80b61faeba7a6c27", "name": "TODO/FIXME marker in shipping code \u2014 supabase/functions/flitsie/index.ts:509", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 supabase/functions/flitsie/index.ts:509"}, "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-9e8daffa4479961a", "name": "Icon-only button without accessible name \u2014 src/components/PickupNotices.jsx:246", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/PickupNotices.jsx:246"}, "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-b49759b2b29d72c1", "name": "Icon-only button without accessible name \u2014 src/pages/ParentApp.jsx:145", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/pages/ParentApp.jsx:145"}, "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-31de786531283ec8", "name": "Insecure pattern 'node_child_process' in scripts/sync-assistant-knowledge.mjs:28", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/sync-assistant-knowledge.mjs:28"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-55c822c8fd297222", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-staff/index.ts:24", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-staff/index.ts:24"}, "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-0858c01d3a6159e1", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-parent/index.ts:21", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-parent/index.ts:21"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eaa8426a242d89d3", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/register-parent/index.ts:14", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/register-parent/index.ts:14"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4944204233b58e2c", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.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-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v6 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-87203a01d98cba38", "name": "Very large file: src/pages/ParentApp.jsx (1103 lines)", "shortDescription": {"text": "Very large file: src/pages/ParentApp.jsx (1103 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 15 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 124 placeholder/mock markers across 44 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ecb0d2c55ed6875d", "name": "Agent authority lacks a verifier contract: .claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8f92171493cceb55", "name": "Commented-code block (15 lines) in scripts/import-school-data.mjs:15", "shortDescription": {"text": "Commented-code block (15 lines) in scripts/import-school-data.mjs: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-c061ac26f4de946e", "name": "Commented-code block (6 lines) in scripts/sync-assistant-knowledge.mjs:7", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/sync-assistant-knowledge.mjs:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5f40e74a1e03f7c3", "name": "Commented-code block (20 lines) in scripts/lib/importSchoolData.mjs:8", "shortDescription": {"text": "Commented-code block (20 lines) in scripts/lib/importSchoolData.mjs:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b17afe15a289d795", "name": "Commented-code block (9 lines) in scripts/lib/csv.mjs:3", "shortDescription": {"text": "Commented-code block (9 lines) in scripts/lib/csv.mjs:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc56f28032084b65", "name": "Commented-code block (5 lines) in supabase/functions/flitsie/index.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/flitsie/index.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1d5c779efc5c357", "name": "Commented-code block (8 lines) in supabase/functions/invite-staff/index.ts:8", "shortDescription": {"text": "Commented-code block (8 lines) in supabase/functions/invite-staff/index.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-806ada8b04c43934", "name": "Commented-code block (10 lines) in supabase/functions/invite-parent/index.ts:3", "shortDescription": {"text": "Commented-code block (10 lines) in supabase/functions/invite-parent/index.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11a57d5663a5580b", "name": "Commented-code block (5 lines) in supabase/functions/sync-knowledge/index.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/sync-knowledge/index.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d9bc7b3d18a92e4", "name": "Commented-code block (6 lines) in supabase/functions/list-unlinked-users/index.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/list-unlinked-users/index.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4be1a1d7df26aa8", "name": "Commented-code block (5 lines) in src/utils/id.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/id.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38a27e1e0d769ca1", "name": "Commented-code block (6 lines) in src/utils/linkAccount.js:31", "shortDescription": {"text": "Commented-code block (6 lines) in src/utils/linkAccount.js:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-efcfcfcaaa79c478", "name": "Commented-code block (5 lines) in src/utils/staffFiles.js:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/staffFiles.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4d5a9b53980f6fdf", "name": "Commented-code block (5 lines) in src/utils/flitsieFacts.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/flitsieFacts.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e5acde68be3d1e93", "name": "Commented-code block (5 lines) in src/utils/inviteLink.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/inviteLink.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4f26bad42abdffb", "name": "Commented-code block (5 lines) in src/components/ProspektusViewer.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ProspektusViewer.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e529d34e4aee559", "name": "Commented-code block (7 lines) in src/components/FlitsieNudges.jsx:6", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/FlitsieNudges.jsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f63bad22be48e5ee", "name": "Commented-code block (8 lines) in src/components/Inbox.jsx:22", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/Inbox.jsx:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-871aea16a4f707c6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/Inbox.jsx:189", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/Inbox.jsx:189"}, "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-c6cb2da442ba9eff", "name": "Commented-code block (5 lines) in src/mock/data.js:181", "shortDescription": {"text": "Commented-code block (5 lines) in src/mock/data.js:181"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2cb0dffbd54afb4c", "name": "Commented-code block (6 lines) in src/contexts/ImpersonationContext.jsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/contexts/ImpersonationContext.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd1bb572712594f9", "name": "Commented-code block (6 lines) in src/lib/messaging.js:43", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/messaging.js:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ba1e621ddaf12c4", "name": "Commented-code block (5 lines) in src/pages/Staff.jsx:78", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/Staff.jsx:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f338e89778ec6d65", "name": "Commented-code block (6 lines) in src/pages/FlitsieFacts.jsx:11", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/FlitsieFacts.jsx:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-05a299a5fa008752", "name": "Commented-code block (6 lines) in src/pages/staffFilesIsolation.test.js:10", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/staffFilesIsolation.test.js:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-884a3b761fdddab8", "name": "Commented-code block (5 lines) in src/pages/FlitsieChats.jsx:19", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/FlitsieChats.jsx: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-6d599e09725b5b19", "name": "Commented-code block (9 lines) in src/pages/FlitsieHub.jsx:10", "shortDescription": {"text": "Commented-code block (9 lines) in src/pages/FlitsieHub.jsx:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5531edb06efc2afb", "name": "Commented-code block (5 lines) in src/pages/FlitsieCannedAnswers.jsx:10", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/FlitsieCannedAnswers.jsx:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4909fb2f53514c47", "name": "Commented-code block (6 lines) in src/hooks/useInbox.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/hooks/useInbox.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2eafc3188c36bb02", "name": "3 env vars used in code but missing from .env.example", "shortDescription": {"text": "3 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `SCHOOL_ID`, `SUPABASE_SERVICE_ROLE_KEY`, `SUPABASE_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0d490f7d22ebfeb2", "name": "Frontend route `/welkom` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/welkom` has no Link/navigate to it \u2014 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-a4e566b264e2d239", "name": "Frontend route `/wag-vir-toegang` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/wag-vir-toegang` has no Link/navigate to it \u2014 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-e79412eaab77d844", "name": "Frontend route `/demo/parent/*` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/demo/parent/*` has no Link/navigate to it \u2014 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-fc1e04286f6e7c56", "name": "Frontend route `/demo/teacher/*` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/demo/teacher/*` has no Link/navigate to it \u2014 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-649f5db76bcb7f9d", "name": "Frontend route `/demo/admin/*` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/demo/admin/*` has no Link/navigate to it \u2014 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-eb1b96c1105b8c57", "name": "Frontend route `/demo/kitchen/*` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/demo/kitchen/*` has no Link/navigate to it \u2014 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-45974e99e7bbd9b9", "name": "Frontend route `/parent/*` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/parent/*` has no Link/navigate to it \u2014 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-50e39daae1d5d20a", "name": "Frontend route `/teacher/*` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/teacher/*` has no Link/navigate to it \u2014 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-dcd884f9724188d7", "name": "Frontend route `/kitchen/*` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/kitchen/*` has no Link/navigate to it \u2014 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-a7b5faa28dafa080", "name": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 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-42af29ca2fbbe255", "name": "Frontend route `/teken-in` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/teken-in` has no Link/navigate to it \u2014 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-dba7cdb1f286b8f6", "name": "Frontend route `classes` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `classes` has no Link/navigate to it \u2014 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-7455ba99cc54f2e7", "name": "Frontend route `departments` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `departments` has no Link/navigate to it \u2014 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-52d79e859fd7b690", "name": "Frontend route `policies` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `policies` has no Link/navigate to it \u2014 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-0ef374f77b5832d0", "name": "Frontend route `qr-poster` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `qr-poster` has no Link/navigate to it \u2014 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-4c3c66507bca09db", "name": "Frontend route `families` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `families` has no Link/navigate to it \u2014 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-67198d2e9c911b4f", "name": "Frontend route `registrations` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `registrations` has no Link/navigate to it \u2014 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-889b1dae79aecba9", "name": "Frontend route `staff` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `staff` has no Link/navigate to it \u2014 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-d197fa5ccbed131d", "name": "Frontend route `trips` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `trips` has no Link/navigate to it \u2014 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-818c6c6dc4f21a58", "name": "Frontend route `trips/:id` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `trips/:id` has no Link/navigate to it \u2014 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-9dce1ba9236de7fd", "name": "Frontend route `children/:id` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `children/:id` has no Link/navigate to it \u2014 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-d0cc70433f3cdd84", "name": "Frontend route `communications` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `communications` has no Link/navigate to it \u2014 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-c617b9a40fb50d86", "name": "Frontend route `messages` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `messages` has no Link/navigate to it \u2014 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-67135e0183cab27f", "name": "Frontend route `flitsie` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `flitsie` has no Link/navigate to it \u2014 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-22dff212e4bcffab", "name": "Frontend route `flitsie-chats` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `flitsie-chats` has no Link/navigate to it \u2014 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-e85218011855ce54", "name": "Frontend route `flitsie-canned` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `flitsie-canned` has no Link/navigate to it \u2014 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-37047e70987474d0", "name": "Frontend route `calendar` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `calendar` has no Link/navigate to it \u2014 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-225099801c97cdb9", "name": "Frontend route `children` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `children` has no Link/navigate to it \u2014 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-2e2d24fc3c95be86", "name": "Frontend route `users` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `users` has no Link/navigate to it \u2014 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-f45797f9a0390128", "name": "Frontend route `/teacher` has no Link/navigate to it \u2014 src/pages/UnlinkedUsers.test.jsx", "shortDescription": {"text": "Frontend route `/teacher` has no Link/navigate to it \u2014 src/pages/UnlinkedUsers.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}}]}}, "automationDetails": {"id": "repobility/18517"}, "properties": {"repository": "RSA-Omen/impie-connect", "repoUrl": "https://github.com/RSA-Omen/impie-connect", "branch": "main"}, "results": [{"ruleId": "scanner-80b61faeba7a6c27", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 supabase/functions/flitsie/index.ts:509"}, "properties": {"repobilityId": "c7519433e978bb86", "scanner": "scanner-primary", "fingerprint": "80b61faeba7a6c27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9e8daffa4479961a", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/PickupNotices.jsx:246"}, "properties": {"repobilityId": "ed374ae12ebb4d91", "scanner": "scanner-primary", "fingerprint": "9e8daffa4479961a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b49759b2b29d72c1", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/pages/ParentApp.jsx:145"}, "properties": {"repobilityId": "d6f3e0c4ae6d6b4f", "scanner": "scanner-primary", "fingerprint": "b49759b2b29d72c1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-31de786531283ec8", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/sync-assistant-knowledge.mjs:28"}, "properties": {"repobilityId": "d0c0c85c4d110d6b", "scanner": "scanner-primary", "fingerprint": "31de786531283ec8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/sync-assistant-knowledge.mjs"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-55c822c8fd297222", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-staff/index.ts:24"}, "properties": {"repobilityId": "78a8b7f5183874c3", "scanner": "scanner-primary", "fingerprint": "55c822c8fd297222", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/invite-staff/index.ts"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-0858c01d3a6159e1", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-parent/index.ts:21"}, "properties": {"repobilityId": "5f1788a12b76fe6b", "scanner": "scanner-primary", "fingerprint": "0858c01d3a6159e1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/invite-parent/index.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-eaa8426a242d89d3", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/register-parent/index.ts:14"}, "properties": {"repobilityId": "addbe4d7fe992e43", "scanner": "scanner-primary", "fingerprint": "eaa8426a242d89d3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/register-parent/index.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-4944204233b58e2c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:5"}, "properties": {"repobilityId": "7c8e268f4e944077", "scanner": "scanner-primary", "fingerprint": "4944204233b58e2c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/_shared/cors.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c266bde81c839bdc", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c2734109a9076e87", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-87203a01d98cba38", "level": "note", "message": {"text": "Very large file: src/pages/ParentApp.jsx (1103 lines)"}, "properties": {"repobilityId": "8a6c7e4fb9ad4eb6", "scanner": "scanner-primary", "fingerprint": "87203a01d98cba38", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "264a5fb42f6dfc8f", "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": "76d13df9a8f96d5b", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "38f5bbddd85dbcfa", "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": "939782b71a14a9b0", "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": "5545d68b1454708c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-ecb0d2c55ed6875d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "properties": {"repobilityId": "d8bae33a6d517bf0", "scanner": "scanner-primary", "fingerprint": "ecb0d2c55ed6875d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8f92171493cceb55", "level": "none", "message": {"text": "Commented-code block (15 lines) in scripts/import-school-data.mjs:15"}, "properties": {"repobilityId": "73b4895e79c6fc0c", "scanner": "scanner-primary", "fingerprint": "8f92171493cceb55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c061ac26f4de946e", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/sync-assistant-knowledge.mjs:7"}, "properties": {"repobilityId": "4684789391efdc7c", "scanner": "scanner-primary", "fingerprint": "c061ac26f4de946e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f40e74a1e03f7c3", "level": "none", "message": {"text": "Commented-code block (20 lines) in scripts/lib/importSchoolData.mjs:8"}, "properties": {"repobilityId": "0d3812894cfe0083", "scanner": "scanner-primary", "fingerprint": "5f40e74a1e03f7c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b17afe15a289d795", "level": "none", "message": {"text": "Commented-code block (9 lines) in scripts/lib/csv.mjs:3"}, "properties": {"repobilityId": "a428b971f59d41c7", "scanner": "scanner-primary", "fingerprint": "b17afe15a289d795", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc56f28032084b65", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/flitsie/index.ts:4"}, "properties": {"repobilityId": "7969c13328d62604", "scanner": "scanner-primary", "fingerprint": "bc56f28032084b65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1d5c779efc5c357", "level": "none", "message": {"text": "Commented-code block (8 lines) in supabase/functions/invite-staff/index.ts:8"}, "properties": {"repobilityId": "edaf4e4bc2ad6a9d", "scanner": "scanner-primary", "fingerprint": "c1d5c779efc5c357", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-806ada8b04c43934", "level": "none", "message": {"text": "Commented-code block (10 lines) in supabase/functions/invite-parent/index.ts:3"}, "properties": {"repobilityId": "4971d1d3adbaaa9b", "scanner": "scanner-primary", "fingerprint": "806ada8b04c43934", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11a57d5663a5580b", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/sync-knowledge/index.ts:1"}, "properties": {"repobilityId": "ac1123f569eb5fdd", "scanner": "scanner-primary", "fingerprint": "11a57d5663a5580b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d9bc7b3d18a92e4", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/list-unlinked-users/index.ts:3"}, "properties": {"repobilityId": "9571e677e96046ed", "scanner": "scanner-primary", "fingerprint": "1d9bc7b3d18a92e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4be1a1d7df26aa8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/id.js:1"}, "properties": {"repobilityId": "6b5ce30f5292c69a", "scanner": "scanner-primary", "fingerprint": "a4be1a1d7df26aa8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38a27e1e0d769ca1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/utils/linkAccount.js:31"}, "properties": {"repobilityId": "eb5f2025334ad717", "scanner": "scanner-primary", "fingerprint": "38a27e1e0d769ca1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-efcfcfcaaa79c478", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/staffFiles.js:6"}, "properties": {"repobilityId": "11f30a8970481894", "scanner": "scanner-primary", "fingerprint": "efcfcfcaaa79c478", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d5a9b53980f6fdf", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/flitsieFacts.js:1"}, "properties": {"repobilityId": "dab9751aa7d2613a", "scanner": "scanner-primary", "fingerprint": "4d5a9b53980f6fdf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5acde68be3d1e93", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/inviteLink.js:3"}, "properties": {"repobilityId": "2fead8bf845c28ae", "scanner": "scanner-primary", "fingerprint": "e5acde68be3d1e93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4f26bad42abdffb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ProspektusViewer.jsx:3"}, "properties": {"repobilityId": "7385a729ec02deb9", "scanner": "scanner-primary", "fingerprint": "a4f26bad42abdffb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e529d34e4aee559", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/FlitsieNudges.jsx:6"}, "properties": {"repobilityId": "c17737d8d61d974d", "scanner": "scanner-primary", "fingerprint": "2e529d34e4aee559", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f63bad22be48e5ee", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/Inbox.jsx:22"}, "properties": {"repobilityId": "a376ebe63eabbebf", "scanner": "scanner-primary", "fingerprint": "f63bad22be48e5ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-871aea16a4f707c6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/Inbox.jsx:189"}, "properties": {"repobilityId": "081522add33b72fc", "scanner": "scanner-primary", "fingerprint": "871aea16a4f707c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c6cb2da442ba9eff", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/mock/data.js:181"}, "properties": {"repobilityId": "a1eefd2950d09bc5", "scanner": "scanner-primary", "fingerprint": "c6cb2da442ba9eff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2cb0dffbd54afb4c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/contexts/ImpersonationContext.jsx:3"}, "properties": {"repobilityId": "7dcccdd5fa4a1cb8", "scanner": "scanner-primary", "fingerprint": "2cb0dffbd54afb4c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd1bb572712594f9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/messaging.js:43"}, "properties": {"repobilityId": "88ae15591fb96053", "scanner": "scanner-primary", "fingerprint": "cd1bb572712594f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ba1e621ddaf12c4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/Staff.jsx:78"}, "properties": {"repobilityId": "ba2926ac340b8bc4", "scanner": "scanner-primary", "fingerprint": "7ba1e621ddaf12c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f338e89778ec6d65", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/FlitsieFacts.jsx:11"}, "properties": {"repobilityId": "83345810a3b5e165", "scanner": "scanner-primary", "fingerprint": "f338e89778ec6d65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-05a299a5fa008752", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/staffFilesIsolation.test.js:10"}, "properties": {"repobilityId": "144cc15732ce0c5b", "scanner": "scanner-primary", "fingerprint": "05a299a5fa008752", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-884a3b761fdddab8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/FlitsieChats.jsx:19"}, "properties": {"repobilityId": "9111636fcaa31d12", "scanner": "scanner-primary", "fingerprint": "884a3b761fdddab8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d599e09725b5b19", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/pages/FlitsieHub.jsx:10"}, "properties": {"repobilityId": "00fed539c37ed1a1", "scanner": "scanner-primary", "fingerprint": "6d599e09725b5b19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5531edb06efc2afb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/FlitsieCannedAnswers.jsx:10"}, "properties": {"repobilityId": "66163ca513f62844", "scanner": "scanner-primary", "fingerprint": "5531edb06efc2afb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4909fb2f53514c47", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/hooks/useInbox.js:1"}, "properties": {"repobilityId": "0a07739c686e96b8", "scanner": "scanner-primary", "fingerprint": "4909fb2f53514c47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2eafc3188c36bb02", "level": "none", "message": {"text": "3 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "bd934ba112b02ffa", "scanner": "scanner-primary", "fingerprint": "2eafc3188c36bb02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-0d490f7d22ebfeb2", "level": "warning", "message": {"text": "Frontend route `/welkom` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "b042ce2e8cf97638", "scanner": "scanner-primary", "fingerprint": "0d490f7d22ebfeb2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a4e566b264e2d239", "level": "warning", "message": {"text": "Frontend route `/wag-vir-toegang` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "f4506a048d52fb1f", "scanner": "scanner-primary", "fingerprint": "a4e566b264e2d239", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e79412eaab77d844", "level": "warning", "message": {"text": "Frontend route `/demo/parent/*` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "46920b1e9c1b280d", "scanner": "scanner-primary", "fingerprint": "e79412eaab77d844", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fc1e04286f6e7c56", "level": "warning", "message": {"text": "Frontend route `/demo/teacher/*` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "c660ae96c6f7788d", "scanner": "scanner-primary", "fingerprint": "fc1e04286f6e7c56", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-649f5db76bcb7f9d", "level": "warning", "message": {"text": "Frontend route `/demo/admin/*` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "255038508f4bfef4", "scanner": "scanner-primary", "fingerprint": "649f5db76bcb7f9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-eb1b96c1105b8c57", "level": "warning", "message": {"text": "Frontend route `/demo/kitchen/*` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "3233937a7c368b7d", "scanner": "scanner-primary", "fingerprint": "eb1b96c1105b8c57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-45974e99e7bbd9b9", "level": "warning", "message": {"text": "Frontend route `/parent/*` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "eeb774305c72b290", "scanner": "scanner-primary", "fingerprint": "45974e99e7bbd9b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-50e39daae1d5d20a", "level": "warning", "message": {"text": "Frontend route `/teacher/*` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "0dea9d8b825fb750", "scanner": "scanner-primary", "fingerprint": "50e39daae1d5d20a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dcd884f9724188d7", "level": "warning", "message": {"text": "Frontend route `/kitchen/*` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "71b788636be64e34", "scanner": "scanner-primary", "fingerprint": "dcd884f9724188d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a7b5faa28dafa080", "level": "warning", "message": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "a88d2c6ef0af681a", "scanner": "scanner-primary", "fingerprint": "a7b5faa28dafa080", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-42af29ca2fbbe255", "level": "warning", "message": {"text": "Frontend route `/teken-in` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "d910fac4833d002f", "scanner": "scanner-primary", "fingerprint": "42af29ca2fbbe255", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dba7cdb1f286b8f6", "level": "warning", "message": {"text": "Frontend route `classes` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "c22c43355deaf27b", "scanner": "scanner-primary", "fingerprint": "dba7cdb1f286b8f6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7455ba99cc54f2e7", "level": "warning", "message": {"text": "Frontend route `departments` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "1aac4d3a67803ff2", "scanner": "scanner-primary", "fingerprint": "7455ba99cc54f2e7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-52d79e859fd7b690", "level": "warning", "message": {"text": "Frontend route `policies` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "80176657665ce460", "scanner": "scanner-primary", "fingerprint": "52d79e859fd7b690", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0ef374f77b5832d0", "level": "warning", "message": {"text": "Frontend route `qr-poster` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "d20b16a854e39037", "scanner": "scanner-primary", "fingerprint": "0ef374f77b5832d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4c3c66507bca09db", "level": "warning", "message": {"text": "Frontend route `families` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "3f5894ecde0e3e2b", "scanner": "scanner-primary", "fingerprint": "4c3c66507bca09db", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-67198d2e9c911b4f", "level": "warning", "message": {"text": "Frontend route `registrations` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "adf7cd6bc215a8f8", "scanner": "scanner-primary", "fingerprint": "67198d2e9c911b4f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-889b1dae79aecba9", "level": "warning", "message": {"text": "Frontend route `staff` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "a957b59bee8f5858", "scanner": "scanner-primary", "fingerprint": "889b1dae79aecba9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d197fa5ccbed131d", "level": "warning", "message": {"text": "Frontend route `trips` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "436f53e173f51a3e", "scanner": "scanner-primary", "fingerprint": "d197fa5ccbed131d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-818c6c6dc4f21a58", "level": "warning", "message": {"text": "Frontend route `trips/:id` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "f3fe81525980a8f9", "scanner": "scanner-primary", "fingerprint": "818c6c6dc4f21a58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9dce1ba9236de7fd", "level": "warning", "message": {"text": "Frontend route `children/:id` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "08551ca8076344b1", "scanner": "scanner-primary", "fingerprint": "9dce1ba9236de7fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d0cc70433f3cdd84", "level": "warning", "message": {"text": "Frontend route `communications` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "4fa93782a94e2af9", "scanner": "scanner-primary", "fingerprint": "d0cc70433f3cdd84", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c617b9a40fb50d86", "level": "warning", "message": {"text": "Frontend route `messages` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "d1a524d8eacf51e2", "scanner": "scanner-primary", "fingerprint": "c617b9a40fb50d86", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-67135e0183cab27f", "level": "warning", "message": {"text": "Frontend route `flitsie` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "7cb2990ceaf4510e", "scanner": "scanner-primary", "fingerprint": "67135e0183cab27f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-22dff212e4bcffab", "level": "warning", "message": {"text": "Frontend route `flitsie-chats` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "f81072290f38157b", "scanner": "scanner-primary", "fingerprint": "22dff212e4bcffab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e85218011855ce54", "level": "warning", "message": {"text": "Frontend route `flitsie-canned` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "87ceb6b9283fbd3f", "scanner": "scanner-primary", "fingerprint": "e85218011855ce54", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-37047e70987474d0", "level": "warning", "message": {"text": "Frontend route `calendar` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "87c25442da0e5cb0", "scanner": "scanner-primary", "fingerprint": "37047e70987474d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-225099801c97cdb9", "level": "warning", "message": {"text": "Frontend route `children` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "9ea626503fa5a582", "scanner": "scanner-primary", "fingerprint": "225099801c97cdb9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2e2d24fc3c95be86", "level": "warning", "message": {"text": "Frontend route `users` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "899676837a5aba4d", "scanner": "scanner-primary", "fingerprint": "2e2d24fc3c95be86", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f45797f9a0390128", "level": "warning", "message": {"text": "Frontend route `/teacher` has no Link/navigate to it \u2014 src/pages/UnlinkedUsers.test.jsx"}, "properties": {"repobilityId": "df583b5867f6501d", "scanner": "scanner-primary", "fingerprint": "f45797f9a0390128", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}