{"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-cbcc6812867cd66a", "name": "Possibly dead Python function: spray_for", "shortDescription": {"text": "Possibly dead Python function: spray_for"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f7d485de731554e", "name": "Possibly dead Python function: norm_year", "shortDescription": {"text": "Possibly dead Python function: norm_year"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e74f06e31ab4977b", "name": "Possibly dead Python function: scrape_massey_ratings", "shortDescription": {"text": "Possibly dead Python function: scrape_massey_ratings"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-91cc683050d0b76c", "name": "Possibly dead Python function: scrape_nwac_standings", "shortDescription": {"text": "Possibly dead Python function: scrape_nwac_standings"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bba0bfb4f7defbbf", "name": "Possibly dead Python function: handle_starttag", "shortDescription": {"text": "Possibly dead Python function: handle_starttag"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dfd252fba395749b", "name": "Possibly dead Python function: handle_endtag", "shortDescription": {"text": "Possibly dead Python function: handle_endtag"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1924cbe4454fc6b", "name": "Possibly dead Python function: handle_data", "shortDescription": {"text": "Possibly dead Python function: handle_data"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb95215d5ea3ee74", "name": "Possibly dead Python function: fetch_one", "shortDescription": {"text": "Possibly dead Python function: fetch_one"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-91e89c1b56969b4e", "name": "Possibly dead Python function: norm_class", "shortDescription": {"text": "Possibly dead Python function: norm_class"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac8f5082a7dd7b8f", "name": "Possibly dead Python function: pos_factor", "shortDescription": {"text": "Possibly dead Python function: pos_factor"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b0de18ec1b4b633", "name": "Possibly dead Python function: draw", "shortDescription": {"text": "Possibly dead Python function: draw"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c05b0d90ea6610aa", "name": "Possibly dead Python function: afterFlowable", "shortDescription": {"text": "Possibly dead Python function: afterFlowable"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-adfb0c771eb16030", "name": "Possibly dead Python function: add_stats_grid", "shortDescription": {"text": "Possibly dead Python function: add_stats_grid"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8f6c26c642d5c7de", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0d66670a20f40904", "name": "Possibly dead Python function: render", "shortDescription": {"text": "Possibly dead Python function: render"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5c917442132126b6", "name": "Possibly dead Python function: explain", "shortDescription": {"text": "Possibly dead Python function: explain"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd7c1d70ebb84d41", "name": "Possibly dead Python function: t_leader_hr", "shortDescription": {"text": "Possibly dead Python function: t_leader_hr"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f973c09e468faf14", "name": "Possibly dead Python function: t_leader_rbi", "shortDescription": {"text": "Possibly dead Python function: t_leader_rbi"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ddf89a8aeffd4de2", "name": "Possibly dead Python function: t_leader_hits", "shortDescription": {"text": "Possibly dead Python function: t_leader_hits"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78d6d0615c1d2de0", "name": "Possibly dead Python function: t_leader_doubles", "shortDescription": {"text": "Possibly dead Python function: t_leader_doubles"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f80d82a4de06e9f", "name": "Possibly dead Python function: t_leader_triples", "shortDescription": {"text": "Possibly dead Python function: t_leader_triples"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d9db537fe681fd4", "name": "Possibly dead Python function: t_leader_sb", "shortDescription": {"text": "Possibly dead Python function: t_leader_sb"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d5789ed970c5311", "name": "Possibly dead Python function: t_leader_walks", "shortDescription": {"text": "Possibly dead Python function: t_leader_walks"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5159338fd5985915", "name": "Possibly dead Python function: t_leader_runs", "shortDescription": {"text": "Possibly dead Python function: t_leader_runs"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4b7b29ebd689da26", "name": "Possibly dead Python function: t_leader_pa", "shortDescription": {"text": "Possibly dead Python function: t_leader_pa"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-44c42fe959f73972", "name": "Possibly dead Python function: t_leader_owar", "shortDescription": {"text": "Possibly dead Python function: t_leader_owar"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-80a32c9081341b85", "name": "Possibly dead Python function: t_leader_avg", "shortDescription": {"text": "Possibly dead Python function: t_leader_avg"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a65c7069ecef7a73", "name": "Possibly dead Python function: t_leader_obp", "shortDescription": {"text": "Possibly dead Python function: t_leader_obp"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b92ccfa11812fb6", "name": "Possibly dead Python function: t_leader_slg", "shortDescription": {"text": "Possibly dead Python function: t_leader_slg"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c798cec5d3dc88bf", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Header.jsx:348", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Header.jsx:348"}, "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-7f859a2a4c70a2ac", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PlayerCompsCard.jsx:31", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PlayerCompsCard.jsx:31"}, "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-3343f94acf5eeefc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PortalTeamGate.jsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PortalTeamGate.jsx:140"}, "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-7c4e9e46238e51e7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CommitBadge.jsx:17", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CommitBadge.jsx:17"}, "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-d6c3fc13e7df91f4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PlayerTrackerTable.jsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PlayerTrackerTable.jsx:194"}, "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-fdb311d50269a506", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PortalHeader.jsx:266", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PortalHeader.jsx:266"}, "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-a1603e901297e0aa", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/home/StatWidgets.jsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/home/StatWidgets.jsx: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-f855b51f91c677ca", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/home/FeatureWidgets.jsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/home/FeatureWidgets.jsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-97facf7b22e082a6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/home/WidgetShell.jsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/home/WidgetShell.jsx:47"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ed9f8dd1360d5e3f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PortalHome.jsx:262", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PortalHome.jsx:262"}, "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-41cc3d86ecfdcd3f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/FavoritesPage.jsx:31", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/FavoritesPage.jsx:31"}, "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-4988421c3127bf30", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SummerTeamDetail.jsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SummerTeamDetail.jsx:53"}, "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-c8e4ae2c570573b2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamsPage.jsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamsPage.jsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26160ba9f09e681d", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/KeyMatchupGraphic.jsx:537", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/KeyMatchupGraphic.jsx:537"}, "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-6a30c0693b23ef12", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TopMoments.jsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TopMoments.jsx:196"}, "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-f7032857c2b337e5", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HometownSearch.jsx:159", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HometownSearch.jsx:159"}, "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-b1c912eb17108ca0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/CoachHomepage.jsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/CoachHomepage.jsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0cc6d3e259dde041", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamDetail.jsx:329", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamDetail.jsx:329"}, "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-eb533708a93047a2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayerComps.jsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayerComps.jsx:115"}, "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-94a022186fe0a90d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SummerGameDetail.jsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SummerGameDetail.jsx:164"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bee3949a6d37feed", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/StatLeaders.jsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/StatLeaders.jsx:74"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-89ee185bb81f77d7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DraftBoard.jsx:325", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DraftBoard.jsx:325"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13f298e1a6501b2e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PnwGrid.jsx:505", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PnwGrid.jsx:505"}, "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-0043e9321782c3ae", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/NewsCommitments.jsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/NewsCommitments.jsx:145"}, "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-60c978b125e7bab6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ScoutingSheet.jsx:202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ScoutingSheet.jsx:202"}, "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-7a01c1d559501c24", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamStatsPage.jsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamStatsPage.jsx:98"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3be74a3bd6c45603", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/BullpenSheet.jsx:236", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/BullpenSheet.jsx:236"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b3500badce1bebbe", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AnonymousHomepage.jsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AnonymousHomepage.jsx:304"}, "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-f63110d57f29db4e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PremiumHomepage.jsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PremiumHomepage.jsx:87"}, "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-a80023850c8351e7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RecruitingGuide.jsx:493", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RecruitingGuide.jsx:493"}, "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-4e4f5a502c1a1583", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/GameDetail.jsx:45", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/GameDetail.jsx:45"}, "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-a38ad7bc4ab422e3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamComparison.jsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamComparison.jsx:75"}, "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-d988cdc8ce1a0e24", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RecruitingHomepage.jsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RecruitingHomepage.jsx:137"}, "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-bd58a830fa9b4732", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayerCardPDF.jsx:808", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayerCardPDF.jsx:808"}, "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-dc45b7d84cda5635", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AllConferenceGenerator.jsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AllConferenceGenerator.jsx:89"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aec610b6974a2cd3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ParkFactors.jsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ParkFactors.jsx:126"}, "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-48bf859ac2df6e6f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/NwacAdvancement.jsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/NwacAdvancement.jsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9632a7fdbd225efb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProTracker.jsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProTracker.jsx:117"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d2bf7faedbb9220", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayoffProjections.jsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayoffProjections.jsx:128"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-03c8c619242e7fc1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Percentiles.jsx:241", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Percentiles.jsx:241"}, "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-ac27ac3813d8ee7a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/FreeHomepage.jsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/FreeHomepage.jsx:84"}, "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-29c34d54e5bfa1a6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamRatings.jsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamRatings.jsx:136"}, "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-3e8b68e245dda64b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/StandingsPage.jsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/StandingsPage.jsx:62"}, "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-1d35c03474007aa4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayerDetail.jsx:776", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayerDetail.jsx:776"}, "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-f028d854b84e193e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PortalPDFs.jsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PortalPDFs.jsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e0bc79eab821ec3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SummerHub.jsx:261", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SummerHub.jsx:261"}, "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-d886f2bb9500296c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamQuiz.jsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamQuiz.jsx:271"}, "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-dd1a163131a51b46", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HistoricMatchups.jsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HistoricMatchups.jsx:283"}, "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-398fa25f2bf12374", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/summer/SummerStatsPage.jsx:567", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/summer/SummerStatsPage.jsx:567"}, "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-08fe8c2658a49e62", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/portal/EmailComposer.jsx:482", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/portal/EmailComposer.jsx:482"}, "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-671ffa9e419d8a63", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/portal/ArticlesList.jsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/portal/ArticlesList.jsx:84"}, "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-1e8af6e668a2b32e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/DepthChart.jsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/DepthChart.jsx:215"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b24954e6156da5e9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/NewDynasty.jsx:1078", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/NewDynasty.jsx:1078"}, "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-25eea20d823b3420", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Dashboard.jsx:801", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Dashboard.jsx:801"}, "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-4e2dfc246a1e0649", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/WeeklyActions.jsx:493", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/WeeklyActions.jsx:493"}, "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-82ce4f0ea5a960ee", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/SummerBall.jsx:282", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/SummerBall.jsx:282"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2da0e535fe73cea2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Records.jsx:430", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Records.jsx:430"}, "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-115cddbfaf0ef3be", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Play.jsx:1457", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Play.jsx:1457"}, "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-40065b634515a027", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Postseason.jsx:646", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Postseason.jsx:646"}, "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-aa47c28c1c8f4af7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Career.jsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Career.jsx:285"}, "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-6520d49f36636a2a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Roster.jsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Roster.jsx:153"}, "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-300cf1ba17d3f850", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/gm/components/PixelSelect.jsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/gm/components/PixelSelect.jsx:96"}, "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-cb21e314ccb75223", "name": "Stray `console.log` in TS/JS \u2014 scripts/gm/generate_non_naia_teams.js:430", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gm/generate_non_naia_teams.js:430"}, "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-a088d6c8efd377d6", "name": "Insecure pattern 'cors_wildcard' in frontend/api/img.ts:144", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in frontend/api/img.ts:144"}, "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-ad9e929a56f163fb", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/signature.html:230", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/signature.html:230"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-10317a9a8ddf297a", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/pages/RecruitingMap.jsx:178", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/pages/RecruitingMap.jsx:178"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-94b8d0e16f520b08", "name": "Very large file: frontend/src/pages/WclLeaderboardGraphic.jsx (1134 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/WclLeaderboardGraphic.jsx (1134 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-4409fefa70b1074a", "name": "Very large file: frontend/src/pages/SocialGraphics.jsx (2054 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/SocialGraphics.jsx (2054 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-62faa187af6a5b62", "name": "Very large file: frontend/src/pages/About.jsx (1534 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/About.jsx (1534 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-20dabc2be92943ea", "name": "Very large file: frontend/src/pages/PlayerCardPDF.jsx (1245 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/PlayerCardPDF.jsx (1245 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-0c87d8592d1af92d", "name": "Very large file: frontend/src/pages/PlayerDetail.jsx (2135 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/PlayerDetail.jsx (2135 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-f507a0437999a868", "name": "Very large file: frontend/src/pages/SummerHub.jsx (1062 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/SummerHub.jsx (1062 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-50fdf18d8d1df8f2", "name": "Very large file: frontend/src/pages/gm/Recruiting.jsx (1584 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/gm/Recruiting.jsx (1584 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-a1c20d3b6303840f", "name": "Very large file: frontend/src/pages/gm/NewDynasty.jsx (1625 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/gm/NewDynasty.jsx (1625 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-9346995e7b338c26", "name": "Very large file: frontend/src/pages/gm/Dashboard.jsx (4034 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/gm/Dashboard.jsx (4034 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-1edf18159fc41463", "name": "Very large file: frontend/src/pages/gm/Play.jsx (2345 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/gm/Play.jsx (2345 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-b90abd0652c23639", "name": "Very large file: frontend/src/pages/gm/Postseason.jsx (1011 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/gm/Postseason.jsx (1011 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-598e552cc6b118cc", "name": "Very large file: frontend/src/gm/engine/sim.js (1165 lines)", "shortDescription": {"text": "Very large file: frontend/src/gm/engine/sim.js (1165 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-3e9134ea237d6ba2", "name": "Very large file: frontend/src/gm/engine/season.js (2079 lines)", "shortDescription": {"text": "Very large file: frontend/src/gm/engine/season.js (2079 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-d3977016f1da6f09", "name": "Very large file: frontend/src/gm/engine/events.js (1045 lines)", "shortDescription": {"text": "Very large file: frontend/src/gm/engine/events.js (1045 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-b4a4afe1c706dff9", "name": "Very large file: frontend/src/gm/engine/postseasonInteractive.js (1890 lines)", "shortDescription": {"text": "Very large file: frontend/src/gm/engine/postseasonInteractive.js (1890 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-bca372c385f7d13a", "name": "Very large file: frontend/src/gm/engine/newDynastyMultiLevel.js (1288 lines)", "shortDescription": {"text": "Very large file: frontend/src/gm/engine/newDynastyMultiLevel.js (1288 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-f66ca2cc7a3dcd6e", "name": "Very large file: frontend/src/gm/engine/recruits.js (1747 lines)", "shortDescription": {"text": "Very large file: frontend/src/gm/engine/recruits.js (1747 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-2cdbc5c8ed3f4df2", "name": "Very large file: frontend/src/gm/engine/schedule.js (1430 lines)", "shortDescription": {"text": "Very large file: frontend/src/gm/engine/schedule.js (1430 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-3fb9d571efd6a0e9", "name": "Very large file: frontend/src/gm/engine/randomEvents.js (3387 lines)", "shortDescription": {"text": "Very large file: frontend/src/gm/engine/randomEvents.js (3387 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-54dbea6378ce4312", "name": "Very large file: scripts/scrape_naia.py (1369 lines)", "shortDescription": {"text": "Very large file: scripts/scrape_naia.py (1369 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-887953f1d59d779e", "name": "Very large file: scripts/scrape_nwac.py (1659 lines)", "shortDescription": {"text": "Very large file: scripts/scrape_nwac.py (1659 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-10dc3330ef8c4904", "name": "Very large file: scripts/scrape_boxscores.py (3812 lines)", "shortDescription": {"text": "Very large file: scripts/scrape_boxscores.py (3812 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-50b256e1adabb327", "name": "Very large file: scripts/scrape_d3.py (1627 lines)", "shortDescription": {"text": "Very large file: scripts/scrape_d3.py (1627 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-d1336fdb03be8d06", "name": "Very large file: scripts/scrape_d2.py (1224 lines)", "shortDescription": {"text": "Very large file: scripts/scrape_d2.py (1224 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-d5cf7dab662631f9", "name": "Very large file: scripts/scrape_d1.py (1675 lines)", "shortDescription": {"text": "Very large file: scripts/scrape_d1.py (1675 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-5c1e96330df8db54", "name": "Very large file: scripts/projections/write_projections_db.py (1135 lines)", "shortDescription": {"text": "Very large file: scripts/projections/write_projections_db.py (1135 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-202a8e988b0a3500", "name": "Very large file: scripts/recruiting_book/build_book.py (2758 lines)", "shortDescription": {"text": "Very large file: scripts/recruiting_book/build_book.py (2758 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-9a4f8831a9f4b562", "name": "Very large file: backend/app/api/quiz.py (1922 lines)", "shortDescription": {"text": "Very large file: backend/app/api/quiz.py (1922 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-cdb78ebccb911577", "name": "Very large file: backend/app/api/routes.py (15700 lines)", "shortDescription": {"text": "Very large file: backend/app/api/routes.py (15700 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-f1a1049c81c1564b", "name": "Very large file: backend/app/api/team_stats.py (1824 lines)", "shortDescription": {"text": "Very large file: backend/app/api/team_stats.py (1824 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-3aeecaa684e4ff73", "name": "Very large file: backend/app/api/summer.py (3326 lines)", "shortDescription": {"text": "Very large file: backend/app/api/summer.py (3326 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-98513ee40cb19d14", "name": "Very large file: backend/app/api/grid.py (1389 lines)", "shortDescription": {"text": "Very large file: backend/app/api/grid.py (1389 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-81b57101a92d460a", "name": "Very large file: backend/app/api/recruiting.py (1872 lines)", "shortDescription": {"text": "Very large file: backend/app/api/recruiting.py (1872 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-1c81f1a43299e1f3", "name": "Very large file: backend/app/api/coaching_tools.py (1647 lines)", "shortDescription": {"text": "Very large file: backend/app/api/coaching_tools.py (1647 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-041afe365b6b98e3", "name": "Very large file: backend/app/api/team_scouting.py (1364 lines)", "shortDescription": {"text": "Very large file: backend/app/api/team_scouting.py (1364 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-8a5e1cdebaa6d588", "name": "Very large file: backend/app/api/pitch_level.py (1776 lines)", "shortDescription": {"text": "Very large file: backend/app/api/pitch_level.py (1776 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-21d202f1cd23df28", "name": "Very large file: backend/app/stats/projections.py (1272 lines)", "shortDescription": {"text": "Very large file: backend/app/stats/projections.py (1272 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "13 test file(s) for 519 source file(s) (ratio 0.03). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 1612 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 146 placeholder/mock markers across 68 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-097dd219901ed605", "name": "Commented-code block (8 lines) in frontend/vite.config.js:5", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/vite.config.js:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-923b373c0fd844cb", "name": "Commented-code block (6 lines) in frontend/middleware.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/middleware.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-010b952d58ad7f79", "name": "Commented-code block (6 lines) in frontend/api/og.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/api/og.tsx: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-b5f7988439d1fa42", "name": "Commented-code block (5 lines) in frontend/api/img.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/api/img.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-13b0dbfe55c37c69", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/api/img.ts:104", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/api/img.ts:104"}, "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-abc37d62b82f6c21", "name": "Commented-code block (10 lines) in frontend/src/App.jsx:121", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/App.jsx:121"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3adf356e12b59b6d", "name": "Commented-code block (10 lines) in frontend/src/main.jsx:12", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/main.jsx:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f0f718b91492702", "name": "Commented-code block (7 lines) in frontend/src/utils/stats.js:208", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/utils/stats.js:208"}, "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-de233daa9dde0a87", "name": "Commented-code block (6 lines) in frontend/src/components/GlobalRouteLoader.jsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/GlobalRouteLoader.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1f5b7950e8dd143", "name": "Commented-code block (8 lines) in frontend/src/components/Header.jsx:529", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/components/Header.jsx:529"}, "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-f8680607a4ad9662", "name": "Commented-code block (7 lines) in frontend/src/components/PortalLayout.jsx:8", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/PortalLayout.jsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19165bea1224f0ca", "name": "Commented-code block (6 lines) in frontend/src/components/PlayerCompsCard.jsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/PlayerCompsCard.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e91415fac5f5a3a", "name": "Commented-code block (5 lines) in frontend/src/components/WpaByGameChart.jsx:34", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/WpaByGameChart.jsx:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2ccb91e374f176e7", "name": "Commented-code block (5 lines) in frontend/src/components/StatsTable.jsx:49", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/StatsTable.jsx:49"}, "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-a4a776509a066226", "name": "Commented-code block (5 lines) in frontend/src/components/CommitBadge.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/CommitBadge.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-00e21de93653ba71", "name": "Commented-code block (5 lines) in frontend/src/components/LazyWpaByGameChart.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/LazyWpaByGameChart.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd248591e1663a0e", "name": "Commented-code block (5 lines) in frontend/src/components/PortalHeader.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/PortalHeader.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1eb50169d3c7c51d", "name": "Commented-code block (6 lines) in frontend/src/components/PlayerStints.jsx:103", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/PlayerStints.jsx:103"}, "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-069e3bdfc2b52ff2", "name": "Commented-code block (5 lines) in frontend/src/components/MaintenanceLockout.jsx:54", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/MaintenanceLockout.jsx:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-556c8864f0ec27da", "name": "Commented-code block (7 lines) in frontend/src/components/EmailPrefsPopup.jsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/EmailPrefsPopup.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2647851129798667", "name": "Commented-code block (5 lines) in frontend/src/components/SeasonSelect.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/SeasonSelect.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3d2c186830787cf6", "name": "Commented-code block (5 lines) in frontend/src/components/playerProfile/shared.jsx:7", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/playerProfile/shared.jsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f081de660a6f3e88", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/home/StatWidgets.jsx:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/home/StatWidgets.jsx:13"}, "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-2a3800cd2cfccaf6", "name": "Commented-code block (7 lines) in frontend/src/components/home/WidgetShell.jsx:74", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/home/WidgetShell.jsx:74"}, "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-92cb06d79f565cd7", "name": "Commented-code block (7 lines) in frontend/src/lib/pendingRequests.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/lib/pendingRequests.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-daa1d68079180804", "name": "Commented-code block (6 lines) in frontend/src/lib/tiers.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/tiers.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-80527671adbfa38e", "name": "Commented-code block (7 lines) in frontend/src/lib/seasons.js:6", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/lib/seasons.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b89141c3751b044", "name": "Commented-code block (6 lines) in frontend/src/lib/sentry.js:46", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/sentry.js:46"}, "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-368afa04e96d7b4f", "name": "Commented-code block (5 lines) in frontend/src/lib/gmPromo.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/gmPromo.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-886cdcf4393573b8", "name": "Commented-code block (5 lines) in frontend/src/lib/brackets.js:42", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/brackets.js: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-68ad780591239f09", "name": "Commented-code block (5 lines) in frontend/src/pages/PlayerProfilePitcher.jsx:24", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/PlayerProfilePitcher.jsx:24"}, "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-420a9212b4296447", "name": "Commented-code block (5 lines) in frontend/src/pages/PortalHome.jsx:308", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/PortalHome.jsx:308"}, "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-f9858af8e4181668", "name": "Commented-code block (8 lines) in frontend/src/pages/WclGameRecapGraphic.jsx:4", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/pages/WclGameRecapGraphic.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33853edb442388e6", "name": "Commented-code block (7 lines) in frontend/src/pages/RecruitingHub.jsx:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/pages/RecruitingHub.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a344922ac9ac8018", "name": "Commented-code block (6 lines) in frontend/src/pages/NewsArticle.jsx:4", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/NewsArticle.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f62fedc3599cb569", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Account.jsx:65", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Account.jsx:65"}, "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-08e3bff78d17cd2d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/BattingLeaderboard.jsx:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/BattingLeaderboard.jsx:133"}, "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-1b7ff8ca1dfeb816", "name": "Commented-code block (5 lines) in frontend/src/pages/TopMoments.jsx:9", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/TopMoments.jsx:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cf0d835d25073eab", "name": "Commented-code block (5 lines) in frontend/src/pages/PlayerScouting.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/PlayerScouting.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-72f38410fd993be7", "name": "Commented-code block (8 lines) in frontend/src/pages/WclLeaderboardGraphic.jsx:3", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/pages/WclLeaderboardGraphic.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d445af6c8410dd3f", "name": "Commented-code block (7 lines) in frontend/src/pages/CoachHomepage.jsx:4", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/pages/CoachHomepage.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-318f5cf6a60a78ac", "name": "Commented-code block (5 lines) in frontend/src/pages/RecruitQuiz.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/RecruitQuiz.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8f4a1db0fb964f3", "name": "Commented-code block (5 lines) in frontend/src/pages/Pricing.jsx:8", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/Pricing.jsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06f0120ff9437a98", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Pricing.jsx:243", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Pricing.jsx:243"}, "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-56689b153c5c93d2", "name": "Commented-code block (5 lines) in frontend/src/pages/ScoutingSheet.jsx:15", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/ScoutingSheet.jsx:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-64f6e01e891c1c50", "name": "Commented-code block (11 lines) in frontend/src/pages/TournamentBracketGraphic.jsx:44", "shortDescription": {"text": "Commented-code block (11 lines) in frontend/src/pages/TournamentBracketGraphic.jsx:44"}, "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-8a44dc79dc5d8b2c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/TeamInfoGraphic.jsx:887", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/TeamInfoGraphic.jsx:887"}, "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-1ae4334cdecb2d8a", "name": "Commented-code block (16 lines) in frontend/src/pages/BullpenSheet.jsx:3", "shortDescription": {"text": "Commented-code block (16 lines) in frontend/src/pages/BullpenSheet.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-590b118bdf11234b", "name": "Commented-code block (6 lines) in frontend/src/pages/SocialGraphics.jsx:8", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/SocialGraphics.jsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d90ec8c205c3199a", "name": "Commented-code block (5 lines) in frontend/src/pages/AnonymousHomepage.jsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/AnonymousHomepage.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4388d4c2504d302e", "name": "Commented-code block (5 lines) in frontend/src/pages/OpponentTrends.jsx:740", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/OpponentTrends.jsx:740"}, "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-c380bdd3b742d067", "name": "Commented-code block (5 lines) in frontend/src/pages/WclRecapGraphic.jsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/WclRecapGraphic.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7c7b89f5dc125233", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/WclRecapGraphic.jsx:333", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/WclRecapGraphic.jsx:333"}, "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-0dade36bc53de8b0", "name": "Commented-code block (10 lines) in frontend/src/pages/PremiumHomepage.jsx:101", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/pages/PremiumHomepage.jsx:101"}, "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-ab0b11d4b0b02816", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PremiumHomepage.jsx:157", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PremiumHomepage.jsx:157"}, "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-df6413c56ada030c", "name": "Commented-code block (5 lines) in frontend/src/pages/RecruitingGuide.jsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/RecruitingGuide.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04ba870d13516d1f", "name": "Commented-code block (8 lines) in frontend/src/pages/CatcherCards.jsx:4", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/pages/CatcherCards.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b43d02a6f7c0dbd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/TeamComparison.jsx:310", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/TeamComparison.jsx:310"}, "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-c14be4a10072ae05", "name": "Commented-code block (8 lines) in frontend/src/pages/About.jsx:3", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/pages/About.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26369562c8f19e58", "name": "Commented-code block (5 lines) in frontend/src/pages/TeamProjections.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/TeamProjections.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8dc0f71852ab769e", "name": "Commented-code block (5 lines) in frontend/src/pages/RecruitingHomepage.jsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/RecruitingHomepage.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-469c4352ca45363d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/WarLeaderboard.jsx:152", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/WarLeaderboard.jsx:152"}, "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-cbf7678200e86cee", "name": "Commented-code block (12 lines) in frontend/src/pages/PlayerCardPDF.jsx:6", "shortDescription": {"text": "Commented-code block (12 lines) in frontend/src/pages/PlayerCardPDF.jsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-390e76d4a8855d1b", "name": "Commented-code block (5 lines) in frontend/src/pages/Homepage.jsx:47", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/Homepage.jsx:47"}, "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-f2915b01174a2d15", "name": "Commented-code block (7 lines) in frontend/src/pages/SummerPlayerProfile.jsx:4", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/pages/SummerPlayerProfile.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aac79e2187c5a425", "name": "Commented-code block (5 lines) in frontend/src/pages/PlayerProfileHitter.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/PlayerProfileHitter.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7e5ea99f1fb166d", "name": "Commented-code block (6 lines) in frontend/src/pages/NwacAdvancement.jsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/NwacAdvancement.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-37f29160150d74df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PitchingLeaderboard.jsx:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PitchingLeaderboard.jsx:133"}, "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-07b5f9586af4674c", "name": "Commented-code block (7 lines) in frontend/src/pages/DailyScoresGraphic.jsx:616", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/pages/DailyScoresGraphic.jsx:616"}, "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-bf38e356ab7c3960", "name": "Commented-code block (5 lines) in frontend/src/pages/FieldingLeaderboard.jsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/FieldingLeaderboard.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ea99e4489996fd7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/FieldingLeaderboard.jsx:149", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/FieldingLeaderboard.jsx:149"}, "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-0d1268c33a52621b", "name": "Commented-code block (5 lines) in frontend/src/pages/ProTracker.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/ProTracker.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8480a6fa6e4cb5d8", "name": "Commented-code block (5 lines) in frontend/src/pages/RecruitingProgramGuide.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/RecruitingProgramGuide.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd983d048af51f3b", "name": "Commented-code block (7 lines) in frontend/src/pages/FreeHomepage.jsx:8", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/pages/FreeHomepage.jsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2392459ddbe4c7a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/FreeHomepage.jsx:257", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/FreeHomepage.jsx:257"}, "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-3d2fa94057231dad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Unsubscribe.jsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Unsubscribe.jsx:32"}, "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-cd11319261dc1cdf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/StandingsPage.jsx:288", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/StandingsPage.jsx:288"}, "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-3746c493d8b385ab", "name": "Commented-code block (10 lines) in frontend/src/pages/WclStandingsGraphic.jsx:3", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/pages/WclStandingsGraphic.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7cb10f10f4b1f876", "name": "Commented-code block (5 lines) in frontend/src/pages/PlayerDetail.jsx:14", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/PlayerDetail.jsx:14"}, "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-0e7ece562359303c", "name": "Commented-code block (8 lines) in frontend/src/pages/PortalPDFs.jsx:3", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/pages/PortalPDFs.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19f254d27807752c", "name": "Commented-code block (5 lines) in frontend/src/pages/SummerHub.jsx:184", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/SummerHub.jsx:184"}, "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-be4be9bc69fe4b61", "name": "Commented-code block (5 lines) in frontend/src/pages/RelieverLeaderboard.jsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/RelieverLeaderboard.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ed864eaaf5300eeb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/RelieverLeaderboard.jsx:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/RelieverLeaderboard.jsx:103"}, "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-baf1522de5f80ba6", "name": "Commented-code block (6 lines) in frontend/src/pages/NWACTournamentSheet.jsx:4", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/NWACTournamentSheet.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-82dfef5cbd3f4760", "name": "Commented-code block (7 lines) in frontend/src/pages/TeamSeasonRecapGraphic.jsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/pages/TeamSeasonRecapGraphic.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3261117d4f96b92f", "name": "Commented-code block (7 lines) in frontend/src/pages/HistoricMatchups.jsx:201", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/pages/HistoricMatchups.jsx:201"}, "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-2a468a6696bc705d", "name": "Commented-code block (5 lines) in frontend/src/pages/summer/SummerStatsPage.jsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/summer/SummerStatsPage.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8132d3ce8782274", "name": "Commented-code block (11 lines) in frontend/src/pages/portal/ArticleEditor.jsx:3", "shortDescription": {"text": "Commented-code block (11 lines) in frontend/src/pages/portal/ArticleEditor.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3589b17eb1d8fecb", "name": "Commented-code block (9 lines) in frontend/src/pages/portal/EmailComposer.jsx:3", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/pages/portal/EmailComposer.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7198dea241263f3", "name": "Commented-code block (5 lines) in frontend/src/pages/gm/Schedule.jsx:651", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/gm/Schedule.jsx:651"}, "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-66d5150a5bebb239", "name": "Commented-code block (7 lines) in frontend/src/pages/gm/Recruiting.jsx:794", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/pages/gm/Recruiting.jsx:794"}, "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-269b6b9820743f69", "name": "Commented-code block (5 lines) in frontend/src/pages/gm/NewDynasty.jsx:118", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/gm/NewDynasty.jsx:118"}, "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-6d8292a2a8b98902", "name": "Commented-code block (8 lines) in frontend/src/pages/gm/Dashboard.jsx:142", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/pages/gm/Dashboard.jsx:142"}, "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-38a92ca8649259e8", "name": "Commented-code block (6 lines) in frontend/src/pages/gm/SummerBall.jsx:61", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/gm/SummerBall.jsx:61"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2be9f1e1ad553c37", "name": "Commented-code block (8 lines) in frontend/src/pages/gm/Stats.jsx:129", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/pages/gm/Stats.jsx:129"}, "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-73e8eb64e6c94c57", "name": "Commented-code block (6 lines) in frontend/src/pages/gm/Rankings.jsx:52", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/gm/Rankings.jsx:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bfe7ee651cf32245", "name": "Commented-code block (5 lines) in frontend/src/pages/gm/Play.jsx:77", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/gm/Play.jsx:77"}, "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-f1a3e4e4318794dd", "name": "Commented-code block (5 lines) in frontend/src/pages/gm/Career.jsx:70", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/gm/Career.jsx:70"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e9b9d821e7bd3220", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useArticles.js:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useArticles.js:100"}, "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-d63c5cc4e848d0f6", "name": "Commented-code block (5 lines) in frontend/src/hooks/useApi.js:8", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/hooks/useApi.js:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6676c60cebbdf91b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useApi.js:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useApi.js:62"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8f1f9128835bd87b", "name": "Legacy-named symbol `tier_cache_v1` in frontend/src/hooks/useTier.js:27", "shortDescription": {"text": "Legacy-named symbol `tier_cache_v1` in frontend/src/hooks/useTier.js:27"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-630c66c011934599", "name": "Commented-code block (8 lines) in frontend/src/hooks/useTier.js:6", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/hooks/useTier.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-87ff22f407f661e0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useTier.js:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useTier.js:70"}, "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-bb352bd362441f0f", "name": "Commented-code block (5 lines) in frontend/src/gm/components/TeamLogo.jsx:32", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/components/TeamLogo.jsx:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2eabd562224295bf", "name": "Commented-code block (5 lines) in frontend/src/gm/components/GMShell.jsx:35", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/components/GMShell.jsx:35"}, "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-e597b4964b4be737", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/playerArchetypes.js:228", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/playerArchetypes.js:228"}, "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-9845accf0c906675", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/outboundTransfers.js:83", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/outboundTransfers.js:83"}, "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-29efca5296fc7afa", "name": "Commented-code block (7 lines) in frontend/src/gm/engine/gameYear.js:31", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/gm/engine/gameYear.js:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a435aed3af7ff52", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/playerRating.js:146", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/playerRating.js:146"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a87a08186497c786", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/nwbbRating.js:128", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/nwbbRating.js: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-71570b6a9aedefb9", "name": "Commented-code block (8 lines) in frontend/src/gm/engine/advancedStats.js:142", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/gm/engine/advancedStats.js:142"}, "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-d2b90daf1b5ae11d", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/storyMode.js:280", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/storyMode.js:280"}, "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-d3bc113227063642", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/weeklyAwards.js:32", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/weeklyAwards.js:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30a7829c42381423", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/pnwPlayoffs.js:84", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/pnwPlayoffs.js:84"}, "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-7f672c506e1335e7", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/simAhead.js:134", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/simAhead.js:134"}, "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-433857fa07b33a1b", "name": "Commented-code block (8 lines) in frontend/src/gm/engine/sim.js:72", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/gm/engine/sim.js:72"}, "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-d5db43a281cb92b1", "name": "Commented-code block (8 lines) in frontend/src/gm/engine/generate.js:76", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/gm/engine/generate.js:76"}, "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-391e29cfb4e6124d", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/season.js:184", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/season.js:184"}, "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-b2825a053eed64bb", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/coaches.js:473", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/coaches.js:473"}, "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-f889469f32dd7c57", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/events.js:269", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/events.js:269"}, "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-ee00f92e26f41d27", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/postseasonInteractive.js:248", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/postseasonInteractive.js:248"}, "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-a94bfce81bc8ab74", "name": "Commented-code block (7 lines) in frontend/src/gm/engine/expansionTeam.js:176", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/gm/engine/expansionTeam.js:176"}, "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-240ae83580137877", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/leagueStats.js:35", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/leagueStats.js:35"}, "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-e7234674518ab856", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/summerBall.js:420", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/summerBall.js:420"}, "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-1d3d3bc21d9e7043", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/newDynastyMultiLevel.js:54", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/newDynastyMultiLevel.js:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8d1249faf046785", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/recruits.js:68", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/recruits.js:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9afc2b0d152e2368", "name": "Commented-code block (9 lines) in frontend/src/gm/engine/loadSchools.js:82", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/gm/engine/loadSchools.js:82"}, "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-361ae5c2925fa81f", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/awards.js:201", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/awards.js:201"}, "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-b2650d7f0142c8a5", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/schedule.js:75", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/schedule.js:75"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b4f54a55b4e4fe2", "name": "Commented-code block (12 lines) in frontend/src/gm/engine/lineups.js:66", "shortDescription": {"text": "Commented-code block (12 lines) in frontend/src/gm/engine/lineups.js:66"}, "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-461e07ccb81526f2", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/newDynasty.js:171", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/newDynasty.js:171"}, "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-ce15094a8fb595d2", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/draft.js:45", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/draft.js:45"}, "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-7d9c4e10ed177c7c", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/randomEvents.js:2110", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/randomEvents.js:2110"}, "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-8baa270f20935390", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/autoMode.js:443", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/autoMode.js:443"}, "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-ab34ac03a24138bb", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/liveGame.js:62", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/liveGame.js:62"}, "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-cc56c4d190f76a60", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/academics.js:119", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/academics.js:119"}, "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-705e9307300e0cae", "name": "Commented-code block (6 lines) in frontend/src/gm/engine/nationalTournament.js:34", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/nationalTournament.js:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-764b0c9e5af47120", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/seasonRecap.js:102", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/seasonRecap.js:102"}, "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-1154070c0993afea", "name": "Commented-code block (7 lines) in frontend/src/gm/engine/rankings.js:92", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/gm/engine/rankings.js:92"}, "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-6856b18637a8d93d", "name": "Commented-code block (7 lines) in frontend/src/gm/engine/nwacTransfers.js:216", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/gm/engine/nwacTransfers.js:216"}, "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-92fcb65f585c35a6", "name": "Commented-code block (5 lines) in frontend/src/gm/engine/budget.js:21", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/budget.js:21"}, "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-54eaae956db7d7b7", "name": "Legacy-named symbol `affiliated_team_v1` in frontend/src/context/AffiliationContext.jsx:17", "shortDescription": {"text": "Legacy-named symbol `affiliated_team_v1` in frontend/src/context/AffiliationContext.jsx:17"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-69b6eaa0e9174a0b", "name": "Commented-code block (5 lines) in frontend/src/context/ThemeContext.jsx:8", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/context/ThemeContext.jsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-72661d38feb67217", "name": "Commented-code block (10 lines) in frontend/src/context/PreviewContext.jsx:7", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/context/PreviewContext.jsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4871b2c587f9ef0f", "name": "Commented-code block (6 lines) in scripts/dedup_games.py:378", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/dedup_games.py:378"}, "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-a30893af9f1042f7", "name": "Commented-code block (7 lines) in scripts/parse_nwac_boxscore.py:443", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/parse_nwac_boxscore.py:443"}, "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-8799f79f8d562106", "name": "Commented-code block (7 lines) in scripts/build_li_table.py:44", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/build_li_table.py:44"}, "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-958eacb114b041da", "name": "Commented-code block (5 lines) in scripts/scrape_naia.py:286", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/scrape_naia.py:286"}, "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-ea6ab41dd6f06f9a", "name": "Commented-code block (7 lines) in scripts/freeze_conference.py:315", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/freeze_conference.py:315"}, "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-2750cc198cac2928", "name": "Legacy-named symbol `pc_legacy` in scripts/parse_pbp_events.py:338", "shortDescription": {"text": "Legacy-named symbol `pc_legacy` in scripts/parse_pbp_events.py:338"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b8c787de69b3cf0b", "name": "Commented-code block (8 lines) in scripts/parse_pbp_events.py:112", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/parse_pbp_events.py:112"}, "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-76aff60c02d986b5", "name": "Commented-code block (5 lines) in scripts/fix_pitching_hbp_from_boxscores.py:138", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/fix_pitching_hbp_from_boxscores.py:138"}, "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-7ac9ae37f67c19df", "name": "Legacy-named symbol `pc_legacy` in scripts/parse_pbp_hr.py:163", "shortDescription": {"text": "Legacy-named symbol `pc_legacy` in scripts/parse_pbp_hr.py:163"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76255f019aecabfe", "name": "Commented-code block (11 lines) in scripts/classify_batted_ball.py:136", "shortDescription": {"text": "Commented-code block (11 lines) in scripts/classify_batted_ball.py:136"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e5f0e60c25713dd", "name": "Commented-code block (5 lines) in scripts/parse_presto_events.py:89", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/parse_presto_events.py:89"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7365620fad97ad1", "name": "Commented-code block (5 lines) in scripts/compute_summer_wpa.py:196", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/compute_summer_wpa.py:196"}, "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-202ad2e184cb3341", "name": "Commented-code block (5 lines) in scripts/scrape_nwac_schedule.py:63", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/scrape_nwac_schedule.py:63"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe34d1ee8442bfa2", "name": "Commented-code block (5 lines) in scripts/link_summer_to_spring.py:367", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/link_summer_to_spring.py:367"}, "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-ab778b4fd61981f7", "name": "Commented-code block (8 lines) in scripts/derive_event_state.py:324", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/derive_event_state.py:324"}, "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-0dbfe5c473b9327b", "name": "Commented-code block (15 lines) in scripts/resolve_summer_game_players.py:42", "shortDescription": {"text": "Commented-code block (15 lines) in scripts/resolve_summer_game_players.py: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-1b66e66cdbc40c9d", "name": "Commented-code block (5 lines) in scripts/scrape_pbp.py:664", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/scrape_pbp.py:664"}, "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-43bc20cac8f29ac8", "name": "Commented-code block (7 lines) in scripts/scrape_nwac_boxscores.py:93", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/scrape_nwac_boxscores.py:93"}, "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-56eddc7c51816c83", "name": "Legacy-named symbol `_parse_sidearm_schedule_v2` in scripts/scrape_boxscores.py:746", "shortDescription": {"text": "Legacy-named symbol `_parse_sidearm_schedule_v2` in scripts/scrape_boxscores.py:746"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2cb562bed1cc520f", "name": "Commented-code block (6 lines) in scripts/scrape_boxscores.py:1773", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/scrape_boxscores.py:1773"}, "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-9c99d52f181625ca", "name": "Commented-code block (8 lines) in scripts/scrape_national_ratings.py:70", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/scrape_national_ratings.py:70"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9553a62867b7a0ac", "name": "Legacy-named symbol `ps_old` in scripts/resync_pitching_stats_from_boxscores.py:8", "shortDescription": {"text": "Legacy-named symbol `ps_old` in scripts/resync_pitching_stats_from_boxscores.py:8"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-18e3e8dc45a22983", "name": "Commented-code block (6 lines) in scripts/build_wp_table.py:62", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/build_wp_table.py:62"}, "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-216929851d2890e8", "name": "Commented-code block (8 lines) in scripts/scrape_recruits.py:98", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/scrape_recruits.py:98"}, "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-40e57f633f17fa8d", "name": "Commented-code block (7 lines) in scripts/derive_summer_event_state.py:349", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/derive_summer_event_state.py:349"}, "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-67f6471aa8326646", "name": "Commented-code block (11 lines) in scripts/compute_wpa.py:204", "shortDescription": {"text": "Commented-code block (11 lines) in scripts/compute_wpa.py:204"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a7075151e0a175ca", "name": "Commented-code block (5 lines) in scripts/team_matching.py:36", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/team_matching.py:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b78c85281589ad64", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/generate_social_graphic.py:462", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/generate_social_graphic.py:462"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d9a72c58fbed120", "name": "Commented-code block (5 lines) in scripts/scrape_future_schedules.py:496", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/scrape_future_schedules.py:496"}, "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-33d3d961b34a09eb", "name": "Commented-code block (5 lines) in scripts/ingest_pro_alumni.py:186", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/ingest_pro_alumni.py:186"}, "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-c0ead5b32eac6862", "name": "Commented-code block (10 lines) in scripts/ingest_pbr_pdf_rankings.py:101", "shortDescription": {"text": "Commented-code block (10 lines) in scripts/ingest_pbr_pdf_rankings.py:101"}, "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-b82cdaf4cacdee3c", "name": "Commented-code block (7 lines) in scripts/scrape_d1.py:589", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/scrape_d1.py:589"}, "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-9490c634703c9d77", "name": "Commented-code block (6 lines) in scripts/archive/create_phantom_players.py:247", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/archive/create_phantom_players.py:247"}, "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-05cc23db65c72936", "name": "Commented-code block (5 lines) in scripts/archive/backfill_handedness.py:60", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/archive/backfill_handedness.py:60"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-28d194c1ee41214e", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/archive/scrape_browser_stats.py:613", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/archive/scrape_browser_stats.py:613"}, "fullDescription": {"text": "`requests.get(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb512be2a4b470f0", "name": "Commented-code block (7 lines) in scripts/archive/audit_team_record_mismatches.py:121", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/archive/audit_team_record_mismatches.py:121"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa5818f0c97c49f2", "name": "Legacy-named symbol `nwbb_v1` in scripts/projections/team_projection.py:6", "shortDescription": {"text": "Legacy-named symbol `nwbb_v1` in scripts/projections/team_projection.py:6"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fcb6f08b5a26b59f", "name": "Commented-code block (5 lines) in scripts/projections/team_projection.py:47", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/projections/team_projection.py:47"}, "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-7abaf9274f02dff1", "name": "Commented-code block (6 lines) in scripts/projections/write_projections_db.py:66", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/projections/write_projections_db.py:66"}, "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-fb8441a21f9dffd2", "name": "Legacy-named symbol `nwbb_v1` in scripts/projections/backtest.py:18", "shortDescription": {"text": "Legacy-named symbol `nwbb_v1` in scripts/projections/backtest.py:18"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-89edd4b8234da3e8", "name": "Commented-code block (5 lines) in scripts/recruiting_book/build_book.py:347", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/recruiting_book/build_book.py:347"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e54c4772bd051292", "name": "Commented-code block (5 lines) in scripts/gm/generate_non_naia_teams.js:52", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/gm/generate_non_naia_teams.js:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-31dc1023a5f0cc18", "name": "Commented-code block (6 lines) in backend/app/recruiting_constants.py:23", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/recruiting_constants.py:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eddd5c1f75222352", "name": "Commented-code block (6 lines) in backend/app/api/quiz.py:1525", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/api/quiz.py:1525"}, "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-f64bffa723e60dd0", "name": "Commented-code block (5 lines) in backend/app/api/routes.py:99", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/api/routes.py:99"}, "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-9acbe3e890f602b9", "name": "Commented-code block (6 lines) in backend/app/api/bullpen_sheet.py:449", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/api/bullpen_sheet.py:449"}, "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-f81364d1d211dc51", "name": "Commented-code block (11 lines) in backend/app/api/team_stats.py:187", "shortDescription": {"text": "Commented-code block (11 lines) in backend/app/api/team_stats.py:187"}, "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-957ade8f3e6e484d", "name": "Commented-code block (5 lines) in backend/app/api/summer.py:164", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/api/summer.py:164"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a61986b42a01596", "name": "Commented-code block (6 lines) in backend/app/api/all_conference.py:223", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/api/all_conference.py:223"}, "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-bfe9f94ddb1aded3", "name": "Commented-code block (5 lines) in backend/app/api/email_prefs.py:106", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/api/email_prefs.py:106"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-238652eca6a70cd3", "name": "Commented-code block (9 lines) in backend/app/api/auth.py:151", "shortDescription": {"text": "Commented-code block (9 lines) in backend/app/api/auth.py:151"}, "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-f7f653687eb5cb62", "name": "Commented-code block (6 lines) in backend/app/api/recruiting.py:799", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/api/recruiting.py:799"}, "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-3b30accdd0a567ad", "name": "Commented-code block (5 lines) in backend/app/api/coaching_tools.py:80", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/api/coaching_tools.py:80"}, "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-a80104a3ae246450", "name": "Commented-code block (5 lines) in backend/app/api/team_scouting.py:420", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/api/team_scouting.py:420"}, "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-fc1b5bbccd279cd8", "name": "Commented-code block (11 lines) in backend/app/api/pitch_level.py:421", "shortDescription": {"text": "Commented-code block (11 lines) in backend/app/api/pitch_level.py:421"}, "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-5f8cabbbf63fa636", "name": "Commented-code block (6 lines) in backend/app/api/billing.py:600", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/api/billing.py:600"}, "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-0feb5bdbf22febf5", "name": "Commented-code block (5 lines) in backend/app/api/leverage.py:62", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/api/leverage.py:62"}, "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-b5089a59d715f76a", "name": "Commented-code block (6 lines) in backend/app/stats/advanced.py:363", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/stats/advanced.py:363"}, "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-a79152f300640745", "name": "Commented-code block (7 lines) in backend/app/stats/projections.py:826", "shortDescription": {"text": "Commented-code block (7 lines) in backend/app/stats/projections.py:826"}, "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-07f860e49be60ddf", "name": "Commented-code block (7 lines) in backend/app/stats/cpi.py:180", "shortDescription": {"text": "Commented-code block (7 lines) in backend/app/stats/cpi.py:180"}, "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-bddda3d5a14c7401", "name": "29 env vars used in code but missing from .env.example", "shortDescription": {"text": "29 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_EMAILS`, `ARTICLE_AUTHOR_EMAILS`, `DATABASE_URL`, `DB_POOL_MAX`, `EMAIL_FROM`, `LEVELS`, `MODE`, `PNW_BASEBALL_DB` + 21 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-380b7cb95b387b9c", "name": "Near-duplicate function bodies in 11 places", "shortDescription": {"text": "Near-duplicate function bodies in 11 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/dedup_games.py:get_conn, scripts/dedup_game_pitching.py:get_conn, scripts/backfill_wmt_boxscores.py:get_conn, scripts/dedup_game_batting.py:get_conn\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/parse_nwac_boxscore.py:get_stat, scripts/parse_nwac_boxscore.py:get_stat\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/scrape_naia.py:fetch_page, scripts/scrape_d3.py:fetch_page, scripts/scrape_d2.py:fetch_page, scripts/scrape_d1.py:fetch_page\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/scrape_naia.py:fetch_json, scripts/scrape_boxscores.py:fetch_json, scripts/scrape_d3.py:fetch_json, scripts/scrape_d2.py:fetch_json\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/scrape_naia.py:safe_int, scripts/scrape_nwac.py:safe_int, scripts/archive/scrape_browser_stats.py:safe_int\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/retry_missing_boxscores.py:resolve_team, scripts/wipe_team_batting.py:resolve_team, scripts/force_rescrape_one_game.py:resolve_team, scripts/archive/inspect_one_game_batting.py:resolve_team\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78c33a49cb26c5f1", "name": "Frontend route `/summer/teams/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/summer/teams/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-95d1f6d38af67f7c", "name": "Frontend route `/summer/players/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/summer/players/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef38737707a8ef70", "name": "Frontend route `/summer/games/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/summer/games/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0f21acba2e83c367", "name": "Frontend route `/game/:gameId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/game/:gameId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-549a7ddb90ea073f", "name": "Frontend route `/team/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/team/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f3c9d53cc9090ced", "name": "Frontend route `/recruiting/rankings` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/recruiting/rankings` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-01a18c967a6f5999", "name": "Frontend route `/recruiting/breakdowns` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/recruiting/breakdowns` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-270e10de982f7dc1", "name": "Frontend route `/recruiting/history` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/recruiting/history` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0634759bd1b927e5", "name": "Frontend route `/recruiting/field` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/recruiting/field` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98502db520fd70f9", "name": "Frontend route `/juco-tracker` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/juco-tracker` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-799e274dc920a2a8", "name": "Frontend route `/portal/juco-tracker` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/portal/juco-tracker` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2455582ad2bc46ae", "name": "Frontend route `/team-scouting` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/team-scouting` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48a5e044dad6eb63", "name": "Frontend route `/enhanced-scouting` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/enhanced-scouting` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bcba627ea5d40012", "name": "Frontend route `/opponent-trends` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/opponent-trends` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-38dd60e72daaa355", "name": "Frontend route `/historic` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/historic` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b6488b4d8bc6117c", "name": "Frontend route `/player-scouting` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/player-scouting` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-01426ff4de06be44", "name": "Frontend route `/portal/scouting-sheet/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/portal/scouting-sheet/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d9c15a82bf665a1a", "name": "Frontend route `/portal/pdfs/player-card/:playerId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/portal/pdfs/player-card/:playerId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-25ca854c526df369", "name": "Frontend route `/portal/pdfs/bulk-player-cards` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/portal/pdfs/bulk-player-cards` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e19559d0558a068", "name": "Frontend route `/portal/bullpen-sheet/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/portal/bullpen-sheet/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f65714fe99490cc8", "name": "Frontend route `/portal/catcher-cards/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/portal/catcher-cards/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-05d3cdf4007d2519", "name": "Frontend route `/news/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/news/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-66b25e3c035a05d6", "name": "Frontend route `/articles/edit/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/articles/edit/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d813f2917e5d89d", "name": "Frontend route `/unsubscribe` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/unsubscribe` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-db2a36fc4844ab35", "name": "Frontend route `/draft/2026` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/draft/2026` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cfb21ae3ec8122ef", "name": "Frontend route `/draft/2027` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/draft/2027` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5b5e56fb6b6e10f6", "name": "Frontend route `/draft/2028` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/draft/2028` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-32855e2e355d93c4", "name": "Frontend route `/gm/dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/gm/dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d00f1bc23d4a6dd6", "name": "Frontend route `/gm/play` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/gm/play` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-963fe75d17ada843", "name": "Frontend route `/gm/stats` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/gm/stats` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3e69479d4516731f", "name": "Frontend route `/gm/player/:playerId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/gm/player/:playerId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-67aacab690a1818b", "name": "Frontend route `/glossary` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/glossary` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0469be656966e830", "name": "Frontend route `/player/:playerId` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/player/:playerId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ebd42d4581bf5e2e", "name": "FastAPI POST `submit_feature_request` without auth dependency \u2014 backend/app/api/feature_requests.py:153", "shortDescription": {"text": "FastAPI POST `submit_feature_request` without auth dependency \u2014 backend/app/api/feature_requests.py:153"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-394a9c620fe35f53", "name": "FastAPI POST `grid_check_custom` without auth dependency \u2014 backend/app/api/grid.py:1047", "shortDescription": {"text": "FastAPI POST `grid_check_custom` without auth dependency \u2014 backend/app/api/grid.py:1047"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-827a0c956adc4134", "name": "FastAPI POST `grid_solutions` without auth dependency \u2014 backend/app/api/grid.py:1064", "shortDescription": {"text": "FastAPI POST `grid_solutions` without auth dependency \u2014 backend/app/api/grid.py:1064"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-25e651a09c24d9bc", "name": "FastAPI POST `grid_validate_custom` without auth dependency \u2014 backend/app/api/grid.py:1132", "shortDescription": {"text": "FastAPI POST `grid_validate_custom` without auth dependency \u2014 backend/app/api/grid.py:1132"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1b95d9e4fe696e4c", "name": "FastAPI PUT `update_prefs_by_token` without auth dependency \u2014 backend/app/api/email_prefs.py:169", "shortDescription": {"text": "FastAPI PUT `update_prefs_by_token` without auth dependency \u2014 backend/app/api/email_prefs.py:169"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1fbe214373642f74", "name": "FastAPI POST `one_click_unsubscribe` without auth dependency \u2014 backend/app/api/email_prefs.py:202", "shortDescription": {"text": "FastAPI POST `one_click_unsubscribe` without auth dependency \u2014 backend/app/api/email_prefs.py:202"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b5d77512fdeefe17", "name": "FastAPI POST `lineup_helper_manual` without auth dependency \u2014 backend/app/api/coaching_tools.py:1166", "shortDescription": {"text": "FastAPI POST `lineup_helper_manual` without auth dependency \u2014 backend/app/api/coaching_tools.py:1166"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-24058bf9f95aca2e", "name": "FastAPI POST `lineup_helper_build` without auth dependency \u2014 backend/app/api/coaching_tools.py:1463", "shortDescription": {"text": "FastAPI POST `lineup_helper_build` without auth dependency \u2014 backend/app/api/coaching_tools.py:1463"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-269bcf4e93dd4c21", "name": "FastAPI POST `lineup_helper_override` without auth dependency \u2014 backend/app/api/coaching_tools.py:1505", "shortDescription": {"text": "FastAPI POST `lineup_helper_override` without auth dependency \u2014 backend/app/api/coaching_tools.py:1505"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e9a7f4446cce4e91", "name": "FastAPI POST `stripe_webhook` without auth dependency \u2014 backend/app/api/billing.py:565", "shortDescription": {"text": "FastAPI POST `stripe_webhook` without auth dependency \u2014 backend/app/api/billing.py:565"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04882232b283489c", "name": "Dangling fetch: GET /api/v1/stats/last-updated (frontend/src/components/StatsLastUpdated.jsx:63)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/stats/last-updated (frontend/src/components/StatsLastUpdated.jsx:63)"}, "fullDescription": {"text": "`frontend/src/components/StatsLastUpdated.jsx:63` calls `GET /api/v1/stats/last-updated` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/stats/last-updated`\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-023079b7f46883cb", "name": "Dangling fetch: GET /api/v1/search?q=${encodeURIComponent(q)}&limit=6 (frontend/src/components/Header.jsx:205)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/search?q=${encodeURIComponent(q)}&limit=6 (frontend/src/components/Header.jsx:205)"}, "fullDescription": {"text": "`frontend/src/components/Header.jsx:205` calls `GET /api/v1/search?q=${encodeURIComponent(q)}&limit=6` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/search`\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-f02520c09daef598", "name": "Dangling fetch: GET /api/v1/players/${playerId}/streaks?season=${season} (frontend/src/components/playerProfile/shared.j", "shortDescription": {"text": "Dangling fetch: GET /api/v1/players/${playerId}/streaks?season=${season} (frontend/src/components/playerProfile/shared.jsx:571)"}, "fullDescription": {"text": "`frontend/src/components/playerProfile/shared.jsx:571` calls `GET /api/v1/players/${playerId}/streaks?season=${season}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/players/<p>/streaks`\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-4fb8c85f663c53a4", "name": "Dangling fetch: GET /api/v1/summer/leaderboards/${c.side}?${params} (frontend/src/components/home/StatWidgets.jsx:299)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/summer/leaderboards/${c.side}?${params} (frontend/src/components/home/StatWidgets.jsx:299)"}, "fullDescription": {"text": "`frontend/src/components/home/StatWidgets.jsx:299` calls `GET /api/v1/summer/leaderboards/${c.side}?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/summer/leaderboards/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-503fc257e6120b94", "name": "Dangling fetch: POST /api/v1/feature-requests (frontend/src/pages/FeatureRequest.jsx:27)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/feature-requests (frontend/src/pages/FeatureRequest.jsx:27)"}, "fullDescription": {"text": "`frontend/src/pages/FeatureRequest.jsx:27` calls `POST /api/v1/feature-requests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/feature-requests`\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-f83e03f64ecbaf76", "name": "Dangling fetch: GET /api/v1/teams/${teamId}/championships (frontend/src/pages/TeamDetail.jsx:358)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/teams/${teamId}/championships (frontend/src/pages/TeamDetail.jsx:358)"}, "fullDescription": {"text": "`frontend/src/pages/TeamDetail.jsx:358` calls `GET /api/v1/teams/${teamId}/championships` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/teams/<p>/championships`\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-777c97c7576b35d1", "name": "Dangling fetch: GET /api/v1/players/${playerId} (frontend/src/pages/DraftBoard.jsx:98)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/players/${playerId} (frontend/src/pages/DraftBoard.jsx:98)"}, "fullDescription": {"text": "`frontend/src/pages/DraftBoard.jsx:98` calls `GET /api/v1/players/${playerId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/players/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fcbb03624ea92c13", "name": "Dangling fetch: GET /api/v1/recruiting/freshman-by-division?season=${CURRENT_SEASON} (frontend/src/pages/RecruitingTips.", "shortDescription": {"text": "Dangling fetch: GET /api/v1/recruiting/freshman-by-division?season=${CURRENT_SEASON} (frontend/src/pages/RecruitingTips.jsx:38)"}, "fullDescription": {"text": "`frontend/src/pages/RecruitingTips.jsx:38` calls `GET /api/v1/recruiting/freshman-by-division?season=${CURRENT_SEASON}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/recruiting/freshman-by-division`\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-28caf3cc162525d6", "name": "Dangling fetch: GET /api/v1/site-stats (frontend/src/pages/AnonymousHomepage.jsx:121)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/site-stats (frontend/src/pages/AnonymousHomepage.jsx:121)"}, "fullDescription": {"text": "`frontend/src/pages/AnonymousHomepage.jsx:121` calls `GET /api/v1/site-stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/site-stats`\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-9208381dce5f5dc4", "name": "Dangling fetch: GET /api/v1/leaderboards/fielding?season=${SEASON}&position=SS&division_id=4&min_games=10&limit=3 (front", "shortDescription": {"text": "Dangling fetch: GET /api/v1/leaderboards/fielding?season=${SEASON}&position=SS&division_id=4&min_games=10&limit=3 (frontend/src/pages/AnonymousHomepage.jsx:438)"}, "fullDescription": {"text": "`frontend/src/pages/AnonymousHomepage.jsx:438` calls `GET /api/v1/leaderboards/fielding?season=${SEASON}&position=SS&division_id=4&min_games=10&limit=3` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/leaderboards/fielding`\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-1d29d0d2a702f72c", "name": "Dangling fetch: GET /api/v1/leaderboards/${endpoint}?season=${SEASON}&sort_by=${sortBy}&sort_dir=desc&limit=200&qualifie", "shortDescription": {"text": "Dangling fetch: GET /api/v1/leaderboards/${endpoint}?season=${SEASON}&sort_by=${sortBy}&sort_dir=desc&limit=200&qualified=true (frontend/src/pages/PremiumHomepage.jsx:136)"}, "fullDescription": {"text": "`frontend/src/pages/PremiumHomepage.jsx:136` calls `GET /api/v1/leaderboards/${endpoint}?season=${SEASON}&sort_by=${sortBy}&sort_dir=desc&limit=200&qualified=true` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/leaderboards/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3d07163c5b2b0f08", "name": "Dangling fetch: PUT /api/v1/recruiting/programs/${teamId} (frontend/src/pages/RecruitingGuide.jsx:210)", "shortDescription": {"text": "Dangling fetch: PUT /api/v1/recruiting/programs/${teamId} (frontend/src/pages/RecruitingGuide.jsx:210)"}, "fullDescription": {"text": "`frontend/src/pages/RecruitingGuide.jsx:210` calls `PUT /api/v1/recruiting/programs/${teamId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/recruiting/programs/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2d6947e182bda2e8", "name": "Dangling fetch: POST /api/v1/coaching/lineup-helper/override (frontend/src/pages/LineupHelper.jsx:85)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/coaching/lineup-helper/override (frontend/src/pages/LineupHelper.jsx:85)"}, "fullDescription": {"text": "`frontend/src/pages/LineupHelper.jsx:85` calls `POST /api/v1/coaching/lineup-helper/override` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/coaching/lineup-helper/override`\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-6d2df28551c9b083", "name": "Dangling fetch: POST /api/v1/coaching/lineup-helper/build (frontend/src/pages/LineupHelper.jsx:829)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/coaching/lineup-helper/build (frontend/src/pages/LineupHelper.jsx:829)"}, "fullDescription": {"text": "`frontend/src/pages/LineupHelper.jsx:829` calls `POST /api/v1/coaching/lineup-helper/build` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/coaching/lineup-helper/build`\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-4d6809295eee2099", "name": "Dangling fetch: GET /api/v1/site-stats (frontend/src/pages/About.jsx:1450)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/site-stats (frontend/src/pages/About.jsx:1450)"}, "fullDescription": {"text": "`frontend/src/pages/About.jsx:1450` calls `GET /api/v1/site-stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/site-stats`\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-4f45bc23d3936f6e", "name": "Dangling fetch: GET /api/v1/leaderboards/war?${params} (frontend/src/pages/WarLeaderboard.jsx:152)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/leaderboards/war?${params} (frontend/src/pages/WarLeaderboard.jsx:152)"}, "fullDescription": {"text": "`frontend/src/pages/WarLeaderboard.jsx:152` calls `GET /api/v1/leaderboards/war?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/leaderboards/war`\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-ffc90754d9d8f36b", "name": "Dangling fetch: GET /api/v1/recruiting/nwac-advancement?season=${CURRENT_SEASON} (frontend/src/pages/NwacAdvancement.jsx", "shortDescription": {"text": "Dangling fetch: GET /api/v1/recruiting/nwac-advancement?season=${CURRENT_SEASON} (frontend/src/pages/NwacAdvancement.jsx:44)"}, "fullDescription": {"text": "`frontend/src/pages/NwacAdvancement.jsx:44` calls `GET /api/v1/recruiting/nwac-advancement?season=${CURRENT_SEASON}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/recruiting/nwac-advancement`\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-a2d339ad61efb2d2", "name": "Dangling fetch: GET /api/v1/leaderboards/fielding?${qs} (frontend/src/pages/FieldingLeaderboard.jsx:149)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/leaderboards/fielding?${qs} (frontend/src/pages/FieldingLeaderboard.jsx:149)"}, "fullDescription": {"text": "`frontend/src/pages/FieldingLeaderboard.jsx:149` calls `GET /api/v1/leaderboards/fielding?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/leaderboards/fielding`\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-4a82e14b2471ad1d", "name": "Dangling fetch: GET /api/v1/pro-alumni (frontend/src/pages/ProTracker.jsx:59)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/pro-alumni (frontend/src/pages/ProTracker.jsx:59)"}, "fullDescription": {"text": "`frontend/src/pages/ProTracker.jsx:59` calls `GET /api/v1/pro-alumni` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/pro-alumni`\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-0a7847cc575640bb", "name": "Dangling fetch: GET /api/v1/recruiting/program-guide (frontend/src/pages/RecruitingProgramGuide.jsx:28)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/recruiting/program-guide (frontend/src/pages/RecruitingProgramGuide.jsx:28)"}, "fullDescription": {"text": "`frontend/src/pages/RecruitingProgramGuide.jsx:28` calls `GET /api/v1/recruiting/program-guide` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/recruiting/program-guide`\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-15bfc7d3a109309d", "name": "Dangling fetch: GET /api/v1/teams/scatter?season=${SEASON}&x_stat=${combo.x}&y_stat=${combo.y} (frontend/src/pages/FreeH", "shortDescription": {"text": "Dangling fetch: GET /api/v1/teams/scatter?season=${SEASON}&x_stat=${combo.x}&y_stat=${combo.y} (frontend/src/pages/FreeHomepage.jsx:118)"}, "fullDescription": {"text": "`frontend/src/pages/FreeHomepage.jsx:118` calls `GET /api/v1/teams/scatter?season=${SEASON}&x_stat=${combo.x}&y_stat=${combo.y}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/teams/scatter`\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-ff6147fc5f4de598", "name": "Dangling fetch: GET /api/v1/teams/scatter?season=${SEASON}&x_stat=${stat.key}&y_stat=win_pct (frontend/src/pages/FreeHom", "shortDescription": {"text": "Dangling fetch: GET /api/v1/teams/scatter?season=${SEASON}&x_stat=${stat.key}&y_stat=win_pct (frontend/src/pages/FreeHomepage.jsx:257)"}, "fullDescription": {"text": "`frontend/src/pages/FreeHomepage.jsx:257` calls `GET /api/v1/teams/scatter?season=${SEASON}&x_stat=${stat.key}&y_stat=win_pct` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/teams/scatter`\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-5fe1210299e4d521", "name": "Dangling fetch: GET /api/v1/leaderboards/${cat.endpoint}?season=${SEASON}&min_bf=80&sort_by=${cat.sort}&sort_dir=desc&li", "shortDescription": {"text": "Dangling fetch: GET /api/v1/leaderboards/${cat.endpoint}?season=${SEASON}&min_bf=80&sort_by=${cat.sort}&sort_dir=desc&limit=2 (frontend/src/pages/FreeHomepage.jsx:432)"}, "fullDescription": {"text": "`frontend/src/pages/FreeHomepage.jsx:432` calls `GET /api/v1/leaderboards/${cat.endpoint}?season=${SEASON}&min_bf=80&sort_by=${cat.sort}&sort_dir=desc&limit=2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/leaderboards/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cedeea103a15c23c", "name": "Dangling fetch: GET /api/v1/leaderboards/percentiles?season=${SEASON}&limit=60 (frontend/src/pages/FreeHomepage.jsx:529)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/leaderboards/percentiles?season=${SEASON}&limit=60 (frontend/src/pages/FreeHomepage.jsx:529)"}, "fullDescription": {"text": "`frontend/src/pages/FreeHomepage.jsx:529` calls `GET /api/v1/leaderboards/percentiles?season=${SEASON}&limit=60` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/leaderboards/percentiles`\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-acb94fb958700e72", "name": "Dangling fetch: GET /api/v1/quiz/league-question?season=${SEASON} (frontend/src/pages/FreeHomepage.jsx:634)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/quiz/league-question?season=${SEASON} (frontend/src/pages/FreeHomepage.jsx:634)"}, "fullDescription": {"text": "`frontend/src/pages/FreeHomepage.jsx:634` calls `GET /api/v1/quiz/league-question?season=${SEASON}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/quiz/league-question`\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-1ccf640a759794b8", "name": "Dangling fetch: GET /api/v1/players/search?q=${encodeURIComponent(query)} (frontend/src/pages/PlayerGraphic.jsx:205)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/players/search?q=${encodeURIComponent(query)} (frontend/src/pages/PlayerGraphic.jsx:205)"}, "fullDescription": {"text": "`frontend/src/pages/PlayerGraphic.jsx:205` calls `GET /api/v1/players/search?q=${encodeURIComponent(query)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/players/search`\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-6595c9500d55ec03", "name": "Dangling fetch: GET /api/v1/team-ratings?season=${season} (frontend/src/pages/PlayerGraphic.jsx:475)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/team-ratings?season=${season} (frontend/src/pages/PlayerGraphic.jsx:475)"}, "fullDescription": {"text": "`frontend/src/pages/PlayerGraphic.jsx:475` calls `GET /api/v1/team-ratings?season=${season}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/team-ratings`\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-145d7046f1cff6c1", "name": "Dangling fetch: GET /api/v1/national-rankings?season=${season} (frontend/src/pages/PlayerGraphic.jsx:476)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/national-rankings?season=${season} (frontend/src/pages/PlayerGraphic.jsx:476)"}, "fullDescription": {"text": "`frontend/src/pages/PlayerGraphic.jsx:476` calls `GET /api/v1/national-rankings?season=${season}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/national-rankings`\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-595efb950a53e414", "name": "Dangling fetch: GET /api/v1/players/${playerId}/streaks?season=${season} (frontend/src/pages/PlayerDetail.jsx:1412)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/players/${playerId}/streaks?season=${season} (frontend/src/pages/PlayerDetail.jsx:1412)"}, "fullDescription": {"text": "`frontend/src/pages/PlayerDetail.jsx:1412` calls `GET /api/v1/players/${playerId}/streaks?season=${season}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/players/<p>/streaks`\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-97ac8a6ca12b7c7a", "name": "Dangling fetch: GET /api/v1/leaderboards/relievers?${qs} (frontend/src/pages/RelieverLeaderboard.jsx:103)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/leaderboards/relievers?${qs} (frontend/src/pages/RelieverLeaderboard.jsx:103)"}, "fullDescription": {"text": "`frontend/src/pages/RelieverLeaderboard.jsx:103` calls `GET /api/v1/leaderboards/relievers?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/leaderboards/relievers`\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-1b1d5926fda286fa", "name": "Unused endpoint: GET /{full_path:path}", "shortDescription": {"text": "Unused endpoint: GET /{full_path:path}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /{full_path:path}` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /` 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-eb48bc9c6f8c0c14", "name": "Unused endpoint: POST /feature-requests", "shortDescription": {"text": "Unused endpoint: POST /feature-requests"}, "fullDescription": {"text": "`backend/app/api/feature_requests.py` declares `POST /feature-requests` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-64fec68a4bd7140d", "name": "Unused endpoint: GET /feature-requests", "shortDescription": {"text": "Unused endpoint: GET /feature-requests"}, "fullDescription": {"text": "`backend/app/api/feature_requests.py` declares `GET /feature-requests` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c85094ad85aafb5c", "name": "Unused endpoint: GET /me/subscription", "shortDescription": {"text": "Unused endpoint: GET /me/subscription"}, "fullDescription": {"text": "`backend/app/api/account.py` declares `GET /me/subscription` 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-b25bbcfcde5ea82f", "name": "Unused endpoint: GET /me/affiliated-team", "shortDescription": {"text": "Unused endpoint: GET /me/affiliated-team"}, "fullDescription": {"text": "`backend/app/api/account.py` declares `GET /me/affiliated-team` 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-0fdb1f7f27df65ce", "name": "Unused endpoint: PUT /me/affiliated-team", "shortDescription": {"text": "Unused endpoint: PUT /me/affiliated-team"}, "fullDescription": {"text": "`backend/app/api/account.py` declares `PUT /me/affiliated-team` 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-162d89ac7e0e2d54", "name": "Unused endpoint: GET /question", "shortDescription": {"text": "Unused endpoint: GET /question"}, "fullDescription": {"text": "`backend/app/api/quiz.py` declares `GET /question` 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-7b01f85b4855fe2a", "name": "Unused endpoint: GET /questions", "shortDescription": {"text": "Unused endpoint: GET /questions"}, "fullDescription": {"text": "`backend/app/api/quiz.py` declares `GET /questions` 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-d88e9ae2a8f1c1cb", "name": "Unused endpoint: GET /league-question", "shortDescription": {"text": "Unused endpoint: GET /league-question"}, "fullDescription": {"text": "`backend/app/api/quiz.py` declares `GET /league-question` 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-9d614fbdbe449e2b", "name": "Unused endpoint: GET /site-stats", "shortDescription": {"text": "Unused endpoint: GET /site-stats"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /site-stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a2e102cbaee3d91", "name": "Unused endpoint: GET /stats/last-updated", "shortDescription": {"text": "Unused endpoint: GET /stats/last-updated"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /stats/last-updated` 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-2b02cf6f0dfc991e", "name": "Unused endpoint: GET /hometown-search", "shortDescription": {"text": "Unused endpoint: GET /hometown-search"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /hometown-search` 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-ebabd49fcdc19cac", "name": "Unused endpoint: GET /divisions", "shortDescription": {"text": "Unused endpoint: GET /divisions"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /divisions` 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-e7be1714a0f2a38c", "name": "Unused endpoint: GET /conferences", "shortDescription": {"text": "Unused endpoint: GET /conferences"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /conferences` 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-72e04955cf83a53f", "name": "Unused endpoint: GET /teams", "shortDescription": {"text": "Unused endpoint: GET /teams"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /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-b416da04e074bb8d", "name": "Unused endpoint: GET /teams/summary", "shortDescription": {"text": "Unused endpoint: GET /teams/summary"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /teams/summary` 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-fa5ca8f5ddd49bd7", "name": "Unused endpoint: GET /standings", "shortDescription": {"text": "Unused endpoint: GET /standings"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /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-8d7a4fc53e78944b", "name": "Unused endpoint: GET /conference-standings-graphic", "shortDescription": {"text": "Unused endpoint: GET /conference-standings-graphic"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /conference-standings-graphic` 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-956de801f310823e", "name": "Unused endpoint: GET /stat-leaders", "shortDescription": {"text": "Unused endpoint: GET /stat-leaders"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /stat-leaders` 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-a300923b068adcba", "name": "Unused endpoint: GET /records", "shortDescription": {"text": "Unused endpoint: GET /records"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /records` 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-bb1e076d0aabc056", "name": "Unused endpoint: GET /team-ratings", "shortDescription": {"text": "Unused endpoint: GET /team-ratings"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /team-ratings` 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-b0eeb3ecb9046f28", "name": "Unused endpoint: GET /national-rankings", "shortDescription": {"text": "Unused endpoint: GET /national-rankings"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /national-rankings` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1959c292402b530f", "name": "Unused endpoint: GET /teams/compare", "shortDescription": {"text": "Unused endpoint: GET /teams/compare"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /teams/compare` 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-279983215bc1d078", "name": "Unused endpoint: GET /teams/matchup", "shortDescription": {"text": "Unused endpoint: GET /teams/matchup"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /teams/matchup` 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-ccbdcb7721fe5866", "name": "Unused endpoint: GET /games/win-probabilities", "shortDescription": {"text": "Unused endpoint: GET /games/win-probabilities"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /games/win-probabilities` 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-dbb1e05bdc70d611", "name": "Unused endpoint: GET /games/upset-of-the-day", "shortDescription": {"text": "Unused endpoint: GET /games/upset-of-the-day"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /games/upset-of-the-day` 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-5e77b87767a7c63c", "name": "Unused endpoint: GET /playoff-projections", "shortDescription": {"text": "Unused endpoint: GET /playoff-projections"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /playoff-projections` 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-a92d11e3963f7869", "name": "Unused endpoint: GET /nwac-championship-odds", "shortDescription": {"text": "Unused endpoint: GET /nwac-championship-odds"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /nwac-championship-odds` 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-816a6475580afcd8", "name": "Unused endpoint: GET /nwac-mvp-tracker", "shortDescription": {"text": "Unused endpoint: GET /nwac-mvp-tracker"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /nwac-mvp-tracker` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e7985195a22ea0e1", "name": "Unused endpoint: GET /teams/scatter", "shortDescription": {"text": "Unused endpoint: GET /teams/scatter"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /teams/scatter` 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-01faadf9e80942cd", "name": "Unused endpoint: GET /teams/correlations", "shortDescription": {"text": "Unused endpoint: GET /teams/correlations"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /teams/correlations` 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-3e6e45699f6fef78", "name": "Unused endpoint: GET /teams/{team_id}", "shortDescription": {"text": "Unused endpoint: GET /teams/{team_id}"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /teams/{team_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-6befd26946914ba9", "name": "Unused endpoint: GET /teams/{team_id}/rankings", "shortDescription": {"text": "Unused endpoint: GET /teams/{team_id}/rankings"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /teams/{team_id}/rankings` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fcf1b02712264c0b", "name": "Unused endpoint: GET /teams/{team_id}/season-recap", "shortDescription": {"text": "Unused endpoint: GET /teams/{team_id}/season-recap"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /teams/{team_id}/season-recap` 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-d3ddbc4a8c8ee1c6", "name": "Unused endpoint: GET /teams/{team_id}/info-graphic", "shortDescription": {"text": "Unused endpoint: GET /teams/{team_id}/info-graphic"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /teams/{team_id}/info-graphic` 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-157a6bc5c097defb", "name": "Unused endpoint: GET /leaderboards/batting", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/batting"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/batting` 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-49339f714e2b3b70", "name": "Unused endpoint: GET /leaderboards/clubs", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/clubs"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/clubs` 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-cb239096708614f5", "name": "Unused endpoint: GET /leaderboards/pitching", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/pitching"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/pitching` 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-9cc348be3acf1b5e", "name": "Unused endpoint: GET /leaderboards/batting-pbp", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/batting-pbp"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/batting-pbp` 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-30878c05ecdc0632", "name": "Unused endpoint: GET /leaderboards/pitching-pbp", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/pitching-pbp"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/pitching-pbp` 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-52e24d237c78d2f1", "name": "Unused endpoint: GET /leaderboards/team-batting-pbp", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/team-batting-pbp"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/team-batting-pbp` 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-9ea32345171b92b1", "name": "Unused endpoint: GET /leaderboards/team-pitching-pbp", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/team-pitching-pbp"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/team-pitching-pbp` 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-7b88120c0e3d8ce3", "name": "Unused endpoint: GET /leaderboards/relievers", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/relievers"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/relievers` 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-6850103d190ea65e", "name": "Unused endpoint: GET /players/{player_id}/goose-eggs", "shortDescription": {"text": "Unused endpoint: GET /players/{player_id}/goose-eggs"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /players/{player_id}/goose-eggs` 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-0f2ea12dec6260e5", "name": "Unused endpoint: GET /leaderboards/fielding", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/fielding"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/fielding` 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-17fee23a4a764109", "name": "Unused endpoint: GET /leaderboards/war", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/war"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/war` 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-aede50b4ea09aabb", "name": "Unused endpoint: GET /leaderboards/percentiles", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/percentiles"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/percentiles` 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-f4b13cad09989c81", "name": "Unused endpoint: GET /leaderboards/teams", "shortDescription": {"text": "Unused endpoint: GET /leaderboards/teams"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /leaderboards/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-d16e4fa529c520e9", "name": "Unused endpoint: GET /search", "shortDescription": {"text": "Unused endpoint: GET /search"}, "fullDescription": {"text": "`backend/app/api/routes.py` declares `GET /search` 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/17846"}, "properties": {"repository": "rasmussenbaseball/pnw-baseball", "repoUrl": "https://github.com/rasmussenbaseball/pnw-baseball", "branch": "main"}, "results": [{"ruleId": "scanner-cbcc6812867cd66a", "level": "note", "message": {"text": "Possibly dead Python function: spray_for"}, "properties": {"repobilityId": "7117ce975f3a74ce", "scanner": "scanner-primary", "fingerprint": "cbcc6812867cd66a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/classify_batted_ball.py:369"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2f7d485de731554e", "level": "note", "message": {"text": "Possibly dead Python function: norm_year"}, "properties": {"repobilityId": "30ac16129fb52e19", "scanner": "scanner-primary", "fingerprint": "2f7d485de731554e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/fill_player_bio_from_csv.py:37"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e74f06e31ab4977b", "level": "note", "message": {"text": "Possibly dead Python function: scrape_massey_ratings"}, "properties": {"repobilityId": "4d87b9f25087d58e", "scanner": "scanner-primary", "fingerprint": "e74f06e31ab4977b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/scrape_national_ratings.py:317"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-91cc683050d0b76c", "level": "note", "message": {"text": "Possibly dead Python function: scrape_nwac_standings"}, "properties": {"repobilityId": "395c0157ed11a548", "scanner": "scanner-primary", "fingerprint": "91cc683050d0b76c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/scrape_records.py:135"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bba0bfb4f7defbbf", "level": "note", "message": {"text": "Possibly dead Python function: handle_starttag"}, "properties": {"repobilityId": "3bf216d149959ebf", "scanner": "scanner-primary", "fingerprint": "bba0bfb4f7defbbf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/archive/sample_substitution_narratives.py:36"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dfd252fba395749b", "level": "note", "message": {"text": "Possibly dead Python function: handle_endtag"}, "properties": {"repobilityId": "7eb6f3decafc1766", "scanner": "scanner-primary", "fingerprint": "dfd252fba395749b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/archive/sample_substitution_narratives.py:43"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d1924cbe4454fc6b", "level": "note", "message": {"text": "Possibly dead Python function: handle_data"}, "properties": {"repobilityId": "3a673a278f4fc1e6", "scanner": "scanner-primary", "fingerprint": "d1924cbe4454fc6b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/archive/sample_substitution_narratives.py:52"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb95215d5ea3ee74", "level": "note", "message": {"text": "Possibly dead Python function: fetch_one"}, "properties": {"repobilityId": "87b4aa7c92d11833", "scanner": "scanner-primary", "fingerprint": "cb95215d5ea3ee74", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/archive/scan_pbp_coverage.py:72"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-91e89c1b56969b4e", "level": "note", "message": {"text": "Possibly dead Python function: norm_class"}, "properties": {"repobilityId": "f4431a4005770e0f", "scanner": "scanner-primary", "fingerprint": "91e89c1b56969b4e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/projections/derive_constants.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ac8f5082a7dd7b8f", "level": "note", "message": {"text": "Possibly dead Python function: pos_factor"}, "properties": {"repobilityId": "394db9911ce74733", "scanner": "scanner-primary", "fingerprint": "ac8f5082a7dd7b8f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/projections/write_projections_db.py:290"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9b0de18ec1b4b633", "level": "note", "message": {"text": "Possibly dead Python function: draw"}, "properties": {"repobilityId": "53ecb21dcbad2db9", "scanner": "scanner-primary", "fingerprint": "9b0de18ec1b4b633", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/recruiting_book/build_book.py:1054"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c05b0d90ea6610aa", "level": "note", "message": {"text": "Possibly dead Python function: afterFlowable"}, "properties": {"repobilityId": "dabdb14c74208704", "scanner": "scanner-primary", "fingerprint": "c05b0d90ea6610aa", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/recruiting_book/build_book.py:2606"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-adfb0c771eb16030", "level": "note", "message": {"text": "Possibly dead Python function: add_stats_grid"}, "properties": {"repobilityId": "518247268b570d5f", "scanner": "scanner-primary", "fingerprint": "adfb0c771eb16030", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/recruiting_book/build_docx.py:204"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8f6c26c642d5c7de", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "8f6c26c642d5c7de", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/cache.py:45"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0d66670a20f40904", "level": "note", "message": {"text": "Possibly dead Python function: render"}, "properties": {"repobilityId": "a287debe7751b057", "scanner": "scanner-primary", "fingerprint": "0d66670a20f40904", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/main.py:55"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5c917442132126b6", "level": "note", "message": {"text": "Possibly dead Python function: explain"}, "properties": {"repobilityId": "e1ad522f6e8bce9d", "scanner": "scanner-primary", "fingerprint": "5c917442132126b6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:409"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fd7c1d70ebb84d41", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_hr"}, "properties": {"repobilityId": "85e65630bd7344fe", "scanner": "scanner-primary", "fingerprint": "fd7c1d70ebb84d41", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:427"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f973c09e468faf14", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_rbi"}, "properties": {"repobilityId": "29d5e089637525eb", "scanner": "scanner-primary", "fingerprint": "f973c09e468faf14", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:432"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ddf89a8aeffd4de2", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_hits"}, "properties": {"repobilityId": "b50ffec78a6d35f6", "scanner": "scanner-primary", "fingerprint": "ddf89a8aeffd4de2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:437"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-78d6d0615c1d2de0", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_doubles"}, "properties": {"repobilityId": "0415fa222f311e45", "scanner": "scanner-primary", "fingerprint": "78d6d0615c1d2de0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:442"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f80d82a4de06e9f", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_triples"}, "properties": {"repobilityId": "aa27038f35460126", "scanner": "scanner-primary", "fingerprint": "0f80d82a4de06e9f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:447"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1d9db537fe681fd4", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_sb"}, "properties": {"repobilityId": "8ee855101fccbcd5", "scanner": "scanner-primary", "fingerprint": "1d9db537fe681fd4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:452"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2d5789ed970c5311", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_walks"}, "properties": {"repobilityId": "00c3a0836b09d51f", "scanner": "scanner-primary", "fingerprint": "2d5789ed970c5311", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:457"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5159338fd5985915", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_runs"}, "properties": {"repobilityId": "b0060659973f0fec", "scanner": "scanner-primary", "fingerprint": "5159338fd5985915", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:462"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4b7b29ebd689da26", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_pa"}, "properties": {"repobilityId": "160945efe1114dab", "scanner": "scanner-primary", "fingerprint": "4b7b29ebd689da26", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:467"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-44c42fe959f73972", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_owar"}, "properties": {"repobilityId": "e0b60c72b8bd1e0c", "scanner": "scanner-primary", "fingerprint": "44c42fe959f73972", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:472"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-80a32c9081341b85", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_avg"}, "properties": {"repobilityId": "7c36c6b399d916a6", "scanner": "scanner-primary", "fingerprint": "80a32c9081341b85", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:480"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a65c7069ecef7a73", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_obp"}, "properties": {"repobilityId": "f54c9e9cdf2d89d7", "scanner": "scanner-primary", "fingerprint": "a65c7069ecef7a73", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:486"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9b92ccfa11812fb6", "level": "note", "message": {"text": "Possibly dead Python function: t_leader_slg"}, "properties": {"repobilityId": "816a5221bc72d84c", "scanner": "scanner-primary", "fingerprint": "9b92ccfa11812fb6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/quiz.py:492"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c798cec5d3dc88bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Header.jsx:348"}, "properties": {"repobilityId": "aca455d32421d136", "scanner": "scanner-primary", "fingerprint": "c798cec5d3dc88bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f859a2a4c70a2ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PlayerCompsCard.jsx:31"}, "properties": {"repobilityId": "b531a8039f7c0d30", "scanner": "scanner-primary", "fingerprint": "7f859a2a4c70a2ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3343f94acf5eeefc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PortalTeamGate.jsx:140"}, "properties": {"repobilityId": "fd9577a1ed396930", "scanner": "scanner-primary", "fingerprint": "3343f94acf5eeefc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c4e9e46238e51e7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CommitBadge.jsx:17"}, "properties": {"repobilityId": "406adcb7148ac43b", "scanner": "scanner-primary", "fingerprint": "7c4e9e46238e51e7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6c3fc13e7df91f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PlayerTrackerTable.jsx:194"}, "properties": {"repobilityId": "1c24879bdd306de7", "scanner": "scanner-primary", "fingerprint": "d6c3fc13e7df91f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fdb311d50269a506", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PortalHeader.jsx:266"}, "properties": {"repobilityId": "5a92c7957ebe7c7c", "scanner": "scanner-primary", "fingerprint": "fdb311d50269a506", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1603e901297e0aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/home/StatWidgets.jsx:91"}, "properties": {"repobilityId": "edc6f6e2bbba5d1d", "scanner": "scanner-primary", "fingerprint": "a1603e901297e0aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f855b51f91c677ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/home/FeatureWidgets.jsx:78"}, "properties": {"repobilityId": "ccae8efbec73259f", "scanner": "scanner-primary", "fingerprint": "f855b51f91c677ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-97facf7b22e082a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/home/WidgetShell.jsx:47"}, "properties": {"repobilityId": "ac535eef3f0fe313", "scanner": "scanner-primary", "fingerprint": "97facf7b22e082a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed9f8dd1360d5e3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PortalHome.jsx:262"}, "properties": {"repobilityId": "64f03a01d24f3c94", "scanner": "scanner-primary", "fingerprint": "ed9f8dd1360d5e3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-41cc3d86ecfdcd3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/FavoritesPage.jsx:31"}, "properties": {"repobilityId": "57921ddd7b6047cc", "scanner": "scanner-primary", "fingerprint": "41cc3d86ecfdcd3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4988421c3127bf30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SummerTeamDetail.jsx:53"}, "properties": {"repobilityId": "0b29ac00aa6afbf8", "scanner": "scanner-primary", "fingerprint": "4988421c3127bf30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8e4ae2c570573b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamsPage.jsx:131"}, "properties": {"repobilityId": "a212f1b72e3befa9", "scanner": "scanner-primary", "fingerprint": "c8e4ae2c570573b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26160ba9f09e681d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/KeyMatchupGraphic.jsx:537"}, "properties": {"repobilityId": "7d8fc45fa9fe4c0f", "scanner": "scanner-primary", "fingerprint": "26160ba9f09e681d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a30c0693b23ef12", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TopMoments.jsx:196"}, "properties": {"repobilityId": "8c524217d633c542", "scanner": "scanner-primary", "fingerprint": "6a30c0693b23ef12", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f7032857c2b337e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HometownSearch.jsx:159"}, "properties": {"repobilityId": "986cf5ddf593c963", "scanner": "scanner-primary", "fingerprint": "f7032857c2b337e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1c912eb17108ca0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/CoachHomepage.jsx:109"}, "properties": {"repobilityId": "f3f0c9bc0b8d6d19", "scanner": "scanner-primary", "fingerprint": "b1c912eb17108ca0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0cc6d3e259dde041", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamDetail.jsx:329"}, "properties": {"repobilityId": "999d57ace2167f41", "scanner": "scanner-primary", "fingerprint": "0cc6d3e259dde041", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eb533708a93047a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayerComps.jsx:115"}, "properties": {"repobilityId": "0fe25af01d1421be", "scanner": "scanner-primary", "fingerprint": "eb533708a93047a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94a022186fe0a90d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SummerGameDetail.jsx:164"}, "properties": {"repobilityId": "72c4c5c7b734cca6", "scanner": "scanner-primary", "fingerprint": "94a022186fe0a90d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bee3949a6d37feed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/StatLeaders.jsx:74"}, "properties": {"repobilityId": "044cd0390003789f", "scanner": "scanner-primary", "fingerprint": "bee3949a6d37feed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89ee185bb81f77d7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DraftBoard.jsx:325"}, "properties": {"repobilityId": "b2849ccc9bc891a6", "scanner": "scanner-primary", "fingerprint": "89ee185bb81f77d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13f298e1a6501b2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PnwGrid.jsx:505"}, "properties": {"repobilityId": "f21aa66500504888", "scanner": "scanner-primary", "fingerprint": "13f298e1a6501b2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0043e9321782c3ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/NewsCommitments.jsx:145"}, "properties": {"repobilityId": "fc1909afa3ae03d3", "scanner": "scanner-primary", "fingerprint": "0043e9321782c3ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60c978b125e7bab6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ScoutingSheet.jsx:202"}, "properties": {"repobilityId": "850f86f3300e1947", "scanner": "scanner-primary", "fingerprint": "60c978b125e7bab6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a01c1d559501c24", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamStatsPage.jsx:98"}, "properties": {"repobilityId": "748e5454ba183491", "scanner": "scanner-primary", "fingerprint": "7a01c1d559501c24", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3be74a3bd6c45603", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/BullpenSheet.jsx:236"}, "properties": {"repobilityId": "195be60e75b5dc3c", "scanner": "scanner-primary", "fingerprint": "3be74a3bd6c45603", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b3500badce1bebbe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AnonymousHomepage.jsx:304"}, "properties": {"repobilityId": "c607deb965c50ade", "scanner": "scanner-primary", "fingerprint": "b3500badce1bebbe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f63110d57f29db4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PremiumHomepage.jsx:87"}, "properties": {"repobilityId": "291fcde4274ca189", "scanner": "scanner-primary", "fingerprint": "f63110d57f29db4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a80023850c8351e7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RecruitingGuide.jsx:493"}, "properties": {"repobilityId": "bbc98fa522d7066a", "scanner": "scanner-primary", "fingerprint": "a80023850c8351e7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e4f5a502c1a1583", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/GameDetail.jsx:45"}, "properties": {"repobilityId": "959e219a64a25b4d", "scanner": "scanner-primary", "fingerprint": "4e4f5a502c1a1583", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a38ad7bc4ab422e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamComparison.jsx:75"}, "properties": {"repobilityId": "42b9090b1782c177", "scanner": "scanner-primary", "fingerprint": "a38ad7bc4ab422e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d988cdc8ce1a0e24", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RecruitingHomepage.jsx:137"}, "properties": {"repobilityId": "b7ab6b2b26f5df93", "scanner": "scanner-primary", "fingerprint": "d988cdc8ce1a0e24", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd58a830fa9b4732", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayerCardPDF.jsx:808"}, "properties": {"repobilityId": "1c2851244c40264c", "scanner": "scanner-primary", "fingerprint": "bd58a830fa9b4732", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc45b7d84cda5635", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AllConferenceGenerator.jsx:89"}, "properties": {"repobilityId": "d2639e6c4265aea2", "scanner": "scanner-primary", "fingerprint": "dc45b7d84cda5635", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aec610b6974a2cd3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ParkFactors.jsx:126"}, "properties": {"repobilityId": "f44982842f39b1ce", "scanner": "scanner-primary", "fingerprint": "aec610b6974a2cd3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48bf859ac2df6e6f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/NwacAdvancement.jsx:118"}, "properties": {"repobilityId": "469ec2c068b8ba1f", "scanner": "scanner-primary", "fingerprint": "48bf859ac2df6e6f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9632a7fdbd225efb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProTracker.jsx:117"}, "properties": {"repobilityId": "cf23d660cb7aa182", "scanner": "scanner-primary", "fingerprint": "9632a7fdbd225efb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d2bf7faedbb9220", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayoffProjections.jsx:128"}, "properties": {"repobilityId": "5759e5b0e66c77e4", "scanner": "scanner-primary", "fingerprint": "2d2bf7faedbb9220", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03c8c619242e7fc1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Percentiles.jsx:241"}, "properties": {"repobilityId": "109fbc4914583d5f", "scanner": "scanner-primary", "fingerprint": "03c8c619242e7fc1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac27ac3813d8ee7a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/FreeHomepage.jsx:84"}, "properties": {"repobilityId": "571d98034ff6c4ff", "scanner": "scanner-primary", "fingerprint": "ac27ac3813d8ee7a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-29c34d54e5bfa1a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamRatings.jsx:136"}, "properties": {"repobilityId": "bea31d0ae1d1295d", "scanner": "scanner-primary", "fingerprint": "29c34d54e5bfa1a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3e8b68e245dda64b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/StandingsPage.jsx:62"}, "properties": {"repobilityId": "ccbebf6020e3b9cd", "scanner": "scanner-primary", "fingerprint": "3e8b68e245dda64b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d35c03474007aa4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PlayerDetail.jsx:776"}, "properties": {"repobilityId": "b41ec01d0aa1451b", "scanner": "scanner-primary", "fingerprint": "1d35c03474007aa4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f028d854b84e193e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PortalPDFs.jsx:218"}, "properties": {"repobilityId": "fb8b4e2cc42c8a09", "scanner": "scanner-primary", "fingerprint": "f028d854b84e193e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e0bc79eab821ec3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SummerHub.jsx:261"}, "properties": {"repobilityId": "3f19ec97168efbc7", "scanner": "scanner-primary", "fingerprint": "8e0bc79eab821ec3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d886f2bb9500296c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/TeamQuiz.jsx:271"}, "properties": {"repobilityId": "1439218ea06e593a", "scanner": "scanner-primary", "fingerprint": "d886f2bb9500296c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd1a163131a51b46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HistoricMatchups.jsx:283"}, "properties": {"repobilityId": "69ff3035ebe2b081", "scanner": "scanner-primary", "fingerprint": "dd1a163131a51b46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-398fa25f2bf12374", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/summer/SummerStatsPage.jsx:567"}, "properties": {"repobilityId": "e928b09d1141a8d0", "scanner": "scanner-primary", "fingerprint": "398fa25f2bf12374", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-08fe8c2658a49e62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/portal/EmailComposer.jsx:482"}, "properties": {"repobilityId": "d76cbf5cf7c8596a", "scanner": "scanner-primary", "fingerprint": "08fe8c2658a49e62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-671ffa9e419d8a63", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/portal/ArticlesList.jsx:84"}, "properties": {"repobilityId": "9fef2bb22999a39d", "scanner": "scanner-primary", "fingerprint": "671ffa9e419d8a63", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e8af6e668a2b32e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/DepthChart.jsx:215"}, "properties": {"repobilityId": "7b05c70dcd834e7c", "scanner": "scanner-primary", "fingerprint": "1e8af6e668a2b32e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b24954e6156da5e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/NewDynasty.jsx:1078"}, "properties": {"repobilityId": "4275093aed112240", "scanner": "scanner-primary", "fingerprint": "b24954e6156da5e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25eea20d823b3420", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Dashboard.jsx:801"}, "properties": {"repobilityId": "eafc677ee1ec7fc2", "scanner": "scanner-primary", "fingerprint": "25eea20d823b3420", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e2dfc246a1e0649", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/WeeklyActions.jsx:493"}, "properties": {"repobilityId": "3d8eee2d2967b75d", "scanner": "scanner-primary", "fingerprint": "4e2dfc246a1e0649", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-82ce4f0ea5a960ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/SummerBall.jsx:282"}, "properties": {"repobilityId": "9a534653dedc25b1", "scanner": "scanner-primary", "fingerprint": "82ce4f0ea5a960ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2da0e535fe73cea2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Records.jsx:430"}, "properties": {"repobilityId": "2138c496517553b8", "scanner": "scanner-primary", "fingerprint": "2da0e535fe73cea2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-115cddbfaf0ef3be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Play.jsx:1457"}, "properties": {"repobilityId": "aba674ceb810759d", "scanner": "scanner-primary", "fingerprint": "115cddbfaf0ef3be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-40065b634515a027", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Postseason.jsx:646"}, "properties": {"repobilityId": "bd8593ce0ea767ff", "scanner": "scanner-primary", "fingerprint": "40065b634515a027", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa47c28c1c8f4af7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Career.jsx:285"}, "properties": {"repobilityId": "0cd190fcfeb55809", "scanner": "scanner-primary", "fingerprint": "aa47c28c1c8f4af7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6520d49f36636a2a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/gm/Roster.jsx:153"}, "properties": {"repobilityId": "75a4b4550fd0c473", "scanner": "scanner-primary", "fingerprint": "6520d49f36636a2a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-300cf1ba17d3f850", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/gm/components/PixelSelect.jsx:96"}, "properties": {"repobilityId": "e91262d400bf49bd", "scanner": "scanner-primary", "fingerprint": "300cf1ba17d3f850", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb21e314ccb75223", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gm/generate_non_naia_teams.js:430"}, "properties": {"repobilityId": "dcc6026fbd5f844f", "scanner": "scanner-primary", "fingerprint": "cb21e314ccb75223", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a088d6c8efd377d6", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in frontend/api/img.ts:144"}, "properties": {"repobilityId": "e16e016e2d009a61", "scanner": "scanner-primary", "fingerprint": "a088d6c8efd377d6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/api/img.ts"}, "region": {"startLine": 144}}}]}, {"ruleId": "scanner-ad9e929a56f163fb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/signature.html:230"}, "properties": {"repobilityId": "6a6a66848d5b66c4", "scanner": "scanner-primary", "fingerprint": "ad9e929a56f163fb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/signature.html"}, "region": {"startLine": 230}}}]}, {"ruleId": "scanner-10317a9a8ddf297a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/pages/RecruitingMap.jsx:178"}, "properties": {"repobilityId": "70f0853c5375acff", "scanner": "scanner-primary", "fingerprint": "10317a9a8ddf297a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/RecruitingMap.jsx"}, "region": {"startLine": 178}}}]}, {"ruleId": "scanner-94b8d0e16f520b08", "level": "note", "message": {"text": "Very large file: frontend/src/pages/WclLeaderboardGraphic.jsx (1134 lines)"}, "properties": {"repobilityId": "7c60f408be625fa3", "scanner": "scanner-primary", "fingerprint": "94b8d0e16f520b08", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4409fefa70b1074a", "level": "note", "message": {"text": "Very large file: frontend/src/pages/SocialGraphics.jsx (2054 lines)"}, "properties": {"repobilityId": "ac858cb1009dd209", "scanner": "scanner-primary", "fingerprint": "4409fefa70b1074a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-62faa187af6a5b62", "level": "note", "message": {"text": "Very large file: frontend/src/pages/About.jsx (1534 lines)"}, "properties": {"repobilityId": "0ce4030195fcd474", "scanner": "scanner-primary", "fingerprint": "62faa187af6a5b62", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-20dabc2be92943ea", "level": "note", "message": {"text": "Very large file: frontend/src/pages/PlayerCardPDF.jsx (1245 lines)"}, "properties": {"repobilityId": "de1cae987d9b3d36", "scanner": "scanner-primary", "fingerprint": "20dabc2be92943ea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0c87d8592d1af92d", "level": "note", "message": {"text": "Very large file: frontend/src/pages/PlayerDetail.jsx (2135 lines)"}, "properties": {"repobilityId": "84e41cf157f7263c", "scanner": "scanner-primary", "fingerprint": "0c87d8592d1af92d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f507a0437999a868", "level": "note", "message": {"text": "Very large file: frontend/src/pages/SummerHub.jsx (1062 lines)"}, "properties": {"repobilityId": "8318dc39c802f48c", "scanner": "scanner-primary", "fingerprint": "f507a0437999a868", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-50fdf18d8d1df8f2", "level": "note", "message": {"text": "Very large file: frontend/src/pages/gm/Recruiting.jsx (1584 lines)"}, "properties": {"repobilityId": "0221eebfa355de3b", "scanner": "scanner-primary", "fingerprint": "50fdf18d8d1df8f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a1c20d3b6303840f", "level": "note", "message": {"text": "Very large file: frontend/src/pages/gm/NewDynasty.jsx (1625 lines)"}, "properties": {"repobilityId": "0f2be96608fa2616", "scanner": "scanner-primary", "fingerprint": "a1c20d3b6303840f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9346995e7b338c26", "level": "note", "message": {"text": "Very large file: frontend/src/pages/gm/Dashboard.jsx (4034 lines)"}, "properties": {"repobilityId": "7c4a6abe690496b1", "scanner": "scanner-primary", "fingerprint": "9346995e7b338c26", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1edf18159fc41463", "level": "note", "message": {"text": "Very large file: frontend/src/pages/gm/Play.jsx (2345 lines)"}, "properties": {"repobilityId": "6dc760e9211f9750", "scanner": "scanner-primary", "fingerprint": "1edf18159fc41463", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b90abd0652c23639", "level": "note", "message": {"text": "Very large file: frontend/src/pages/gm/Postseason.jsx (1011 lines)"}, "properties": {"repobilityId": "4b89f8d2664a253d", "scanner": "scanner-primary", "fingerprint": "b90abd0652c23639", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-598e552cc6b118cc", "level": "note", "message": {"text": "Very large file: frontend/src/gm/engine/sim.js (1165 lines)"}, "properties": {"repobilityId": "4e8a3b13525be9fa", "scanner": "scanner-primary", "fingerprint": "598e552cc6b118cc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3e9134ea237d6ba2", "level": "note", "message": {"text": "Very large file: frontend/src/gm/engine/season.js (2079 lines)"}, "properties": {"repobilityId": "3598c1bdff608189", "scanner": "scanner-primary", "fingerprint": "3e9134ea237d6ba2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d3977016f1da6f09", "level": "note", "message": {"text": "Very large file: frontend/src/gm/engine/events.js (1045 lines)"}, "properties": {"repobilityId": "8b5207c259c3f569", "scanner": "scanner-primary", "fingerprint": "d3977016f1da6f09", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b4a4afe1c706dff9", "level": "note", "message": {"text": "Very large file: frontend/src/gm/engine/postseasonInteractive.js (1890 lines)"}, "properties": {"repobilityId": "5344dc5266a75632", "scanner": "scanner-primary", "fingerprint": "b4a4afe1c706dff9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bca372c385f7d13a", "level": "note", "message": {"text": "Very large file: frontend/src/gm/engine/newDynastyMultiLevel.js (1288 lines)"}, "properties": {"repobilityId": "85fdd1e7a88a5903", "scanner": "scanner-primary", "fingerprint": "bca372c385f7d13a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f66ca2cc7a3dcd6e", "level": "note", "message": {"text": "Very large file: frontend/src/gm/engine/recruits.js (1747 lines)"}, "properties": {"repobilityId": "ead7b530f4dafc4c", "scanner": "scanner-primary", "fingerprint": "f66ca2cc7a3dcd6e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2cdbc5c8ed3f4df2", "level": "note", "message": {"text": "Very large file: frontend/src/gm/engine/schedule.js (1430 lines)"}, "properties": {"repobilityId": "ce1c5dfe038aa4d5", "scanner": "scanner-primary", "fingerprint": "2cdbc5c8ed3f4df2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3fb9d571efd6a0e9", "level": "note", "message": {"text": "Very large file: frontend/src/gm/engine/randomEvents.js (3387 lines)"}, "properties": {"repobilityId": "81528eae3446beff", "scanner": "scanner-primary", "fingerprint": "3fb9d571efd6a0e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-54dbea6378ce4312", "level": "note", "message": {"text": "Very large file: scripts/scrape_naia.py (1369 lines)"}, "properties": {"repobilityId": "acd799b73ed0ccbd", "scanner": "scanner-primary", "fingerprint": "54dbea6378ce4312", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-887953f1d59d779e", "level": "note", "message": {"text": "Very large file: scripts/scrape_nwac.py (1659 lines)"}, "properties": {"repobilityId": "5bc039a62c05dc38", "scanner": "scanner-primary", "fingerprint": "887953f1d59d779e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-10dc3330ef8c4904", "level": "note", "message": {"text": "Very large file: scripts/scrape_boxscores.py (3812 lines)"}, "properties": {"repobilityId": "626f29e80b5a191a", "scanner": "scanner-primary", "fingerprint": "10dc3330ef8c4904", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-50b256e1adabb327", "level": "note", "message": {"text": "Very large file: scripts/scrape_d3.py (1627 lines)"}, "properties": {"repobilityId": "2634f24fd81d481f", "scanner": "scanner-primary", "fingerprint": "50b256e1adabb327", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d1336fdb03be8d06", "level": "note", "message": {"text": "Very large file: scripts/scrape_d2.py (1224 lines)"}, "properties": {"repobilityId": "326a52a294d7c86b", "scanner": "scanner-primary", "fingerprint": "d1336fdb03be8d06", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d5cf7dab662631f9", "level": "note", "message": {"text": "Very large file: scripts/scrape_d1.py (1675 lines)"}, "properties": {"repobilityId": "97ecd46df3885c56", "scanner": "scanner-primary", "fingerprint": "d5cf7dab662631f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5c1e96330df8db54", "level": "note", "message": {"text": "Very large file: scripts/projections/write_projections_db.py (1135 lines)"}, "properties": {"repobilityId": "2991eb9c5ba12ace", "scanner": "scanner-primary", "fingerprint": "5c1e96330df8db54", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-202a8e988b0a3500", "level": "note", "message": {"text": "Very large file: scripts/recruiting_book/build_book.py (2758 lines)"}, "properties": {"repobilityId": "0cb1ffca28f5da95", "scanner": "scanner-primary", "fingerprint": "202a8e988b0a3500", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9a4f8831a9f4b562", "level": "note", "message": {"text": "Very large file: backend/app/api/quiz.py (1922 lines)"}, "properties": {"repobilityId": "8a55f5d173214544", "scanner": "scanner-primary", "fingerprint": "9a4f8831a9f4b562", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cdb78ebccb911577", "level": "note", "message": {"text": "Very large file: backend/app/api/routes.py (15700 lines)"}, "properties": {"repobilityId": "bd3db19073836ca7", "scanner": "scanner-primary", "fingerprint": "cdb78ebccb911577", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f1a1049c81c1564b", "level": "note", "message": {"text": "Very large file: backend/app/api/team_stats.py (1824 lines)"}, "properties": {"repobilityId": "e05959bcffb56939", "scanner": "scanner-primary", "fingerprint": "f1a1049c81c1564b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3aeecaa684e4ff73", "level": "note", "message": {"text": "Very large file: backend/app/api/summer.py (3326 lines)"}, "properties": {"repobilityId": "e45388e355b03648", "scanner": "scanner-primary", "fingerprint": "3aeecaa684e4ff73", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-98513ee40cb19d14", "level": "note", "message": {"text": "Very large file: backend/app/api/grid.py (1389 lines)"}, "properties": {"repobilityId": "e124248693575646", "scanner": "scanner-primary", "fingerprint": "98513ee40cb19d14", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-81b57101a92d460a", "level": "note", "message": {"text": "Very large file: backend/app/api/recruiting.py (1872 lines)"}, "properties": {"repobilityId": "a5d80dcfa2653649", "scanner": "scanner-primary", "fingerprint": "81b57101a92d460a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1c81f1a43299e1f3", "level": "note", "message": {"text": "Very large file: backend/app/api/coaching_tools.py (1647 lines)"}, "properties": {"repobilityId": "4516b1493119bc6c", "scanner": "scanner-primary", "fingerprint": "1c81f1a43299e1f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-041afe365b6b98e3", "level": "note", "message": {"text": "Very large file: backend/app/api/team_scouting.py (1364 lines)"}, "properties": {"repobilityId": "c06e74b7cd889a2d", "scanner": "scanner-primary", "fingerprint": "041afe365b6b98e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8a5e1cdebaa6d588", "level": "note", "message": {"text": "Very large file: backend/app/api/pitch_level.py (1776 lines)"}, "properties": {"repobilityId": "993b1afa1ee3941d", "scanner": "scanner-primary", "fingerprint": "8a5e1cdebaa6d588", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-21d202f1cd23df28", "level": "note", "message": {"text": "Very large file: backend/app/stats/projections.py (1272 lines)"}, "properties": {"repobilityId": "26f332a01936cbcc", "scanner": "scanner-primary", "fingerprint": "21d202f1cd23df28", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "aed524de07f84d91", "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": "971a5aaeb9f7bce9", "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": "88998990134cf88b", "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": "efc158cacc3e4b97", "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": "1fd3b350b6ec2437", "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": "a9bc8d82c09ebde1", "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": "53ff09f719966605", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-097dd219901ed605", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/vite.config.js:5"}, "properties": {"repobilityId": "8a131a6df4ac158e", "scanner": "scanner-primary", "fingerprint": "097dd219901ed605", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-923b373c0fd844cb", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/middleware.js:3"}, "properties": {"repobilityId": "61f9d573dab3a6b6", "scanner": "scanner-primary", "fingerprint": "923b373c0fd844cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-010b952d58ad7f79", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/api/og.tsx:3"}, "properties": {"repobilityId": "fbf4ec249e34e325", "scanner": "scanner-primary", "fingerprint": "010b952d58ad7f79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5f7988439d1fa42", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/api/img.ts:3"}, "properties": {"repobilityId": "4b4f130380bf5e3a", "scanner": "scanner-primary", "fingerprint": "b5f7988439d1fa42", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13b0dbfe55c37c69", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/api/img.ts:104"}, "properties": {"repobilityId": "18babaeaa0264b02", "scanner": "scanner-primary", "fingerprint": "13b0dbfe55c37c69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-abc37d62b82f6c21", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/App.jsx:121"}, "properties": {"repobilityId": "2034f9831099d4ba", "scanner": "scanner-primary", "fingerprint": "abc37d62b82f6c21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3adf356e12b59b6d", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/main.jsx:12"}, "properties": {"repobilityId": "7c61e95a56235c9f", "scanner": "scanner-primary", "fingerprint": "3adf356e12b59b6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f0f718b91492702", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/utils/stats.js:208"}, "properties": {"repobilityId": "2225e6a4211f811d", "scanner": "scanner-primary", "fingerprint": "1f0f718b91492702", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de233daa9dde0a87", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/GlobalRouteLoader.jsx:1"}, "properties": {"repobilityId": "a350bab2e03cc421", "scanner": "scanner-primary", "fingerprint": "de233daa9dde0a87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1f5b7950e8dd143", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/components/Header.jsx:529"}, "properties": {"repobilityId": "bdbecc4551f17973", "scanner": "scanner-primary", "fingerprint": "f1f5b7950e8dd143", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8680607a4ad9662", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/PortalLayout.jsx:8"}, "properties": {"repobilityId": "816c0dc0c2deddb2", "scanner": "scanner-primary", "fingerprint": "f8680607a4ad9662", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-19165bea1224f0ca", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/PlayerCompsCard.jsx:3"}, "properties": {"repobilityId": "ada44c76a892b632", "scanner": "scanner-primary", "fingerprint": "19165bea1224f0ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e91415fac5f5a3a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/WpaByGameChart.jsx:34"}, "properties": {"repobilityId": "e2090b51c0703ff0", "scanner": "scanner-primary", "fingerprint": "0e91415fac5f5a3a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ccb91e374f176e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/StatsTable.jsx:49"}, "properties": {"repobilityId": "f81ba1d8ca139cc3", "scanner": "scanner-primary", "fingerprint": "2ccb91e374f176e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4a776509a066226", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/CommitBadge.jsx:1"}, "properties": {"repobilityId": "1ef0535488de28b5", "scanner": "scanner-primary", "fingerprint": "a4a776509a066226", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-00e21de93653ba71", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/LazyWpaByGameChart.jsx:3"}, "properties": {"repobilityId": "c069103c22c65024", "scanner": "scanner-primary", "fingerprint": "00e21de93653ba71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd248591e1663a0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/PortalHeader.jsx:3"}, "properties": {"repobilityId": "438806c991fcfffe", "scanner": "scanner-primary", "fingerprint": "dd248591e1663a0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1eb50169d3c7c51d", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/PlayerStints.jsx:103"}, "properties": {"repobilityId": "5b73059a3fd73b7c", "scanner": "scanner-primary", "fingerprint": "1eb50169d3c7c51d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-069e3bdfc2b52ff2", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/MaintenanceLockout.jsx:54"}, "properties": {"repobilityId": "762c457c602456da", "scanner": "scanner-primary", "fingerprint": "069e3bdfc2b52ff2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-556c8864f0ec27da", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/EmailPrefsPopup.jsx:3"}, "properties": {"repobilityId": "ae61a02586fa0746", "scanner": "scanner-primary", "fingerprint": "556c8864f0ec27da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2647851129798667", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/SeasonSelect.jsx:3"}, "properties": {"repobilityId": "9099648763d6be1f", "scanner": "scanner-primary", "fingerprint": "2647851129798667", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d2c186830787cf6", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/playerProfile/shared.jsx:7"}, "properties": {"repobilityId": "a5fbe9bcea473436", "scanner": "scanner-primary", "fingerprint": "3d2c186830787cf6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f081de660a6f3e88", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/home/StatWidgets.jsx:13"}, "properties": {"repobilityId": "5c9108a35bf80e75", "scanner": "scanner-primary", "fingerprint": "f081de660a6f3e88", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a3800cd2cfccaf6", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/home/WidgetShell.jsx:74"}, "properties": {"repobilityId": "8e0c2008f7ee0aed", "scanner": "scanner-primary", "fingerprint": "2a3800cd2cfccaf6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-92cb06d79f565cd7", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/lib/pendingRequests.js:1"}, "properties": {"repobilityId": "b4eab31709e7d659", "scanner": "scanner-primary", "fingerprint": "92cb06d79f565cd7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-daa1d68079180804", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/tiers.js:1"}, "properties": {"repobilityId": "36abaadfc4120d23", "scanner": "scanner-primary", "fingerprint": "daa1d68079180804", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80527671adbfa38e", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/lib/seasons.js:6"}, "properties": {"repobilityId": "4bf9c01255a011ad", "scanner": "scanner-primary", "fingerprint": "80527671adbfa38e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b89141c3751b044", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/sentry.js:46"}, "properties": {"repobilityId": "4051c2b4528fa563", "scanner": "scanner-primary", "fingerprint": "7b89141c3751b044", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-368afa04e96d7b4f", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/gmPromo.js:3"}, "properties": {"repobilityId": "93bd1a80f4028404", "scanner": "scanner-primary", "fingerprint": "368afa04e96d7b4f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-886cdcf4393573b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/brackets.js:42"}, "properties": {"repobilityId": "ab75b95d64c2f854", "scanner": "scanner-primary", "fingerprint": "886cdcf4393573b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68ad780591239f09", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/PlayerProfilePitcher.jsx:24"}, "properties": {"repobilityId": "f67403e4b4865c84", "scanner": "scanner-primary", "fingerprint": "68ad780591239f09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-420a9212b4296447", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/PortalHome.jsx:308"}, "properties": {"repobilityId": "9fbe094df11f88e2", "scanner": "scanner-primary", "fingerprint": "420a9212b4296447", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9858af8e4181668", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/pages/WclGameRecapGraphic.jsx:4"}, "properties": {"repobilityId": "e51c2d91c2d23f38", "scanner": "scanner-primary", "fingerprint": "f9858af8e4181668", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33853edb442388e6", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/pages/RecruitingHub.jsx:1"}, "properties": {"repobilityId": "67c8499f6335c022", "scanner": "scanner-primary", "fingerprint": "33853edb442388e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a344922ac9ac8018", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/NewsArticle.jsx:4"}, "properties": {"repobilityId": "056c8eab87fe4147", "scanner": "scanner-primary", "fingerprint": "a344922ac9ac8018", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f62fedc3599cb569", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Account.jsx:65"}, "properties": {"repobilityId": "4beab04c0002d034", "scanner": "scanner-primary", "fingerprint": "f62fedc3599cb569", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-08e3bff78d17cd2d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/BattingLeaderboard.jsx:133"}, "properties": {"repobilityId": "3c889e2910a695a6", "scanner": "scanner-primary", "fingerprint": "08e3bff78d17cd2d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b7ff8ca1dfeb816", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/TopMoments.jsx:9"}, "properties": {"repobilityId": "a769ec4c31ac7bc3", "scanner": "scanner-primary", "fingerprint": "1b7ff8ca1dfeb816", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf0d835d25073eab", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/PlayerScouting.jsx:3"}, "properties": {"repobilityId": "8309bcabd5dda14e", "scanner": "scanner-primary", "fingerprint": "cf0d835d25073eab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72f38410fd993be7", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/pages/WclLeaderboardGraphic.jsx:3"}, "properties": {"repobilityId": "2f30086dde108c76", "scanner": "scanner-primary", "fingerprint": "72f38410fd993be7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d445af6c8410dd3f", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/pages/CoachHomepage.jsx:4"}, "properties": {"repobilityId": "ac45e6b91503fd04", "scanner": "scanner-primary", "fingerprint": "d445af6c8410dd3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-318f5cf6a60a78ac", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/RecruitQuiz.jsx:1"}, "properties": {"repobilityId": "35d62becc6bea55b", "scanner": "scanner-primary", "fingerprint": "318f5cf6a60a78ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8f4a1db0fb964f3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/Pricing.jsx:8"}, "properties": {"repobilityId": "08b2d0e56363bb53", "scanner": "scanner-primary", "fingerprint": "f8f4a1db0fb964f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06f0120ff9437a98", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Pricing.jsx:243"}, "properties": {"repobilityId": "d492d86013f20d63", "scanner": "scanner-primary", "fingerprint": "06f0120ff9437a98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-56689b153c5c93d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/ScoutingSheet.jsx:15"}, "properties": {"repobilityId": "238fff427e56a47d", "scanner": "scanner-primary", "fingerprint": "56689b153c5c93d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64f6e01e891c1c50", "level": "none", "message": {"text": "Commented-code block (11 lines) in frontend/src/pages/TournamentBracketGraphic.jsx:44"}, "properties": {"repobilityId": "2636e51b457d7f79", "scanner": "scanner-primary", "fingerprint": "64f6e01e891c1c50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a44dc79dc5d8b2c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/TeamInfoGraphic.jsx:887"}, "properties": {"repobilityId": "e63aaf5d3fdf93ca", "scanner": "scanner-primary", "fingerprint": "8a44dc79dc5d8b2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1ae4334cdecb2d8a", "level": "none", "message": {"text": "Commented-code block (16 lines) in frontend/src/pages/BullpenSheet.jsx:3"}, "properties": {"repobilityId": "68849e0ca7a5acb0", "scanner": "scanner-primary", "fingerprint": "1ae4334cdecb2d8a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-590b118bdf11234b", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/SocialGraphics.jsx:8"}, "properties": {"repobilityId": "b4eb1a33b6648054", "scanner": "scanner-primary", "fingerprint": "590b118bdf11234b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d90ec8c205c3199a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/AnonymousHomepage.jsx:4"}, "properties": {"repobilityId": "aff20e373447ffb9", "scanner": "scanner-primary", "fingerprint": "d90ec8c205c3199a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4388d4c2504d302e", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/OpponentTrends.jsx:740"}, "properties": {"repobilityId": "4098d410c24701ce", "scanner": "scanner-primary", "fingerprint": "4388d4c2504d302e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c380bdd3b742d067", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/WclRecapGraphic.jsx:4"}, "properties": {"repobilityId": "4f6a332e3986b1a5", "scanner": "scanner-primary", "fingerprint": "c380bdd3b742d067", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c7b89f5dc125233", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/WclRecapGraphic.jsx:333"}, "properties": {"repobilityId": "5d0523d08d59fc16", "scanner": "scanner-primary", "fingerprint": "7c7b89f5dc125233", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0dade36bc53de8b0", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/pages/PremiumHomepage.jsx:101"}, "properties": {"repobilityId": "ec45b810662bf4dc", "scanner": "scanner-primary", "fingerprint": "0dade36bc53de8b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab0b11d4b0b02816", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PremiumHomepage.jsx:157"}, "properties": {"repobilityId": "bb1e8872a959c1a2", "scanner": "scanner-primary", "fingerprint": "ab0b11d4b0b02816", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df6413c56ada030c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/RecruitingGuide.jsx:4"}, "properties": {"repobilityId": "93845dc3ea1e4c3c", "scanner": "scanner-primary", "fingerprint": "df6413c56ada030c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04ba870d13516d1f", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/pages/CatcherCards.jsx:4"}, "properties": {"repobilityId": "c3a360224f5e4a77", "scanner": "scanner-primary", "fingerprint": "04ba870d13516d1f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b43d02a6f7c0dbd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/TeamComparison.jsx:310"}, "properties": {"repobilityId": "7c0314cbc34dd309", "scanner": "scanner-primary", "fingerprint": "6b43d02a6f7c0dbd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c14be4a10072ae05", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/pages/About.jsx:3"}, "properties": {"repobilityId": "42da261970ca4721", "scanner": "scanner-primary", "fingerprint": "c14be4a10072ae05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26369562c8f19e58", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/TeamProjections.jsx:3"}, "properties": {"repobilityId": "c67f66c203cdf7c0", "scanner": "scanner-primary", "fingerprint": "26369562c8f19e58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8dc0f71852ab769e", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/RecruitingHomepage.jsx:4"}, "properties": {"repobilityId": "d1aa4a4b35cacf4b", "scanner": "scanner-primary", "fingerprint": "8dc0f71852ab769e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-469c4352ca45363d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/WarLeaderboard.jsx:152"}, "properties": {"repobilityId": "864f4f7518c1e60b", "scanner": "scanner-primary", "fingerprint": "469c4352ca45363d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cbf7678200e86cee", "level": "none", "message": {"text": "Commented-code block (12 lines) in frontend/src/pages/PlayerCardPDF.jsx:6"}, "properties": {"repobilityId": "81ddff50661e2464", "scanner": "scanner-primary", "fingerprint": "cbf7678200e86cee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-390e76d4a8855d1b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/Homepage.jsx:47"}, "properties": {"repobilityId": "df914d6b5fe733c6", "scanner": "scanner-primary", "fingerprint": "390e76d4a8855d1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2915b01174a2d15", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/pages/SummerPlayerProfile.jsx:4"}, "properties": {"repobilityId": "1a457d66b277ba46", "scanner": "scanner-primary", "fingerprint": "f2915b01174a2d15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aac79e2187c5a425", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/PlayerProfileHitter.jsx:1"}, "properties": {"repobilityId": "48bf29f7d234a425", "scanner": "scanner-primary", "fingerprint": "aac79e2187c5a425", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7e5ea99f1fb166d", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/NwacAdvancement.jsx:1"}, "properties": {"repobilityId": "fa589dc02481452f", "scanner": "scanner-primary", "fingerprint": "f7e5ea99f1fb166d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37f29160150d74df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PitchingLeaderboard.jsx:133"}, "properties": {"repobilityId": "15e889de72ac27fd", "scanner": "scanner-primary", "fingerprint": "37f29160150d74df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-07b5f9586af4674c", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/pages/DailyScoresGraphic.jsx:616"}, "properties": {"repobilityId": "faed0c18193f785f", "scanner": "scanner-primary", "fingerprint": "07b5f9586af4674c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf38e356ab7c3960", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/FieldingLeaderboard.jsx:4"}, "properties": {"repobilityId": "7e6a8e53016b54d2", "scanner": "scanner-primary", "fingerprint": "bf38e356ab7c3960", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ea99e4489996fd7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/FieldingLeaderboard.jsx:149"}, "properties": {"repobilityId": "9e96ff2fb8332884", "scanner": "scanner-primary", "fingerprint": "6ea99e4489996fd7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0d1268c33a52621b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/ProTracker.jsx:3"}, "properties": {"repobilityId": "09e57863dc5218e4", "scanner": "scanner-primary", "fingerprint": "0d1268c33a52621b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8480a6fa6e4cb5d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/RecruitingProgramGuide.jsx:1"}, "properties": {"repobilityId": "b4d2979328f8ff34", "scanner": "scanner-primary", "fingerprint": "8480a6fa6e4cb5d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd983d048af51f3b", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/pages/FreeHomepage.jsx:8"}, "properties": {"repobilityId": "d091e6e8270ed986", "scanner": "scanner-primary", "fingerprint": "dd983d048af51f3b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2392459ddbe4c7a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/FreeHomepage.jsx:257"}, "properties": {"repobilityId": "41fca461313a6862", "scanner": "scanner-primary", "fingerprint": "2392459ddbe4c7a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d2fa94057231dad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Unsubscribe.jsx:32"}, "properties": {"repobilityId": "2ff9fe9987cc6cc0", "scanner": "scanner-primary", "fingerprint": "3d2fa94057231dad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd11319261dc1cdf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/StandingsPage.jsx:288"}, "properties": {"repobilityId": "f6ef366cdc82db3d", "scanner": "scanner-primary", "fingerprint": "cd11319261dc1cdf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3746c493d8b385ab", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/pages/WclStandingsGraphic.jsx:3"}, "properties": {"repobilityId": "04a9202dcbab601d", "scanner": "scanner-primary", "fingerprint": "3746c493d8b385ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7cb10f10f4b1f876", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/PlayerDetail.jsx:14"}, "properties": {"repobilityId": "c924368322975846", "scanner": "scanner-primary", "fingerprint": "7cb10f10f4b1f876", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e7ece562359303c", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/pages/PortalPDFs.jsx:3"}, "properties": {"repobilityId": "5d4da8c1c0083aa9", "scanner": "scanner-primary", "fingerprint": "0e7ece562359303c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-19f254d27807752c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/SummerHub.jsx:184"}, "properties": {"repobilityId": "92eba92206cf4eec", "scanner": "scanner-primary", "fingerprint": "19f254d27807752c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be4be9bc69fe4b61", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/RelieverLeaderboard.jsx:4"}, "properties": {"repobilityId": "c779a7b5f362d75d", "scanner": "scanner-primary", "fingerprint": "be4be9bc69fe4b61", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed864eaaf5300eeb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/RelieverLeaderboard.jsx:103"}, "properties": {"repobilityId": "c335979bf123b885", "scanner": "scanner-primary", "fingerprint": "ed864eaaf5300eeb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-baf1522de5f80ba6", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/NWACTournamentSheet.jsx:4"}, "properties": {"repobilityId": "98d02b707727f579", "scanner": "scanner-primary", "fingerprint": "baf1522de5f80ba6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82dfef5cbd3f4760", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/pages/TeamSeasonRecapGraphic.jsx:3"}, "properties": {"repobilityId": "58e358323f87f517", "scanner": "scanner-primary", "fingerprint": "82dfef5cbd3f4760", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3261117d4f96b92f", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/pages/HistoricMatchups.jsx:201"}, "properties": {"repobilityId": "216f86cc9ba3a148", "scanner": "scanner-primary", "fingerprint": "3261117d4f96b92f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a468a6696bc705d", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/summer/SummerStatsPage.jsx:3"}, "properties": {"repobilityId": "18df8a363f9b915c", "scanner": "scanner-primary", "fingerprint": "2a468a6696bc705d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8132d3ce8782274", "level": "none", "message": {"text": "Commented-code block (11 lines) in frontend/src/pages/portal/ArticleEditor.jsx:3"}, "properties": {"repobilityId": "a89717f1e87e19c5", "scanner": "scanner-primary", "fingerprint": "f8132d3ce8782274", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3589b17eb1d8fecb", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/pages/portal/EmailComposer.jsx:3"}, "properties": {"repobilityId": "34ff26048820d863", "scanner": "scanner-primary", "fingerprint": "3589b17eb1d8fecb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7198dea241263f3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/gm/Schedule.jsx:651"}, "properties": {"repobilityId": "fa4ef3c33a646c40", "scanner": "scanner-primary", "fingerprint": "f7198dea241263f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66d5150a5bebb239", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/pages/gm/Recruiting.jsx:794"}, "properties": {"repobilityId": "f7b09449d02719b0", "scanner": "scanner-primary", "fingerprint": "66d5150a5bebb239", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-269b6b9820743f69", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/gm/NewDynasty.jsx:118"}, "properties": {"repobilityId": "3e0629941b2f2fa2", "scanner": "scanner-primary", "fingerprint": "269b6b9820743f69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d8292a2a8b98902", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/pages/gm/Dashboard.jsx:142"}, "properties": {"repobilityId": "76fc94b9382a2f6f", "scanner": "scanner-primary", "fingerprint": "6d8292a2a8b98902", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38a92ca8649259e8", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/gm/SummerBall.jsx:61"}, "properties": {"repobilityId": "1dccc2e88a686590", "scanner": "scanner-primary", "fingerprint": "38a92ca8649259e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2be9f1e1ad553c37", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/pages/gm/Stats.jsx:129"}, "properties": {"repobilityId": "03da68da1cdfda87", "scanner": "scanner-primary", "fingerprint": "2be9f1e1ad553c37", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73e8eb64e6c94c57", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/gm/Rankings.jsx:52"}, "properties": {"repobilityId": "f9f05fe54ed0bdb7", "scanner": "scanner-primary", "fingerprint": "73e8eb64e6c94c57", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bfe7ee651cf32245", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/gm/Play.jsx:77"}, "properties": {"repobilityId": "fdb759c6325a1204", "scanner": "scanner-primary", "fingerprint": "bfe7ee651cf32245", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1a3e4e4318794dd", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/gm/Career.jsx:70"}, "properties": {"repobilityId": "7568dfec79b4ebce", "scanner": "scanner-primary", "fingerprint": "f1a3e4e4318794dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9b9d821e7bd3220", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useArticles.js:100"}, "properties": {"repobilityId": "c14176edbbe00d34", "scanner": "scanner-primary", "fingerprint": "e9b9d821e7bd3220", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d63c5cc4e848d0f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/hooks/useApi.js:8"}, "properties": {"repobilityId": "52cefb4ecdf8c9f7", "scanner": "scanner-primary", "fingerprint": "d63c5cc4e848d0f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6676c60cebbdf91b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useApi.js:62"}, "properties": {"repobilityId": "cf45afb153dab8e7", "scanner": "scanner-primary", "fingerprint": "6676c60cebbdf91b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f1f9128835bd87b", "level": "note", "message": {"text": "Legacy-named symbol `tier_cache_v1` in frontend/src/hooks/useTier.js:27"}, "properties": {"repobilityId": "af3b078a9e9a4f8f", "scanner": "scanner-primary", "fingerprint": "8f1f9128835bd87b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-630c66c011934599", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/hooks/useTier.js:6"}, "properties": {"repobilityId": "50c6919bf6e6d5e3", "scanner": "scanner-primary", "fingerprint": "630c66c011934599", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87ff22f407f661e0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useTier.js:70"}, "properties": {"repobilityId": "f32afbc9a7bcc478", "scanner": "scanner-primary", "fingerprint": "87ff22f407f661e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb352bd362441f0f", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/components/TeamLogo.jsx:32"}, "properties": {"repobilityId": "f36efb6476a24d5a", "scanner": "scanner-primary", "fingerprint": "bb352bd362441f0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2eabd562224295bf", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/components/GMShell.jsx:35"}, "properties": {"repobilityId": "ee72babd15744a17", "scanner": "scanner-primary", "fingerprint": "2eabd562224295bf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e597b4964b4be737", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/playerArchetypes.js:228"}, "properties": {"repobilityId": "4ab8f7243ea0a35d", "scanner": "scanner-primary", "fingerprint": "e597b4964b4be737", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9845accf0c906675", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/outboundTransfers.js:83"}, "properties": {"repobilityId": "08d68e2a085e200e", "scanner": "scanner-primary", "fingerprint": "9845accf0c906675", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29efca5296fc7afa", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/gm/engine/gameYear.js:31"}, "properties": {"repobilityId": "b03e4e8ed316882e", "scanner": "scanner-primary", "fingerprint": "29efca5296fc7afa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a435aed3af7ff52", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/playerRating.js:146"}, "properties": {"repobilityId": "4acf0b317a88dd48", "scanner": "scanner-primary", "fingerprint": "2a435aed3af7ff52", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a87a08186497c786", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/nwbbRating.js:128"}, "properties": {"repobilityId": "97b0b65a0393a74a", "scanner": "scanner-primary", "fingerprint": "a87a08186497c786", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71570b6a9aedefb9", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/gm/engine/advancedStats.js:142"}, "properties": {"repobilityId": "187ab793aefe34af", "scanner": "scanner-primary", "fingerprint": "71570b6a9aedefb9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2b90daf1b5ae11d", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/storyMode.js:280"}, "properties": {"repobilityId": "13c3dc0993649f46", "scanner": "scanner-primary", "fingerprint": "d2b90daf1b5ae11d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3bc113227063642", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/weeklyAwards.js:32"}, "properties": {"repobilityId": "1499c36afa93e51c", "scanner": "scanner-primary", "fingerprint": "d3bc113227063642", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30a7829c42381423", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/pnwPlayoffs.js:84"}, "properties": {"repobilityId": "71ba676eaef118f0", "scanner": "scanner-primary", "fingerprint": "30a7829c42381423", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f672c506e1335e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/simAhead.js:134"}, "properties": {"repobilityId": "5bc3c063b8024af1", "scanner": "scanner-primary", "fingerprint": "7f672c506e1335e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-433857fa07b33a1b", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/gm/engine/sim.js:72"}, "properties": {"repobilityId": "8f49d6427879c5c0", "scanner": "scanner-primary", "fingerprint": "433857fa07b33a1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d5db43a281cb92b1", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/gm/engine/generate.js:76"}, "properties": {"repobilityId": "38d198ccd8fbd42b", "scanner": "scanner-primary", "fingerprint": "d5db43a281cb92b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-391e29cfb4e6124d", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/season.js:184"}, "properties": {"repobilityId": "ba5ac3619d73b38b", "scanner": "scanner-primary", "fingerprint": "391e29cfb4e6124d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2825a053eed64bb", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/coaches.js:473"}, "properties": {"repobilityId": "9d85b7fec15f5c2c", "scanner": "scanner-primary", "fingerprint": "b2825a053eed64bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f889469f32dd7c57", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/events.js:269"}, "properties": {"repobilityId": "f63e728260b5669c", "scanner": "scanner-primary", "fingerprint": "f889469f32dd7c57", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee00f92e26f41d27", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/postseasonInteractive.js:248"}, "properties": {"repobilityId": "1148c97b985aad8a", "scanner": "scanner-primary", "fingerprint": "ee00f92e26f41d27", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a94bfce81bc8ab74", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/gm/engine/expansionTeam.js:176"}, "properties": {"repobilityId": "8153128e406ec21d", "scanner": "scanner-primary", "fingerprint": "a94bfce81bc8ab74", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-240ae83580137877", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/leagueStats.js:35"}, "properties": {"repobilityId": "816309f90989c28c", "scanner": "scanner-primary", "fingerprint": "240ae83580137877", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7234674518ab856", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/summerBall.js:420"}, "properties": {"repobilityId": "f126046a78396620", "scanner": "scanner-primary", "fingerprint": "e7234674518ab856", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d3d3bc21d9e7043", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/newDynastyMultiLevel.js:54"}, "properties": {"repobilityId": "744bf9d3886539d6", "scanner": "scanner-primary", "fingerprint": "1d3d3bc21d9e7043", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8d1249faf046785", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/recruits.js:68"}, "properties": {"repobilityId": "4f60e7a492790fb4", "scanner": "scanner-primary", "fingerprint": "b8d1249faf046785", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9afc2b0d152e2368", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/gm/engine/loadSchools.js:82"}, "properties": {"repobilityId": "f70853782b488d5f", "scanner": "scanner-primary", "fingerprint": "9afc2b0d152e2368", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-361ae5c2925fa81f", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/awards.js:201"}, "properties": {"repobilityId": "ee7deb8abf2182f6", "scanner": "scanner-primary", "fingerprint": "361ae5c2925fa81f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2650d7f0142c8a5", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/schedule.js:75"}, "properties": {"repobilityId": "21d517f170a07893", "scanner": "scanner-primary", "fingerprint": "b2650d7f0142c8a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b4f54a55b4e4fe2", "level": "none", "message": {"text": "Commented-code block (12 lines) in frontend/src/gm/engine/lineups.js:66"}, "properties": {"repobilityId": "5423c0ee44a9ad5b", "scanner": "scanner-primary", "fingerprint": "8b4f54a55b4e4fe2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-461e07ccb81526f2", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/newDynasty.js:171"}, "properties": {"repobilityId": "8dfbd9b8f1a80316", "scanner": "scanner-primary", "fingerprint": "461e07ccb81526f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce15094a8fb595d2", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/draft.js:45"}, "properties": {"repobilityId": "de03b882dd83c80f", "scanner": "scanner-primary", "fingerprint": "ce15094a8fb595d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d9c4e10ed177c7c", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/randomEvents.js:2110"}, "properties": {"repobilityId": "f520e905b16d0c69", "scanner": "scanner-primary", "fingerprint": "7d9c4e10ed177c7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8baa270f20935390", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/autoMode.js:443"}, "properties": {"repobilityId": "e9485672046f69fd", "scanner": "scanner-primary", "fingerprint": "8baa270f20935390", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab34ac03a24138bb", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/liveGame.js:62"}, "properties": {"repobilityId": "bda3f5497475fea6", "scanner": "scanner-primary", "fingerprint": "ab34ac03a24138bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc56c4d190f76a60", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/academics.js:119"}, "properties": {"repobilityId": "1c1fd2f2512c3967", "scanner": "scanner-primary", "fingerprint": "cc56c4d190f76a60", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-705e9307300e0cae", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/gm/engine/nationalTournament.js:34"}, "properties": {"repobilityId": "6da00a1b8ffef5a8", "scanner": "scanner-primary", "fingerprint": "705e9307300e0cae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-764b0c9e5af47120", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/seasonRecap.js:102"}, "properties": {"repobilityId": "68edb983b5771e70", "scanner": "scanner-primary", "fingerprint": "764b0c9e5af47120", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1154070c0993afea", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/gm/engine/rankings.js:92"}, "properties": {"repobilityId": "bb810fad4bf28d6e", "scanner": "scanner-primary", "fingerprint": "1154070c0993afea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6856b18637a8d93d", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/gm/engine/nwacTransfers.js:216"}, "properties": {"repobilityId": "18d0944a2eb6b884", "scanner": "scanner-primary", "fingerprint": "6856b18637a8d93d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-92fcb65f585c35a6", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/gm/engine/budget.js:21"}, "properties": {"repobilityId": "99fef9e6d8b4d2fe", "scanner": "scanner-primary", "fingerprint": "92fcb65f585c35a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54eaae956db7d7b7", "level": "note", "message": {"text": "Legacy-named symbol `affiliated_team_v1` in frontend/src/context/AffiliationContext.jsx:17"}, "properties": {"repobilityId": "de2d7f1c424b6a69", "scanner": "scanner-primary", "fingerprint": "54eaae956db7d7b7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-69b6eaa0e9174a0b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/context/ThemeContext.jsx:8"}, "properties": {"repobilityId": "661d3133f714d027", "scanner": "scanner-primary", "fingerprint": "69b6eaa0e9174a0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72661d38feb67217", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/context/PreviewContext.jsx:7"}, "properties": {"repobilityId": "b4caaf50fb695240", "scanner": "scanner-primary", "fingerprint": "72661d38feb67217", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4871b2c587f9ef0f", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/dedup_games.py:378"}, "properties": {"repobilityId": "cb45fb8f8b4ee294", "scanner": "scanner-primary", "fingerprint": "4871b2c587f9ef0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a30893af9f1042f7", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/parse_nwac_boxscore.py:443"}, "properties": {"repobilityId": "c63dc1b4cde37f89", "scanner": "scanner-primary", "fingerprint": "a30893af9f1042f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8799f79f8d562106", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/build_li_table.py:44"}, "properties": {"repobilityId": "e2c467d8900646a4", "scanner": "scanner-primary", "fingerprint": "8799f79f8d562106", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-958eacb114b041da", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/scrape_naia.py:286"}, "properties": {"repobilityId": "da842f591775da11", "scanner": "scanner-primary", "fingerprint": "958eacb114b041da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea6ab41dd6f06f9a", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/freeze_conference.py:315"}, "properties": {"repobilityId": "26f1bc94abcb0204", "scanner": "scanner-primary", "fingerprint": "ea6ab41dd6f06f9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2750cc198cac2928", "level": "note", "message": {"text": "Legacy-named symbol `pc_legacy` in scripts/parse_pbp_events.py:338"}, "properties": {"repobilityId": "953e58105da9ac26", "scanner": "scanner-primary", "fingerprint": "2750cc198cac2928", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b8c787de69b3cf0b", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/parse_pbp_events.py:112"}, "properties": {"repobilityId": "92bff5628b36dca0", "scanner": "scanner-primary", "fingerprint": "b8c787de69b3cf0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76aff60c02d986b5", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/fix_pitching_hbp_from_boxscores.py:138"}, "properties": {"repobilityId": "bec49a19efe5b3e4", "scanner": "scanner-primary", "fingerprint": "76aff60c02d986b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ac9ae37f67c19df", "level": "note", "message": {"text": "Legacy-named symbol `pc_legacy` in scripts/parse_pbp_hr.py:163"}, "properties": {"repobilityId": "68dcb3c264a1af51", "scanner": "scanner-primary", "fingerprint": "7ac9ae37f67c19df", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-76255f019aecabfe", "level": "none", "message": {"text": "Commented-code block (11 lines) in scripts/classify_batted_ball.py:136"}, "properties": {"repobilityId": "272c183b93e1baed", "scanner": "scanner-primary", "fingerprint": "76255f019aecabfe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e5f0e60c25713dd", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/parse_presto_events.py:89"}, "properties": {"repobilityId": "9efb780defa1301c", "scanner": "scanner-primary", "fingerprint": "1e5f0e60c25713dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7365620fad97ad1", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/compute_summer_wpa.py:196"}, "properties": {"repobilityId": "9a27e9115ccfdd3d", "scanner": "scanner-primary", "fingerprint": "f7365620fad97ad1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-202ad2e184cb3341", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/scrape_nwac_schedule.py:63"}, "properties": {"repobilityId": "a3b7c6b6f9c88d43", "scanner": "scanner-primary", "fingerprint": "202ad2e184cb3341", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe34d1ee8442bfa2", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/link_summer_to_spring.py:367"}, "properties": {"repobilityId": "d603093c1428b57e", "scanner": "scanner-primary", "fingerprint": "fe34d1ee8442bfa2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab778b4fd61981f7", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/derive_event_state.py:324"}, "properties": {"repobilityId": "6ea9378ada03af1c", "scanner": "scanner-primary", "fingerprint": "ab778b4fd61981f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0dbfe5c473b9327b", "level": "none", "message": {"text": "Commented-code block (15 lines) in scripts/resolve_summer_game_players.py:42"}, "properties": {"repobilityId": "f25b9ca3966b6718", "scanner": "scanner-primary", "fingerprint": "0dbfe5c473b9327b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b66e66cdbc40c9d", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/scrape_pbp.py:664"}, "properties": {"repobilityId": "9d507327a341fa5f", "scanner": "scanner-primary", "fingerprint": "1b66e66cdbc40c9d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-43bc20cac8f29ac8", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/scrape_nwac_boxscores.py:93"}, "properties": {"repobilityId": "7768774ffc0db0a5", "scanner": "scanner-primary", "fingerprint": "43bc20cac8f29ac8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56eddc7c51816c83", "level": "note", "message": {"text": "Legacy-named symbol `_parse_sidearm_schedule_v2` in scripts/scrape_boxscores.py:746"}, "properties": {"repobilityId": "6d423e74b0769d70", "scanner": "scanner-primary", "fingerprint": "56eddc7c51816c83", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2cb562bed1cc520f", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/scrape_boxscores.py:1773"}, "properties": {"repobilityId": "c405dff6e15dd8a9", "scanner": "scanner-primary", "fingerprint": "2cb562bed1cc520f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c99d52f181625ca", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/scrape_national_ratings.py:70"}, "properties": {"repobilityId": "296c1d9b3865fa9f", "scanner": "scanner-primary", "fingerprint": "9c99d52f181625ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9553a62867b7a0ac", "level": "note", "message": {"text": "Legacy-named symbol `ps_old` in scripts/resync_pitching_stats_from_boxscores.py:8"}, "properties": {"repobilityId": "59ae406c9a889e0c", "scanner": "scanner-primary", "fingerprint": "9553a62867b7a0ac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-18e3e8dc45a22983", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/build_wp_table.py:62"}, "properties": {"repobilityId": "dcd0605b6d5390c6", "scanner": "scanner-primary", "fingerprint": "18e3e8dc45a22983", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-216929851d2890e8", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/scrape_recruits.py:98"}, "properties": {"repobilityId": "8e3be8f9fe5892d3", "scanner": "scanner-primary", "fingerprint": "216929851d2890e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40e57f633f17fa8d", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/derive_summer_event_state.py:349"}, "properties": {"repobilityId": "1b46c1ae616850a3", "scanner": "scanner-primary", "fingerprint": "40e57f633f17fa8d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67f6471aa8326646", "level": "none", "message": {"text": "Commented-code block (11 lines) in scripts/compute_wpa.py:204"}, "properties": {"repobilityId": "78a6f41d147c2f1b", "scanner": "scanner-primary", "fingerprint": "67f6471aa8326646", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7075151e0a175ca", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/team_matching.py:36"}, "properties": {"repobilityId": "185bea96479a3b3e", "scanner": "scanner-primary", "fingerprint": "a7075151e0a175ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b78c85281589ad64", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/generate_social_graphic.py:462"}, "properties": {"repobilityId": "e9bd048c4a4fcdff", "scanner": "scanner-primary", "fingerprint": "b78c85281589ad64", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1d9a72c58fbed120", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/scrape_future_schedules.py:496"}, "properties": {"repobilityId": "7e4649aa588103c9", "scanner": "scanner-primary", "fingerprint": "1d9a72c58fbed120", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33d3d961b34a09eb", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/ingest_pro_alumni.py:186"}, "properties": {"repobilityId": "c87d91f76c211f53", "scanner": "scanner-primary", "fingerprint": "33d3d961b34a09eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c0ead5b32eac6862", "level": "none", "message": {"text": "Commented-code block (10 lines) in scripts/ingest_pbr_pdf_rankings.py:101"}, "properties": {"repobilityId": "9f0592643014b3e6", "scanner": "scanner-primary", "fingerprint": "c0ead5b32eac6862", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b82cdaf4cacdee3c", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/scrape_d1.py:589"}, "properties": {"repobilityId": "7c5fc20ef63d7c2c", "scanner": "scanner-primary", "fingerprint": "b82cdaf4cacdee3c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9490c634703c9d77", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/archive/create_phantom_players.py:247"}, "properties": {"repobilityId": "4ed59a129e471289", "scanner": "scanner-primary", "fingerprint": "9490c634703c9d77", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-05cc23db65c72936", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/archive/backfill_handedness.py:60"}, "properties": {"repobilityId": "ce76085e52f9b2bd", "scanner": "scanner-primary", "fingerprint": "05cc23db65c72936", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-28d194c1ee41214e", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/archive/scrape_browser_stats.py:613"}, "properties": {"repobilityId": "edb5003a98b57c04", "scanner": "scanner-primary", "fingerprint": "28d194c1ee41214e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb512be2a4b470f0", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/archive/audit_team_record_mismatches.py:121"}, "properties": {"repobilityId": "32b9927c535cce4d", "scanner": "scanner-primary", "fingerprint": "cb512be2a4b470f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa5818f0c97c49f2", "level": "note", "message": {"text": "Legacy-named symbol `nwbb_v1` in scripts/projections/team_projection.py:6"}, "properties": {"repobilityId": "3a6c16479c116bec", "scanner": "scanner-primary", "fingerprint": "aa5818f0c97c49f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fcb6f08b5a26b59f", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/projections/team_projection.py:47"}, "properties": {"repobilityId": "2f0b9b0b71ba0ce4", "scanner": "scanner-primary", "fingerprint": "fcb6f08b5a26b59f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7abaf9274f02dff1", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/projections/write_projections_db.py:66"}, "properties": {"repobilityId": "7e3033b34a945655", "scanner": "scanner-primary", "fingerprint": "7abaf9274f02dff1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb8441a21f9dffd2", "level": "note", "message": {"text": "Legacy-named symbol `nwbb_v1` in scripts/projections/backtest.py:18"}, "properties": {"repobilityId": "ca712007c532855b", "scanner": "scanner-primary", "fingerprint": "fb8441a21f9dffd2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-89edd4b8234da3e8", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/recruiting_book/build_book.py:347"}, "properties": {"repobilityId": "ac86bdc0948c3963", "scanner": "scanner-primary", "fingerprint": "89edd4b8234da3e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e54c4772bd051292", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/gm/generate_non_naia_teams.js:52"}, "properties": {"repobilityId": "729d60e96211c1a3", "scanner": "scanner-primary", "fingerprint": "e54c4772bd051292", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31dc1023a5f0cc18", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/recruiting_constants.py:23"}, "properties": {"repobilityId": "3ccd79eb9c7d6a77", "scanner": "scanner-primary", "fingerprint": "31dc1023a5f0cc18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eddd5c1f75222352", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/api/quiz.py:1525"}, "properties": {"repobilityId": "10497b8c3862558c", "scanner": "scanner-primary", "fingerprint": "eddd5c1f75222352", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f64bffa723e60dd0", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/api/routes.py:99"}, "properties": {"repobilityId": "f45abd1f1692776e", "scanner": "scanner-primary", "fingerprint": "f64bffa723e60dd0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9acbe3e890f602b9", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/api/bullpen_sheet.py:449"}, "properties": {"repobilityId": "d8b10e77a09b5530", "scanner": "scanner-primary", "fingerprint": "9acbe3e890f602b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f81364d1d211dc51", "level": "none", "message": {"text": "Commented-code block (11 lines) in backend/app/api/team_stats.py:187"}, "properties": {"repobilityId": "2ea695f05e561d95", "scanner": "scanner-primary", "fingerprint": "f81364d1d211dc51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-957ade8f3e6e484d", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/api/summer.py:164"}, "properties": {"repobilityId": "679ff729d2b592e0", "scanner": "scanner-primary", "fingerprint": "957ade8f3e6e484d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a61986b42a01596", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/api/all_conference.py:223"}, "properties": {"repobilityId": "403b81cfb59f7951", "scanner": "scanner-primary", "fingerprint": "6a61986b42a01596", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bfe9f94ddb1aded3", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/api/email_prefs.py:106"}, "properties": {"repobilityId": "8b52f4079d1a6d6c", "scanner": "scanner-primary", "fingerprint": "bfe9f94ddb1aded3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-238652eca6a70cd3", "level": "none", "message": {"text": "Commented-code block (9 lines) in backend/app/api/auth.py:151"}, "properties": {"repobilityId": "dc1c45280ce0b7e0", "scanner": "scanner-primary", "fingerprint": "238652eca6a70cd3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7f653687eb5cb62", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/api/recruiting.py:799"}, "properties": {"repobilityId": "1dd937b3b42e184d", "scanner": "scanner-primary", "fingerprint": "f7f653687eb5cb62", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b30accdd0a567ad", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/api/coaching_tools.py:80"}, "properties": {"repobilityId": "37071ce2a505b84d", "scanner": "scanner-primary", "fingerprint": "3b30accdd0a567ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a80104a3ae246450", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/api/team_scouting.py:420"}, "properties": {"repobilityId": "73c778d4a981a879", "scanner": "scanner-primary", "fingerprint": "a80104a3ae246450", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc1b5bbccd279cd8", "level": "none", "message": {"text": "Commented-code block (11 lines) in backend/app/api/pitch_level.py:421"}, "properties": {"repobilityId": "57ac669aa711b70b", "scanner": "scanner-primary", "fingerprint": "fc1b5bbccd279cd8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f8cabbbf63fa636", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/api/billing.py:600"}, "properties": {"repobilityId": "5a849db31ecbfe59", "scanner": "scanner-primary", "fingerprint": "5f8cabbbf63fa636", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0feb5bdbf22febf5", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/api/leverage.py:62"}, "properties": {"repobilityId": "284ab80284722e3c", "scanner": "scanner-primary", "fingerprint": "0feb5bdbf22febf5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5089a59d715f76a", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/stats/advanced.py:363"}, "properties": {"repobilityId": "bc60751425432078", "scanner": "scanner-primary", "fingerprint": "b5089a59d715f76a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a79152f300640745", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/app/stats/projections.py:826"}, "properties": {"repobilityId": "f2e25e5ca0e07962", "scanner": "scanner-primary", "fingerprint": "a79152f300640745", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-07f860e49be60ddf", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/app/stats/cpi.py:180"}, "properties": {"repobilityId": "a4ccbc778d3c4e6d", "scanner": "scanner-primary", "fingerprint": "07f860e49be60ddf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bddda3d5a14c7401", "level": "note", "message": {"text": "29 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "3519a6b4ac1d4f19", "scanner": "scanner-primary", "fingerprint": "bddda3d5a14c7401", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-380b7cb95b387b9c", "level": "note", "message": {"text": "Near-duplicate function bodies in 11 places"}, "properties": {"repobilityId": "ba025f93d58b7a5a", "scanner": "scanner-primary", "fingerprint": "380b7cb95b387b9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b9b6242409f93a8f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "56d5554b21f4b24a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "17d87b1784a12641", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "f774a682343a7e6d", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "44c2653c42ef4d31", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "b3d683794e555569", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "0169c476fee31930", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a2bb9282d1e11064", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "c646a48a2ff7a15f", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "56411ced4d5a359e", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "836170eeb021492d", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "ac2a9b85c762c1fa", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d0d1abac9530d15a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1b677a20a8c82b51", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "8e0511b8cdff6735", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "8c451a5a0d975914", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6383fb0ba4d0d33a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "041221b3746e9f79", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "426204b8bfd06851", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-78c33a49cb26c5f1", "level": "warning", "message": {"text": "Frontend route `/summer/teams/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "57551c5993545c14", "scanner": "scanner-primary", "fingerprint": "78c33a49cb26c5f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-95d1f6d38af67f7c", "level": "warning", "message": {"text": "Frontend route `/summer/players/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "0053caaff9437d02", "scanner": "scanner-primary", "fingerprint": "95d1f6d38af67f7c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ef38737707a8ef70", "level": "warning", "message": {"text": "Frontend route `/summer/games/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "cab96cb6a0664fed", "scanner": "scanner-primary", "fingerprint": "ef38737707a8ef70", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0f21acba2e83c367", "level": "warning", "message": {"text": "Frontend route `/game/:gameId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d5dffbe61be1c265", "scanner": "scanner-primary", "fingerprint": "0f21acba2e83c367", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-549a7ddb90ea073f", "level": "warning", "message": {"text": "Frontend route `/team/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "cf60410b4bf797f5", "scanner": "scanner-primary", "fingerprint": "549a7ddb90ea073f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f3c9d53cc9090ced", "level": "warning", "message": {"text": "Frontend route `/recruiting/rankings` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "adf19dbad04902c1", "scanner": "scanner-primary", "fingerprint": "f3c9d53cc9090ced", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-01a18c967a6f5999", "level": "warning", "message": {"text": "Frontend route `/recruiting/breakdowns` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "3686e814c4383521", "scanner": "scanner-primary", "fingerprint": "01a18c967a6f5999", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-270e10de982f7dc1", "level": "warning", "message": {"text": "Frontend route `/recruiting/history` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d87e2dee8829e4e6", "scanner": "scanner-primary", "fingerprint": "270e10de982f7dc1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0634759bd1b927e5", "level": "warning", "message": {"text": "Frontend route `/recruiting/field` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "9c31e5f4328a7f9d", "scanner": "scanner-primary", "fingerprint": "0634759bd1b927e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-98502db520fd70f9", "level": "warning", "message": {"text": "Frontend route `/juco-tracker` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "0fa3441a7e92fd9b", "scanner": "scanner-primary", "fingerprint": "98502db520fd70f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-799e274dc920a2a8", "level": "warning", "message": {"text": "Frontend route `/portal/juco-tracker` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "24fc66ad7e65db07", "scanner": "scanner-primary", "fingerprint": "799e274dc920a2a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2455582ad2bc46ae", "level": "warning", "message": {"text": "Frontend route `/team-scouting` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "a0d48a696a392db8", "scanner": "scanner-primary", "fingerprint": "2455582ad2bc46ae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-48a5e044dad6eb63", "level": "warning", "message": {"text": "Frontend route `/enhanced-scouting` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d5f20f16723f2577", "scanner": "scanner-primary", "fingerprint": "48a5e044dad6eb63", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bcba627ea5d40012", "level": "warning", "message": {"text": "Frontend route `/opponent-trends` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "66ba13a9f94cffe2", "scanner": "scanner-primary", "fingerprint": "bcba627ea5d40012", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-38dd60e72daaa355", "level": "warning", "message": {"text": "Frontend route `/historic` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "934d8415323de477", "scanner": "scanner-primary", "fingerprint": "38dd60e72daaa355", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b6488b4d8bc6117c", "level": "warning", "message": {"text": "Frontend route `/player-scouting` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "059037ec7c348799", "scanner": "scanner-primary", "fingerprint": "b6488b4d8bc6117c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-01426ff4de06be44", "level": "warning", "message": {"text": "Frontend route `/portal/scouting-sheet/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "0fa6027397d762a1", "scanner": "scanner-primary", "fingerprint": "01426ff4de06be44", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d9c15a82bf665a1a", "level": "warning", "message": {"text": "Frontend route `/portal/pdfs/player-card/:playerId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "3398e68874040af5", "scanner": "scanner-primary", "fingerprint": "d9c15a82bf665a1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-25ca854c526df369", "level": "warning", "message": {"text": "Frontend route `/portal/pdfs/bulk-player-cards` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "da45735a0b3cb599", "scanner": "scanner-primary", "fingerprint": "25ca854c526df369", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1e19559d0558a068", "level": "warning", "message": {"text": "Frontend route `/portal/bullpen-sheet/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "3d26fa3fb71794bf", "scanner": "scanner-primary", "fingerprint": "1e19559d0558a068", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f65714fe99490cc8", "level": "warning", "message": {"text": "Frontend route `/portal/catcher-cards/:teamId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "c0cea3d8e98f6a60", "scanner": "scanner-primary", "fingerprint": "f65714fe99490cc8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-05d3cdf4007d2519", "level": "warning", "message": {"text": "Frontend route `/news/:slug` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "52863b94bd22d447", "scanner": "scanner-primary", "fingerprint": "05d3cdf4007d2519", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-66b25e3c035a05d6", "level": "warning", "message": {"text": "Frontend route `/articles/edit/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d9fc4a4949a951ee", "scanner": "scanner-primary", "fingerprint": "66b25e3c035a05d6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3d813f2917e5d89d", "level": "warning", "message": {"text": "Frontend route `/unsubscribe` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "9f5908e03c708e6e", "scanner": "scanner-primary", "fingerprint": "3d813f2917e5d89d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-db2a36fc4844ab35", "level": "warning", "message": {"text": "Frontend route `/draft/2026` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "f2551cb2d50581dd", "scanner": "scanner-primary", "fingerprint": "db2a36fc4844ab35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cfb21ae3ec8122ef", "level": "warning", "message": {"text": "Frontend route `/draft/2027` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "5c288aab18ba25f7", "scanner": "scanner-primary", "fingerprint": "cfb21ae3ec8122ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5b5e56fb6b6e10f6", "level": "warning", "message": {"text": "Frontend route `/draft/2028` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "5dfe46ea3092f16e", "scanner": "scanner-primary", "fingerprint": "5b5e56fb6b6e10f6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-32855e2e355d93c4", "level": "warning", "message": {"text": "Frontend route `/gm/dashboard` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d78e08d787bebdf6", "scanner": "scanner-primary", "fingerprint": "32855e2e355d93c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d00f1bc23d4a6dd6", "level": "warning", "message": {"text": "Frontend route `/gm/play` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "5857352d9d9546ec", "scanner": "scanner-primary", "fingerprint": "d00f1bc23d4a6dd6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-963fe75d17ada843", "level": "warning", "message": {"text": "Frontend route `/gm/stats` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "ba014db2fc562b17", "scanner": "scanner-primary", "fingerprint": "963fe75d17ada843", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3e69479d4516731f", "level": "warning", "message": {"text": "Frontend route `/gm/player/:playerId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "5983a1cb338aabdd", "scanner": "scanner-primary", "fingerprint": "3e69479d4516731f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-67aacab690a1818b", "level": "warning", "message": {"text": "Frontend route `/glossary` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "3c1104bd90056a9c", "scanner": "scanner-primary", "fingerprint": "67aacab690a1818b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0469be656966e830", "level": "warning", "message": {"text": "Frontend route `/player/:playerId` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "3ca2e807ae26762c", "scanner": "scanner-primary", "fingerprint": "0469be656966e830", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ebd42d4581bf5e2e", "level": "error", "message": {"text": "FastAPI POST `submit_feature_request` without auth dependency \u2014 backend/app/api/feature_requests.py:153"}, "properties": {"repobilityId": "fdb4539333fb64ff", "scanner": "scanner-primary", "fingerprint": "ebd42d4581bf5e2e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/feature_requests.py"}, "region": {"startLine": 153}}}]}, {"ruleId": "scanner-394a9c620fe35f53", "level": "error", "message": {"text": "FastAPI POST `grid_check_custom` without auth dependency \u2014 backend/app/api/grid.py:1047"}, "properties": {"repobilityId": "c4ad9f602cbb9c28", "scanner": "scanner-primary", "fingerprint": "394a9c620fe35f53", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/grid.py"}, "region": {"startLine": 1047}}}]}, {"ruleId": "scanner-827a0c956adc4134", "level": "error", "message": {"text": "FastAPI POST `grid_solutions` without auth dependency \u2014 backend/app/api/grid.py:1064"}, "properties": {"repobilityId": "01e7b1196f91fe9e", "scanner": "scanner-primary", "fingerprint": "827a0c956adc4134", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/grid.py"}, "region": {"startLine": 1064}}}]}, {"ruleId": "scanner-25e651a09c24d9bc", "level": "error", "message": {"text": "FastAPI POST `grid_validate_custom` without auth dependency \u2014 backend/app/api/grid.py:1132"}, "properties": {"repobilityId": "8decd5cdf9e887dc", "scanner": "scanner-primary", "fingerprint": "25e651a09c24d9bc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/grid.py"}, "region": {"startLine": 1132}}}]}, {"ruleId": "scanner-1b95d9e4fe696e4c", "level": "error", "message": {"text": "FastAPI PUT `update_prefs_by_token` without auth dependency \u2014 backend/app/api/email_prefs.py:169"}, "properties": {"repobilityId": "ca7be358d2fb9ac2", "scanner": "scanner-primary", "fingerprint": "1b95d9e4fe696e4c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/email_prefs.py"}, "region": {"startLine": 169}}}]}, {"ruleId": "scanner-1fbe214373642f74", "level": "error", "message": {"text": "FastAPI POST `one_click_unsubscribe` without auth dependency \u2014 backend/app/api/email_prefs.py:202"}, "properties": {"repobilityId": "474f44909feec7bb", "scanner": "scanner-primary", "fingerprint": "1fbe214373642f74", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/email_prefs.py"}, "region": {"startLine": 202}}}]}, {"ruleId": "scanner-b5d77512fdeefe17", "level": "error", "message": {"text": "FastAPI POST `lineup_helper_manual` without auth dependency \u2014 backend/app/api/coaching_tools.py:1166"}, "properties": {"repobilityId": "4edd715e8d06289f", "scanner": "scanner-primary", "fingerprint": "b5d77512fdeefe17", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/coaching_tools.py"}, "region": {"startLine": 1166}}}]}, {"ruleId": "scanner-24058bf9f95aca2e", "level": "error", "message": {"text": "FastAPI POST `lineup_helper_build` without auth dependency \u2014 backend/app/api/coaching_tools.py:1463"}, "properties": {"repobilityId": "b5eed791ed4c648b", "scanner": "scanner-primary", "fingerprint": "24058bf9f95aca2e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/coaching_tools.py"}, "region": {"startLine": 1463}}}]}, {"ruleId": "scanner-269bcf4e93dd4c21", "level": "error", "message": {"text": "FastAPI POST `lineup_helper_override` without auth dependency \u2014 backend/app/api/coaching_tools.py:1505"}, "properties": {"repobilityId": "2f462fbb7dfdc82a", "scanner": "scanner-primary", "fingerprint": "269bcf4e93dd4c21", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/coaching_tools.py"}, "region": {"startLine": 1505}}}]}, {"ruleId": "scanner-e9a7f4446cce4e91", "level": "error", "message": {"text": "FastAPI POST `stripe_webhook` without auth dependency \u2014 backend/app/api/billing.py:565"}, "properties": {"repobilityId": "d5bcf480e39a150e", "scanner": "scanner-primary", "fingerprint": "e9a7f4446cce4e91", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/billing.py"}, "region": {"startLine": 565}}}]}, {"ruleId": "scanner-04882232b283489c", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/stats/last-updated (frontend/src/components/StatsLastUpdated.jsx:63)"}, "properties": {"repobilityId": "39de4444d2e5a476", "scanner": "scanner-primary", "fingerprint": "04882232b283489c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-023079b7f46883cb", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/search?q=${encodeURIComponent(q)}&limit=6 (frontend/src/components/Header.jsx:205)"}, "properties": {"repobilityId": "7b7ca450d7269a66", "scanner": "scanner-primary", "fingerprint": "023079b7f46883cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f02520c09daef598", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/players/${playerId}/streaks?season=${season} (frontend/src/components/playerProfile/shared.jsx:571)"}, "properties": {"repobilityId": "b1ddd254d0795900", "scanner": "scanner-primary", "fingerprint": "f02520c09daef598", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4fb8c85f663c53a4", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/summer/leaderboards/${c.side}?${params} (frontend/src/components/home/StatWidgets.jsx:299)"}, "properties": {"repobilityId": "e68d05efab0d150d", "scanner": "scanner-primary", "fingerprint": "4fb8c85f663c53a4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-503fc257e6120b94", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/feature-requests (frontend/src/pages/FeatureRequest.jsx:27)"}, "properties": {"repobilityId": "4258f4d74f6776bc", "scanner": "scanner-primary", "fingerprint": "503fc257e6120b94", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f83e03f64ecbaf76", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/teams/${teamId}/championships (frontend/src/pages/TeamDetail.jsx:358)"}, "properties": {"repobilityId": "9513bcdc73779e8e", "scanner": "scanner-primary", "fingerprint": "f83e03f64ecbaf76", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-777c97c7576b35d1", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/players/${playerId} (frontend/src/pages/DraftBoard.jsx:98)"}, "properties": {"repobilityId": "36915601ef6ecaf0", "scanner": "scanner-primary", "fingerprint": "777c97c7576b35d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fcbb03624ea92c13", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/recruiting/freshman-by-division?season=${CURRENT_SEASON} (frontend/src/pages/RecruitingTips.jsx:38)"}, "properties": {"repobilityId": "76bbf1702ad32752", "scanner": "scanner-primary", "fingerprint": "fcbb03624ea92c13", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-28caf3cc162525d6", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/site-stats (frontend/src/pages/AnonymousHomepage.jsx:121)"}, "properties": {"repobilityId": "553c63a4d39c520a", "scanner": "scanner-primary", "fingerprint": "28caf3cc162525d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9208381dce5f5dc4", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/leaderboards/fielding?season=${SEASON}&position=SS&division_id=4&min_games=10&limit=3 (frontend/src/pages/AnonymousHomepage.jsx:438)"}, "properties": {"repobilityId": "c069ff4b37bc3659", "scanner": "scanner-primary", "fingerprint": "9208381dce5f5dc4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1d29d0d2a702f72c", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/leaderboards/${endpoint}?season=${SEASON}&sort_by=${sortBy}&sort_dir=desc&limit=200&qualified=true (frontend/src/pages/PremiumHomepage.jsx:136)"}, "properties": {"repobilityId": "b8ec96a43d353653", "scanner": "scanner-primary", "fingerprint": "1d29d0d2a702f72c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3d07163c5b2b0f08", "level": "error", "message": {"text": "Dangling fetch: PUT /api/v1/recruiting/programs/${teamId} (frontend/src/pages/RecruitingGuide.jsx:210)"}, "properties": {"repobilityId": "9fd020ee4a168dff", "scanner": "scanner-primary", "fingerprint": "3d07163c5b2b0f08", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2d6947e182bda2e8", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/coaching/lineup-helper/override (frontend/src/pages/LineupHelper.jsx:85)"}, "properties": {"repobilityId": "dbde838004654ab1", "scanner": "scanner-primary", "fingerprint": "2d6947e182bda2e8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6d2df28551c9b083", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/coaching/lineup-helper/build (frontend/src/pages/LineupHelper.jsx:829)"}, "properties": {"repobilityId": "7ec7d4c790872f97", "scanner": "scanner-primary", "fingerprint": "6d2df28551c9b083", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d6809295eee2099", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/site-stats (frontend/src/pages/About.jsx:1450)"}, "properties": {"repobilityId": "e5ab842a12b4d60d", "scanner": "scanner-primary", "fingerprint": "4d6809295eee2099", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4f45bc23d3936f6e", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/leaderboards/war?${params} (frontend/src/pages/WarLeaderboard.jsx:152)"}, "properties": {"repobilityId": "dd8c301700e0e38f", "scanner": "scanner-primary", "fingerprint": "4f45bc23d3936f6e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ffc90754d9d8f36b", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/recruiting/nwac-advancement?season=${CURRENT_SEASON} (frontend/src/pages/NwacAdvancement.jsx:44)"}, "properties": {"repobilityId": "6483c85378483cc3", "scanner": "scanner-primary", "fingerprint": "ffc90754d9d8f36b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a2d339ad61efb2d2", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/leaderboards/fielding?${qs} (frontend/src/pages/FieldingLeaderboard.jsx:149)"}, "properties": {"repobilityId": "0e80f1cdd7556a88", "scanner": "scanner-primary", "fingerprint": "a2d339ad61efb2d2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4a82e14b2471ad1d", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/pro-alumni (frontend/src/pages/ProTracker.jsx:59)"}, "properties": {"repobilityId": "0c6d6ba572fa8b79", "scanner": "scanner-primary", "fingerprint": "4a82e14b2471ad1d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0a7847cc575640bb", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/recruiting/program-guide (frontend/src/pages/RecruitingProgramGuide.jsx:28)"}, "properties": {"repobilityId": "15e860227b0d86b7", "scanner": "scanner-primary", "fingerprint": "0a7847cc575640bb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-15bfc7d3a109309d", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/teams/scatter?season=${SEASON}&x_stat=${combo.x}&y_stat=${combo.y} (frontend/src/pages/FreeHomepage.jsx:118)"}, "properties": {"repobilityId": "460cd3a096612420", "scanner": "scanner-primary", "fingerprint": "15bfc7d3a109309d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ff6147fc5f4de598", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/teams/scatter?season=${SEASON}&x_stat=${stat.key}&y_stat=win_pct (frontend/src/pages/FreeHomepage.jsx:257)"}, "properties": {"repobilityId": "e06aa5a2352b8236", "scanner": "scanner-primary", "fingerprint": "ff6147fc5f4de598", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5fe1210299e4d521", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/leaderboards/${cat.endpoint}?season=${SEASON}&min_bf=80&sort_by=${cat.sort}&sort_dir=desc&limit=2 (frontend/src/pages/FreeHomepage.jsx:432)"}, "properties": {"repobilityId": "b97af749268052b6", "scanner": "scanner-primary", "fingerprint": "5fe1210299e4d521", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cedeea103a15c23c", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/leaderboards/percentiles?season=${SEASON}&limit=60 (frontend/src/pages/FreeHomepage.jsx:529)"}, "properties": {"repobilityId": "fdd758721299b84c", "scanner": "scanner-primary", "fingerprint": "cedeea103a15c23c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-acb94fb958700e72", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/quiz/league-question?season=${SEASON} (frontend/src/pages/FreeHomepage.jsx:634)"}, "properties": {"repobilityId": "bebd8ac3675ab679", "scanner": "scanner-primary", "fingerprint": "acb94fb958700e72", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ccf640a759794b8", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/players/search?q=${encodeURIComponent(query)} (frontend/src/pages/PlayerGraphic.jsx:205)"}, "properties": {"repobilityId": "1655b796fcb0c41c", "scanner": "scanner-primary", "fingerprint": "1ccf640a759794b8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6595c9500d55ec03", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/team-ratings?season=${season} (frontend/src/pages/PlayerGraphic.jsx:475)"}, "properties": {"repobilityId": "3eb76cd4f7a9639f", "scanner": "scanner-primary", "fingerprint": "6595c9500d55ec03", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-145d7046f1cff6c1", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/national-rankings?season=${season} (frontend/src/pages/PlayerGraphic.jsx:476)"}, "properties": {"repobilityId": "116a337990d471ec", "scanner": "scanner-primary", "fingerprint": "145d7046f1cff6c1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-595efb950a53e414", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/players/${playerId}/streaks?season=${season} (frontend/src/pages/PlayerDetail.jsx:1412)"}, "properties": {"repobilityId": "414b5b3d7d2189e6", "scanner": "scanner-primary", "fingerprint": "595efb950a53e414", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97ac8a6ca12b7c7a", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/leaderboards/relievers?${qs} (frontend/src/pages/RelieverLeaderboard.jsx:103)"}, "properties": {"repobilityId": "3bc222fb2d3ddc7a", "scanner": "scanner-primary", "fingerprint": "97ac8a6ca12b7c7a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b1d5926fda286fa", "level": "note", "message": {"text": "Unused endpoint: GET /{full_path:path}"}, "properties": {"repobilityId": "574058a6b8490f0e", "scanner": "scanner-primary", "fingerprint": "1b1d5926fda286fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "9a7ab29051c0367b", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb48bc9c6f8c0c14", "level": "note", "message": {"text": "Unused endpoint: POST /feature-requests"}, "properties": {"repobilityId": "ae111d83da77e67e", "scanner": "scanner-primary", "fingerprint": "eb48bc9c6f8c0c14", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-64fec68a4bd7140d", "level": "note", "message": {"text": "Unused endpoint: GET /feature-requests"}, "properties": {"repobilityId": "95815047c0ea21d4", "scanner": "scanner-primary", "fingerprint": "64fec68a4bd7140d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c85094ad85aafb5c", "level": "note", "message": {"text": "Unused endpoint: GET /me/subscription"}, "properties": {"repobilityId": "6d04297bf1e03a43", "scanner": "scanner-primary", "fingerprint": "c85094ad85aafb5c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b25bbcfcde5ea82f", "level": "note", "message": {"text": "Unused endpoint: GET /me/affiliated-team"}, "properties": {"repobilityId": "ded4736811fd571e", "scanner": "scanner-primary", "fingerprint": "b25bbcfcde5ea82f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0fdb1f7f27df65ce", "level": "note", "message": {"text": "Unused endpoint: PUT /me/affiliated-team"}, "properties": {"repobilityId": "4a65e47b765b38ac", "scanner": "scanner-primary", "fingerprint": "0fdb1f7f27df65ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-162d89ac7e0e2d54", "level": "note", "message": {"text": "Unused endpoint: GET /question"}, "properties": {"repobilityId": "6c7cdbea704e0762", "scanner": "scanner-primary", "fingerprint": "162d89ac7e0e2d54", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b01f85b4855fe2a", "level": "note", "message": {"text": "Unused endpoint: GET /questions"}, "properties": {"repobilityId": "2e60ea2b799f9f47", "scanner": "scanner-primary", "fingerprint": "7b01f85b4855fe2a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d88e9ae2a8f1c1cb", "level": "note", "message": {"text": "Unused endpoint: GET /league-question"}, "properties": {"repobilityId": "7d3240af2ec75568", "scanner": "scanner-primary", "fingerprint": "d88e9ae2a8f1c1cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d614fbdbe449e2b", "level": "note", "message": {"text": "Unused endpoint: GET /site-stats"}, "properties": {"repobilityId": "550ecdd56a667891", "scanner": "scanner-primary", "fingerprint": "9d614fbdbe449e2b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a2e102cbaee3d91", "level": "note", "message": {"text": "Unused endpoint: GET /stats/last-updated"}, "properties": {"repobilityId": "f0d96f3f1ec36a22", "scanner": "scanner-primary", "fingerprint": "6a2e102cbaee3d91", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b02cf6f0dfc991e", "level": "note", "message": {"text": "Unused endpoint: GET /hometown-search"}, "properties": {"repobilityId": "106a9a2f2f14d1e0", "scanner": "scanner-primary", "fingerprint": "2b02cf6f0dfc991e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ebabd49fcdc19cac", "level": "note", "message": {"text": "Unused endpoint: GET /divisions"}, "properties": {"repobilityId": "7adfbda6cb5f6b53", "scanner": "scanner-primary", "fingerprint": "ebabd49fcdc19cac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7be1714a0f2a38c", "level": "note", "message": {"text": "Unused endpoint: GET /conferences"}, "properties": {"repobilityId": "9a6b1ab37842d3a4", "scanner": "scanner-primary", "fingerprint": "e7be1714a0f2a38c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72e04955cf83a53f", "level": "note", "message": {"text": "Unused endpoint: GET /teams"}, "properties": {"repobilityId": "01b54a27dc8b14cd", "scanner": "scanner-primary", "fingerprint": "72e04955cf83a53f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b416da04e074bb8d", "level": "note", "message": {"text": "Unused endpoint: GET /teams/summary"}, "properties": {"repobilityId": "72baa76170bae0e3", "scanner": "scanner-primary", "fingerprint": "b416da04e074bb8d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa5ca8f5ddd49bd7", "level": "note", "message": {"text": "Unused endpoint: GET /standings"}, "properties": {"repobilityId": "7bbc6a36971066d1", "scanner": "scanner-primary", "fingerprint": "fa5ca8f5ddd49bd7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d7a4fc53e78944b", "level": "note", "message": {"text": "Unused endpoint: GET /conference-standings-graphic"}, "properties": {"repobilityId": "b5fc5a5594530f3e", "scanner": "scanner-primary", "fingerprint": "8d7a4fc53e78944b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-956de801f310823e", "level": "note", "message": {"text": "Unused endpoint: GET /stat-leaders"}, "properties": {"repobilityId": "d42d3c4b10995bc1", "scanner": "scanner-primary", "fingerprint": "956de801f310823e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a300923b068adcba", "level": "note", "message": {"text": "Unused endpoint: GET /records"}, "properties": {"repobilityId": "4d1af7b7a3d314df", "scanner": "scanner-primary", "fingerprint": "a300923b068adcba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb1e076d0aabc056", "level": "note", "message": {"text": "Unused endpoint: GET /team-ratings"}, "properties": {"repobilityId": "4beef61acb5d8477", "scanner": "scanner-primary", "fingerprint": "bb1e076d0aabc056", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b0eeb3ecb9046f28", "level": "note", "message": {"text": "Unused endpoint: GET /national-rankings"}, "properties": {"repobilityId": "6d1ac09ac12da86e", "scanner": "scanner-primary", "fingerprint": "b0eeb3ecb9046f28", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1959c292402b530f", "level": "note", "message": {"text": "Unused endpoint: GET /teams/compare"}, "properties": {"repobilityId": "b11dd7e9e854e35b", "scanner": "scanner-primary", "fingerprint": "1959c292402b530f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-279983215bc1d078", "level": "note", "message": {"text": "Unused endpoint: GET /teams/matchup"}, "properties": {"repobilityId": "2e4eb78a5f153663", "scanner": "scanner-primary", "fingerprint": "279983215bc1d078", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccbdcb7721fe5866", "level": "note", "message": {"text": "Unused endpoint: GET /games/win-probabilities"}, "properties": {"repobilityId": "122bc64f6c917755", "scanner": "scanner-primary", "fingerprint": "ccbdcb7721fe5866", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dbb1e05bdc70d611", "level": "note", "message": {"text": "Unused endpoint: GET /games/upset-of-the-day"}, "properties": {"repobilityId": "526725a60df98a69", "scanner": "scanner-primary", "fingerprint": "dbb1e05bdc70d611", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e77b87767a7c63c", "level": "note", "message": {"text": "Unused endpoint: GET /playoff-projections"}, "properties": {"repobilityId": "4ee6e56cd85eb998", "scanner": "scanner-primary", "fingerprint": "5e77b87767a7c63c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a92d11e3963f7869", "level": "note", "message": {"text": "Unused endpoint: GET /nwac-championship-odds"}, "properties": {"repobilityId": "0daf3860fab7c300", "scanner": "scanner-primary", "fingerprint": "a92d11e3963f7869", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-816a6475580afcd8", "level": "note", "message": {"text": "Unused endpoint: GET /nwac-mvp-tracker"}, "properties": {"repobilityId": "e6fb05d4b3920001", "scanner": "scanner-primary", "fingerprint": "816a6475580afcd8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7985195a22ea0e1", "level": "note", "message": {"text": "Unused endpoint: GET /teams/scatter"}, "properties": {"repobilityId": "b922eac629c57977", "scanner": "scanner-primary", "fingerprint": "e7985195a22ea0e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01faadf9e80942cd", "level": "note", "message": {"text": "Unused endpoint: GET /teams/correlations"}, "properties": {"repobilityId": "964ecd8175b66d46", "scanner": "scanner-primary", "fingerprint": "01faadf9e80942cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e6e45699f6fef78", "level": "note", "message": {"text": "Unused endpoint: GET /teams/{team_id}"}, "properties": {"repobilityId": "a841da06c1d27fa5", "scanner": "scanner-primary", "fingerprint": "3e6e45699f6fef78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6befd26946914ba9", "level": "note", "message": {"text": "Unused endpoint: GET /teams/{team_id}/rankings"}, "properties": {"repobilityId": "131cabe7a0ae8fa3", "scanner": "scanner-primary", "fingerprint": "6befd26946914ba9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fcf1b02712264c0b", "level": "note", "message": {"text": "Unused endpoint: GET /teams/{team_id}/season-recap"}, "properties": {"repobilityId": "3e4a8b8084e8c460", "scanner": "scanner-primary", "fingerprint": "fcf1b02712264c0b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d3ddbc4a8c8ee1c6", "level": "note", "message": {"text": "Unused endpoint: GET /teams/{team_id}/info-graphic"}, "properties": {"repobilityId": "a2299db7b41963d6", "scanner": "scanner-primary", "fingerprint": "d3ddbc4a8c8ee1c6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-157a6bc5c097defb", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/batting"}, "properties": {"repobilityId": "c5122d9e4e12667c", "scanner": "scanner-primary", "fingerprint": "157a6bc5c097defb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-49339f714e2b3b70", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/clubs"}, "properties": {"repobilityId": "543bf69378a8b237", "scanner": "scanner-primary", "fingerprint": "49339f714e2b3b70", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb239096708614f5", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/pitching"}, "properties": {"repobilityId": "b8eac9d2ed066ef5", "scanner": "scanner-primary", "fingerprint": "cb239096708614f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9cc348be3acf1b5e", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/batting-pbp"}, "properties": {"repobilityId": "1f9b07870ab3f884", "scanner": "scanner-primary", "fingerprint": "9cc348be3acf1b5e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-30878c05ecdc0632", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/pitching-pbp"}, "properties": {"repobilityId": "23fca3c6199249b6", "scanner": "scanner-primary", "fingerprint": "30878c05ecdc0632", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52e24d237c78d2f1", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/team-batting-pbp"}, "properties": {"repobilityId": "3a053101d28353f1", "scanner": "scanner-primary", "fingerprint": "52e24d237c78d2f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ea32345171b92b1", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/team-pitching-pbp"}, "properties": {"repobilityId": "9307e2ea3c41bdd5", "scanner": "scanner-primary", "fingerprint": "9ea32345171b92b1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b88120c0e3d8ce3", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/relievers"}, "properties": {"repobilityId": "733086ee6bb14784", "scanner": "scanner-primary", "fingerprint": "7b88120c0e3d8ce3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6850103d190ea65e", "level": "note", "message": {"text": "Unused endpoint: GET /players/{player_id}/goose-eggs"}, "properties": {"repobilityId": "42f46237cff06484", "scanner": "scanner-primary", "fingerprint": "6850103d190ea65e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0f2ea12dec6260e5", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/fielding"}, "properties": {"repobilityId": "76bd4cf445c7d7db", "scanner": "scanner-primary", "fingerprint": "0f2ea12dec6260e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17fee23a4a764109", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/war"}, "properties": {"repobilityId": "53f8a6bfde16111d", "scanner": "scanner-primary", "fingerprint": "17fee23a4a764109", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aede50b4ea09aabb", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/percentiles"}, "properties": {"repobilityId": "4789e1bdb70401d8", "scanner": "scanner-primary", "fingerprint": "aede50b4ea09aabb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f4b13cad09989c81", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboards/teams"}, "properties": {"repobilityId": "5b41992b3cbdce51", "scanner": "scanner-primary", "fingerprint": "f4b13cad09989c81", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d16e4fa529c520e9", "level": "note", "message": {"text": "Unused endpoint: GET /search"}, "properties": {"repobilityId": "1eb4dc35ae633de2", "scanner": "scanner-primary", "fingerprint": "d16e4fa529c520e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}