{"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-a3feffe20455018a", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/ui/Topbar.jsx:16", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/ui/Topbar.jsx:16"}, "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-7e17b4c29bbc5838", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Templates.jsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Templates.jsx:146"}, "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-7d14a5f0aad1316a", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Courses.jsx:306", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Courses.jsx:306"}, "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-edacfaea5fec7df8", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/AdminDashboard.jsx:465", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/AdminDashboard.jsx:465"}, "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-4faa9389e7e8a6a7", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Counsellors.jsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Counsellors.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-a2a0e52fd0fe5f5f", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/AssignmentCreate.jsx:406", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/AssignmentCreate.jsx:406"}, "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-c70517946de89e20", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Rubrics.jsx:346", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Rubrics.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-a18cf8bacea31ffd", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Personas.jsx:446", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Personas.jsx:446"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e91e1c353e72bd6e", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/counsellor/MyMocks.jsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/counsellor/MyMocks.jsx:123"}, "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-2f2d6a655c331355", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/counsellor/Profile.jsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/counsellor/Profile.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-bbd08add8ba78280", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/counsellor/Dashboard.jsx:613", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/counsellor/Dashboard.jsx:613"}, "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-e623e3b0df183235", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/superadmin/UserManagement.jsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/superadmin/UserManagement.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-2dd28b01f9d5e2ae", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/CounsellorLayout.jsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/CounsellorLayout.jsx:37"}, "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-d7657de6509d191a", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/AdminLayout.jsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/AdminLayout.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-ea3f445a6e042a2e", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/SuperAdminLayout.jsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/SuperAdminLayout.jsx:37"}, "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-d85532eb4998a1f9", "name": "Stray `console.log` in TS/JS \u2014 scripts/mine/workflow-mine.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/mine/workflow-mine.js:27"}, "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-e4f5dec653319a91", "name": "Stray `console.log` in TS/JS \u2014 server/index.js:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/index.js:43"}, "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-5a32ac60613087ac", "name": "Runtime dotenv file present in repo: .env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: .env.production"}, "fullDescription": {"text": "`.env.production` looks like a runtime dotenv file. It contains secret-looking assignments for VITE_SUPABASE_ANON_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-c353ac5e6edd451c", "name": "Possible secret in scripts/smoke-api.mjs", "shortDescription": {"text": "Possible secret in scripts/smoke-api.mjs"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-da74ac9263cae779", "name": "Possible secret in scripts/loadtest-edge.mjs", "shortDescription": {"text": "Possible secret in scripts/loadtest-edge.mjs"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-7b8dbe9c249e4f94", "name": "Insecure pattern 'cors_wildcard' in server/index.js:46", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in server/index.js:46"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e6de0f03579740f6", "name": "Very large file: supabase/functions/api/index.ts (1371 lines)", "shortDescription": {"text": "Very large file: supabase/functions/api/index.ts (1371 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-840903f1fe9e52f3", "name": "Very large file: server/report.js (1117 lines)", "shortDescription": {"text": "Very large file: server/report.js (1117 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-28742ad8477025b2", "name": "Very large file: server/index.js (1792 lines)", "shortDescription": {"text": "Very large file: server/index.js (1792 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": "29 tests / 145 src (ratio 0.20)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 133 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 182 placeholder/mock markers across 48 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e68abd8eb2990f21", "name": "Commented-code block (15 lines) in client/vite.config.js:22", "shortDescription": {"text": "Commented-code block (15 lines) in client/vite.config.js: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-e5f3892c5e5a352a", "name": "Commented-code block (5 lines) in client/src/ui/Modal.jsx:7", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/ui/Modal.jsx: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-55fb81d766a079cb", "name": "Commented-code block (5 lines) in client/src/ui/Table.jsx:7", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/ui/Table.jsx: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-8213cfc97b894c94", "name": "Commented-code block (9 lines) in client/src/ui/ConfirmDialog.jsx:9", "shortDescription": {"text": "Commented-code block (9 lines) in client/src/ui/ConfirmDialog.jsx:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-559b7b22d78632b2", "name": "Commented-code block (8 lines) in client/src/lib/stream.js:17", "shortDescription": {"text": "Commented-code block (8 lines) in client/src/lib/stream.js:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e17c060ec9269ba", "name": "Commented-code block (5 lines) in client/src/voice/useOpenAIRealtime.js:17", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/voice/useOpenAIRealtime.js:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eeb3938531513627", "name": "Commented-code block (5 lines) in client/src/voice/engines.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/voice/engines.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-8ce7203bd6a1fc25", "name": "Commented-code block (9 lines) in client/src/pages/shared/TranscriptView.jsx:1", "shortDescription": {"text": "Commented-code block (9 lines) in client/src/pages/shared/TranscriptView.jsx: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-165f81323cdd2aef", "name": "Commented-code block (5 lines) in client/src/pages/counsellor/Session.jsx:75", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/pages/counsellor/Session.jsx:75"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0caefcecb5bbbdff", "name": "Commented-code block (6 lines) in client/src/pages/counsellor/session/CallSidebar.jsx:89", "shortDescription": {"text": "Commented-code block (6 lines) in client/src/pages/counsellor/session/CallSidebar.jsx:89"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2c992e30791ba50", "name": "Commented-code block (7 lines) in client/src/pages/counsellor/session/Orb.jsx:1", "shortDescription": {"text": "Commented-code block (7 lines) in client/src/pages/counsellor/session/Orb.jsx: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-88cb9c4fbeae5614", "name": "Commented-code block (5 lines) in client/src/pages/counsellor/session/CallStage.jsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/pages/counsellor/session/CallStage.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-d63689448ef81ee2", "name": "Commented-code block (7 lines) in client/src/pages/counsellor/session/GreenRoom.jsx:69", "shortDescription": {"text": "Commented-code block (7 lines) in client/src/pages/counsellor/session/GreenRoom.jsx:69"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-560b440817b5395b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/scrape-courses.mjs:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/scrape-courses.mjs:101"}, "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-d41b09a8459d62a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/loadtest-edge.mjs:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/loadtest-edge.mjs:6"}, "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-5bc6d9d5c142fa3f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-reports-edge.mjs:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-reports-edge.mjs:19"}, "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-07c3960eb49f6b2c", "name": "Commented-code block (6 lines) in scripts/mine/diarize.mjs:17", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/mine/diarize.mjs:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-efe958b7e1f61889", "name": "Commented-code block (5 lines) in supabase/functions/api/smoke.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/api/smoke.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0ba0527069ad6283", "name": "Commented-code block (5 lines) in supabase/functions/api/index.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/api/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-32170c552666bedd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/api/index.ts:1349", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/api/index.ts:1349"}, "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-013356e65f01275b", "name": "Commented-code block (9 lines) in supabase/functions/session/index.ts:11", "shortDescription": {"text": "Commented-code block (9 lines) in supabase/functions/session/index.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0bd80946334e1839", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/session/index.ts:272", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/session/index.ts:272"}, "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-dad68fac2c5b80bb", "name": "Commented-code block (9 lines) in supabase/functions/report-worker/index.ts:5", "shortDescription": {"text": "Commented-code block (9 lines) in supabase/functions/report-worker/index.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f401fcf99071d3f", "name": "Commented-code block (5 lines) in supabase/functions/report-worker/smoke.test.mjs:3", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/report-worker/smoke.test.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-0665e282576bc81d", "name": "Commented-code block (6 lines) in supabase/functions/_shared/path.js:11", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/path.js: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-ad47e7aa18c0f1d9", "name": "Commented-code block (5 lines) in supabase/functions/_shared/auth.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/auth.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-499723bbb5d7e2ec", "name": "Commented-code block (101 lines) in supabase/functions/_shared/store.js:8", "shortDescription": {"text": "Commented-code block (101 lines) in supabase/functions/_shared/store.js: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-ea2e8304d090dfc8", "name": "Commented-code block (5 lines) in supabase/functions/_shared/cors.js:19", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/cors.js: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-34834fbdb8a2195c", "name": "Commented-code block (5 lines) in supabase/functions/_shared/lib/styleExemplars.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/lib/styleExemplars.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-e23293d6c018acc2", "name": "Commented-code block (5 lines) in supabase/functions/_shared/lib/prompt.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/lib/prompt.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-6ce879f37bc68493", "name": "Commented-code block (5 lines) in supabase/functions/_shared/lib/grounding.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/lib/grounding.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-e6345e116163dbb7", "name": "Commented-code block (6 lines) in supabase/functions/_shared/lib/report.js:268", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/lib/report.js:268"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e47b888d63a73a2", "name": "Commented-code block (12 lines) in supabase/functions/_shared/lib/promptConfig.js:1", "shortDescription": {"text": "Commented-code block (12 lines) in supabase/functions/_shared/lib/promptConfig.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-11079ad7658620f3", "name": "Commented-code block (6 lines) in supabase/functions/_shared/lib/objections.js:194", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/lib/objections.js:194"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8901bd86cd4853a0", "name": "Commented-code block (6 lines) in supabase/functions/_shared/lib/realtime.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/lib/realtime.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-6299b5335698244c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/lib/realtime.js:287", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/lib/realtime.js:287"}, "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-c2638478291af1b2", "name": "Commented-code block (7 lines) in supabase/functions/_shared/lib/register.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in supabase/functions/_shared/lib/register.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-be90373f091711dd", "name": "Commented-code block (15 lines) in supabase/functions/_shared/lib/scoring.js:1", "shortDescription": {"text": "Commented-code block (15 lines) in supabase/functions/_shared/lib/scoring.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4c0c7a02f59ee64", "name": "Commented-code block (9 lines) in server/disposition.js:3", "shortDescription": {"text": "Commented-code block (9 lines) in server/disposition.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-49c8818d7f849945", "name": "Commented-code block (6 lines) in server/classify.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in server/classify.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-2778cdadd5faaf45", "name": "Commented-code block (10 lines) in server/styleExemplars.js:7", "shortDescription": {"text": "Commented-code block (10 lines) in server/styleExemplars.js:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f66c9a31f9685c3", "name": "Commented-code block (5 lines) in server/voices.js:16", "shortDescription": {"text": "Commented-code block (5 lines) in server/voices.js: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-0a19a4c34030dd25", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/test-minimax.mjs:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/test-minimax.mjs:14"}, "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-9f763c8c76c64f6d", "name": "Commented-code block (8 lines) in server/prompt.js:1", "shortDescription": {"text": "Commented-code block (8 lines) in server/prompt.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-85bdce3db6733482", "name": "Commented-code block (16 lines) in server/report.js:5", "shortDescription": {"text": "Commented-code block (16 lines) in server/report.js:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99aa4e865d05507b", "name": "Commented-code block (5 lines) in server/store.js:50", "shortDescription": {"text": "Commented-code block (5 lines) in server/store.js:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-59c66ff6e4cffdc4", "name": "Commented-code block (6 lines) in server/promptConfig.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in server/promptConfig.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-e7788a4693d0876a", "name": "Commented-code block (7 lines) in server/llm.js:7", "shortDescription": {"text": "Commented-code block (7 lines) in server/llm.js:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0ce80c00de702ce7", "name": "Commented-code block (5 lines) in server/objections.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in server/objections.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-9c95779f96f7aa83", "name": "Commented-code block (7 lines) in server/engine.js:69", "shortDescription": {"text": "Commented-code block (7 lines) in server/engine.js:69"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-671870a8a5e49980", "name": "Commented-code block (5 lines) in server/realtime.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in server/realtime.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-b8866915368befe5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/realtime.js:291", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/realtime.js:291"}, "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-ca584e03643c1e0a", "name": "Commented-code block (5 lines) in server/phases.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in server/phases.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-6ae75e3ad89e16c6", "name": "Commented-code block (6 lines) in server/index.js:32", "shortDescription": {"text": "Commented-code block (6 lines) in server/index.js: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-596fa3e3558ef421", "name": "Commented-code block (5 lines) in server/personality.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in server/personality.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-393abad1d24995dc", "name": "Commented-code block (6 lines) in server/analytics.js:150", "shortDescription": {"text": "Commented-code block (6 lines) in server/analytics.js:150"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-58758c3177aeb3b5", "name": "Commented-code block (7 lines) in server/scoring.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in server/scoring.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d6262b1f5976648", "name": "Commented-code block (7 lines) in server/tests/objections.test.mjs:337", "shortDescription": {"text": "Commented-code block (7 lines) in server/tests/objections.test.mjs:337"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df8bd1c39233f4fe", "name": "Commented-code block (11 lines) in server/tests/report.test.mjs:3", "shortDescription": {"text": "Commented-code block (11 lines) in server/tests/report.test.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-42dc4efe356a773e", "name": "Commented-code block (5 lines) in server/tests/scoring-pay-ask.test.mjs:3", "shortDescription": {"text": "Commented-code block (5 lines) in server/tests/scoring-pay-ask.test.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-dbc25ac6da56ff09", "name": "Commented-code block (6 lines) in server/tests/a2-fixes.test.mjs:3", "shortDescription": {"text": "Commented-code block (6 lines) in server/tests/a2-fixes.test.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-3dbf8826c0c89905", "name": "Commented-code block (6 lines) in server/tests/prompt-phase-scope.test.mjs:3", "shortDescription": {"text": "Commented-code block (6 lines) in server/tests/prompt-phase-scope.test.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-07e840d926b183d3", "name": "Commented-code block (9 lines) in server/tests/llm.test.mjs:3", "shortDescription": {"text": "Commented-code block (9 lines) in server/tests/llm.test.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-0d6ebcb96744ee58", "name": "Commented-code block (5 lines) in server/tests/prompt-parts.test.mjs:3", "shortDescription": {"text": "Commented-code block (5 lines) in server/tests/prompt-parts.test.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-9470ccb6f3fc5a55", "name": "Commented-code block (7 lines) in server/tests/style-exemplars.test.mjs:3", "shortDescription": {"text": "Commented-code block (7 lines) in server/tests/style-exemplars.test.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-fbdc28c4d48b0fe6", "name": "Commented-code block (7 lines) in server/tests/realtime.test.mjs:3", "shortDescription": {"text": "Commented-code block (7 lines) in server/tests/realtime.test.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-01ded2eeae03f87c", "name": "Commented-code block (8 lines) in server/tests/disposition.test.mjs:3", "shortDescription": {"text": "Commented-code block (8 lines) in server/tests/disposition.test.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-e2d696894f416d88", "name": "Commented-code block (5 lines) in server/tests/engine.test.mjs:3", "shortDescription": {"text": "Commented-code block (5 lines) in server/tests/engine.test.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-70fcae2d13c708b6", "name": "17 env vars used in code but missing from .env.example", "shortDescription": {"text": "17 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `ANTHROPIC_MODEL`, `BASE`, `GOOGLE_CLIENT_ID`, `MINIMAX_API_KEY`, `OLLAMA_API_KEY`, `OLLAMA_MODEL`, `OPENAI_API_KEY` + 9 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-65fc28d3dd89a319", "name": "Frontend route `/admin/reports/:id` has no Link/navigate to it \u2014 client/src/main.jsx", "shortDescription": {"text": "Frontend route `/admin/reports/:id` has no Link/navigate to it \u2014 client/src/main.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-cc0a04cc96ed3135", "name": "Frontend route `/app/reports/:id` has no Link/navigate to it \u2014 client/src/main.jsx", "shortDescription": {"text": "Frontend route `/app/reports/:id` has no Link/navigate to it \u2014 client/src/main.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-7b68a3fdd5be1004", "name": "Frontend route `/app/session/:sessionId` has no Link/navigate to it \u2014 client/src/main.jsx", "shortDescription": {"text": "Frontend route `/app/session/:sessionId` has no Link/navigate to it \u2014 client/src/main.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-9f33fb5020d47df8", "name": "Dangling fetch: GET /api${path} (client/src/lib/api.js:40)", "shortDescription": {"text": "Dangling fetch: GET /api${path} (client/src/lib/api.js:40)"}, "fullDescription": {"text": "`client/src/lib/api.js:40` calls `GET /api${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/api/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c40ed04bd41c1c0f", "name": "Dangling fetch: POST https://api.minimax.io/v1/chat/completions (server/test-minimax.mjs:14)", "shortDescription": {"text": "Dangling fetch: POST https://api.minimax.io/v1/chat/completions (server/test-minimax.mjs:14)"}, "fullDescription": {"text": "`server/test-minimax.mjs:14` calls `POST https://api.minimax.io/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.minimax.io/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ce4181bd75865464", "name": "Dangling fetch: GET https://oauth2.googleapis.com/tokeninfo?id_token=${encodeURIComponent(idToken)} (server/index.js:176", "shortDescription": {"text": "Dangling fetch: GET https://oauth2.googleapis.com/tokeninfo?id_token=${encodeURIComponent(idToken)} (server/index.js:176)"}, "fullDescription": {"text": "`server/index.js:176` calls `GET https://oauth2.googleapis.com/tokeninfo?id_token=${encodeURIComponent(idToken)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/tokeninfo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-200ab2e98a288506", "name": "Unused endpoint: POST /api/login", "shortDescription": {"text": "Unused endpoint: POST /api/login"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/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-383cdb7fe9cebb9d", "name": "Unused endpoint: POST /api/auth/google", "shortDescription": {"text": "Unused endpoint: POST /api/auth/google"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/auth/google` 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-3a3c45156489b020", "name": "Unused endpoint: GET /api/users", "shortDescription": {"text": "Unused endpoint: GET /api/users"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/users` 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-3e4f9da731afcecc", "name": "Unused endpoint: PUT /api/users/:id/role", "shortDescription": {"text": "Unused endpoint: PUT /api/users/:id/role"}, "fullDescription": {"text": "`server/index.js` declares `PUT /api/users/:id/role` 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-78dbe25cdcd00bc0", "name": "Unused endpoint: PATCH /api/users/:id", "shortDescription": {"text": "Unused endpoint: PATCH /api/users/:id"}, "fullDescription": {"text": "`server/index.js` declares `PATCH /api/users/: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-a74c3f9ed77908ee", "name": "Unused endpoint: GET /api/counsellors", "shortDescription": {"text": "Unused endpoint: GET /api/counsellors"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/counsellors` 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-06a6e540434c44fa", "name": "Unused endpoint: GET /api/personas", "shortDescription": {"text": "Unused endpoint: GET /api/personas"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/personas` 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-2be1a34b7c5a7855", "name": "Unused endpoint: POST /api/personas", "shortDescription": {"text": "Unused endpoint: POST /api/personas"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/personas` 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-0698df6b16b06ed8", "name": "Unused endpoint: PUT /api/personas/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/personas/:id"}, "fullDescription": {"text": "`server/index.js` declares `PUT /api/personas/: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-3d4af336cb9a296f", "name": "Unused endpoint: DELETE /api/personas/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/personas/:id"}, "fullDescription": {"text": "`server/index.js` declares `DELETE /api/personas/: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-e6b1ba0df1e9977d", "name": "Unused endpoint: GET /api/courses", "shortDescription": {"text": "Unused endpoint: GET /api/courses"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/courses` 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-112b1da8e4e2bacb", "name": "Unused endpoint: POST /api/courses", "shortDescription": {"text": "Unused endpoint: POST /api/courses"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/courses` 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-119ef544937176e7", "name": "Unused endpoint: PUT /api/courses/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/courses/:id"}, "fullDescription": {"text": "`server/index.js` declares `PUT /api/courses/: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-0c40d5b7288b64aa", "name": "Unused endpoint: DELETE /api/courses/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/courses/:id"}, "fullDescription": {"text": "`server/index.js` declares `DELETE /api/courses/: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-ee4e94cfbd1fa809", "name": "Unused endpoint: GET /api/rubric-templates", "shortDescription": {"text": "Unused endpoint: GET /api/rubric-templates"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/rubric-templates` 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-405937551f0d9381", "name": "Unused endpoint: POST /api/rubric-templates", "shortDescription": {"text": "Unused endpoint: POST /api/rubric-templates"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/rubric-templates` 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-f62b1d5d0cc26522", "name": "Unused endpoint: PUT /api/rubric-templates/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/rubric-templates/:id"}, "fullDescription": {"text": "`server/index.js` declares `PUT /api/rubric-templates/: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-24319a5f1f173141", "name": "Unused endpoint: DELETE /api/rubric-templates/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/rubric-templates/:id"}, "fullDescription": {"text": "`server/index.js` declares `DELETE /api/rubric-templates/: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-3bd41a5ede4479bb", "name": "Unused endpoint: GET /api/lead-profiles", "shortDescription": {"text": "Unused endpoint: GET /api/lead-profiles"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/lead-profiles` 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-07eb5bba53e9db79", "name": "Unused endpoint: GET /api/assignments", "shortDescription": {"text": "Unused endpoint: GET /api/assignments"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/assignments` 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-6940d60c9c754e19", "name": "Unused endpoint: POST /api/assignments", "shortDescription": {"text": "Unused endpoint: POST /api/assignments"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/assignments` 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-50492da779abba02", "name": "Unused endpoint: GET /api/assignments/:id", "shortDescription": {"text": "Unused endpoint: GET /api/assignments/:id"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/assignments/: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-77ae2908439687fb", "name": "Unused endpoint: DELETE /api/assignments/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/assignments/:id"}, "fullDescription": {"text": "`server/index.js` declares `DELETE /api/assignments/: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-38f45b52ed9c1bb0", "name": "Unused endpoint: POST /api/sessions/start", "shortDescription": {"text": "Unused endpoint: POST /api/sessions/start"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/sessions/start` 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-1fcb1cd4007efd06", "name": "Unused endpoint: POST /api/sessions/:id/realtime/openai-token", "shortDescription": {"text": "Unused endpoint: POST /api/sessions/:id/realtime/openai-token"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/sessions/:id/realtime/openai-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-79f63b63114928cb", "name": "Unused endpoint: POST /api/sessions/:id/observe", "shortDescription": {"text": "Unused endpoint: POST /api/sessions/:id/observe"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/sessions/:id/observe` 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-5f91081cdb4832b4", "name": "Unused endpoint: POST /api/sessions/:id/end", "shortDescription": {"text": "Unused endpoint: POST /api/sessions/:id/end"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/sessions/:id/end` 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-a7b46f06f6eb426f", "name": "Unused endpoint: GET /api/sessions/:id", "shortDescription": {"text": "Unused endpoint: GET /api/sessions/:id"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/sessions/: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-ae18e966899ef533", "name": "Unused endpoint: DELETE /api/sessions/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/sessions/:id"}, "fullDescription": {"text": "`server/index.js` declares `DELETE /api/sessions/: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-c7bad8164cc38ea0", "name": "Unused endpoint: GET /api/reports", "shortDescription": {"text": "Unused endpoint: GET /api/reports"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/reports` 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-307f483a71b49cf7", "name": "Unused endpoint: GET /api/reports/:id", "shortDescription": {"text": "Unused endpoint: GET /api/reports/:id"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/reports/: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-262b0192ab7be876", "name": "Unused endpoint: DELETE /api/reports/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/reports/:id"}, "fullDescription": {"text": "`server/index.js` declares `DELETE /api/reports/: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-7309b5f12502bc59", "name": "Unused endpoint: GET /api/config/prompts", "shortDescription": {"text": "Unused endpoint: GET /api/config/prompts"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/config/prompts` 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-7565da15a7a9d168", "name": "Unused endpoint: PUT /api/config/prompts", "shortDescription": {"text": "Unused endpoint: PUT /api/config/prompts"}, "fullDescription": {"text": "`server/index.js` declares `PUT /api/config/prompts` 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-463e918281fbf3e6", "name": "Unused endpoint: GET /api/config/scoring", "shortDescription": {"text": "Unused endpoint: GET /api/config/scoring"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/config/scoring` 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-a0a6873d0ff535b7", "name": "Unused endpoint: PUT /api/config/scoring", "shortDescription": {"text": "Unused endpoint: PUT /api/config/scoring"}, "fullDescription": {"text": "`server/index.js` declares `PUT /api/config/scoring` 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-dd7ff412b5dd6e8d", "name": "Unused endpoint: GET /api/integrity-probes", "shortDescription": {"text": "Unused endpoint: GET /api/integrity-probes"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/integrity-probes` 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-ae97d35e069f4ccc", "name": "Unused endpoint: PUT /api/integrity-probes", "shortDescription": {"text": "Unused endpoint: PUT /api/integrity-probes"}, "fullDescription": {"text": "`server/index.js` declares `PUT /api/integrity-probes` 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-6ee9691dd1f6de59", "name": "Unused endpoint: GET /api/sessions/:id/prompt", "shortDescription": {"text": "Unused endpoint: GET /api/sessions/:id/prompt"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/sessions/:id/prompt` 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-d6f8180e47d26c85", "name": "Unused endpoint: POST /api/sessions/:id/cue", "shortDescription": {"text": "Unused endpoint: POST /api/sessions/:id/cue"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/sessions/:id/cue` 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-4e129bf227adce25", "name": "Unused endpoint: GET /api/assignment-templates", "shortDescription": {"text": "Unused endpoint: GET /api/assignment-templates"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/assignment-templates` 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-ee10c304d127f853", "name": "Unused endpoint: POST /api/assignment-templates", "shortDescription": {"text": "Unused endpoint: POST /api/assignment-templates"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/assignment-templates` 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-ea69d6e6fb0f81b5", "name": "Unused endpoint: PUT /api/assignment-templates/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/assignment-templates/:id"}, "fullDescription": {"text": "`server/index.js` declares `PUT /api/assignment-templates/: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-f3217d71939370a1", "name": "Unused endpoint: DELETE /api/assignment-templates/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/assignment-templates/:id"}, "fullDescription": {"text": "`server/index.js` declares `DELETE /api/assignment-templates/: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-a9475438500377c7", "name": "Unused endpoint: POST /api/assignment-templates/:id/assign", "shortDescription": {"text": "Unused endpoint: POST /api/assignment-templates/:id/assign"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/assignment-templates/:id/assign` 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-cb85fb6ea9e48679", "name": "Unused endpoint: GET /api/analytics/admin", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/admin"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/analytics/admin` 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-3f61f24eaad15df5", "name": "Unused endpoint: GET /api/analytics/counsellor/:id", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/counsellor/:id"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/analytics/counsellor/: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-a369f71214e9ef56", "name": "Unused endpoint: GET /api/leaderboard", "shortDescription": {"text": "Unused endpoint: GET /api/leaderboard"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/leaderboard` 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-745b599fff4dfd95", "name": "Unused endpoint: GET /counsellors", "shortDescription": {"text": "Unused endpoint: GET /counsellors"}, "fullDescription": {"text": "`supabase/functions/api/index.ts` declares `GET /counsellors` 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-c53703d9548a9538", "name": "Unused endpoint: GET /personas", "shortDescription": {"text": "Unused endpoint: GET /personas"}, "fullDescription": {"text": "`supabase/functions/api/index.ts` declares `GET /personas` 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/17755"}, "properties": {"repository": "rahulajay34/student-sim", "repoUrl": "https://github.com/rahulajay34/student-sim", "branch": "main"}, "results": [{"ruleId": "scanner-a3feffe20455018a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/ui/Topbar.jsx:16"}, "properties": {"repobilityId": "c50861da659ae7dd", "scanner": "scanner-primary", "fingerprint": "a3feffe20455018a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7e17b4c29bbc5838", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Templates.jsx:146"}, "properties": {"repobilityId": "f437e167ef67c5a9", "scanner": "scanner-primary", "fingerprint": "7e17b4c29bbc5838", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d14a5f0aad1316a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Courses.jsx:306"}, "properties": {"repobilityId": "cc65879a1ff3042c", "scanner": "scanner-primary", "fingerprint": "7d14a5f0aad1316a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-edacfaea5fec7df8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/AdminDashboard.jsx:465"}, "properties": {"repobilityId": "4df067a2961874b0", "scanner": "scanner-primary", "fingerprint": "edacfaea5fec7df8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4faa9389e7e8a6a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Counsellors.jsx:118"}, "properties": {"repobilityId": "3379ed99eea237e1", "scanner": "scanner-primary", "fingerprint": "4faa9389e7e8a6a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a2a0e52fd0fe5f5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/AssignmentCreate.jsx:406"}, "properties": {"repobilityId": "ba1529572798fe13", "scanner": "scanner-primary", "fingerprint": "a2a0e52fd0fe5f5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c70517946de89e20", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Rubrics.jsx:346"}, "properties": {"repobilityId": "b5498c2d57da4c00", "scanner": "scanner-primary", "fingerprint": "c70517946de89e20", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a18cf8bacea31ffd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/admin/Personas.jsx:446"}, "properties": {"repobilityId": "a0272ff20f087f83", "scanner": "scanner-primary", "fingerprint": "a18cf8bacea31ffd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e91e1c353e72bd6e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/counsellor/MyMocks.jsx:123"}, "properties": {"repobilityId": "8f2061586656a20f", "scanner": "scanner-primary", "fingerprint": "e91e1c353e72bd6e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f2d6a655c331355", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/counsellor/Profile.jsx:78"}, "properties": {"repobilityId": "f9c010a6384cd7a8", "scanner": "scanner-primary", "fingerprint": "2f2d6a655c331355", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbd08add8ba78280", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/counsellor/Dashboard.jsx:613"}, "properties": {"repobilityId": "430cbaeee2a4ebd8", "scanner": "scanner-primary", "fingerprint": "bbd08add8ba78280", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e623e3b0df183235", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/superadmin/UserManagement.jsx:102"}, "properties": {"repobilityId": "abd623c7189f0f43", "scanner": "scanner-primary", "fingerprint": "e623e3b0df183235", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2dd28b01f9d5e2ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/CounsellorLayout.jsx:37"}, "properties": {"repobilityId": "4055c9d07f9972e4", "scanner": "scanner-primary", "fingerprint": "2dd28b01f9d5e2ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7657de6509d191a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/AdminLayout.jsx:46"}, "properties": {"repobilityId": "7cc8a4c4434014ef", "scanner": "scanner-primary", "fingerprint": "d7657de6509d191a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea3f445a6e042a2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/SuperAdminLayout.jsx:37"}, "properties": {"repobilityId": "4787b1b6b50b84c9", "scanner": "scanner-primary", "fingerprint": "ea3f445a6e042a2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d85532eb4998a1f9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/mine/workflow-mine.js:27"}, "properties": {"repobilityId": "cbd3776d37ec575d", "scanner": "scanner-primary", "fingerprint": "d85532eb4998a1f9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e4f5dec653319a91", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/index.js:43"}, "properties": {"repobilityId": "21e6b3de2b3dd856", "scanner": "scanner-primary", "fingerprint": "e4f5dec653319a91", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a32ac60613087ac", "level": "error", "message": {"text": "Runtime dotenv file present in repo: .env.production"}, "properties": {"repobilityId": "da3016501941bee3", "scanner": "scanner-primary", "fingerprint": "5a32ac60613087ac", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c353ac5e6edd451c", "level": "error", "message": {"text": "Possible secret in scripts/smoke-api.mjs"}, "properties": {"repobilityId": "afaab0a6453b13af", "scanner": "scanner-primary", "fingerprint": "c353ac5e6edd451c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/smoke-api.mjs"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-c353ac5e6edd451c", "level": "error", "message": {"text": "Possible secret in scripts/smoke-api.mjs"}, "properties": {"repobilityId": "afaab0a6453b13af", "scanner": "scanner-primary", "fingerprint": "c353ac5e6edd451c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/smoke-api.mjs"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-da74ac9263cae779", "level": "error", "message": {"text": "Possible secret in scripts/loadtest-edge.mjs"}, "properties": {"repobilityId": "36de4f4462c679c3", "scanner": "scanner-primary", "fingerprint": "da74ac9263cae779", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/loadtest-edge.mjs"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-7b8dbe9c249e4f94", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in server/index.js:46"}, "properties": {"repobilityId": "d9e2487a3e052e8b", "scanner": "scanner-primary", "fingerprint": "7b8dbe9c249e4f94", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/index.js"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-e6de0f03579740f6", "level": "note", "message": {"text": "Very large file: supabase/functions/api/index.ts (1371 lines)"}, "properties": {"repobilityId": "c6105e5a0c88a847", "scanner": "scanner-primary", "fingerprint": "e6de0f03579740f6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-840903f1fe9e52f3", "level": "note", "message": {"text": "Very large file: server/report.js (1117 lines)"}, "properties": {"repobilityId": "1e876485ee7e172e", "scanner": "scanner-primary", "fingerprint": "840903f1fe9e52f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-28742ad8477025b2", "level": "note", "message": {"text": "Very large file: server/index.js (1792 lines)"}, "properties": {"repobilityId": "4d84f5062adc96c0", "scanner": "scanner-primary", "fingerprint": "28742ad8477025b2", "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-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "d57c13531b0b093b", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "eec1d4c26b7dc162", "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": "a7c73ee363fc7856", "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": "3ea01511847a5ace", "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": "f6e582ed47eefccb", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "c68aaadbda3b748a", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "30cb872645b0e611", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "488c0b94032b5cc7", "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": "7e113d18459c3fe1", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e68abd8eb2990f21", "level": "none", "message": {"text": "Commented-code block (15 lines) in client/vite.config.js:22"}, "properties": {"repobilityId": "e16ef5e6cf785663", "scanner": "scanner-primary", "fingerprint": "e68abd8eb2990f21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5f3892c5e5a352a", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/ui/Modal.jsx:7"}, "properties": {"repobilityId": "574d6f57928f6758", "scanner": "scanner-primary", "fingerprint": "e5f3892c5e5a352a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55fb81d766a079cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/ui/Table.jsx:7"}, "properties": {"repobilityId": "d070da8c3354556d", "scanner": "scanner-primary", "fingerprint": "55fb81d766a079cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8213cfc97b894c94", "level": "none", "message": {"text": "Commented-code block (9 lines) in client/src/ui/ConfirmDialog.jsx:9"}, "properties": {"repobilityId": "c9dd55c0296b982c", "scanner": "scanner-primary", "fingerprint": "8213cfc97b894c94", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-559b7b22d78632b2", "level": "none", "message": {"text": "Commented-code block (8 lines) in client/src/lib/stream.js:17"}, "properties": {"repobilityId": "3d641b2a51edeadc", "scanner": "scanner-primary", "fingerprint": "559b7b22d78632b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e17c060ec9269ba", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/voice/useOpenAIRealtime.js:17"}, "properties": {"repobilityId": "545265e052fff0b0", "scanner": "scanner-primary", "fingerprint": "9e17c060ec9269ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eeb3938531513627", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/voice/engines.js:3"}, "properties": {"repobilityId": "bdc717e8619aeec9", "scanner": "scanner-primary", "fingerprint": "eeb3938531513627", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ce7203bd6a1fc25", "level": "none", "message": {"text": "Commented-code block (9 lines) in client/src/pages/shared/TranscriptView.jsx:1"}, "properties": {"repobilityId": "69ea5e882b0f33cc", "scanner": "scanner-primary", "fingerprint": "8ce7203bd6a1fc25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-165f81323cdd2aef", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/pages/counsellor/Session.jsx:75"}, "properties": {"repobilityId": "dab1822abc2adbb6", "scanner": "scanner-primary", "fingerprint": "165f81323cdd2aef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0caefcecb5bbbdff", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/src/pages/counsellor/session/CallSidebar.jsx:89"}, "properties": {"repobilityId": "ea7830df3809129c", "scanner": "scanner-primary", "fingerprint": "0caefcecb5bbbdff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2c992e30791ba50", "level": "none", "message": {"text": "Commented-code block (7 lines) in client/src/pages/counsellor/session/Orb.jsx:1"}, "properties": {"repobilityId": "2c17827416c8840e", "scanner": "scanner-primary", "fingerprint": "c2c992e30791ba50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-88cb9c4fbeae5614", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/pages/counsellor/session/CallStage.jsx:6"}, "properties": {"repobilityId": "2451912f227c4356", "scanner": "scanner-primary", "fingerprint": "88cb9c4fbeae5614", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d63689448ef81ee2", "level": "none", "message": {"text": "Commented-code block (7 lines) in client/src/pages/counsellor/session/GreenRoom.jsx:69"}, "properties": {"repobilityId": "5ac3e727a25a1654", "scanner": "scanner-primary", "fingerprint": "d63689448ef81ee2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-560b440817b5395b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/scrape-courses.mjs:101"}, "properties": {"repobilityId": "53c681e225c80231", "scanner": "scanner-primary", "fingerprint": "560b440817b5395b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d41b09a8459d62a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/loadtest-edge.mjs:6"}, "properties": {"repobilityId": "540ed8a72e9bac6c", "scanner": "scanner-primary", "fingerprint": "d41b09a8459d62a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5bc6d9d5c142fa3f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-reports-edge.mjs:19"}, "properties": {"repobilityId": "1eb66f122ca9e4b8", "scanner": "scanner-primary", "fingerprint": "5bc6d9d5c142fa3f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-07c3960eb49f6b2c", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/mine/diarize.mjs:17"}, "properties": {"repobilityId": "a2a0d569fcb96814", "scanner": "scanner-primary", "fingerprint": "07c3960eb49f6b2c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-efe958b7e1f61889", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/api/smoke.mjs:1"}, "properties": {"repobilityId": "c4978a8d415c87c4", "scanner": "scanner-primary", "fingerprint": "efe958b7e1f61889", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ba0527069ad6283", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/api/index.ts:1"}, "properties": {"repobilityId": "ef22d9457db61c2d", "scanner": "scanner-primary", "fingerprint": "0ba0527069ad6283", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-32170c552666bedd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/api/index.ts:1349"}, "properties": {"repobilityId": "942f69336585685c", "scanner": "scanner-primary", "fingerprint": "32170c552666bedd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-013356e65f01275b", "level": "none", "message": {"text": "Commented-code block (9 lines) in supabase/functions/session/index.ts:11"}, "properties": {"repobilityId": "d389964d51071208", "scanner": "scanner-primary", "fingerprint": "013356e65f01275b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bd80946334e1839", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/session/index.ts:272"}, "properties": {"repobilityId": "8dedc459257fb43b", "scanner": "scanner-primary", "fingerprint": "0bd80946334e1839", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dad68fac2c5b80bb", "level": "none", "message": {"text": "Commented-code block (9 lines) in supabase/functions/report-worker/index.ts:5"}, "properties": {"repobilityId": "8e7091d12bd3fdf5", "scanner": "scanner-primary", "fingerprint": "dad68fac2c5b80bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f401fcf99071d3f", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/report-worker/smoke.test.mjs:3"}, "properties": {"repobilityId": "ba7751077af98ab1", "scanner": "scanner-primary", "fingerprint": "1f401fcf99071d3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0665e282576bc81d", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/path.js:11"}, "properties": {"repobilityId": "755d4160cded0c1b", "scanner": "scanner-primary", "fingerprint": "0665e282576bc81d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad47e7aa18c0f1d9", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/auth.js:3"}, "properties": {"repobilityId": "7784781afa487ec2", "scanner": "scanner-primary", "fingerprint": "ad47e7aa18c0f1d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-499723bbb5d7e2ec", "level": "none", "message": {"text": "Commented-code block (101 lines) in supabase/functions/_shared/store.js:8"}, "properties": {"repobilityId": "84b32d1c560c9fbc", "scanner": "scanner-primary", "fingerprint": "499723bbb5d7e2ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea2e8304d090dfc8", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/cors.js:19"}, "properties": {"repobilityId": "7309427d25bf871c", "scanner": "scanner-primary", "fingerprint": "ea2e8304d090dfc8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34834fbdb8a2195c", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/lib/styleExemplars.js:1"}, "properties": {"repobilityId": "879079d45eafe2fd", "scanner": "scanner-primary", "fingerprint": "34834fbdb8a2195c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e23293d6c018acc2", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/lib/prompt.js:1"}, "properties": {"repobilityId": "9703ba745dd85497", "scanner": "scanner-primary", "fingerprint": "e23293d6c018acc2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ce879f37bc68493", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/lib/grounding.js:1"}, "properties": {"repobilityId": "12a0a6e835275f10", "scanner": "scanner-primary", "fingerprint": "6ce879f37bc68493", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e6345e116163dbb7", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/lib/report.js:268"}, "properties": {"repobilityId": "8961363e94dad614", "scanner": "scanner-primary", "fingerprint": "e6345e116163dbb7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e47b888d63a73a2", "level": "none", "message": {"text": "Commented-code block (12 lines) in supabase/functions/_shared/lib/promptConfig.js:1"}, "properties": {"repobilityId": "586be4e56d04fa1c", "scanner": "scanner-primary", "fingerprint": "0e47b888d63a73a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11079ad7658620f3", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/lib/objections.js:194"}, "properties": {"repobilityId": "ff7bcd6fd3eb7128", "scanner": "scanner-primary", "fingerprint": "11079ad7658620f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8901bd86cd4853a0", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/lib/realtime.js:1"}, "properties": {"repobilityId": "8e75a194367b1494", "scanner": "scanner-primary", "fingerprint": "8901bd86cd4853a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6299b5335698244c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/lib/realtime.js:287"}, "properties": {"repobilityId": "8a993e641a5f4094", "scanner": "scanner-primary", "fingerprint": "6299b5335698244c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c2638478291af1b2", "level": "none", "message": {"text": "Commented-code block (7 lines) in supabase/functions/_shared/lib/register.js:1"}, "properties": {"repobilityId": "e98a190fc788898c", "scanner": "scanner-primary", "fingerprint": "c2638478291af1b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be90373f091711dd", "level": "none", "message": {"text": "Commented-code block (15 lines) in supabase/functions/_shared/lib/scoring.js:1"}, "properties": {"repobilityId": "130cbbf4f878dac5", "scanner": "scanner-primary", "fingerprint": "be90373f091711dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4c0c7a02f59ee64", "level": "none", "message": {"text": "Commented-code block (9 lines) in server/disposition.js:3"}, "properties": {"repobilityId": "018c7997caabc708", "scanner": "scanner-primary", "fingerprint": "c4c0c7a02f59ee64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49c8818d7f849945", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/classify.js:1"}, "properties": {"repobilityId": "d32ea4c889c0fee8", "scanner": "scanner-primary", "fingerprint": "49c8818d7f849945", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2778cdadd5faaf45", "level": "none", "message": {"text": "Commented-code block (10 lines) in server/styleExemplars.js:7"}, "properties": {"repobilityId": "270abd8c5ff5a5ac", "scanner": "scanner-primary", "fingerprint": "2778cdadd5faaf45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f66c9a31f9685c3", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/voices.js:16"}, "properties": {"repobilityId": "eab3c18408932659", "scanner": "scanner-primary", "fingerprint": "1f66c9a31f9685c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a19a4c34030dd25", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/test-minimax.mjs:14"}, "properties": {"repobilityId": "c1c454b798bfdb09", "scanner": "scanner-primary", "fingerprint": "0a19a4c34030dd25", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9f763c8c76c64f6d", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/prompt.js:1"}, "properties": {"repobilityId": "3704d3e5e07612c6", "scanner": "scanner-primary", "fingerprint": "9f763c8c76c64f6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85bdce3db6733482", "level": "none", "message": {"text": "Commented-code block (16 lines) in server/report.js:5"}, "properties": {"repobilityId": "b2dc7fdeeddffc14", "scanner": "scanner-primary", "fingerprint": "85bdce3db6733482", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99aa4e865d05507b", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/store.js:50"}, "properties": {"repobilityId": "64a9e4716d3ec96f", "scanner": "scanner-primary", "fingerprint": "99aa4e865d05507b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59c66ff6e4cffdc4", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/promptConfig.js:1"}, "properties": {"repobilityId": "02dfe8944856406d", "scanner": "scanner-primary", "fingerprint": "59c66ff6e4cffdc4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7788a4693d0876a", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/llm.js:7"}, "properties": {"repobilityId": "f01a50bf7005cf3b", "scanner": "scanner-primary", "fingerprint": "e7788a4693d0876a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ce80c00de702ce7", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/objections.js:3"}, "properties": {"repobilityId": "46304ffe4a808209", "scanner": "scanner-primary", "fingerprint": "0ce80c00de702ce7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c95779f96f7aa83", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/engine.js:69"}, "properties": {"repobilityId": "9911ff48bd7cb842", "scanner": "scanner-primary", "fingerprint": "9c95779f96f7aa83", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-671870a8a5e49980", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/realtime.js:3"}, "properties": {"repobilityId": "0e84a0770d771154", "scanner": "scanner-primary", "fingerprint": "671870a8a5e49980", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8866915368befe5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/realtime.js:291"}, "properties": {"repobilityId": "846fec391ec0674f", "scanner": "scanner-primary", "fingerprint": "b8866915368befe5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ca584e03643c1e0a", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/phases.js:1"}, "properties": {"repobilityId": "25b9e4ab494a78d4", "scanner": "scanner-primary", "fingerprint": "ca584e03643c1e0a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ae75e3ad89e16c6", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/index.js:32"}, "properties": {"repobilityId": "0e5244c5ccb9374e", "scanner": "scanner-primary", "fingerprint": "6ae75e3ad89e16c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-596fa3e3558ef421", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/personality.js:3"}, "properties": {"repobilityId": "4d9f2ede9f59bfa5", "scanner": "scanner-primary", "fingerprint": "596fa3e3558ef421", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-393abad1d24995dc", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/analytics.js:150"}, "properties": {"repobilityId": "da9d730c7d17168f", "scanner": "scanner-primary", "fingerprint": "393abad1d24995dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58758c3177aeb3b5", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/scoring.js:1"}, "properties": {"repobilityId": "82b05f1a1eea763e", "scanner": "scanner-primary", "fingerprint": "58758c3177aeb3b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d6262b1f5976648", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/tests/objections.test.mjs:337"}, "properties": {"repobilityId": "5f78db0eef9f90f5", "scanner": "scanner-primary", "fingerprint": "2d6262b1f5976648", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df8bd1c39233f4fe", "level": "none", "message": {"text": "Commented-code block (11 lines) in server/tests/report.test.mjs:3"}, "properties": {"repobilityId": "d0b31f0e59eb9954", "scanner": "scanner-primary", "fingerprint": "df8bd1c39233f4fe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42dc4efe356a773e", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/tests/scoring-pay-ask.test.mjs:3"}, "properties": {"repobilityId": "c7ca94eeb90a9422", "scanner": "scanner-primary", "fingerprint": "42dc4efe356a773e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbc25ac6da56ff09", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/tests/a2-fixes.test.mjs:3"}, "properties": {"repobilityId": "cd8ff22278af813a", "scanner": "scanner-primary", "fingerprint": "dbc25ac6da56ff09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3dbf8826c0c89905", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/tests/prompt-phase-scope.test.mjs:3"}, "properties": {"repobilityId": "1c46e7bf1beeb640", "scanner": "scanner-primary", "fingerprint": "3dbf8826c0c89905", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-07e840d926b183d3", "level": "none", "message": {"text": "Commented-code block (9 lines) in server/tests/llm.test.mjs:3"}, "properties": {"repobilityId": "2b05736199e5a11f", "scanner": "scanner-primary", "fingerprint": "07e840d926b183d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d6ebcb96744ee58", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/tests/prompt-parts.test.mjs:3"}, "properties": {"repobilityId": "5028dd367b1003f6", "scanner": "scanner-primary", "fingerprint": "0d6ebcb96744ee58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9470ccb6f3fc5a55", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/tests/style-exemplars.test.mjs:3"}, "properties": {"repobilityId": "32c5dc9b674bd3c7", "scanner": "scanner-primary", "fingerprint": "9470ccb6f3fc5a55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fbdc28c4d48b0fe6", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/tests/realtime.test.mjs:3"}, "properties": {"repobilityId": "38ab3d852ea033b9", "scanner": "scanner-primary", "fingerprint": "fbdc28c4d48b0fe6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01ded2eeae03f87c", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/tests/disposition.test.mjs:3"}, "properties": {"repobilityId": "8ef1020dc6fb248e", "scanner": "scanner-primary", "fingerprint": "01ded2eeae03f87c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2d696894f416d88", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/tests/engine.test.mjs:3"}, "properties": {"repobilityId": "08fac4cee8b2527b", "scanner": "scanner-primary", "fingerprint": "e2d696894f416d88", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70fcae2d13c708b6", "level": "note", "message": {"text": "17 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "f21675bed249619c", "scanner": "scanner-primary", "fingerprint": "70fcae2d13c708b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-65fc28d3dd89a319", "level": "warning", "message": {"text": "Frontend route `/admin/reports/:id` has no Link/navigate to it \u2014 client/src/main.jsx"}, "properties": {"repobilityId": "3ea3e6bc14332a2b", "scanner": "scanner-primary", "fingerprint": "65fc28d3dd89a319", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cc0a04cc96ed3135", "level": "warning", "message": {"text": "Frontend route `/app/reports/:id` has no Link/navigate to it \u2014 client/src/main.jsx"}, "properties": {"repobilityId": "6ea93d5960892544", "scanner": "scanner-primary", "fingerprint": "cc0a04cc96ed3135", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7b68a3fdd5be1004", "level": "warning", "message": {"text": "Frontend route `/app/session/:sessionId` has no Link/navigate to it \u2014 client/src/main.jsx"}, "properties": {"repobilityId": "543c3ae286d1c0d2", "scanner": "scanner-primary", "fingerprint": "7b68a3fdd5be1004", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9f33fb5020d47df8", "level": "error", "message": {"text": "Dangling fetch: GET /api${path} (client/src/lib/api.js:40)"}, "properties": {"repobilityId": "bec8d976382fc0ca", "scanner": "scanner-primary", "fingerprint": "9f33fb5020d47df8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c40ed04bd41c1c0f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.minimax.io/v1/chat/completions (server/test-minimax.mjs:14)"}, "properties": {"repobilityId": "b623e49aa9d9c8bd", "scanner": "scanner-primary", "fingerprint": "c40ed04bd41c1c0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ce4181bd75865464", "level": "error", "message": {"text": "Dangling fetch: GET https://oauth2.googleapis.com/tokeninfo?id_token=${encodeURIComponent(idToken)} (server/index.js:176)"}, "properties": {"repobilityId": "f255ae4b54d26b53", "scanner": "scanner-primary", "fingerprint": "ce4181bd75865464", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-200ab2e98a288506", "level": "note", "message": {"text": "Unused endpoint: POST /api/login"}, "properties": {"repobilityId": "630a2d77bf27edcb", "scanner": "scanner-primary", "fingerprint": "200ab2e98a288506", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-383cdb7fe9cebb9d", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/google"}, "properties": {"repobilityId": "81c0b9147042cd82", "scanner": "scanner-primary", "fingerprint": "383cdb7fe9cebb9d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3a3c45156489b020", "level": "note", "message": {"text": "Unused endpoint: GET /api/users"}, "properties": {"repobilityId": "062ea3cf85a4a5e6", "scanner": "scanner-primary", "fingerprint": "3a3c45156489b020", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e4f9da731afcecc", "level": "note", "message": {"text": "Unused endpoint: PUT /api/users/:id/role"}, "properties": {"repobilityId": "9a39110603677e33", "scanner": "scanner-primary", "fingerprint": "3e4f9da731afcecc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-78dbe25cdcd00bc0", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/users/:id"}, "properties": {"repobilityId": "facb0fb13c9858cd", "scanner": "scanner-primary", "fingerprint": "78dbe25cdcd00bc0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a74c3f9ed77908ee", "level": "note", "message": {"text": "Unused endpoint: GET /api/counsellors"}, "properties": {"repobilityId": "4770ce289a2e7245", "scanner": "scanner-primary", "fingerprint": "a74c3f9ed77908ee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06a6e540434c44fa", "level": "note", "message": {"text": "Unused endpoint: GET /api/personas"}, "properties": {"repobilityId": "fcc2774021f6aa93", "scanner": "scanner-primary", "fingerprint": "06a6e540434c44fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2be1a34b7c5a7855", "level": "note", "message": {"text": "Unused endpoint: POST /api/personas"}, "properties": {"repobilityId": "fd736e069b356480", "scanner": "scanner-primary", "fingerprint": "2be1a34b7c5a7855", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0698df6b16b06ed8", "level": "note", "message": {"text": "Unused endpoint: PUT /api/personas/:id"}, "properties": {"repobilityId": "9d2334a585db2213", "scanner": "scanner-primary", "fingerprint": "0698df6b16b06ed8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d4af336cb9a296f", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/personas/:id"}, "properties": {"repobilityId": "3d1df7de52743fee", "scanner": "scanner-primary", "fingerprint": "3d4af336cb9a296f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e6b1ba0df1e9977d", "level": "note", "message": {"text": "Unused endpoint: GET /api/courses"}, "properties": {"repobilityId": "ac800b2f91a660a7", "scanner": "scanner-primary", "fingerprint": "e6b1ba0df1e9977d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-112b1da8e4e2bacb", "level": "note", "message": {"text": "Unused endpoint: POST /api/courses"}, "properties": {"repobilityId": "6a6a05be4d13652c", "scanner": "scanner-primary", "fingerprint": "112b1da8e4e2bacb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-119ef544937176e7", "level": "note", "message": {"text": "Unused endpoint: PUT /api/courses/:id"}, "properties": {"repobilityId": "1cbe659efd25a16b", "scanner": "scanner-primary", "fingerprint": "119ef544937176e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c40d5b7288b64aa", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/courses/:id"}, "properties": {"repobilityId": "98fcd15bbc20fdf3", "scanner": "scanner-primary", "fingerprint": "0c40d5b7288b64aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee4e94cfbd1fa809", "level": "note", "message": {"text": "Unused endpoint: GET /api/rubric-templates"}, "properties": {"repobilityId": "a72689c7280b9ef1", "scanner": "scanner-primary", "fingerprint": "ee4e94cfbd1fa809", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-405937551f0d9381", "level": "note", "message": {"text": "Unused endpoint: POST /api/rubric-templates"}, "properties": {"repobilityId": "7f79b1c7bc656a0d", "scanner": "scanner-primary", "fingerprint": "405937551f0d9381", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f62b1d5d0cc26522", "level": "note", "message": {"text": "Unused endpoint: PUT /api/rubric-templates/:id"}, "properties": {"repobilityId": "a4cc440c140caefb", "scanner": "scanner-primary", "fingerprint": "f62b1d5d0cc26522", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24319a5f1f173141", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/rubric-templates/:id"}, "properties": {"repobilityId": "85de93333cfc9331", "scanner": "scanner-primary", "fingerprint": "24319a5f1f173141", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3bd41a5ede4479bb", "level": "note", "message": {"text": "Unused endpoint: GET /api/lead-profiles"}, "properties": {"repobilityId": "f45080d98788a327", "scanner": "scanner-primary", "fingerprint": "3bd41a5ede4479bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-07eb5bba53e9db79", "level": "note", "message": {"text": "Unused endpoint: GET /api/assignments"}, "properties": {"repobilityId": "db91972f8f31735d", "scanner": "scanner-primary", "fingerprint": "07eb5bba53e9db79", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6940d60c9c754e19", "level": "note", "message": {"text": "Unused endpoint: POST /api/assignments"}, "properties": {"repobilityId": "b0ed38ff7508cf12", "scanner": "scanner-primary", "fingerprint": "6940d60c9c754e19", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50492da779abba02", "level": "note", "message": {"text": "Unused endpoint: GET /api/assignments/:id"}, "properties": {"repobilityId": "060b94c475cc5cd9", "scanner": "scanner-primary", "fingerprint": "50492da779abba02", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-77ae2908439687fb", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/assignments/:id"}, "properties": {"repobilityId": "915608299ad533ab", "scanner": "scanner-primary", "fingerprint": "77ae2908439687fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38f45b52ed9c1bb0", "level": "note", "message": {"text": "Unused endpoint: POST /api/sessions/start"}, "properties": {"repobilityId": "9b4dc843a1fbe436", "scanner": "scanner-primary", "fingerprint": "38f45b52ed9c1bb0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1fcb1cd4007efd06", "level": "note", "message": {"text": "Unused endpoint: POST /api/sessions/:id/realtime/openai-token"}, "properties": {"repobilityId": "28dbc14c4bec4f29", "scanner": "scanner-primary", "fingerprint": "1fcb1cd4007efd06", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-79f63b63114928cb", "level": "note", "message": {"text": "Unused endpoint: POST /api/sessions/:id/observe"}, "properties": {"repobilityId": "e61f98bafc721e3c", "scanner": "scanner-primary", "fingerprint": "79f63b63114928cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5f91081cdb4832b4", "level": "note", "message": {"text": "Unused endpoint: POST /api/sessions/:id/end"}, "properties": {"repobilityId": "aa326f233b517952", "scanner": "scanner-primary", "fingerprint": "5f91081cdb4832b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a7b46f06f6eb426f", "level": "note", "message": {"text": "Unused endpoint: GET /api/sessions/:id"}, "properties": {"repobilityId": "a537f152c3f050b1", "scanner": "scanner-primary", "fingerprint": "a7b46f06f6eb426f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae18e966899ef533", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/sessions/:id"}, "properties": {"repobilityId": "832cbe431d09d95b", "scanner": "scanner-primary", "fingerprint": "ae18e966899ef533", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7bad8164cc38ea0", "level": "note", "message": {"text": "Unused endpoint: GET /api/reports"}, "properties": {"repobilityId": "2a1faca569486ec5", "scanner": "scanner-primary", "fingerprint": "c7bad8164cc38ea0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-307f483a71b49cf7", "level": "note", "message": {"text": "Unused endpoint: GET /api/reports/:id"}, "properties": {"repobilityId": "22ad76d7f95a4d73", "scanner": "scanner-primary", "fingerprint": "307f483a71b49cf7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-262b0192ab7be876", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/reports/:id"}, "properties": {"repobilityId": "53b592c81b26d8b6", "scanner": "scanner-primary", "fingerprint": "262b0192ab7be876", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7309b5f12502bc59", "level": "note", "message": {"text": "Unused endpoint: GET /api/config/prompts"}, "properties": {"repobilityId": "23c251f579b3461f", "scanner": "scanner-primary", "fingerprint": "7309b5f12502bc59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7565da15a7a9d168", "level": "note", "message": {"text": "Unused endpoint: PUT /api/config/prompts"}, "properties": {"repobilityId": "895b9b2523b422ae", "scanner": "scanner-primary", "fingerprint": "7565da15a7a9d168", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-463e918281fbf3e6", "level": "note", "message": {"text": "Unused endpoint: GET /api/config/scoring"}, "properties": {"repobilityId": "8550d33fb171b88f", "scanner": "scanner-primary", "fingerprint": "463e918281fbf3e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0a6873d0ff535b7", "level": "note", "message": {"text": "Unused endpoint: PUT /api/config/scoring"}, "properties": {"repobilityId": "338067655e09fe14", "scanner": "scanner-primary", "fingerprint": "a0a6873d0ff535b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd7ff412b5dd6e8d", "level": "note", "message": {"text": "Unused endpoint: GET /api/integrity-probes"}, "properties": {"repobilityId": "25f054e49ec803b4", "scanner": "scanner-primary", "fingerprint": "dd7ff412b5dd6e8d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae97d35e069f4ccc", "level": "note", "message": {"text": "Unused endpoint: PUT /api/integrity-probes"}, "properties": {"repobilityId": "a4d701ebc8daaccb", "scanner": "scanner-primary", "fingerprint": "ae97d35e069f4ccc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ee9691dd1f6de59", "level": "note", "message": {"text": "Unused endpoint: GET /api/sessions/:id/prompt"}, "properties": {"repobilityId": "185290a740348036", "scanner": "scanner-primary", "fingerprint": "6ee9691dd1f6de59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d6f8180e47d26c85", "level": "note", "message": {"text": "Unused endpoint: POST /api/sessions/:id/cue"}, "properties": {"repobilityId": "3257d2d3c9c75e8f", "scanner": "scanner-primary", "fingerprint": "d6f8180e47d26c85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e129bf227adce25", "level": "note", "message": {"text": "Unused endpoint: GET /api/assignment-templates"}, "properties": {"repobilityId": "7c7f4449cae8e0f8", "scanner": "scanner-primary", "fingerprint": "4e129bf227adce25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee10c304d127f853", "level": "note", "message": {"text": "Unused endpoint: POST /api/assignment-templates"}, "properties": {"repobilityId": "d7922d92ee58f667", "scanner": "scanner-primary", "fingerprint": "ee10c304d127f853", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea69d6e6fb0f81b5", "level": "note", "message": {"text": "Unused endpoint: PUT /api/assignment-templates/:id"}, "properties": {"repobilityId": "2f5fd0efb30637b5", "scanner": "scanner-primary", "fingerprint": "ea69d6e6fb0f81b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3217d71939370a1", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/assignment-templates/:id"}, "properties": {"repobilityId": "f9846d902363b2bd", "scanner": "scanner-primary", "fingerprint": "f3217d71939370a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a9475438500377c7", "level": "note", "message": {"text": "Unused endpoint: POST /api/assignment-templates/:id/assign"}, "properties": {"repobilityId": "e84bc3319f0666db", "scanner": "scanner-primary", "fingerprint": "a9475438500377c7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb85fb6ea9e48679", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/admin"}, "properties": {"repobilityId": "46b2bfecd1463862", "scanner": "scanner-primary", "fingerprint": "cb85fb6ea9e48679", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f61f24eaad15df5", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/counsellor/:id"}, "properties": {"repobilityId": "5a621bf017064049", "scanner": "scanner-primary", "fingerprint": "3f61f24eaad15df5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a369f71214e9ef56", "level": "note", "message": {"text": "Unused endpoint: GET /api/leaderboard"}, "properties": {"repobilityId": "9db6b6517a494eaa", "scanner": "scanner-primary", "fingerprint": "a369f71214e9ef56", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-745b599fff4dfd95", "level": "note", "message": {"text": "Unused endpoint: GET /counsellors"}, "properties": {"repobilityId": "6b91ae3b5d481e53", "scanner": "scanner-primary", "fingerprint": "745b599fff4dfd95", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c53703d9548a9538", "level": "note", "message": {"text": "Unused endpoint: GET /personas"}, "properties": {"repobilityId": "4159ac946cf8c23a", "scanner": "scanner-primary", "fingerprint": "c53703d9548a9538", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}