{"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-52c9bbcf06ae7070", "name": "Stray `console.log` in TS/JS \u2014 worker/src/index.ts:1511", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/src/index.ts:1511"}, "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-a739044fed20f437", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/NavBar.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/NavBar.tsx:91"}, "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-f5caf22cc7153bda", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/predictions/BatchPredictForm.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/predictions/BatchPredictForm.tsx:183"}, "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-e69dc7352288b8ba", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/predictions/PredictionCard.tsx:287", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/predictions/PredictionCard.tsx:287"}, "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-0b7c12173f9762ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/match/MatchCard.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/match/MatchCard.tsx:66"}, "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-84c85051bc4e5d80", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/match/GroupTable.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/match/GroupTable.tsx:71"}, "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-da9c9d8d1ea7dbcd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/activity/ActivityFeed.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/activity/ActivityFeed.tsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-491f2821c6d8bf82", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/Accordion.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/Accordion.tsx:47"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-004cee2e98c4ac33", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/hero/GroupStagePhase.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/hero/GroupStagePhase.tsx:65"}, "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-773ef0608ef5d9a5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/hero/KnockoutsPhase.tsx:401", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/hero/KnockoutsPhase.tsx:401"}, "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-e501e61e6d876eb4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/hero/PostFinalPhase.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/hero/PostFinalPhase.tsx:185"}, "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-ce335bb7c4dacec1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/pool/PoolRecap.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pool/PoolRecap.tsx:204"}, "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-e619f4c9bc9b1277", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/pool/WallOfFame.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pool/WallOfFame.tsx:213"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-473e53ba1e03f5d7", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/bracketResolver.test.ts:326", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/bracketResolver.test.ts:326"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2ee420e1a900528", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/StandingsPage.tsx:332", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/StandingsPage.tsx:332"}, "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-f21ca42d5335733c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/LeaderboardPage.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/LeaderboardPage.tsx:192"}, "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-ae01704640271b4e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/HomePage.tsx:537", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/HomePage.tsx:537"}, "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-6fce00d902a57986", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/MatchDetailPage.tsx:288", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/MatchDetailPage.tsx:288"}, "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-e201bcadf81f82a0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ProfilePage.tsx:586", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ProfilePage.tsx:586"}, "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-75117d13121b3cf2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BracketPage.tsx:442", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BracketPage.tsx:442"}, "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-6e5d9ded2971d911", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PoolsPage.tsx:496", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PoolsPage.tsx:496"}, "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-20d8c9d1357da7c0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CompetitionHub.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CompetitionHub.tsx:89"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2062531e2c8211e6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OverviewTab.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OverviewTab.tsx:307"}, "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-7c524a260eccb72a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TeamPage.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TeamPage.tsx:193"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af839c7f4061463b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/WatchPage.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/WatchPage.tsx:102"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-358d83e3e73dd320", "name": "Insecure pattern 'cors_wildcard' in worker/src/index.ts:3692", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in worker/src/index.ts:3692"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-64192a3c67110d01", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a9d8f9ae0f5e6ac0", "name": "Very large file: worker/src/index.ts (4583 lines)", "shortDescription": {"text": "Very large file: worker/src/index.ts (4583 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-2abca897ee2f2576", "name": "Very large file: src/pages/MatchDetailPage.tsx (1358 lines)", "shortDescription": {"text": "Very large file: src/pages/MatchDetailPage.tsx (1358 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-7ee99ee865dbede1", "name": "Very large file: src/pages/TeamPage.tsx (1725 lines)", "shortDescription": {"text": "Very large file: src/pages/TeamPage.tsx (1725 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-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 24 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 51 placeholder/mock markers across 18 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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. 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-c68eff76d1bac487", "name": "Commented-code block (11 lines) in worker/src/index.ts:369", "shortDescription": {"text": "Commented-code block (11 lines) in worker/src/index.ts:369"}, "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-4e4b0626299b6b17", "name": "`fetch()` without try/.catch or AbortSignal \u2014 worker/src/index.ts:571", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/src/index.ts:571"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9dcf5e4b14d5f683", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/predictions/PredictionHeatmap.tsx:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/predictions/PredictionHeatmap.tsx:34"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae025241fada87e9", "name": "Commented-code block (5 lines) in src/components/match/MatchCard.tsx:416", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/match/MatchCard.tsx:416"}, "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-c6413dbec6ea86da", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/notifications.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/notifications.ts:56"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f69da11fc1768466", "name": "Commented-code block (5 lines) in src/lib/scoring.test.ts:42", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/scoring.test.ts:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a14f832477ba076c", "name": "Commented-code block (5 lines) in src/lib/badges.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/badges.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1595f89a913f500", "name": "Commented-code block (5 lines) in src/pages/MatchDetailPage.tsx:1057", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/MatchDetailPage.tsx:1057"}, "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-fe74b9d38cf373fd", "name": "Commented-code block (5 lines) in src/pages/PredictionsPage.tsx:128", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/PredictionsPage.tsx:128"}, "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-221b108fedbee04a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useLeaderboard.ts:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useLeaderboard.ts:78"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-23f8d46b699871a4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/usePools.ts:107", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/usePools.ts:107"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-be8c8dd67b07a544", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useReactions.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useReactions.ts:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e4fd549b5a09ecd8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useConsensus.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useConsensus.ts:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11ef2a288bfe3695", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useActivityFeed.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useActivityFeed.ts:25"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f6491db462b728bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/usePredictions.ts:162", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/usePredictions.ts:162"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-26dab46507101ec7", "name": "Frontend route `:competition` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `:competition` has no Link/navigate to it \u2014 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-f0d80347972d2d00", "name": "Frontend route `match/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `match/:id` has no Link/navigate to it \u2014 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-bc4ca40992c61c01", "name": "Frontend route `team/:teamId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `team/:teamId` has no Link/navigate to it \u2014 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-9a95c0d0b6ae196b", "name": "Frontend route `pool/:joinCode` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `pool/:joinCode` has no Link/navigate to it \u2014 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-14c7bfdb04a6c574", "name": "Frontend route `news/:slug` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `news/:slug` has no Link/navigate to it \u2014 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-11feb210c2f50b50", "name": "Frontend route `profile` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 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-13369518714f94a8", "name": "Frontend route `watch` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `watch` has no Link/navigate to it \u2014 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-e8aca74fd784b9f2", "name": "Frontend route `sign-in` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `sign-in` has no Link/navigate to it \u2014 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-5c5fb8eea6cbc8ba", "name": "Frontend route `admin` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admin` has no Link/navigate to it \u2014 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-fdd80686930a9d48", "name": "Frontend route `terms` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `terms` has no Link/navigate to it \u2014 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-2909e8d8f64f6992", "name": "Frontend route `privacy` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `privacy` has no Link/navigate to it \u2014 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-f4c35086f9f74750", "name": "Frontend route `help` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `help` has no Link/navigate to it \u2014 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-ebffbaa853292f5a", "name": "Frontend route `contact` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `contact` has no Link/navigate to it \u2014 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-f1294228f4a6ad0c", "name": "Dangling fetch: POST https://${host}/api/${projectId}/store/?sentry_key=${key}&sentry_version=7 (worker/src/index.ts:777", "shortDescription": {"text": "Dangling fetch: POST https://${host}/api/${projectId}/store/?sentry_key=${key}&sentry_version=7 (worker/src/index.ts:777)"}, "fullDescription": {"text": "`worker/src/index.ts:777` calls `POST https://${host}/api/${projectId}/store/?sentry_key=${key}&sentry_version=7` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>/api/<p>/store`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e0e2045ddba3598d", "name": "Dangling fetch: POST https://api.resend.com/emails (worker/src/index.ts:4389)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (worker/src/index.ts:4389)"}, "fullDescription": {"text": "`worker/src/index.ts:4389` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b8073f7bf758f6d0", "name": "Unused endpoint: USE /api/*", "shortDescription": {"text": "Unused endpoint: USE /api/*"}, "fullDescription": {"text": "`worker/src/index.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-31eb8c00528e5f1d", "name": "Unused endpoint: GET /api/competitions", "shortDescription": {"text": "Unused endpoint: GET /api/competitions"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/competitions` 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-974a3eaa1bc4d9bb", "name": "Unused endpoint: GET /api/live", "shortDescription": {"text": "Unused endpoint: GET /api/live"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/live` 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-5f48eb84164778be", "name": "Unused endpoint: GET /api/admin/trigger-news", "shortDescription": {"text": "Unused endpoint: GET /api/admin/trigger-news"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/admin/trigger-news` 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-9980366a08471a7a", "name": "Unused endpoint: GET /api/admin/backfill-scrape", "shortDescription": {"text": "Unused endpoint: GET /api/admin/backfill-scrape"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/admin/backfill-scrape` 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-ece9facd8d4af5e3", "name": "Unused endpoint: GET /api/admin/backfill-summarize", "shortDescription": {"text": "Unused endpoint: GET /api/admin/backfill-summarize"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/admin/backfill-summarize` 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-8a4ac10a024740d5", "name": "Unused endpoint: GET /api/admin/backfill-translate", "shortDescription": {"text": "Unused endpoint: GET /api/admin/backfill-translate"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/admin/backfill-translate` 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-b221c8af84303418", "name": "Unused endpoint: GET /api/admin/populate", "shortDescription": {"text": "Unused endpoint: GET /api/admin/populate"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/admin/populate` 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-633ac3dde43db91c", "name": "Unused endpoint: GET /api/:comp/scores", "shortDescription": {"text": "Unused endpoint: GET /api/:comp/scores"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/:comp/scores` 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-3f3742ef421303c0", "name": "Unused endpoint: GET /api/:comp/standings", "shortDescription": {"text": "Unused endpoint: GET /api/:comp/standings"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/:comp/standings` 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-42869a1f5be81af5", "name": "Unused endpoint: GET /api/:comp/match/:id", "shortDescription": {"text": "Unused endpoint: GET /api/:comp/match/:id"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/:comp/match/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f7a4c065e6ed63c0", "name": "Unused endpoint: GET /api/:comp/matches", "shortDescription": {"text": "Unused endpoint: GET /api/:comp/matches"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/:comp/matches` 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-b6fc6f4ca08855f8", "name": "Unused endpoint: GET /api/:comp/teams", "shortDescription": {"text": "Unused endpoint: GET /api/:comp/teams"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/:comp/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-4093319bd9b0104d", "name": "Unused endpoint: GET /api/team/:teamId/photos", "shortDescription": {"text": "Unused endpoint: GET /api/team/:teamId/photos"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/team/:teamId/photos` 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-5dee551e105a2a01", "name": "Unused endpoint: POST /api/score", "shortDescription": {"text": "Unused endpoint: POST /api/score"}, "fullDescription": {"text": "`worker/src/index.ts` declares `POST /api/score` 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-370f2c80321a64be", "name": "Unused endpoint: GET /api/player-photo/:playerId", "shortDescription": {"text": "Unused endpoint: GET /api/player-photo/:playerId"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/player-photo/:playerId` 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-d25d7e5e7bd938c9", "name": "Unused endpoint: GET /api/scores", "shortDescription": {"text": "Unused endpoint: GET /api/scores"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/scores` 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-71fe2b6c2f43107b", "name": "Unused endpoint: GET /api/standings", "shortDescription": {"text": "Unused endpoint: GET /api/standings"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/standings` 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-4c911334efce24ab", "name": "Unused endpoint: GET /api/match/:id", "shortDescription": {"text": "Unused endpoint: GET /api/match/:id"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/match/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1223a96b92f3f557", "name": "Unused endpoint: GET /api/match/:id/detail", "shortDescription": {"text": "Unused endpoint: GET /api/match/:id/detail"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/match/:id/detail` 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-7ca5b0f08fcc73bc", "name": "Unused endpoint: GET /api/h2h/:id", "shortDescription": {"text": "Unused endpoint: GET /api/h2h/:id"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/h2h/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fba39f4004582dbd", "name": "Unused endpoint: GET /api/:comp/scorers", "shortDescription": {"text": "Unused endpoint: GET /api/:comp/scorers"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/:comp/scorers` 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-778f45a124dbd2e7", "name": "Unused endpoint: GET /api/news", "shortDescription": {"text": "Unused endpoint: GET /api/news"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/news` 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-f98729b6bb25390c", "name": "Unused endpoint: GET /api/news/:slug", "shortDescription": {"text": "Unused endpoint: GET /api/news/:slug"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/news/:slug` 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-e358971cad3cc194", "name": "Unused endpoint: GET /api/news/:slug/translate", "shortDescription": {"text": "Unused endpoint: GET /api/news/:slug/translate"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/news/:slug/translate` 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-fc33c6bf75a938ef", "name": "Unused endpoint: GET /api/:comp/news", "shortDescription": {"text": "Unused endpoint: GET /api/:comp/news"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/:comp/news` 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-65f8292f6cc55e66", "name": "Unused endpoint: GET /api/team/:teamId/news", "shortDescription": {"text": "Unused endpoint: GET /api/team/:teamId/news"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/team/:teamId/news` 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-08d9ecd397f99f1f", "name": "Unused endpoint: GET /api/diag", "shortDescription": {"text": "Unused endpoint: GET /api/diag"}, "fullDescription": {"text": "`worker/src/index.ts` declares `GET /api/diag` 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": "`worker/src/index.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-3bfb58e3fa4d13a5", "name": "Unused endpoint: POST /api/contact", "shortDescription": {"text": "Unused endpoint: POST /api/contact"}, "fullDescription": {"text": "`worker/src/index.ts` declares `POST /api/contact` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c622e6243ccd6e0a", "name": "Unused endpoint: POST /api/push/subscribe", "shortDescription": {"text": "Unused endpoint: POST /api/push/subscribe"}, "fullDescription": {"text": "`worker/src/index.ts` declares `POST /api/push/subscribe` 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-81560ec224758e3e", "name": "Unused endpoint: POST /api/push/test", "shortDescription": {"text": "Unused endpoint: POST /api/push/test"}, "fullDescription": {"text": "`worker/src/index.ts` declares `POST /api/push/test` 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/23119"}, "properties": {"repository": "YamanAddas/YancoCup", "repoUrl": "https://github.com/YamanAddas/YancoCup", "branch": "main"}, "results": [{"ruleId": "scanner-52c9bbcf06ae7070", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/src/index.ts:1511"}, "properties": {"repobilityId": "9d920df95db5924f", "scanner": "scanner-primary", "fingerprint": "52c9bbcf06ae7070", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a739044fed20f437", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/NavBar.tsx:91"}, "properties": {"repobilityId": "18465052aae0c91d", "scanner": "scanner-primary", "fingerprint": "a739044fed20f437", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f5caf22cc7153bda", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/predictions/BatchPredictForm.tsx:183"}, "properties": {"repobilityId": "05bf85cc5b652406", "scanner": "scanner-primary", "fingerprint": "f5caf22cc7153bda", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e69dc7352288b8ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/predictions/PredictionCard.tsx:287"}, "properties": {"repobilityId": "c8d03954eec8ecc7", "scanner": "scanner-primary", "fingerprint": "e69dc7352288b8ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0b7c12173f9762ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/match/MatchCard.tsx:66"}, "properties": {"repobilityId": "88c87dca2db4eece", "scanner": "scanner-primary", "fingerprint": "0b7c12173f9762ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84c85051bc4e5d80", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/match/GroupTable.tsx:71"}, "properties": {"repobilityId": "b4be8b791b0784ab", "scanner": "scanner-primary", "fingerprint": "84c85051bc4e5d80", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da9c9d8d1ea7dbcd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/activity/ActivityFeed.tsx:93"}, "properties": {"repobilityId": "b216f081d6d893a2", "scanner": "scanner-primary", "fingerprint": "da9c9d8d1ea7dbcd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-491f2821c6d8bf82", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/Accordion.tsx:47"}, "properties": {"repobilityId": "dbcabf643921dc1a", "scanner": "scanner-primary", "fingerprint": "491f2821c6d8bf82", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-004cee2e98c4ac33", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/hero/GroupStagePhase.tsx:65"}, "properties": {"repobilityId": "8f08091c59c5d865", "scanner": "scanner-primary", "fingerprint": "004cee2e98c4ac33", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-773ef0608ef5d9a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/hero/KnockoutsPhase.tsx:401"}, "properties": {"repobilityId": "4e78bc7cf822d3d6", "scanner": "scanner-primary", "fingerprint": "773ef0608ef5d9a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e501e61e6d876eb4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/hero/PostFinalPhase.tsx:185"}, "properties": {"repobilityId": "ea37618d819eeca1", "scanner": "scanner-primary", "fingerprint": "e501e61e6d876eb4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce335bb7c4dacec1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pool/PoolRecap.tsx:204"}, "properties": {"repobilityId": "b194c239570613b3", "scanner": "scanner-primary", "fingerprint": "ce335bb7c4dacec1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e619f4c9bc9b1277", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pool/WallOfFame.tsx:213"}, "properties": {"repobilityId": "721baede4e7d817c", "scanner": "scanner-primary", "fingerprint": "e619f4c9bc9b1277", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-473e53ba1e03f5d7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/bracketResolver.test.ts:326"}, "properties": {"repobilityId": "78ad548afe531bf9", "scanner": "scanner-primary", "fingerprint": "473e53ba1e03f5d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f2ee420e1a900528", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/StandingsPage.tsx:332"}, "properties": {"repobilityId": "e0755aab18c2e4c2", "scanner": "scanner-primary", "fingerprint": "f2ee420e1a900528", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f21ca42d5335733c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/LeaderboardPage.tsx:192"}, "properties": {"repobilityId": "6724c3f6cb7c4cd9", "scanner": "scanner-primary", "fingerprint": "f21ca42d5335733c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae01704640271b4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/HomePage.tsx:537"}, "properties": {"repobilityId": "a039ee569fe4e0ac", "scanner": "scanner-primary", "fingerprint": "ae01704640271b4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6fce00d902a57986", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/MatchDetailPage.tsx:288"}, "properties": {"repobilityId": "ea79d53bc67c4b9d", "scanner": "scanner-primary", "fingerprint": "6fce00d902a57986", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e201bcadf81f82a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ProfilePage.tsx:586"}, "properties": {"repobilityId": "16027c4ce7b27cae", "scanner": "scanner-primary", "fingerprint": "e201bcadf81f82a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75117d13121b3cf2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BracketPage.tsx:442"}, "properties": {"repobilityId": "b3fc1bc26aacd6e9", "scanner": "scanner-primary", "fingerprint": "75117d13121b3cf2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e5d9ded2971d911", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PoolsPage.tsx:496"}, "properties": {"repobilityId": "cca219691a4dadb8", "scanner": "scanner-primary", "fingerprint": "6e5d9ded2971d911", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20d8c9d1357da7c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CompetitionHub.tsx:89"}, "properties": {"repobilityId": "c5aaa3bda05d2256", "scanner": "scanner-primary", "fingerprint": "20d8c9d1357da7c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2062531e2c8211e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OverviewTab.tsx:307"}, "properties": {"repobilityId": "b402d37b86d142ad", "scanner": "scanner-primary", "fingerprint": "2062531e2c8211e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c524a260eccb72a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TeamPage.tsx:193"}, "properties": {"repobilityId": "42f9c720a3ba1f25", "scanner": "scanner-primary", "fingerprint": "7c524a260eccb72a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af839c7f4061463b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/WatchPage.tsx:102"}, "properties": {"repobilityId": "266dd80932f02f10", "scanner": "scanner-primary", "fingerprint": "af839c7f4061463b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-358d83e3e73dd320", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in worker/src/index.ts:3692"}, "properties": {"repobilityId": "220f871ca200fb74", "scanner": "scanner-primary", "fingerprint": "358d83e3e73dd320", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/src/index.ts"}, "region": {"startLine": 3692}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "707ab51ca83fb7cc", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-64192a3c67110d01", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "87338a8bfcb6f435", "scanner": "scanner-primary", "fingerprint": "64192a3c67110d01", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a9d8f9ae0f5e6ac0", "level": "note", "message": {"text": "Very large file: worker/src/index.ts (4583 lines)"}, "properties": {"repobilityId": "b94e997eff4c1d39", "scanner": "scanner-primary", "fingerprint": "a9d8f9ae0f5e6ac0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2abca897ee2f2576", "level": "note", "message": {"text": "Very large file: src/pages/MatchDetailPage.tsx (1358 lines)"}, "properties": {"repobilityId": "eea2a46eb24732bf", "scanner": "scanner-primary", "fingerprint": "2abca897ee2f2576", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7ee99ee865dbede1", "level": "note", "message": {"text": "Very large file: src/pages/TeamPage.tsx (1725 lines)"}, "properties": {"repobilityId": "361e497fb8eb314c", "scanner": "scanner-primary", "fingerprint": "7ee99ee865dbede1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "4308a63fefced641", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "74555d71e642e823", "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": "d1f383104c2c80d0", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "eb831d7d9f8d1113", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "fdc96d10081f6a8c", "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": "e8746592219e6add", "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": "7c4ddd4bc9f89202", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-c68eff76d1bac487", "level": "none", "message": {"text": "Commented-code block (11 lines) in worker/src/index.ts:369"}, "properties": {"repobilityId": "b2209c20e22923d3", "scanner": "scanner-primary", "fingerprint": "c68eff76d1bac487", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e4b0626299b6b17", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/src/index.ts:571"}, "properties": {"repobilityId": "9af0d5d0a32b3ba7", "scanner": "scanner-primary", "fingerprint": "4e4b0626299b6b17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9dcf5e4b14d5f683", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/predictions/PredictionHeatmap.tsx:34"}, "properties": {"repobilityId": "e9dcb612f70b569f", "scanner": "scanner-primary", "fingerprint": "9dcf5e4b14d5f683", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ae025241fada87e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/match/MatchCard.tsx:416"}, "properties": {"repobilityId": "3682a21c4a1b43e3", "scanner": "scanner-primary", "fingerprint": "ae025241fada87e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6413dbec6ea86da", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/notifications.ts:56"}, "properties": {"repobilityId": "7f45e420410f9a6d", "scanner": "scanner-primary", "fingerprint": "c6413dbec6ea86da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f69da11fc1768466", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/scoring.test.ts:42"}, "properties": {"repobilityId": "1efafe7e6f92b8ba", "scanner": "scanner-primary", "fingerprint": "f69da11fc1768466", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a14f832477ba076c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/badges.test.ts:3"}, "properties": {"repobilityId": "c51e20470a1e922f", "scanner": "scanner-primary", "fingerprint": "a14f832477ba076c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e1595f89a913f500", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/MatchDetailPage.tsx:1057"}, "properties": {"repobilityId": "f333d47fa5185360", "scanner": "scanner-primary", "fingerprint": "e1595f89a913f500", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe74b9d38cf373fd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/PredictionsPage.tsx:128"}, "properties": {"repobilityId": "d382536975e07fcd", "scanner": "scanner-primary", "fingerprint": "fe74b9d38cf373fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-221b108fedbee04a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useLeaderboard.ts:78"}, "properties": {"repobilityId": "3bf481ec34e80531", "scanner": "scanner-primary", "fingerprint": "221b108fedbee04a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-23f8d46b699871a4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/usePools.ts:107"}, "properties": {"repobilityId": "21d7cae796876545", "scanner": "scanner-primary", "fingerprint": "23f8d46b699871a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-be8c8dd67b07a544", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useReactions.ts:27"}, "properties": {"repobilityId": "a79b7a90e29fc93a", "scanner": "scanner-primary", "fingerprint": "be8c8dd67b07a544", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e4fd549b5a09ecd8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useConsensus.ts:35"}, "properties": {"repobilityId": "6ab5b888e62150ba", "scanner": "scanner-primary", "fingerprint": "e4fd549b5a09ecd8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-11ef2a288bfe3695", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useActivityFeed.ts:25"}, "properties": {"repobilityId": "231364999b8504d9", "scanner": "scanner-primary", "fingerprint": "11ef2a288bfe3695", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f6491db462b728bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/usePredictions.ts:162"}, "properties": {"repobilityId": "962f0ae384db5322", "scanner": "scanner-primary", "fingerprint": "f6491db462b728bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-26dab46507101ec7", "level": "warning", "message": {"text": "Frontend route `:competition` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "0c14006ffa3912c6", "scanner": "scanner-primary", "fingerprint": "26dab46507101ec7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f0d80347972d2d00", "level": "warning", "message": {"text": "Frontend route `match/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "ecd16d92ec0d34d3", "scanner": "scanner-primary", "fingerprint": "f0d80347972d2d00", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bc4ca40992c61c01", "level": "warning", "message": {"text": "Frontend route `team/:teamId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "0a9c2ba925634fa3", "scanner": "scanner-primary", "fingerprint": "bc4ca40992c61c01", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9a95c0d0b6ae196b", "level": "warning", "message": {"text": "Frontend route `pool/:joinCode` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "41ec6694c92f72c7", "scanner": "scanner-primary", "fingerprint": "9a95c0d0b6ae196b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-14c7bfdb04a6c574", "level": "warning", "message": {"text": "Frontend route `news/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b180b84ca14bde62", "scanner": "scanner-primary", "fingerprint": "14c7bfdb04a6c574", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-11feb210c2f50b50", "level": "warning", "message": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "96c44ef5fce161fb", "scanner": "scanner-primary", "fingerprint": "11feb210c2f50b50", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-13369518714f94a8", "level": "warning", "message": {"text": "Frontend route `watch` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a94451d4dfa6a9fb", "scanner": "scanner-primary", "fingerprint": "13369518714f94a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e8aca74fd784b9f2", "level": "warning", "message": {"text": "Frontend route `sign-in` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "410657aa185e4a78", "scanner": "scanner-primary", "fingerprint": "e8aca74fd784b9f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5c5fb8eea6cbc8ba", "level": "warning", "message": {"text": "Frontend route `admin` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "e4d3d94b837b99bb", "scanner": "scanner-primary", "fingerprint": "5c5fb8eea6cbc8ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fdd80686930a9d48", "level": "warning", "message": {"text": "Frontend route `terms` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "fd7b1f8f0e2d7ac9", "scanner": "scanner-primary", "fingerprint": "fdd80686930a9d48", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2909e8d8f64f6992", "level": "warning", "message": {"text": "Frontend route `privacy` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a1d8a5eb1dc154bb", "scanner": "scanner-primary", "fingerprint": "2909e8d8f64f6992", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f4c35086f9f74750", "level": "warning", "message": {"text": "Frontend route `help` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "bc4d22eed5bd88d1", "scanner": "scanner-primary", "fingerprint": "f4c35086f9f74750", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ebffbaa853292f5a", "level": "warning", "message": {"text": "Frontend route `contact` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "feb5d71ebba47a54", "scanner": "scanner-primary", "fingerprint": "ebffbaa853292f5a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f1294228f4a6ad0c", "level": "error", "message": {"text": "Dangling fetch: POST https://${host}/api/${projectId}/store/?sentry_key=${key}&sentry_version=7 (worker/src/index.ts:777)"}, "properties": {"repobilityId": "daa22fb34b91577d", "scanner": "scanner-primary", "fingerprint": "f1294228f4a6ad0c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e0e2045ddba3598d", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (worker/src/index.ts:4389)"}, "properties": {"repobilityId": "15d43efc166567a0", "scanner": "scanner-primary", "fingerprint": "e0e2045ddba3598d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b8073f7bf758f6d0", "level": "note", "message": {"text": "Unused endpoint: USE /api/*"}, "properties": {"repobilityId": "be4ff52189dc06e1", "scanner": "scanner-primary", "fingerprint": "b8073f7bf758f6d0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-31eb8c00528e5f1d", "level": "note", "message": {"text": "Unused endpoint: GET /api/competitions"}, "properties": {"repobilityId": "a8dcc81a5a268298", "scanner": "scanner-primary", "fingerprint": "31eb8c00528e5f1d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-974a3eaa1bc4d9bb", "level": "note", "message": {"text": "Unused endpoint: GET /api/live"}, "properties": {"repobilityId": "dee47310796903b3", "scanner": "scanner-primary", "fingerprint": "974a3eaa1bc4d9bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5f48eb84164778be", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/trigger-news"}, "properties": {"repobilityId": "137f2fdf2090e5a0", "scanner": "scanner-primary", "fingerprint": "5f48eb84164778be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9980366a08471a7a", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/backfill-scrape"}, "properties": {"repobilityId": "f5ff4fd599d28acd", "scanner": "scanner-primary", "fingerprint": "9980366a08471a7a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ece9facd8d4af5e3", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/backfill-summarize"}, "properties": {"repobilityId": "5d2a63469320bec6", "scanner": "scanner-primary", "fingerprint": "ece9facd8d4af5e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a4ac10a024740d5", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/backfill-translate"}, "properties": {"repobilityId": "54bac27941b63cb1", "scanner": "scanner-primary", "fingerprint": "8a4ac10a024740d5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b221c8af84303418", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/populate"}, "properties": {"repobilityId": "3cdb7816c4e157be", "scanner": "scanner-primary", "fingerprint": "b221c8af84303418", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-633ac3dde43db91c", "level": "note", "message": {"text": "Unused endpoint: GET /api/:comp/scores"}, "properties": {"repobilityId": "d037904d53c20e09", "scanner": "scanner-primary", "fingerprint": "633ac3dde43db91c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f3742ef421303c0", "level": "note", "message": {"text": "Unused endpoint: GET /api/:comp/standings"}, "properties": {"repobilityId": "35ec424f29b247b3", "scanner": "scanner-primary", "fingerprint": "3f3742ef421303c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42869a1f5be81af5", "level": "note", "message": {"text": "Unused endpoint: GET /api/:comp/match/:id"}, "properties": {"repobilityId": "7212deacd15d14e7", "scanner": "scanner-primary", "fingerprint": "42869a1f5be81af5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f7a4c065e6ed63c0", "level": "note", "message": {"text": "Unused endpoint: GET /api/:comp/matches"}, "properties": {"repobilityId": "c82c9c219ac57419", "scanner": "scanner-primary", "fingerprint": "f7a4c065e6ed63c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b6fc6f4ca08855f8", "level": "note", "message": {"text": "Unused endpoint: GET /api/:comp/teams"}, "properties": {"repobilityId": "085e414d2b150a6e", "scanner": "scanner-primary", "fingerprint": "b6fc6f4ca08855f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4093319bd9b0104d", "level": "note", "message": {"text": "Unused endpoint: GET /api/team/:teamId/photos"}, "properties": {"repobilityId": "208e411ef7ba9cde", "scanner": "scanner-primary", "fingerprint": "4093319bd9b0104d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5dee551e105a2a01", "level": "note", "message": {"text": "Unused endpoint: POST /api/score"}, "properties": {"repobilityId": "084c1c03f5153c7b", "scanner": "scanner-primary", "fingerprint": "5dee551e105a2a01", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-370f2c80321a64be", "level": "note", "message": {"text": "Unused endpoint: GET /api/player-photo/:playerId"}, "properties": {"repobilityId": "f0e9106a6af38932", "scanner": "scanner-primary", "fingerprint": "370f2c80321a64be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d25d7e5e7bd938c9", "level": "note", "message": {"text": "Unused endpoint: GET /api/scores"}, "properties": {"repobilityId": "1a3a16a18cf3edfb", "scanner": "scanner-primary", "fingerprint": "d25d7e5e7bd938c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-71fe2b6c2f43107b", "level": "note", "message": {"text": "Unused endpoint: GET /api/standings"}, "properties": {"repobilityId": "1867ba5ff2c5d5bc", "scanner": "scanner-primary", "fingerprint": "71fe2b6c2f43107b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c911334efce24ab", "level": "note", "message": {"text": "Unused endpoint: GET /api/match/:id"}, "properties": {"repobilityId": "0a0fe64daed60ebf", "scanner": "scanner-primary", "fingerprint": "4c911334efce24ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1223a96b92f3f557", "level": "note", "message": {"text": "Unused endpoint: GET /api/match/:id/detail"}, "properties": {"repobilityId": "69462f258c8d1e13", "scanner": "scanner-primary", "fingerprint": "1223a96b92f3f557", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ca5b0f08fcc73bc", "level": "note", "message": {"text": "Unused endpoint: GET /api/h2h/:id"}, "properties": {"repobilityId": "b4ff8c0bddff889f", "scanner": "scanner-primary", "fingerprint": "7ca5b0f08fcc73bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fba39f4004582dbd", "level": "note", "message": {"text": "Unused endpoint: GET /api/:comp/scorers"}, "properties": {"repobilityId": "3ebcbab5167a82c8", "scanner": "scanner-primary", "fingerprint": "fba39f4004582dbd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-778f45a124dbd2e7", "level": "note", "message": {"text": "Unused endpoint: GET /api/news"}, "properties": {"repobilityId": "bc2f6fd1df0f3952", "scanner": "scanner-primary", "fingerprint": "778f45a124dbd2e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f98729b6bb25390c", "level": "note", "message": {"text": "Unused endpoint: GET /api/news/:slug"}, "properties": {"repobilityId": "3a245073524ea000", "scanner": "scanner-primary", "fingerprint": "f98729b6bb25390c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e358971cad3cc194", "level": "note", "message": {"text": "Unused endpoint: GET /api/news/:slug/translate"}, "properties": {"repobilityId": "278c1ad75bf96ca4", "scanner": "scanner-primary", "fingerprint": "e358971cad3cc194", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc33c6bf75a938ef", "level": "note", "message": {"text": "Unused endpoint: GET /api/:comp/news"}, "properties": {"repobilityId": "fce2c02dfffd807d", "scanner": "scanner-primary", "fingerprint": "fc33c6bf75a938ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-65f8292f6cc55e66", "level": "note", "message": {"text": "Unused endpoint: GET /api/team/:teamId/news"}, "properties": {"repobilityId": "d8d991266a996156", "scanner": "scanner-primary", "fingerprint": "65f8292f6cc55e66", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-08d9ecd397f99f1f", "level": "note", "message": {"text": "Unused endpoint: GET /api/diag"}, "properties": {"repobilityId": "76c940566eb8cd73", "scanner": "scanner-primary", "fingerprint": "08d9ecd397f99f1f", "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": "5371aa75af248644", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3bfb58e3fa4d13a5", "level": "note", "message": {"text": "Unused endpoint: POST /api/contact"}, "properties": {"repobilityId": "e4dea3e106f72f45", "scanner": "scanner-primary", "fingerprint": "3bfb58e3fa4d13a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c622e6243ccd6e0a", "level": "note", "message": {"text": "Unused endpoint: POST /api/push/subscribe"}, "properties": {"repobilityId": "3e05281195fbd182", "scanner": "scanner-primary", "fingerprint": "c622e6243ccd6e0a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-81560ec224758e3e", "level": "note", "message": {"text": "Unused endpoint: POST /api/push/test"}, "properties": {"repobilityId": "258ceadd791d8856", "scanner": "scanner-primary", "fingerprint": "81560ec224758e3e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}