{"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-6c662593f86c66f4", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ShareProfileModal.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ShareProfileModal.tsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1cdcce8b35848fa2", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/SharePostModal.tsx:116", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/SharePostModal.tsx:116"}, "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-0f4f42bf4c70ca4a", "name": "Icon-only button without accessible name \u2014 client/src/components/LikesModal.tsx:38", "shortDescription": {"text": "Icon-only button without accessible name \u2014 client/src/components/LikesModal.tsx:38"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffa52faa64411e42", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/LikesModal.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/LikesModal.tsx:64"}, "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-d065f835fe5ad6cb", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/PostDetailModal.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/PostDetailModal.tsx:63"}, "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-32a9df33d05fc2b2", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/CreatePostModal.tsx:269", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/CreatePostModal.tsx:269"}, "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-a729a586ddf8e839", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Tournaments.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Tournaments.tsx:149"}, "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-58aeb08ec70f71d3", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Profile.tsx:1104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Profile.tsx:1104"}, "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-2d4aaf6bce518ce3", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Grow.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Grow.tsx:171"}, "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-1bc79721dcdff13b", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Messages.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Messages.tsx:103"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06ae7388a97aeecc", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDashboard.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDashboard.tsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4fe6211ce956f9bd", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Settings.tsx:704", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Settings.tsx:704"}, "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-d64bf3be28931cb0", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Explore.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Explore.tsx:109"}, "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-5825f2e85599c7c1", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/TeamManage.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/TeamManage.tsx:179"}, "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-8f13a88ae2674108", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/TournamentRegister.tsx:325", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/TournamentRegister.tsx:325"}, "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-3f44848f1fa47029", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ScoutCopilot.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ScoutCopilot.tsx:61"}, "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-f4e59852e09b99a7", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Highlights.tsx:208", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Highlights.tsx:208"}, "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-b3c9860e9087177a", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/MainLayout.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/MainLayout.tsx:164"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94f2d640590403cf", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/features/statTracker/TrackerDashboard.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/features/statTracker/TrackerDashboard.tsx:44"}, "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-0d019fbbb41ee780", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/features/statTracker/StatTrackerLauncher.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/features/statTracker/StatTrackerLauncher.tsx:108"}, "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-6c33f6c853f5732d", "name": "Icon-only button without accessible name \u2014 client/src/features/statTracker/basketball/BasketballMatch.tsx:239", "shortDescription": {"text": "Icon-only button without accessible name \u2014 client/src/features/statTracker/basketball/BasketballMatch.tsx:239"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-882aba29b44b3ac6", "name": "Icon-only button without accessible name \u2014 client/src/features/statTracker/football/FootballMatch.tsx:588", "shortDescription": {"text": "Icon-only button without accessible name \u2014 client/src/features/statTracker/football/FootballMatch.tsx:588"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b3def03c5c9d6743", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/features/statTracker/football/FootballMatch.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/features/statTracker/football/FootballMatch.tsx:210"}, "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-d33dda2fba1334c4", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/rewrite-media-urls.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/rewrite-media-urls.ts:45"}, "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-8dc1807802b7add8", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-cloudinary-to-gcs.ts:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-cloudinary-to-gcs.ts:98"}, "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-1ea390d358a408b4", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/create-admin.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/create-admin.ts:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f008f0713d4a6cc", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d0abaa7aaca9a70b", "name": "Runtime dotenv file present in repo: client/.env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: client/.env.production"}, "fullDescription": {"text": "`client/.env.production` looks like a runtime dotenv file. It contains secret-looking assignments for VITE_FIREBASE_API_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-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-384b1530625bf1a2", "name": "Very large file: client/src/pages/Profile.tsx (1426 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Profile.tsx (1426 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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 114 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "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-1a6aeb84f8544549", "name": "Node manifest has dependencies but no lockfile: client/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: client/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7101ca1926e3342", "name": "Node manifest has dependencies but no lockfile: server/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: server/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 34 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 104 placeholder/mock markers across 22 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, lockfile. 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, lockfile. 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-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-41419a78264ba5db", "name": "Commented-code block (5 lines) in client/src/config/firebase.ts:23", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/config/firebase.ts:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26f40ca39aa15fc6", "name": "Commented-code block (7 lines) in client/src/pages/Profile.tsx:39", "shortDescription": {"text": "Commented-code block (7 lines) in client/src/pages/Profile.tsx:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe3749c23b67018f", "name": "Commented-code block (5 lines) in server/src/middleware/botProtection.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/middleware/botProtection.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-46f31f0f3e04e98b", "name": "Commented-code block (7 lines) in server/src/routes/auth.routes.ts:52", "shortDescription": {"text": "Commented-code block (7 lines) in server/src/routes/auth.routes.ts:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c8e4de8d21ffa53", "name": "Commented-code block (7 lines) in server/src/validation/common.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in server/src/validation/common.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-b0965e3ea419bcbb", "name": "Commented-code block (7 lines) in server/src/services/storage.ts:164", "shortDescription": {"text": "Commented-code block (7 lines) in server/src/services/storage.ts:164"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2eafc3188c36bb02", "name": "3 env vars used in code but missing from .env.example", "shortDescription": {"text": "3 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `GCP_PROJECT_ID`, `GCS_BUCKET`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-66a0e29b3b314ea4", "name": "Frontend route `/landing` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/landing` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-1ce3fadde1bd9512", "name": "Frontend route `/verify-email` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/verify-email` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-270bca32d3c6d67a", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-d578319a21342dc1", "name": "Frontend route `/handover/consent` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/handover/consent` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-e57fcdb04507ef07", "name": "Frontend route `home` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `home` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-ced8b64826a882e8", "name": "Frontend route `explore` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `explore` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-6d906ef7b6ebaebe", "name": "Frontend route `tournaments` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `tournaments` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-cd22735b0d7f8464", "name": "Frontend route `tournaments/:id/register` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `tournaments/:id/register` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-9991d58254b1a27c", "name": "Frontend route `teams/:id` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `teams/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-2ec0ebc7e1730685", "name": "Frontend route `rankings` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `rankings` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-402be67d220a1809", "name": "Frontend route `announcements` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `announcements` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-743b58d25ddce747", "name": "Frontend route `messages` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `messages` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-84b35aa6fd926494", "name": "Frontend route `notifications` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `notifications` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-e7a3ba1f25824324", "name": "Frontend route `grow` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `grow` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-d0106ab56945e8b3", "name": "Frontend route `profile/:id` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `profile/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-630f7cf411a7e65a", "name": "Frontend route `profile/edit` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `profile/edit` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-d49fcc58073b94b7", "name": "Frontend route `admin` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `admin` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-bbb656b1d4ec8840", "name": "Frontend route `admin/stat-tracker` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `admin/stat-tracker` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-73da776df31d0fd6", "name": "Frontend route `admin/stat-tracker/:tournamentId` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `admin/stat-tracker/:tournamentId` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-a35093e136ddab0d", "name": "Frontend route `settings` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-c5384df563ff0d24", "name": "Frontend route `saved` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `saved` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-af827e681a3c8e5d", "name": "Frontend route `scout-copilot` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `scout-copilot` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-66871d39e3b8c556", "name": "Frontend route `/admin/stat-tracker/demo/:sport` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/stat-tracker/demo/:sport` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-391b88e2150f83ca", "name": "Frontend route `/admin/stat-tracker/:tournamentId/match/:matchId` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/stat-tracker/:tournamentId/match/:matchId` has no Link/navigate to it \u2014 client/src/App.tsx"}, "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-9041dafb13fda95d", "name": "Unused endpoint: POST /messages/conversations", "shortDescription": {"text": "Unused endpoint: POST /messages/conversations"}, "fullDescription": {"text": "`client/src/components/ShareProfileModal.tsx` declares `POST /messages/conversations` 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-cead848819ebc7e6", "name": "Unused endpoint: POST /posts/upload-url", "shortDescription": {"text": "Unused endpoint: POST /posts/upload-url"}, "fullDescription": {"text": "`client/src/components/CreatePostModal.tsx` declares `POST /posts/upload-url` 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-d38eae0b19ee450e", "name": "Unused endpoint: POST /posts", "shortDescription": {"text": "Unused endpoint: POST /posts"}, "fullDescription": {"text": "`client/src/components/CreatePostModal.tsx` declares `POST /posts` 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-23a2588067ef76eb", "name": "Unused endpoint: GET /posts/saved", "shortDescription": {"text": "Unused endpoint: GET /posts/saved"}, "fullDescription": {"text": "`client/src/pages/SavedPosts.tsx` declares `GET /posts/saved` 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-8e5753c153b98a24", "name": "Unused endpoint: PUT /users/profile/banner", "shortDescription": {"text": "Unused endpoint: PUT /users/profile/banner"}, "fullDescription": {"text": "`client/src/pages/Profile.tsx` declares `PUT /users/profile/banner` 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-26afc44750984200", "name": "Unused endpoint: GET /connections/requests", "shortDescription": {"text": "Unused endpoint: GET /connections/requests"}, "fullDescription": {"text": "`client/src/pages/Grow.tsx` declares `GET /connections/requests` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cf8761ead55c7ff1", "name": "Unused endpoint: GET /connections/suggestions", "shortDescription": {"text": "Unused endpoint: GET /connections/suggestions"}, "fullDescription": {"text": "`client/src/pages/Grow.tsx` declares `GET /connections/suggestions` 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-ba468154b5550ed9", "name": "Unused endpoint: GET /messages/conversations", "shortDescription": {"text": "Unused endpoint: GET /messages/conversations"}, "fullDescription": {"text": "`client/src/pages/Messages.tsx` declares `GET /messages/conversations` 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-dd159bd05997c05c", "name": "Unused endpoint: GET /admin/stats", "shortDescription": {"text": "Unused endpoint: GET /admin/stats"}, "fullDescription": {"text": "`client/src/pages/AdminDashboard.tsx` declares `GET /admin/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f6c5e1b82ddba36", "name": "Unused endpoint: POST /admin/create-admin", "shortDescription": {"text": "Unused endpoint: POST /admin/create-admin"}, "fullDescription": {"text": "`client/src/pages/AdminDashboard.tsx` declares `POST /admin/create-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-4e6bcaeb07e406a1", "name": "Unused endpoint: GET /tournaments?limit=50", "shortDescription": {"text": "Unused endpoint: GET /tournaments?limit=50"}, "fullDescription": {"text": "`client/src/pages/AdminDashboard.tsx` declares `GET /tournaments?limit=50` 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-f78f36468b729293", "name": "Unused endpoint: POST /tournaments", "shortDescription": {"text": "Unused endpoint: POST /tournaments"}, "fullDescription": {"text": "`client/src/pages/AdminDashboard.tsx` declares `POST /tournaments` 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-8c7d57ce82505f0b", "name": "Unused endpoint: PUT /users/profile", "shortDescription": {"text": "Unused endpoint: PUT /users/profile"}, "fullDescription": {"text": "`client/src/pages/EditProfile.tsx` declares `PUT /users/profile` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94c5c6d061675d36", "name": "Unused endpoint: GET /announcements", "shortDescription": {"text": "Unused endpoint: GET /announcements"}, "fullDescription": {"text": "`client/src/pages/Announcements.tsx` declares `GET /announcements` 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-5e27c360ebee473b", "name": "Unused endpoint: POST /announcements", "shortDescription": {"text": "Unused endpoint: POST /announcements"}, "fullDescription": {"text": "`client/src/pages/Announcements.tsx` declares `POST /announcements` 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-386845289ca0b11c", "name": "Unused endpoint: GET /stats/athletes", "shortDescription": {"text": "Unused endpoint: GET /stats/athletes"}, "fullDescription": {"text": "`client/src/pages/Challenges.tsx` declares `GET /stats/athletes` 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-4f29da06358b9582", "name": "Unused endpoint: POST /auth/handover/consent", "shortDescription": {"text": "Unused endpoint: POST /auth/handover/consent"}, "fullDescription": {"text": "`client/src/pages/HandoverConsent.tsx` declares `POST /auth/handover/consent` 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-01e96993c51b4d1e", "name": "Unused endpoint: GET /users/blocked", "shortDescription": {"text": "Unused endpoint: GET /users/blocked"}, "fullDescription": {"text": "`client/src/pages/Settings.tsx` declares `GET /users/blocked` 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-df3287de54415eba", "name": "Unused endpoint: PATCH /users/settings/notifications", "shortDescription": {"text": "Unused endpoint: PATCH /users/settings/notifications"}, "fullDescription": {"text": "`client/src/pages/Settings.tsx` declares `PATCH /users/settings/notifications` 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-dcb9f43d4b1d7d0c", "name": "Unused endpoint: POST /auth/handover/request", "shortDescription": {"text": "Unused endpoint: POST /auth/handover/request"}, "fullDescription": {"text": "`client/src/pages/Settings.tsx` declares `POST /auth/handover/request` 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-6769403a32c62b53", "name": "Unused endpoint: POST /auth/handover/complete", "shortDescription": {"text": "Unused endpoint: POST /auth/handover/complete"}, "fullDescription": {"text": "`client/src/pages/Settings.tsx` declares `POST /auth/handover/complete` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-888dc12be3239ded", "name": "Unused endpoint: DELETE /users/account", "shortDescription": {"text": "Unused endpoint: DELETE /users/account"}, "fullDescription": {"text": "`client/src/pages/Settings.tsx` declares `DELETE /users/account` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-575ee17b52b227c5", "name": "Unused endpoint: POST /users/settings/verify-phone", "shortDescription": {"text": "Unused endpoint: POST /users/settings/verify-phone"}, "fullDescription": {"text": "`client/src/pages/Settings.tsx` declares `POST /users/settings/verify-phone` 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-c9a7c59a4096ef36", "name": "Unused endpoint: PATCH /notifications/read-all", "shortDescription": {"text": "Unused endpoint: PATCH /notifications/read-all"}, "fullDescription": {"text": "`client/src/pages/Notifications.tsx` declares `PATCH /notifications/read-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b9d10b90eb19dc5", "name": "Unused endpoint: POST /scout-copilot", "shortDescription": {"text": "Unused endpoint: POST /scout-copilot"}, "fullDescription": {"text": "`client/src/pages/ScoutCopilot.tsx` declares `POST /scout-copilot` 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-a770f2c42555b943", "name": "Unused endpoint: POST /highlights", "shortDescription": {"text": "Unused endpoint: POST /highlights"}, "fullDescription": {"text": "`client/src/pages/Highlights.tsx` declares `POST /highlights` 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-0c1b5735888cf592", "name": "Unused endpoint: GET /notifications?limit=1", "shortDescription": {"text": "Unused endpoint: GET /notifications?limit=1"}, "fullDescription": {"text": "`client/src/layouts/MainLayout.tsx` declares `GET /notifications?limit=1` 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-b43e4b1bbcea3bfb", "name": "Unused endpoint: GET /messages/unread-count", "shortDescription": {"text": "Unused endpoint: GET /messages/unread-count"}, "fullDescription": {"text": "`client/src/layouts/MainLayout.tsx` declares `GET /messages/unread-count` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b3f34c73e51a50b3", "name": "Unused endpoint: POST /tracker/sessions", "shortDescription": {"text": "Unused endpoint: POST /tracker/sessions"}, "fullDescription": {"text": "`client/src/features/statTracker/api.ts` declares `POST /tracker/sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dde3adb27bf7eebe", "name": "Unused endpoint: USE /api", "shortDescription": {"text": "Unused endpoint: USE /api"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`server/src/app.ts` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/auth` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ff40cb10f7c8519", "name": "Unused endpoint: USE /api/users", "shortDescription": {"text": "Unused endpoint: USE /api/users"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /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-b625bd59c0654e2f", "name": "Unused endpoint: USE /api/connections", "shortDescription": {"text": "Unused endpoint: USE /api/connections"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/connections` 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-8e9fa90a8df48b4b", "name": "Unused endpoint: USE /api/highlights", "shortDescription": {"text": "Unused endpoint: USE /api/highlights"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/highlights` 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-1be44d2cc9b65154", "name": "Unused endpoint: USE /api/posts", "shortDescription": {"text": "Unused endpoint: USE /api/posts"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/posts` 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-d95f6b6be4decff8", "name": "Unused endpoint: USE /api/feed", "shortDescription": {"text": "Unused endpoint: USE /api/feed"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/feed` 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-95d83ea4b1a04d3d", "name": "Unused endpoint: USE /api/teams", "shortDescription": {"text": "Unused endpoint: USE /api/teams"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/teams` 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-5b450d5b20ee9793", "name": "Unused endpoint: USE /api/tournaments", "shortDescription": {"text": "Unused endpoint: USE /api/tournaments"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/tournaments` 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-592c06f9e6f78cbd", "name": "Unused endpoint: USE /api/rankings", "shortDescription": {"text": "Unused endpoint: USE /api/rankings"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/rankings` 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-7222c1377806c38f", "name": "Unused endpoint: USE /api/announcements", "shortDescription": {"text": "Unused endpoint: USE /api/announcements"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/announcements` 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-c3a8b7932f72b92f", "name": "Unused endpoint: USE /api/notifications", "shortDescription": {"text": "Unused endpoint: USE /api/notifications"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/notifications` 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-9a300508c4edb651", "name": "Unused endpoint: USE /api/messages", "shortDescription": {"text": "Unused endpoint: USE /api/messages"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/messages` 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-d93a530ce10d47d9", "name": "Unused endpoint: USE /api/admin", "shortDescription": {"text": "Unused endpoint: USE /api/admin"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/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-624b07500a25228c", "name": "Unused endpoint: USE /api/scout-copilot", "shortDescription": {"text": "Unused endpoint: USE /api/scout-copilot"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/scout-copilot` 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-06c88a2e2dc65557", "name": "Unused endpoint: USE /api/stats", "shortDescription": {"text": "Unused endpoint: USE /api/stats"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4f1b62219aa9fde", "name": "Unused endpoint: USE /api/tracker", "shortDescription": {"text": "Unused endpoint: USE /api/tracker"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/tracker` 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-1d2f7fecff5fc79a", "name": "Unused endpoint: POST /foo", "shortDescription": {"text": "Unused endpoint: POST /foo"}, "fullDescription": {"text": "`server/src/middleware/validate.ts` declares `POST /foo` 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-735042cc20eb744a", "name": "Unused endpoint: POST /follow/:userId", "shortDescription": {"text": "Unused endpoint: POST /follow/:userId"}, "fullDescription": {"text": "`server/src/routes/connection.routes.ts` declares `POST /follow/:userId` 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-7ad2149f43658f4f", "name": "Unused endpoint: DELETE /unfollow/:userId", "shortDescription": {"text": "Unused endpoint: DELETE /unfollow/:userId"}, "fullDescription": {"text": "`server/src/routes/connection.routes.ts` declares `DELETE /unfollow/:userId` 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/18750"}, "properties": {"repository": "Sahi1107/The-All-For-1-Sports-Network", "repoUrl": "https://github.com/Sahi1107/The-All-For-1-Sports-Network", "branch": "main"}, "results": [{"ruleId": "scanner-6c662593f86c66f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ShareProfileModal.tsx:112"}, "properties": {"repobilityId": "a5076182a507e7b0", "scanner": "scanner-primary", "fingerprint": "6c662593f86c66f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1cdcce8b35848fa2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/SharePostModal.tsx:116"}, "properties": {"repobilityId": "c6bf801f1eecc9e4", "scanner": "scanner-primary", "fingerprint": "1cdcce8b35848fa2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f4f42bf4c70ca4a", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 client/src/components/LikesModal.tsx:38"}, "properties": {"repobilityId": "b28c0abdd3d8ef9a", "scanner": "scanner-primary", "fingerprint": "0f4f42bf4c70ca4a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-ffa52faa64411e42", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/LikesModal.tsx:64"}, "properties": {"repobilityId": "deaa6093180d5b00", "scanner": "scanner-primary", "fingerprint": "ffa52faa64411e42", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d065f835fe5ad6cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/PostDetailModal.tsx:63"}, "properties": {"repobilityId": "ba0596644f839a2a", "scanner": "scanner-primary", "fingerprint": "d065f835fe5ad6cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-32a9df33d05fc2b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/CreatePostModal.tsx:269"}, "properties": {"repobilityId": "7f4ae65271ba1cb4", "scanner": "scanner-primary", "fingerprint": "32a9df33d05fc2b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a729a586ddf8e839", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Tournaments.tsx:149"}, "properties": {"repobilityId": "ba9dc6a29a54074d", "scanner": "scanner-primary", "fingerprint": "a729a586ddf8e839", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58aeb08ec70f71d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Profile.tsx:1104"}, "properties": {"repobilityId": "744d0029c7747da3", "scanner": "scanner-primary", "fingerprint": "58aeb08ec70f71d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d4aaf6bce518ce3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Grow.tsx:171"}, "properties": {"repobilityId": "6d4407b6bb74e9b0", "scanner": "scanner-primary", "fingerprint": "2d4aaf6bce518ce3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bc79721dcdff13b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Messages.tsx:103"}, "properties": {"repobilityId": "aba0f52998f80b02", "scanner": "scanner-primary", "fingerprint": "1bc79721dcdff13b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06ae7388a97aeecc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDashboard.tsx:80"}, "properties": {"repobilityId": "3d8cf5e6861d9280", "scanner": "scanner-primary", "fingerprint": "06ae7388a97aeecc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fe6211ce956f9bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Settings.tsx:704"}, "properties": {"repobilityId": "db63208095bf2f43", "scanner": "scanner-primary", "fingerprint": "4fe6211ce956f9bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d64bf3be28931cb0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Explore.tsx:109"}, "properties": {"repobilityId": "bab63fe36efd7630", "scanner": "scanner-primary", "fingerprint": "d64bf3be28931cb0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5825f2e85599c7c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/TeamManage.tsx:179"}, "properties": {"repobilityId": "525bc6e1a4d5a4e8", "scanner": "scanner-primary", "fingerprint": "5825f2e85599c7c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f13a88ae2674108", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/TournamentRegister.tsx:325"}, "properties": {"repobilityId": "b93a2dc83a03059e", "scanner": "scanner-primary", "fingerprint": "8f13a88ae2674108", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f44848f1fa47029", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ScoutCopilot.tsx:61"}, "properties": {"repobilityId": "245a24faa1daf80b", "scanner": "scanner-primary", "fingerprint": "3f44848f1fa47029", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4e59852e09b99a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Highlights.tsx:208"}, "properties": {"repobilityId": "b5694d45a82c1b2b", "scanner": "scanner-primary", "fingerprint": "f4e59852e09b99a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b3c9860e9087177a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/layouts/MainLayout.tsx:164"}, "properties": {"repobilityId": "464e6441d9e63bd3", "scanner": "scanner-primary", "fingerprint": "b3c9860e9087177a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94f2d640590403cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/features/statTracker/TrackerDashboard.tsx:44"}, "properties": {"repobilityId": "6cdb8d1e9bd2f468", "scanner": "scanner-primary", "fingerprint": "94f2d640590403cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d019fbbb41ee780", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/features/statTracker/StatTrackerLauncher.tsx:108"}, "properties": {"repobilityId": "76eebf7586b079a2", "scanner": "scanner-primary", "fingerprint": "0d019fbbb41ee780", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c33f6c853f5732d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 client/src/features/statTracker/basketball/BasketballMatch.tsx:239"}, "properties": {"repobilityId": "bc8c4ea883c3aa20", "scanner": "scanner-primary", "fingerprint": "6c33f6c853f5732d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-882aba29b44b3ac6", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 client/src/features/statTracker/football/FootballMatch.tsx:588"}, "properties": {"repobilityId": "b3431e2edc1bdab8", "scanner": "scanner-primary", "fingerprint": "882aba29b44b3ac6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b3def03c5c9d6743", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/features/statTracker/football/FootballMatch.tsx:210"}, "properties": {"repobilityId": "3e46b81900d0d7c0", "scanner": "scanner-primary", "fingerprint": "b3def03c5c9d6743", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d33dda2fba1334c4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/rewrite-media-urls.ts:45"}, "properties": {"repobilityId": "8424eb8115dbdb01", "scanner": "scanner-primary", "fingerprint": "d33dda2fba1334c4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8dc1807802b7add8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-cloudinary-to-gcs.ts:98"}, "properties": {"repobilityId": "44a458832bc38306", "scanner": "scanner-primary", "fingerprint": "8dc1807802b7add8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1ea390d358a408b4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/create-admin.ts:41"}, "properties": {"repobilityId": "ab736a5ddc03d3e3", "scanner": "scanner-primary", "fingerprint": "1ea390d358a408b4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f008f0713d4a6cc", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "properties": {"repobilityId": "71e011c0fbaa180a", "scanner": "scanner-primary", "fingerprint": "1f008f0713d4a6cc", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/Dockerfile"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-1f008f0713d4a6cc", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "properties": {"repobilityId": "acb7d5ef08978372", "scanner": "scanner-primary", "fingerprint": "1f008f0713d4a6cc", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/Dockerfile"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-d0abaa7aaca9a70b", "level": "error", "message": {"text": "Runtime dotenv file present in repo: client/.env.production"}, "properties": {"repobilityId": "ba10706fc4e1197b", "scanner": "scanner-primary", "fingerprint": "d0abaa7aaca9a70b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/.env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-384b1530625bf1a2", "level": "note", "message": {"text": "Very large file: client/src/pages/Profile.tsx (1426 lines)"}, "properties": {"repobilityId": "cd49eae197f788b3", "scanner": "scanner-primary", "fingerprint": "384b1530625bf1a2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "085aca4c0be7e37f", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-1a6aeb84f8544549", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: client/package.json"}, "properties": {"repobilityId": "289cda4e29a77d84", "scanner": "scanner-primary", "fingerprint": "1a6aeb84f8544549", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d7101ca1926e3342", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: server/package.json"}, "properties": {"repobilityId": "bbcd0a89809ced91", "scanner": "scanner-primary", "fingerprint": "d7101ca1926e3342", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "0e586987577334ba", "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": "62cd5543dad88321", "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": "1702d1a04ae90d44", "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": "cb2d533920da3ea5", "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": "400b83a924a1ff54", "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": "c22ad77aef869de9", "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": "d30f881afba68b42", "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": "99ab179611829281", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-41419a78264ba5db", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/config/firebase.ts:23"}, "properties": {"repobilityId": "c114aa68ebaae3a2", "scanner": "scanner-primary", "fingerprint": "41419a78264ba5db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26f40ca39aa15fc6", "level": "none", "message": {"text": "Commented-code block (7 lines) in client/src/pages/Profile.tsx:39"}, "properties": {"repobilityId": "e336d5786df6c36c", "scanner": "scanner-primary", "fingerprint": "26f40ca39aa15fc6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe3749c23b67018f", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/middleware/botProtection.ts:8"}, "properties": {"repobilityId": "545ea91e97697004", "scanner": "scanner-primary", "fingerprint": "fe3749c23b67018f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46f31f0f3e04e98b", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/src/routes/auth.routes.ts:52"}, "properties": {"repobilityId": "95b5ec482ef06323", "scanner": "scanner-primary", "fingerprint": "46f31f0f3e04e98b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c8e4de8d21ffa53", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/src/validation/common.ts:5"}, "properties": {"repobilityId": "a8fa7e828e645eb3", "scanner": "scanner-primary", "fingerprint": "5c8e4de8d21ffa53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0965e3ea419bcbb", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/src/services/storage.ts:164"}, "properties": {"repobilityId": "f1600f560df0874a", "scanner": "scanner-primary", "fingerprint": "b0965e3ea419bcbb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2eafc3188c36bb02", "level": "none", "message": {"text": "3 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "bd934ba112b02ffa", "scanner": "scanner-primary", "fingerprint": "2eafc3188c36bb02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-66a0e29b3b314ea4", "level": "warning", "message": {"text": "Frontend route `/landing` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "a703fab60cf168d7", "scanner": "scanner-primary", "fingerprint": "66a0e29b3b314ea4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1ce3fadde1bd9512", "level": "warning", "message": {"text": "Frontend route `/verify-email` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "7360c44b26ec3c80", "scanner": "scanner-primary", "fingerprint": "1ce3fadde1bd9512", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-270bca32d3c6d67a", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "24fd4c93be04a967", "scanner": "scanner-primary", "fingerprint": "270bca32d3c6d67a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d578319a21342dc1", "level": "warning", "message": {"text": "Frontend route `/handover/consent` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "cc22fa624a239488", "scanner": "scanner-primary", "fingerprint": "d578319a21342dc1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e57fcdb04507ef07", "level": "warning", "message": {"text": "Frontend route `home` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "7d1ad95763890c21", "scanner": "scanner-primary", "fingerprint": "e57fcdb04507ef07", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ced8b64826a882e8", "level": "warning", "message": {"text": "Frontend route `explore` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "7b7537aa8a17eb7d", "scanner": "scanner-primary", "fingerprint": "ced8b64826a882e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6d906ef7b6ebaebe", "level": "warning", "message": {"text": "Frontend route `tournaments` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "cd56bbc617ea8eee", "scanner": "scanner-primary", "fingerprint": "6d906ef7b6ebaebe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cd22735b0d7f8464", "level": "warning", "message": {"text": "Frontend route `tournaments/:id/register` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "de5d8cb91dd9047e", "scanner": "scanner-primary", "fingerprint": "cd22735b0d7f8464", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9991d58254b1a27c", "level": "warning", "message": {"text": "Frontend route `teams/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "6e1218a18fcdb358", "scanner": "scanner-primary", "fingerprint": "9991d58254b1a27c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2ec0ebc7e1730685", "level": "warning", "message": {"text": "Frontend route `rankings` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "abd0d9385d54f406", "scanner": "scanner-primary", "fingerprint": "2ec0ebc7e1730685", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-402be67d220a1809", "level": "warning", "message": {"text": "Frontend route `announcements` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "717e6bb0ef33cd92", "scanner": "scanner-primary", "fingerprint": "402be67d220a1809", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-743b58d25ddce747", "level": "warning", "message": {"text": "Frontend route `messages` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "fe000f362b8048a7", "scanner": "scanner-primary", "fingerprint": "743b58d25ddce747", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-84b35aa6fd926494", "level": "warning", "message": {"text": "Frontend route `notifications` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "77839d51f41a8ad1", "scanner": "scanner-primary", "fingerprint": "84b35aa6fd926494", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e7a3ba1f25824324", "level": "warning", "message": {"text": "Frontend route `grow` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "ece8c5cab6bbacda", "scanner": "scanner-primary", "fingerprint": "e7a3ba1f25824324", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d0106ab56945e8b3", "level": "warning", "message": {"text": "Frontend route `profile/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "58fe7e770be23567", "scanner": "scanner-primary", "fingerprint": "d0106ab56945e8b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-630f7cf411a7e65a", "level": "warning", "message": {"text": "Frontend route `profile/edit` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "87cea4fcbc17c2c3", "scanner": "scanner-primary", "fingerprint": "630f7cf411a7e65a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d49fcc58073b94b7", "level": "warning", "message": {"text": "Frontend route `admin` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "b2166541652d8d24", "scanner": "scanner-primary", "fingerprint": "d49fcc58073b94b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bbb656b1d4ec8840", "level": "warning", "message": {"text": "Frontend route `admin/stat-tracker` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "f05bf6a3b19aeb80", "scanner": "scanner-primary", "fingerprint": "bbb656b1d4ec8840", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-73da776df31d0fd6", "level": "warning", "message": {"text": "Frontend route `admin/stat-tracker/:tournamentId` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "c98cfb187e3d04ee", "scanner": "scanner-primary", "fingerprint": "73da776df31d0fd6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a35093e136ddab0d", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "9fd205c2a1e95fb9", "scanner": "scanner-primary", "fingerprint": "a35093e136ddab0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c5384df563ff0d24", "level": "warning", "message": {"text": "Frontend route `saved` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "fcc3a6ae5f733bd7", "scanner": "scanner-primary", "fingerprint": "c5384df563ff0d24", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-af827e681a3c8e5d", "level": "warning", "message": {"text": "Frontend route `scout-copilot` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "0c6bc1244846230a", "scanner": "scanner-primary", "fingerprint": "af827e681a3c8e5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-66871d39e3b8c556", "level": "warning", "message": {"text": "Frontend route `/admin/stat-tracker/demo/:sport` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "73a8f39331c9fa43", "scanner": "scanner-primary", "fingerprint": "66871d39e3b8c556", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-391b88e2150f83ca", "level": "warning", "message": {"text": "Frontend route `/admin/stat-tracker/:tournamentId/match/:matchId` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "3b4a572788daa143", "scanner": "scanner-primary", "fingerprint": "391b88e2150f83ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9041dafb13fda95d", "level": "note", "message": {"text": "Unused endpoint: POST /messages/conversations"}, "properties": {"repobilityId": "f88751a1e858a7e0", "scanner": "scanner-primary", "fingerprint": "9041dafb13fda95d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cead848819ebc7e6", "level": "note", "message": {"text": "Unused endpoint: POST /posts/upload-url"}, "properties": {"repobilityId": "0bb49c9ce20b7d5b", "scanner": "scanner-primary", "fingerprint": "cead848819ebc7e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d38eae0b19ee450e", "level": "note", "message": {"text": "Unused endpoint: POST /posts"}, "properties": {"repobilityId": "1ac7be48ff93bcb6", "scanner": "scanner-primary", "fingerprint": "d38eae0b19ee450e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23a2588067ef76eb", "level": "note", "message": {"text": "Unused endpoint: GET /posts/saved"}, "properties": {"repobilityId": "5f189d2771ea2cad", "scanner": "scanner-primary", "fingerprint": "23a2588067ef76eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e5753c153b98a24", "level": "note", "message": {"text": "Unused endpoint: PUT /users/profile/banner"}, "properties": {"repobilityId": "af8ccad9e1d06f61", "scanner": "scanner-primary", "fingerprint": "8e5753c153b98a24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-26afc44750984200", "level": "note", "message": {"text": "Unused endpoint: GET /connections/requests"}, "properties": {"repobilityId": "29335f8125db53b5", "scanner": "scanner-primary", "fingerprint": "26afc44750984200", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cf8761ead55c7ff1", "level": "note", "message": {"text": "Unused endpoint: GET /connections/suggestions"}, "properties": {"repobilityId": "250dcec30f14af6a", "scanner": "scanner-primary", "fingerprint": "cf8761ead55c7ff1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ba468154b5550ed9", "level": "note", "message": {"text": "Unused endpoint: GET /messages/conversations"}, "properties": {"repobilityId": "3d36f2d73b4a9380", "scanner": "scanner-primary", "fingerprint": "ba468154b5550ed9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd159bd05997c05c", "level": "note", "message": {"text": "Unused endpoint: GET /admin/stats"}, "properties": {"repobilityId": "b945f900d80199bf", "scanner": "scanner-primary", "fingerprint": "dd159bd05997c05c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0f6c5e1b82ddba36", "level": "note", "message": {"text": "Unused endpoint: POST /admin/create-admin"}, "properties": {"repobilityId": "cda1df0c97e47428", "scanner": "scanner-primary", "fingerprint": "0f6c5e1b82ddba36", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e6bcaeb07e406a1", "level": "note", "message": {"text": "Unused endpoint: GET /tournaments?limit=50"}, "properties": {"repobilityId": "669f048fa97d2e79", "scanner": "scanner-primary", "fingerprint": "4e6bcaeb07e406a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f78f36468b729293", "level": "note", "message": {"text": "Unused endpoint: POST /tournaments"}, "properties": {"repobilityId": "9e38e9b69f45cbf2", "scanner": "scanner-primary", "fingerprint": "f78f36468b729293", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c7d57ce82505f0b", "level": "note", "message": {"text": "Unused endpoint: PUT /users/profile"}, "properties": {"repobilityId": "feacc3d4bfecd370", "scanner": "scanner-primary", "fingerprint": "8c7d57ce82505f0b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-94c5c6d061675d36", "level": "note", "message": {"text": "Unused endpoint: GET /announcements"}, "properties": {"repobilityId": "a4059b1b377578e3", "scanner": "scanner-primary", "fingerprint": "94c5c6d061675d36", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e27c360ebee473b", "level": "note", "message": {"text": "Unused endpoint: POST /announcements"}, "properties": {"repobilityId": "729aee2a7ca22d97", "scanner": "scanner-primary", "fingerprint": "5e27c360ebee473b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-386845289ca0b11c", "level": "note", "message": {"text": "Unused endpoint: GET /stats/athletes"}, "properties": {"repobilityId": "d30af7b530ac3572", "scanner": "scanner-primary", "fingerprint": "386845289ca0b11c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f29da06358b9582", "level": "note", "message": {"text": "Unused endpoint: POST /auth/handover/consent"}, "properties": {"repobilityId": "44444862ab82f694", "scanner": "scanner-primary", "fingerprint": "4f29da06358b9582", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01e96993c51b4d1e", "level": "note", "message": {"text": "Unused endpoint: GET /users/blocked"}, "properties": {"repobilityId": "1b554861e6a9188d", "scanner": "scanner-primary", "fingerprint": "01e96993c51b4d1e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-df3287de54415eba", "level": "note", "message": {"text": "Unused endpoint: PATCH /users/settings/notifications"}, "properties": {"repobilityId": "9d38a28775ed6be7", "scanner": "scanner-primary", "fingerprint": "df3287de54415eba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dcb9f43d4b1d7d0c", "level": "note", "message": {"text": "Unused endpoint: POST /auth/handover/request"}, "properties": {"repobilityId": "0c9c2008c23dc4e8", "scanner": "scanner-primary", "fingerprint": "dcb9f43d4b1d7d0c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6769403a32c62b53", "level": "note", "message": {"text": "Unused endpoint: POST /auth/handover/complete"}, "properties": {"repobilityId": "59707d2fe9904a9f", "scanner": "scanner-primary", "fingerprint": "6769403a32c62b53", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-888dc12be3239ded", "level": "note", "message": {"text": "Unused endpoint: DELETE /users/account"}, "properties": {"repobilityId": "6d6177a8d8cf4946", "scanner": "scanner-primary", "fingerprint": "888dc12be3239ded", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-575ee17b52b227c5", "level": "note", "message": {"text": "Unused endpoint: POST /users/settings/verify-phone"}, "properties": {"repobilityId": "c0758cd68f19bfe2", "scanner": "scanner-primary", "fingerprint": "575ee17b52b227c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c9a7c59a4096ef36", "level": "note", "message": {"text": "Unused endpoint: PATCH /notifications/read-all"}, "properties": {"repobilityId": "93c5f3bab518e972", "scanner": "scanner-primary", "fingerprint": "c9a7c59a4096ef36", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b9d10b90eb19dc5", "level": "note", "message": {"text": "Unused endpoint: POST /scout-copilot"}, "properties": {"repobilityId": "76b78446769a15b2", "scanner": "scanner-primary", "fingerprint": "1b9d10b90eb19dc5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a770f2c42555b943", "level": "note", "message": {"text": "Unused endpoint: POST /highlights"}, "properties": {"repobilityId": "b5210028895ec8a5", "scanner": "scanner-primary", "fingerprint": "a770f2c42555b943", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c1b5735888cf592", "level": "note", "message": {"text": "Unused endpoint: GET /notifications?limit=1"}, "properties": {"repobilityId": "e36ff8b83658013c", "scanner": "scanner-primary", "fingerprint": "0c1b5735888cf592", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b43e4b1bbcea3bfb", "level": "note", "message": {"text": "Unused endpoint: GET /messages/unread-count"}, "properties": {"repobilityId": "cb13fc2dbb86168b", "scanner": "scanner-primary", "fingerprint": "b43e4b1bbcea3bfb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b3f34c73e51a50b3", "level": "note", "message": {"text": "Unused endpoint: POST /tracker/sessions"}, "properties": {"repobilityId": "aed4f53b868c8d35", "scanner": "scanner-primary", "fingerprint": "b3f34c73e51a50b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "b6c02166ba88fa20", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "183047b8293f0f49", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "4c21c6bc22d52f1c", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4ff40cb10f7c8519", "level": "note", "message": {"text": "Unused endpoint: USE /api/users"}, "properties": {"repobilityId": "970b5f4e57916a24", "scanner": "scanner-primary", "fingerprint": "4ff40cb10f7c8519", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b625bd59c0654e2f", "level": "note", "message": {"text": "Unused endpoint: USE /api/connections"}, "properties": {"repobilityId": "9d2c6c1c74becb09", "scanner": "scanner-primary", "fingerprint": "b625bd59c0654e2f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e9fa90a8df48b4b", "level": "note", "message": {"text": "Unused endpoint: USE /api/highlights"}, "properties": {"repobilityId": "768e06c9fbb5e083", "scanner": "scanner-primary", "fingerprint": "8e9fa90a8df48b4b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1be44d2cc9b65154", "level": "note", "message": {"text": "Unused endpoint: USE /api/posts"}, "properties": {"repobilityId": "aaaf8cca1ae8d3f1", "scanner": "scanner-primary", "fingerprint": "1be44d2cc9b65154", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d95f6b6be4decff8", "level": "note", "message": {"text": "Unused endpoint: USE /api/feed"}, "properties": {"repobilityId": "a631a9c3031600b3", "scanner": "scanner-primary", "fingerprint": "d95f6b6be4decff8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-95d83ea4b1a04d3d", "level": "note", "message": {"text": "Unused endpoint: USE /api/teams"}, "properties": {"repobilityId": "7c103da362691fb0", "scanner": "scanner-primary", "fingerprint": "95d83ea4b1a04d3d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5b450d5b20ee9793", "level": "note", "message": {"text": "Unused endpoint: USE /api/tournaments"}, "properties": {"repobilityId": "06806d43ae5d2235", "scanner": "scanner-primary", "fingerprint": "5b450d5b20ee9793", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-592c06f9e6f78cbd", "level": "note", "message": {"text": "Unused endpoint: USE /api/rankings"}, "properties": {"repobilityId": "20efc765c1ad17ae", "scanner": "scanner-primary", "fingerprint": "592c06f9e6f78cbd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7222c1377806c38f", "level": "note", "message": {"text": "Unused endpoint: USE /api/announcements"}, "properties": {"repobilityId": "426fb30b6b85b4a4", "scanner": "scanner-primary", "fingerprint": "7222c1377806c38f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3a8b7932f72b92f", "level": "note", "message": {"text": "Unused endpoint: USE /api/notifications"}, "properties": {"repobilityId": "6f72bbf0172cb9fd", "scanner": "scanner-primary", "fingerprint": "c3a8b7932f72b92f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a300508c4edb651", "level": "note", "message": {"text": "Unused endpoint: USE /api/messages"}, "properties": {"repobilityId": "010ef7044e1f5138", "scanner": "scanner-primary", "fingerprint": "9a300508c4edb651", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d93a530ce10d47d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin"}, "properties": {"repobilityId": "e6043ca70dab8c1f", "scanner": "scanner-primary", "fingerprint": "d93a530ce10d47d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-624b07500a25228c", "level": "note", "message": {"text": "Unused endpoint: USE /api/scout-copilot"}, "properties": {"repobilityId": "d80419c55f25a9a1", "scanner": "scanner-primary", "fingerprint": "624b07500a25228c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06c88a2e2dc65557", "level": "note", "message": {"text": "Unused endpoint: USE /api/stats"}, "properties": {"repobilityId": "d850093f806d6290", "scanner": "scanner-primary", "fingerprint": "06c88a2e2dc65557", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e4f1b62219aa9fde", "level": "note", "message": {"text": "Unused endpoint: USE /api/tracker"}, "properties": {"repobilityId": "672897f73b6f4e35", "scanner": "scanner-primary", "fingerprint": "e4f1b62219aa9fde", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1d2f7fecff5fc79a", "level": "note", "message": {"text": "Unused endpoint: POST /foo"}, "properties": {"repobilityId": "8730f5eb1a16f046", "scanner": "scanner-primary", "fingerprint": "1d2f7fecff5fc79a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-735042cc20eb744a", "level": "note", "message": {"text": "Unused endpoint: POST /follow/:userId"}, "properties": {"repobilityId": "ed340d5bedc8faee", "scanner": "scanner-primary", "fingerprint": "735042cc20eb744a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ad2149f43658f4f", "level": "note", "message": {"text": "Unused endpoint: DELETE /unfollow/:userId"}, "properties": {"repobilityId": "f76a3d35d6fbff3d", "scanner": "scanner-primary", "fingerprint": "7ad2149f43658f4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}