{"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-e3cbc7835c7b0d2a", "name": "Stray `console.log` in TS/JS \u2014 build-inject.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 build-inject.js:23"}, "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-f953bba4b129d167", "name": "Stray `console.log` in TS/JS \u2014 ai-copilot/copilot-cli.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ai-copilot/copilot-cli.js:33"}, "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-37eb02a2920953f5", "name": "Stray `console.log` in TS/JS \u2014 ai-copilot/index.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ai-copilot/index.js:13"}, "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-3abfb336b1f849de", "name": "Stray `console.log` in TS/JS \u2014 qa/market-intel-agent.js:456", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/market-intel-agent.js:456"}, "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-a0ca505826b2f94d", "name": "Stray `console.log` in TS/JS \u2014 qa/club-intelligence/club-intelligence-cli.js:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/club-intelligence/club-intelligence-cli.js:29"}, "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-783296f76f57a895", "name": "Stray `console.log` in TS/JS \u2014 qa/club-intelligence/index.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/club-intelligence/index.js:11"}, "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-82bb769ee4859f8b", "name": "Stray `console.log` in TS/JS \u2014 qa/lead-personalisation/generate-report.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/lead-personalisation/generate-report.js:18"}, "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-67e1c33a8076149c", "name": "Stray `console.log` in TS/JS \u2014 qa/lead-personalisation/lead-personalisation.js:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/lead-personalisation/lead-personalisation.js:108"}, "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-2670c347ec47436f", "name": "Stray `console.log` in TS/JS \u2014 qa/market-intel/pipeline.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/market-intel/pipeline.js:32"}, "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-ac5d4e06d9ea7240", "name": "Stray `console.log` in TS/JS \u2014 qa/market-intel/score-leads.js:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/market-intel/score-leads.js:59"}, "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-0f32805b38ca4ef8", "name": "Stray `console.log` in TS/JS \u2014 qa/market-intel/import-csv.js:87", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/market-intel/import-csv.js:87"}, "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-0b2708b460ba8563", "name": "Stray `console.log` in TS/JS \u2014 qa/coaching-engine/coaching-engine-cli.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/coaching-engine/coaching-engine-cli.js:32"}, "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-e5e8eee8a93d8013", "name": "Stray `console.log` in TS/JS \u2014 qa/data-integration/data-integration-cli.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/data-integration/data-integration-cli.js:22"}, "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-f4d97784b35e912d", "name": "Stray `console.log` in TS/JS \u2014 qa/data-integration/data-report.js:251", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/data-integration/data-report.js:251"}, "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-7c022f8e71643b5f", "name": "Stray `console.log` in TS/JS \u2014 qa/scripts/availability-self-test.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/scripts/availability-self-test.js:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d72f1c84f3b8c929", "name": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-session.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-session.js:21"}, "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-762448026585e842", "name": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-assistant.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-assistant.js:17"}, "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-0ccadda84ade28e1", "name": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-law.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-law.js:17"}, "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-e0382b67b8e6a6c3", "name": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-drills.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-drills.js:17"}, "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-5513187b2bda2d0b", "name": "Stray `console.log` in TS/JS \u2014 qa/playwright-report/trace/uiMode.C2Efnu2P.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/playwright-report/trace/uiMode.C2Efnu2P.js:5"}, "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-f5c67e36d36fe612", "name": "Stray `console.log` in TS/JS \u2014 qa/playwright-report/trace/sw.bundle.js:1", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/playwright-report/trace/sw.bundle.js:1"}, "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-b4c2e0df790e3e10", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 qa/playwright-report/trace/assets/defaultSettingsView-D31xz8zv.js:", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 qa/playwright-report/trace/assets/defaultSettingsView-D31xz8zv.js:50"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c43e0dac4c5fb028", "name": "Stray `console.log` in TS/JS \u2014 qa/discovery/discovery.js:95", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/discovery/discovery.js:95"}, "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-c888f5f0ded5e861", "name": "Stray `console.log` in TS/JS \u2014 qa/rugby-intel/generate-reports.js:245", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-intel/generate-reports.js:245"}, "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-9034bbf647985a7c", "name": "Stray `console.log` in TS/JS \u2014 qa/rugby-intel/rugby-intel.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-intel/rugby-intel.js:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ceeb8f3f310ae78", "name": "Stray `console.log` in TS/JS \u2014 qa/rugby-intel/ingest.js:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-intel/ingest.js:53"}, "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-5974c9142ba58383", "name": "Stray `console.log` in TS/JS \u2014 qa/player-development/player-development-cli.js:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/player-development/player-development-cli.js:85"}, "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-14d652c0453e1829", "name": "Stray `console.log` in TS/JS \u2014 qa/e2e/workflow-13-role-switching.spec.js:170", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/e2e/workflow-13-role-switching.spec.js:170"}, "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-f130149ed670e069", "name": "Stray `console.log` in TS/JS \u2014 qa/e2e/signup-qa-full.spec.js:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/e2e/signup-qa-full.spec.js:109"}, "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-44b7688fe0d45f66", "name": "Stray `console.log` in TS/JS \u2014 fixture-engine/fixture-api.js:196", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 fixture-engine/fixture-api.js:196"}, "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-2c76d3bd7db75371", "name": "Stray `console.log` in TS/JS \u2014 fixture-engine/fixture-cli.js:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 fixture-engine/fixture-cli.js:38"}, "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-8ebd03a264ac03e2", "name": "Stray `console.log` in TS/JS \u2014 api/invite.js:169", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/invite.js:169"}, "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-b45351ed0e34d29c", "name": "Stray `console.log` in TS/JS \u2014 test/player-dm-diagnostic.test.js:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/player-dm-diagnostic.test.js:111"}, "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-6480f944026595a8", "name": "Stray `console.log` in TS/JS \u2014 club-digital-twin/club-twin-cli.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 club-digital-twin/club-twin-cli.js:25"}, "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-f6136d4aaef9bef0", "name": "Stray `console.log` in TS/JS \u2014 club-digital-twin/club-api.js:167", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 club-digital-twin/club-api.js:167"}, "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-cbb14b65c98b595d", "name": "Stray `console.log` in TS/JS \u2014 club-digital-twin/index.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 club-digital-twin/index.js:11"}, "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-c95319d72eae7c0b", "name": "Stray `console.log` in TS/JS \u2014 dashboard/dashboard-cli.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 dashboard/dashboard-cli.js:11"}, "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-072448d8ce6e9019", "name": "Stray `console.log` in TS/JS \u2014 platform/index.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 platform/index.js:11"}, "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-09e8d6bd89820470", "name": "Stray `console.log` in TS/JS \u2014 platform/platform-cli.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 platform/platform-cli.js:11"}, "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-e9aa313a297e04f6", "name": "Stray `console.log` in TS/JS \u2014 knowledge-engine/index.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 knowledge-engine/index.js:10"}, "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-f582cd83b51e4ab3", "name": "Stray `console.log` in TS/JS \u2014 knowledge-engine/knowledge-cli.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 knowledge-engine/knowledge-cli.js:11"}, "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-9b42264a8daa1250", "name": "Stray `console.log` in TS/JS \u2014 orchestrator/orchestrator-cli.js:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 orchestrator/orchestrator-cli.js:46"}, "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-4a67aa1474ea280b", "name": "Stray `console.log` in TS/JS \u2014 orchestrator/index.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 orchestrator/index.js:14"}, "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-130ef5f740e6dbd5", "name": "Stray `console.log` in TS/JS \u2014 workflow-engine/workflow-engine-cli.js:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 workflow-engine/workflow-engine-cli.js:78"}, "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-e08c89937d62807a", "name": "Stray `console.log` in TS/JS \u2014 app/api-server.js:394", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api-server.js:394"}, "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-b2d3608bc5c5cfa7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/layout/Sidebar.jsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/layout/Sidebar.jsx:66"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8fbebac5cbc3a7bb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/layout/TopBar.jsx:19", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/layout/TopBar.jsx:19"}, "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-a261f1e287a7f90e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/ApprovalsQueue.jsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/ApprovalsQueue.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-ead89cdfb83d4183", "name": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/ActionHistoryFeed.jsx:3", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/ActionHistoryFeed.jsx:38"}, "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-e0ad979ccdcbb8e3", "name": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/ClubHealthCard.jsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/ClubHealthCard.jsx:58"}, "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-bed10772f666ce1e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/PlayerAlerts.jsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/PlayerAlerts.jsx:32"}, "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-e0ea1d9e67a8233b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/command-bar/CommandBar.jsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/command-bar/CommandBar.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-a7e80f1727fd3751", "name": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/pages/CommunicationsPage.jsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/pages/CommunicationsPage.jsx:63"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76596073daf6ab32", "name": "`truncate` class without `title=` for hover reveal \u2014 app/mobile/src/components/layout/CommandBar.jsx:20", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/mobile/src/components/layout/CommandBar.jsx:20"}, "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-dd55d6fa526c91cc", "name": "`truncate` class without `title=` for hover reveal \u2014 app/mobile/src/components/ui/AlertItem.jsx:34", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/mobile/src/components/ui/AlertItem.jsx:34"}, "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-227e7849330ba5af", "name": "Stray `console.log` in TS/JS \u2014 season-intelligence/season-api.js:151", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 season-intelligence/season-api.js:151"}, "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-19d7fb6f85eeed51", "name": "Stray `console.log` in TS/JS \u2014 season-intelligence/season-cli.js:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 season-intelligence/season-cli.js:66"}, "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-712ab882715f1ca5", "name": "Stray `console.log` in TS/JS \u2014 memory-engine/memory-engine-cli.js:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 memory-engine/memory-engine-cli.js:43"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e6db188955c329d2", "name": "Stray `console.log` in TS/JS \u2014 autonomous-assistant/assistant-cli.js:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 autonomous-assistant/assistant-cli.js:42"}, "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-555fd1462d61d093", "name": "Stray `console.log` in TS/JS \u2014 autonomous-assistant/assistant-api.js:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 autonomous-assistant/assistant-api.js:126"}, "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-4e7871cdbc59d4dc", "name": "Stray `console.log` in TS/JS \u2014 actions/action-cli.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 actions/action-cli.js:11"}, "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-86da5a175ae5f7b7", "name": "Stray `console.log` in TS/JS \u2014 learning-engine/learning-api.js:141", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learning-engine/learning-api.js:141"}, "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-a14c1712549e1a3e", "name": "Stray `console.log` in TS/JS \u2014 learning-engine/learning-cli.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 learning-engine/learning-cli.js:19"}, "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-6a66738bbfe60c28", "name": "Stray `console.log` in TS/JS \u2014 communications-engine/communications-engine-cli.js:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 communications-engine/communications-engine-cli.js:31"}, "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-022946f615b4abbe", "name": "Stray `console.log` in TS/JS \u2014 communications-engine/communications-pack-cli.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 communications-engine/communications-pack-cli.js:18"}, "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-10d73af5e3d8de60", "name": "Analyzer timeout: security.scan", "shortDescription": {"text": "Analyzer timeout: security.scan"}, "fullDescription": {"text": "analyzer exceeded 60.0s wall-clock (thread mode \u2014 daemon abandoned). Bump REPOBILITY_ANALYZER_TIMEOUT_S if expected."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-76d772df8627e110", "name": "Very large file: api/_identityStore.js (1576 lines)", "shortDescription": {"text": "Very large file: api/_identityStore.js (1576 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-e1cd066ccc5d407e", "name": "Very large file: actions/action-registry.js (1351 lines)", "shortDescription": {"text": "Very large file: actions/action-registry.js (1351 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-2f7463cb319b1153", "name": "Very large file: mission-control/app.js (2241 lines)", "shortDescription": {"text": "Very large file: mission-control/app.js (2241 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "76 tests / 492 src (ratio 0.15)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 878 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 132 placeholder/mock markers across 48 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38a34a198d1d14f4", "name": "Agent authority lacks a verifier contract: .claude/commands/core-guardian.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/core-guardian.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-262b2f45360cebab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:138", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:138"}, "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-76dbbf6271a05822", "name": "Commented-code block (6 lines) in qa/market-intel-agent.js:277", "shortDescription": {"text": "Commented-code block (6 lines) in qa/market-intel-agent.js:277"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5268982def893f05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/lead-personalisation/coaching-preview.js:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/lead-personalisation/coaching-preview.js:106"}, "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-b9622718fa7d9ebb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/lead-personalisation/outreach-draft.js:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/lead-personalisation/outreach-draft.js:40"}, "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-68672a99d250bea1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/claude.js:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/claude.js:19"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5efcfe33b345678a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/local.js:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/local.js:19"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8d4f60e51c83d6ba", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/gemini.js:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/gemini.js:20"}, "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-388fdd56aa23315c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/openai.js:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/openai.js:17"}, "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-3ba0a571f6dbc490", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/data-integration/data-report.js:137", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/data-integration/data-report.js:137"}, "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-2f5da85f5ece2bec", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/helpers/shared-steps.js:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/helpers/shared-steps.js:92"}, "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-098a9388bcd271d5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/assistant.js:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/assistant.js:49"}, "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-3e2379cbcad4732f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/session-builder.js:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/session-builder.js:84"}, "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-e9ba040e78f6f20b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/law-explainer.js:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/law-explainer.js:38"}, "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-31d81671d85700ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/drill-finder.js:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/drill-finder.js:34"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8adbc95568f14d5d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/uiMode.C2Efnu2P.js:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/uiMode.C2Efnu2P.js:4"}, "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-b4faa2e12c595e50", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/sw.bundle.js:3", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/sw.bundle.js:3"}, "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-677f0ba89687d5fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/index.BCnMPevh.js:1", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/index.BCnMPevh.js:1"}, "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-ead7487d38fa93cf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/snapshot.v8KI4P3m.js:2", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/snapshot.v8KI4P3m.js:2"}, "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-abc7e26dfd5e1d93", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/assets/urlMatch-BYQrIQwR.js:1", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/assets/urlMatch-BYQrIQwR.js:1"}, "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-d7bbc56066daefe8", "name": "Legacy-named symbol `unstable_legacy` in qa/playwright-report/trace/assets/defaultSettingsView-D31xz8zv.js:49", "shortDescription": {"text": "Legacy-named symbol `unstable_legacy` in qa/playwright-report/trace/assets/defaultSettingsView-D31xz8zv.js:49"}, "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-a91048923ea8d7be", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/assets/defaultSettingsView-D31xz8zv.js:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/assets/defaultSettingsView-D31xz8zv.js:60"}, "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-5974beb1533d69cf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-intel/summarize.js:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-intel/summarize.js:51"}, "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-4e87f331a9f04fe9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/e2e/signup-qa-full.spec.js:462", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/e2e/signup-qa-full.spec.js:462"}, "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-8e492659a4234616", "name": "Commented-code block (5 lines) in api/publish.js:30", "shortDescription": {"text": "Commented-code block (5 lines) in api/publish.js:30"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd10bf92b2755be9", "name": "Commented-code block (9 lines) in api/chat.js:1", "shortDescription": {"text": "Commented-code block (9 lines) in api/chat.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-8ae860da54c9d6de", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/chat.js:509", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/chat.js:509"}, "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-fd05484624b9f4d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_kv.js:2", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_kv.js:2"}, "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-913411efebb48cda", "name": "Commented-code block (6 lines) in api/_identityStore.js:1413", "shortDescription": {"text": "Commented-code block (6 lines) in api/_identityStore.js:1413"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1d65da0c847d067", "name": "Commented-code block (5 lines) in api/_stripe.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in api/_stripe.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-8f4c13b56375c2b3", "name": "Commented-code block (9 lines) in test/identity-system.test.js:823", "shortDescription": {"text": "Commented-code block (9 lines) in test/identity-system.test.js:823"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f76871904eea51e", "name": "Commented-code block (6 lines) in test/stripe-phase5.test.js:265", "shortDescription": {"text": "Commented-code block (6 lines) in test/stripe-phase5.test.js:265"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3dac2c1a81630b17", "name": "Legacy-named symbol `fx_legacy` in test/fixtures.test.js:144", "shortDescription": {"text": "Legacy-named symbol `fx_legacy` in test/fixtures.test.js:144"}, "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-f5cdb92bf5050b13", "name": "Commented-code block (7 lines) in test/club-command-dashboard.test.js:79", "shortDescription": {"text": "Commented-code block (7 lines) in test/club-command-dashboard.test.js:79"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d9249a664c0f4b1e", "name": "Commented-code block (5 lines) in test/messaging-stability.test.js:28", "shortDescription": {"text": "Commented-code block (5 lines) in test/messaging-stability.test.js:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57d1ff8af0042fcd", "name": "Commented-code block (6 lines) in test/match-readiness.test.js:40", "shortDescription": {"text": "Commented-code block (6 lines) in test/match-readiness.test.js:40"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-736e8b7526a90a1a", "name": "Legacy-named symbol `rainy_day_backup` in test/travel-publisher-adoption.test.js:54", "shortDescription": {"text": "Legacy-named symbol `rainy_day_backup` in test/travel-publisher-adoption.test.js:54"}, "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-c763d1fca0a09de7", "name": "Commented-code block (6 lines) in test/subscription-feature-gates.test.js:88", "shortDescription": {"text": "Commented-code block (6 lines) in test/subscription-feature-gates.test.js:88"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9903639bbd577cab", "name": "Legacy-named symbol `rainy_day_backup` in test/travel-itinerary-platform.test.js:46", "shortDescription": {"text": "Legacy-named symbol `rainy_day_backup` in test/travel-itinerary-platform.test.js:46"}, "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-92d3fd44146fb969", "name": "Commented-code block (7 lines) in dashboard/approval-centre/approval-ledger.js:8", "shortDescription": {"text": "Commented-code block (7 lines) in dashboard/approval-centre/approval-ledger.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-2ad6212bf5be0904", "name": "Commented-code block (10 lines) in platform/platform-registry.js:10", "shortDescription": {"text": "Commented-code block (10 lines) in platform/platform-registry.js:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4ddeaaed6e21ef8b", "name": "Commented-code block (7 lines) in platform/platform-orchestrator.js:4", "shortDescription": {"text": "Commented-code block (7 lines) in platform/platform-orchestrator.js: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-b7c6aa7a91974320", "name": "Commented-code block (5 lines) in app/api-server.js:361", "shortDescription": {"text": "Commented-code block (5 lines) in app/api-server.js:361"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-026edf357ba57cf3", "name": "Commented-code block (5 lines) in lib/travel-intelligence-orchestrator/constants.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/travel-intelligence-orchestrator/constants.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-f7dc0d87286e5550", "name": "Commented-code block (5 lines) in lib/travel-timeline-platform/constants.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/travel-timeline-platform/constants.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-38a35ff3145eb994", "name": "Commented-code block (5 lines) in lib/itinerary-platform/service.js:331", "shortDescription": {"text": "Commented-code block (5 lines) in lib/itinerary-platform/service.js:331"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0daff7d9b224011d", "name": "Commented-code block (5 lines) in lib/destination-platform/service.js:165", "shortDescription": {"text": "Commented-code block (5 lines) in lib/destination-platform/service.js:165"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6bac76d65e3e3bb2", "name": "Legacy-named symbol `rainy_day_backup` in lib/trip-intelligence-platform/constants.js:5", "shortDescription": {"text": "Legacy-named symbol `rainy_day_backup` in lib/trip-intelligence-platform/constants.js:5"}, "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-b25e0ddfdf601fa2", "name": "Commented-code block (5 lines) in lib/traveller-digital-twin-platform/constants.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/traveller-digital-twin-platform/constants.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-39e3778dcb04dbd9", "name": "Commented-code block (6 lines) in lib/travel-relationship-graph/constants.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in lib/travel-relationship-graph/constants.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-9dd0a971b75870fd", "name": "Commented-code block (5 lines) in lib/approval-platform/constants.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/approval-platform/constants.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-e8b1a251f6e9f95f", "name": "Commented-code block (5 lines) in lib/travel-insight-engine/constants.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/travel-insight-engine/constants.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-d1025fc8e581e6f5", "name": "Commented-code block (5 lines) in lib/traveller-identity-platform/constants.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/traveller-identity-platform/constants.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-99dee0d713ab809c", "name": "Commented-code block (11 lines) in season-intelligence/weekly-brief.js:9", "shortDescription": {"text": "Commented-code block (11 lines) in season-intelligence/weekly-brief.js: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-d2c9e262b9b9145b", "name": "Commented-code block (5 lines) in season-intelligence/coach-experience.js:17", "shortDescription": {"text": "Commented-code block (5 lines) in season-intelligence/coach-experience.js:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47f3971e31637031", "name": "`fetch()` without try/.catch or AbortSignal \u2014 season-intelligence/coach-experience.js:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 season-intelligence/coach-experience.js:86"}, "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-3a0ddf33e08bd6a6", "name": "Commented-code block (6 lines) in season-intelligence/match-readiness.js:9", "shortDescription": {"text": "Commented-code block (6 lines) in season-intelligence/match-readiness.js: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-595230976f8513bb", "name": "Commented-code block (6 lines) in memory-engine/memory-engine-cli.js:320", "shortDescription": {"text": "Commented-code block (6 lines) in memory-engine/memory-engine-cli.js:320"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae8e608a972eec29", "name": "Commented-code block (13 lines) in actions/action-registry.js:6", "shortDescription": {"text": "Commented-code block (13 lines) in actions/action-registry.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-d61519e8af159cbb", "name": "Commented-code block (5 lines) in brain/index.js:9", "shortDescription": {"text": "Commented-code block (5 lines) in brain/index.js: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-17fda1bc79b94f70", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/sw.js:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/sw.js:29"}, "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-a614a04eb58ffc21", "name": "Commented-code block (9 lines) in mission-control/app.js:1652", "shortDescription": {"text": "Commented-code block (9 lines) in mission-control/app.js:1652"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c41bb1a1f430bd6", "name": "39 env vars used in code but missing from .env.example", "shortDescription": {"text": "39 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `APPROVAL_LEDGER`, `APP_ORIGIN`, `APP_URL`, `ASSISTANT_PORT`, `CLUB_ID`, `COACHING_ENGINE_MODEL`, `COACHING_ENGINE_PROVIDER` + 31 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-49b85ddca7f305ea", "name": "Frontend route `today` has no Link/navigate to it \u2014 app/mobile/src/App.jsx", "shortDescription": {"text": "Frontend route `today` has no Link/navigate to it \u2014 app/mobile/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-6d985cd0d800c488", "name": "Frontend route `match` has no Link/navigate to it \u2014 app/mobile/src/App.jsx", "shortDescription": {"text": "Frontend route `match` has no Link/navigate to it \u2014 app/mobile/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-01985ff7ed1b8d60", "name": "Frontend route `actions` has no Link/navigate to it \u2014 app/mobile/src/App.jsx", "shortDescription": {"text": "Frontend route `actions` has no Link/navigate to it \u2014 app/mobile/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-c94c1fadb37428fd", "name": "Frontend route `alerts` has no Link/navigate to it \u2014 app/mobile/src/App.jsx", "shortDescription": {"text": "Frontend route `alerts` has no Link/navigate to it \u2014 app/mobile/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-ecd61ee3c3198c91", "name": "Dangling fetch: POST /api/availability (sw.js:138)", "shortDescription": {"text": "Dangling fetch: POST /api/availability (sw.js:138)"}, "fullDescription": {"text": "`sw.js:138` calls `POST /api/availability` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/availability`\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-6e92c6fd44dd463e", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/market-intel-agent.js:60)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/market-intel-agent.js:60)"}, "fullDescription": {"text": "`qa/market-intel-agent.js:60` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-3231e53bbbf93091", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/lead-personalisation/coaching-preview.js:106)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/lead-personalisation/coaching-preview.js:106)"}, "fullDescription": {"text": "`qa/lead-personalisation/coaching-preview.js:106` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-78a0e46b9f28d585", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/lead-personalisation/outreach-draft.js:40)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/lead-personalisation/outreach-draft.js:40)"}, "fullDescription": {"text": "`qa/lead-personalisation/outreach-draft.js:40` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-d02ca389c08d8b20", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/market-intel/score-leads.js:28)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/market-intel/score-leads.js:28)"}, "fullDescription": {"text": "`qa/market-intel/score-leads.js:28` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-d9c81bcd80bbeb56", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/coaching-engine/providers/claude.js:19)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/coaching-engine/providers/claude.js:19)"}, "fullDescription": {"text": "`qa/coaching-engine/providers/claude.js:19` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-3c53cb6c95a650d4", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (qa/coaching-engine/providers/openai.js:17)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (qa/coaching-engine/providers/openai.js:17)"}, "fullDescription": {"text": "`qa/coaching-engine/providers/openai.js:17` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-022716a5a3985d1d", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/assistant.js:49)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/assistant.js:49)"}, "fullDescription": {"text": "`qa/rugby-assistant/assistant.js:49` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-4ae9ec617636875e", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/session-builder.js:84)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/session-builder.js:84)"}, "fullDescription": {"text": "`qa/rugby-assistant/session-builder.js:84` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-cdf52822cd65cc85", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/law-explainer.js:38)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/law-explainer.js:38)"}, "fullDescription": {"text": "`qa/rugby-assistant/law-explainer.js:38` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-c726f4e32bd86432", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/drill-finder.js:34)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/drill-finder.js:34)"}, "fullDescription": {"text": "`qa/rugby-assistant/drill-finder.js:34` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-775693cdae818ecf", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-intel/summarize.js:51)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-intel/summarize.js:51)"}, "fullDescription": {"text": "`qa/rugby-intel/summarize.js:51` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-bef9fe058e757fc1", "name": "Dangling fetch: POST /api/identity (qa/e2e/signup-qa-full.spec.js:462)", "shortDescription": {"text": "Dangling fetch: POST /api/identity (qa/e2e/signup-qa-full.spec.js:462)"}, "fullDescription": {"text": "`qa/e2e/signup-qa-full.spec.js:462` calls `POST /api/identity` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/identity`\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-6b97d51955cbb906", "name": "Dangling fetch: POST https://api.resend.com/emails (api/_email.js:18)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (api/_email.js:18)"}, "fullDescription": {"text": "`api/_email.js:18` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa4c4092a72a265b", "name": "Dangling fetch: GET /api/health (app/mobile/src/api/client.js:82)", "shortDescription": {"text": "Dangling fetch: GET /api/health (app/mobile/src/api/client.js:82)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:82` calls `GET /api/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/health`\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-85c2a7c3baaaf9f1", "name": "Dangling fetch: GET /api/club/health (app/mobile/src/api/client.js:83)", "shortDescription": {"text": "Dangling fetch: GET /api/club/health (app/mobile/src/api/client.js:83)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:83` calls `GET /api/club/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/club/health`\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-6d19d6a8dc750e40", "name": "Dangling fetch: GET /api/actions (app/mobile/src/api/client.js:84)", "shortDescription": {"text": "Dangling fetch: GET /api/actions (app/mobile/src/api/client.js:84)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:84` calls `GET /api/actions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/actions`\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-189ce6e42893a41c", "name": "Dangling fetch: POST /api/actions/run (app/mobile/src/api/client.js:85)", "shortDescription": {"text": "Dangling fetch: POST /api/actions/run (app/mobile/src/api/client.js:85)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:85` calls `POST /api/actions/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/actions/run`\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-440f8c269206ca36", "name": "Dangling fetch: POST /api/nl (app/mobile/src/api/client.js:89)", "shortDescription": {"text": "Dangling fetch: POST /api/nl (app/mobile/src/api/client.js:89)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:89` calls `POST /api/nl` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/nl`\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-225b8769200ebb98", "name": "Dangling fetch: GET /api/actions/resolve?q=${encodeURIComponent(text)} (app/mobile/src/api/client.js:93)", "shortDescription": {"text": "Dangling fetch: GET /api/actions/resolve?q=${encodeURIComponent(text)} (app/mobile/src/api/client.js:93)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:93` calls `GET /api/actions/resolve?q=${encodeURIComponent(text)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/actions/resolve`\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-c841a0250048f8fc", "name": "Dangling fetch: GET /api/alerts/injuries (app/mobile/src/api/client.js:94)", "shortDescription": {"text": "Dangling fetch: GET /api/alerts/injuries (app/mobile/src/api/client.js:94)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:94` calls `GET /api/alerts/injuries` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/alerts/injuries`\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-3ca1ce802d4bc864", "name": "Dangling fetch: GET /api/alerts/attendance (app/mobile/src/api/client.js:95)", "shortDescription": {"text": "Dangling fetch: GET /api/alerts/attendance (app/mobile/src/api/client.js:95)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:95` calls `GET /api/alerts/attendance` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/alerts/attendance`\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-a11dd23a017e667b", "name": "Dangling fetch: GET /api/approvals (app/mobile/src/api/client.js:97)", "shortDescription": {"text": "Dangling fetch: GET /api/approvals (app/mobile/src/api/client.js:97)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:97` calls `GET /api/approvals` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/approvals`\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-01afbda0026841b8", "name": "Dangling fetch: GET /api/history (app/mobile/src/api/client.js:98)", "shortDescription": {"text": "Dangling fetch: GET /api/history (app/mobile/src/api/client.js:98)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:98` calls `GET /api/history` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/history`\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-132b52d6c25882b5", "name": "Dangling fetch: GET /twin/status (app/mobile/src/api/client.js:105)", "shortDescription": {"text": "Dangling fetch: GET /twin/status (app/mobile/src/api/client.js:105)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:105` calls `GET /twin/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/twin/status`\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-a38db2e96178563b", "name": "Dangling fetch: GET /twin/summary (app/mobile/src/api/client.js:106)", "shortDescription": {"text": "Dangling fetch: GET /twin/summary (app/mobile/src/api/client.js:106)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:106` calls `GET /twin/summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/twin/summary`\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-b6c72ae36ed51d44", "name": "Dangling fetch: GET /twin/health (app/mobile/src/api/client.js:107)", "shortDescription": {"text": "Dangling fetch: GET /twin/health (app/mobile/src/api/client.js:107)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:107` calls `GET /twin/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/twin/health`\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-66a24ee05795d372", "name": "Dangling fetch: GET /twin/risks/critical (app/mobile/src/api/client.js:108)", "shortDescription": {"text": "Dangling fetch: GET /twin/risks/critical (app/mobile/src/api/client.js:108)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:108` calls `GET /twin/risks/critical` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/twin/risks/critical`\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-cd723df68190a9cb", "name": "Dangling fetch: GET /twin/briefing (app/mobile/src/api/client.js:109)", "shortDescription": {"text": "Dangling fetch: GET /twin/briefing (app/mobile/src/api/client.js:109)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:109` calls `GET /twin/briefing` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/twin/briefing`\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-f9d16e2aa71eb73f", "name": "Dangling fetch: GET /fixtures/upcoming?limit=${limit ?? 5} (app/mobile/src/api/client.js:116)", "shortDescription": {"text": "Dangling fetch: GET /fixtures/upcoming?limit=${limit ?? 5} (app/mobile/src/api/client.js:116)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:116` calls `GET /fixtures/upcoming?limit=${limit ?? 5}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/fixtures/upcoming`\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-29320aed18cd9186", "name": "Dangling fetch: GET /fixtures/recent (app/mobile/src/api/client.js:117)", "shortDescription": {"text": "Dangling fetch: GET /fixtures/recent (app/mobile/src/api/client.js:117)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:117` calls `GET /fixtures/recent` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/fixtures/recent`\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-f9b048e0f897aeb5", "name": "Dangling fetch: GET /fixtures/${id} (app/mobile/src/api/client.js:118)", "shortDescription": {"text": "Dangling fetch: GET /fixtures/${id} (app/mobile/src/api/client.js:118)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:118` calls `GET /fixtures/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/fixtures/<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-2cbee98125d4efae", "name": "Dangling fetch: GET /fixtures/${id}/timeline (app/mobile/src/api/client.js:120)", "shortDescription": {"text": "Dangling fetch: GET /fixtures/${id}/timeline (app/mobile/src/api/client.js:120)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:120` calls `GET /fixtures/${id}/timeline` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/fixtures/<p>/timeline`\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-e69c97dacf3fb0ed", "name": "Dangling fetch: GET /fixtures/${id}/pack (app/mobile/src/api/client.js:121)", "shortDescription": {"text": "Dangling fetch: GET /fixtures/${id}/pack (app/mobile/src/api/client.js:121)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:121` calls `GET /fixtures/${id}/pack` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/fixtures/<p>/pack`\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-9d771996d7daab7b", "name": "Dangling fetch: GET /season/standings (app/mobile/src/api/client.js:125)", "shortDescription": {"text": "Dangling fetch: GET /season/standings (app/mobile/src/api/client.js:125)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:125` calls `GET /season/standings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/season/standings`\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-b2098187a5b7249f", "name": "Dangling fetch: GET /season/timeline (app/mobile/src/api/client.js:126)", "shortDescription": {"text": "Dangling fetch: GET /season/timeline (app/mobile/src/api/client.js:126)"}, "fullDescription": {"text": "`app/mobile/src/api/client.js:126` calls `GET /season/timeline` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/season/timeline`\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-bb70089163b270fb", "name": "Dangling fetch: GET /api/mission-control (mission-control/app.js:310)", "shortDescription": {"text": "Dangling fetch: GET /api/mission-control (mission-control/app.js:310)"}, "fullDescription": {"text": "`mission-control/app.js:310` calls `GET /api/mission-control` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mission-control`\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-7e1e798b9f2decfa", "name": "Dangling fetch: GET /api/mission-control?action=market-intel (mission-control/app.js:1242)", "shortDescription": {"text": "Dangling fetch: GET /api/mission-control?action=market-intel (mission-control/app.js:1242)"}, "fullDescription": {"text": "`mission-control/app.js:1242` calls `GET /api/mission-control?action=market-intel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mission-control`\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-e9e08a2465ac4a0c", "name": "Dangling fetch: GET /api/mission-control?action=discovery (mission-control/app.js:1314)", "shortDescription": {"text": "Dangling fetch: GET /api/mission-control?action=discovery (mission-control/app.js:1314)"}, "fullDescription": {"text": "`mission-control/app.js:1314` calls `GET /api/mission-control?action=discovery` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mission-control`\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-26120b0814fd93f1", "name": "Dangling fetch: GET /api/mission-control?action=rugby-assistant (mission-control/app.js:1461)", "shortDescription": {"text": "Dangling fetch: GET /api/mission-control?action=rugby-assistant (mission-control/app.js:1461)"}, "fullDescription": {"text": "`mission-control/app.js:1461` calls `GET /api/mission-control?action=rugby-assistant` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mission-control`\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-dda7018ff26d04d1", "name": "Dangling fetch: GET /api/mission-control?action=lead-personalise (mission-control/app.js:1600)", "shortDescription": {"text": "Dangling fetch: GET /api/mission-control?action=lead-personalise (mission-control/app.js:1600)"}, "fullDescription": {"text": "`mission-control/app.js:1600` calls `GET /api/mission-control?action=lead-personalise` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mission-control`\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-2c632cf48db87dd9", "name": "Unused endpoint: USE /ai-copilot", "shortDescription": {"text": "Unused endpoint: USE /ai-copilot"}, "fullDescription": {"text": "`ai-copilot/copilot-cli.js` declares `USE /ai-copilot` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b52ccf6bcf04f732", "name": "Unused endpoint: GET /phase", "shortDescription": {"text": "Unused endpoint: GET /phase"}, "fullDescription": {"text": "`season-intelligence/season-api.js` declares `GET /phase` 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-db83eab459e8faa2", "name": "Unused endpoint: GET /phase/prescription", "shortDescription": {"text": "Unused endpoint: GET /phase/prescription"}, "fullDescription": {"text": "`season-intelligence/season-api.js` declares `GET /phase/prescription` 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-31bc5a8070dbf310", "name": "Unused endpoint: GET /phases", "shortDescription": {"text": "Unused endpoint: GET /phases"}, "fullDescription": {"text": "`season-intelligence/season-api.js` declares `GET /phases` 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-70806e9ce848ad87", "name": "Unused endpoint: GET /predictions", "shortDescription": {"text": "Unused endpoint: GET /predictions"}, "fullDescription": {"text": "`season-intelligence/season-api.js` declares `GET /predictions` 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-816bf1f13cd40131", "name": "Unused endpoint: GET /simulation", "shortDescription": {"text": "Unused endpoint: GET /simulation"}, "fullDescription": {"text": "`season-intelligence/season-api.js` declares `GET /simulation` 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-b185439eaa31f620", "name": "Unused endpoint: GET /season", "shortDescription": {"text": "Unused endpoint: GET /season"}, "fullDescription": {"text": "`season-intelligence/season-api.js` declares `GET /season` 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-b4e7af087f89a5db", "name": "Unused endpoint: POST /snapshot", "shortDescription": {"text": "Unused endpoint: POST /snapshot"}, "fullDescription": {"text": "`season-intelligence/season-api.js` declares `POST /snapshot` 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-dad90d47f699ffbc", "name": "Unused endpoint: GET /trend", "shortDescription": {"text": "Unused endpoint: GET /trend"}, "fullDescription": {"text": "`season-intelligence/season-api.js` declares `GET /trend` 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-2fac324bb039b212", "name": "Unused endpoint: GET /briefing", "shortDescription": {"text": "Unused endpoint: GET /briefing"}, "fullDescription": {"text": "`autonomous-assistant/assistant-api.js` declares `GET /briefing` 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-a05bb86942aaac61", "name": "Unused endpoint: POST /recommendations/:id/dismiss", "shortDescription": {"text": "Unused endpoint: POST /recommendations/:id/dismiss"}, "fullDescription": {"text": "`autonomous-assistant/assistant-api.js` declares `POST /recommendations/:id/dismiss` 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-d4b8ec2a413aa30c", "name": "Unused endpoint: POST /recommendations/:id/snooze", "shortDescription": {"text": "Unused endpoint: POST /recommendations/:id/snooze"}, "fullDescription": {"text": "`autonomous-assistant/assistant-api.js` declares `POST /recommendations/:id/snooze` 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-119476a8fa11ecbf", "name": "Unused endpoint: POST /recommendations/:id/resolve", "shortDescription": {"text": "Unused endpoint: POST /recommendations/:id/resolve"}, "fullDescription": {"text": "`autonomous-assistant/assistant-api.js` declares `POST /recommendations/:id/resolve` 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-bf8708f93c5621bc", "name": "Unused endpoint: GET /timeline", "shortDescription": {"text": "Unused endpoint: GET /timeline"}, "fullDescription": {"text": "`autonomous-assistant/assistant-api.js` declares `GET /timeline` 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-643015abc723c59f", "name": "Unused endpoint: GET /decision-support", "shortDescription": {"text": "Unused endpoint: GET /decision-support"}, "fullDescription": {"text": "`autonomous-assistant/assistant-api.js` declares `GET /decision-support` 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-4156885d64b4ae18", "name": "Unused endpoint: GET /automation-report", "shortDescription": {"text": "Unused endpoint: GET /automation-report"}, "fullDescription": {"text": "`autonomous-assistant/assistant-api.js` declares `GET /automation-report` 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-69a693dfc33637f4", "name": "Unused endpoint: POST /run", "shortDescription": {"text": "Unused endpoint: POST /run"}, "fullDescription": {"text": "`autonomous-assistant/assistant-api.js` declares `POST /run` 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-31b8e5d82ee698d1", "name": "Unused endpoint: POST /automate", "shortDescription": {"text": "Unused endpoint: POST /automate"}, "fullDescription": {"text": "`autonomous-assistant/assistant-api.js` declares `POST /automate` 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/19716"}, "properties": {"repository": "simonbdodd6/CLAUDEPUSH", "repoUrl": "https://github.com/simonbdodd6/CLAUDEPUSH", "branch": "main"}, "results": [{"ruleId": "scanner-e3cbc7835c7b0d2a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 build-inject.js:23"}, "properties": {"repobilityId": "1db10c24dc303999", "scanner": "scanner-primary", "fingerprint": "e3cbc7835c7b0d2a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f953bba4b129d167", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ai-copilot/copilot-cli.js:33"}, "properties": {"repobilityId": "73df3260c2c208aa", "scanner": "scanner-primary", "fingerprint": "f953bba4b129d167", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-37eb02a2920953f5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ai-copilot/index.js:13"}, "properties": {"repobilityId": "9ee62d562530cb51", "scanner": "scanner-primary", "fingerprint": "37eb02a2920953f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3abfb336b1f849de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/market-intel-agent.js:456"}, "properties": {"repobilityId": "48a88a8c99ce950e", "scanner": "scanner-primary", "fingerprint": "3abfb336b1f849de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a0ca505826b2f94d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/club-intelligence/club-intelligence-cli.js:29"}, "properties": {"repobilityId": "4464ec80270f18cc", "scanner": "scanner-primary", "fingerprint": "a0ca505826b2f94d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-783296f76f57a895", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/club-intelligence/index.js:11"}, "properties": {"repobilityId": "ea44726d5255b6ca", "scanner": "scanner-primary", "fingerprint": "783296f76f57a895", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-82bb769ee4859f8b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/lead-personalisation/generate-report.js:18"}, "properties": {"repobilityId": "bc976cd334011260", "scanner": "scanner-primary", "fingerprint": "82bb769ee4859f8b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-67e1c33a8076149c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/lead-personalisation/lead-personalisation.js:108"}, "properties": {"repobilityId": "20af98dbcc3da65d", "scanner": "scanner-primary", "fingerprint": "67e1c33a8076149c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2670c347ec47436f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/market-intel/pipeline.js:32"}, "properties": {"repobilityId": "22c97e55cb265e68", "scanner": "scanner-primary", "fingerprint": "2670c347ec47436f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ac5d4e06d9ea7240", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/market-intel/score-leads.js:59"}, "properties": {"repobilityId": "c07a7ea702d558f9", "scanner": "scanner-primary", "fingerprint": "ac5d4e06d9ea7240", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f32805b38ca4ef8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/market-intel/import-csv.js:87"}, "properties": {"repobilityId": "87d69e07d3c67c41", "scanner": "scanner-primary", "fingerprint": "0f32805b38ca4ef8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0b2708b460ba8563", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/coaching-engine/coaching-engine-cli.js:32"}, "properties": {"repobilityId": "d96d592c8cb9ee33", "scanner": "scanner-primary", "fingerprint": "0b2708b460ba8563", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e5e8eee8a93d8013", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/data-integration/data-integration-cli.js:22"}, "properties": {"repobilityId": "3d438a27a1578d61", "scanner": "scanner-primary", "fingerprint": "e5e8eee8a93d8013", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f4d97784b35e912d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/data-integration/data-report.js:251"}, "properties": {"repobilityId": "ad79d936d57ec7e4", "scanner": "scanner-primary", "fingerprint": "f4d97784b35e912d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c022f8e71643b5f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/scripts/availability-self-test.js:41"}, "properties": {"repobilityId": "338485488081ccb7", "scanner": "scanner-primary", "fingerprint": "7c022f8e71643b5f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d72f1c84f3b8c929", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-session.js:21"}, "properties": {"repobilityId": "6c0c27f5410441f7", "scanner": "scanner-primary", "fingerprint": "d72f1c84f3b8c929", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-762448026585e842", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-assistant.js:17"}, "properties": {"repobilityId": "1edf13a666a54649", "scanner": "scanner-primary", "fingerprint": "762448026585e842", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ccadda84ade28e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-law.js:17"}, "properties": {"repobilityId": "511ca30bec95a787", "scanner": "scanner-primary", "fingerprint": "0ccadda84ade28e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e0382b67b8e6a6c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-assistant/rugby-drills.js:17"}, "properties": {"repobilityId": "cbbdfc654d78eb2b", "scanner": "scanner-primary", "fingerprint": "e0382b67b8e6a6c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5513187b2bda2d0b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/playwright-report/trace/uiMode.C2Efnu2P.js:5"}, "properties": {"repobilityId": "9317156be793b799", "scanner": "scanner-primary", "fingerprint": "5513187b2bda2d0b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5c67e36d36fe612", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/playwright-report/trace/sw.bundle.js:1"}, "properties": {"repobilityId": "176d1d65dca1824f", "scanner": "scanner-primary", "fingerprint": "f5c67e36d36fe612", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b4c2e0df790e3e10", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 qa/playwright-report/trace/assets/defaultSettingsView-D31xz8zv.js:50"}, "properties": {"repobilityId": "06baaba9629ef983", "scanner": "scanner-primary", "fingerprint": "b4c2e0df790e3e10", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c43e0dac4c5fb028", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/discovery/discovery.js:95"}, "properties": {"repobilityId": "88c7758be1dcbeb2", "scanner": "scanner-primary", "fingerprint": "c43e0dac4c5fb028", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c888f5f0ded5e861", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-intel/generate-reports.js:245"}, "properties": {"repobilityId": "24bbecd11bebb39d", "scanner": "scanner-primary", "fingerprint": "c888f5f0ded5e861", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9034bbf647985a7c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-intel/rugby-intel.js:41"}, "properties": {"repobilityId": "5649df52f450fc24", "scanner": "scanner-primary", "fingerprint": "9034bbf647985a7c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7ceeb8f3f310ae78", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/rugby-intel/ingest.js:53"}, "properties": {"repobilityId": "49313ec50ef031a8", "scanner": "scanner-primary", "fingerprint": "7ceeb8f3f310ae78", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5974c9142ba58383", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/player-development/player-development-cli.js:85"}, "properties": {"repobilityId": "a4b106a7b1d30781", "scanner": "scanner-primary", "fingerprint": "5974c9142ba58383", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14d652c0453e1829", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/e2e/workflow-13-role-switching.spec.js:170"}, "properties": {"repobilityId": "9bb8c8484c2c10e3", "scanner": "scanner-primary", "fingerprint": "14d652c0453e1829", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f130149ed670e069", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/e2e/signup-qa-full.spec.js:109"}, "properties": {"repobilityId": "4f01686056ec7443", "scanner": "scanner-primary", "fingerprint": "f130149ed670e069", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-44b7688fe0d45f66", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 fixture-engine/fixture-api.js:196"}, "properties": {"repobilityId": "718ebc6d1c812508", "scanner": "scanner-primary", "fingerprint": "44b7688fe0d45f66", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2c76d3bd7db75371", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 fixture-engine/fixture-cli.js:38"}, "properties": {"repobilityId": "63fb131476b8a387", "scanner": "scanner-primary", "fingerprint": "2c76d3bd7db75371", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ebd03a264ac03e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/invite.js:169"}, "properties": {"repobilityId": "3c8efe17ed5e2547", "scanner": "scanner-primary", "fingerprint": "8ebd03a264ac03e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b45351ed0e34d29c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/player-dm-diagnostic.test.js:111"}, "properties": {"repobilityId": "62e82556c2226500", "scanner": "scanner-primary", "fingerprint": "b45351ed0e34d29c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6480f944026595a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 club-digital-twin/club-twin-cli.js:25"}, "properties": {"repobilityId": "948d1ebbee7c9bc9", "scanner": "scanner-primary", "fingerprint": "6480f944026595a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6136d4aaef9bef0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 club-digital-twin/club-api.js:167"}, "properties": {"repobilityId": "8baa2018716646d6", "scanner": "scanner-primary", "fingerprint": "f6136d4aaef9bef0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cbb14b65c98b595d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 club-digital-twin/index.js:11"}, "properties": {"repobilityId": "9dde1f90f2521fc8", "scanner": "scanner-primary", "fingerprint": "cbb14b65c98b595d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c95319d72eae7c0b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 dashboard/dashboard-cli.js:11"}, "properties": {"repobilityId": "d7d2315e3e7d2208", "scanner": "scanner-primary", "fingerprint": "c95319d72eae7c0b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-072448d8ce6e9019", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 platform/index.js:11"}, "properties": {"repobilityId": "a146925940e939ef", "scanner": "scanner-primary", "fingerprint": "072448d8ce6e9019", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09e8d6bd89820470", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 platform/platform-cli.js:11"}, "properties": {"repobilityId": "0f929eed3128e288", "scanner": "scanner-primary", "fingerprint": "09e8d6bd89820470", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e9aa313a297e04f6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 knowledge-engine/index.js:10"}, "properties": {"repobilityId": "0140bfb0f94acea9", "scanner": "scanner-primary", "fingerprint": "e9aa313a297e04f6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f582cd83b51e4ab3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 knowledge-engine/knowledge-cli.js:11"}, "properties": {"repobilityId": "cd5539c4d55780f4", "scanner": "scanner-primary", "fingerprint": "f582cd83b51e4ab3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b42264a8daa1250", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 orchestrator/orchestrator-cli.js:46"}, "properties": {"repobilityId": "e0dc88d1c507d97b", "scanner": "scanner-primary", "fingerprint": "9b42264a8daa1250", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a67aa1474ea280b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 orchestrator/index.js:14"}, "properties": {"repobilityId": "d3f599bf9f0be0d7", "scanner": "scanner-primary", "fingerprint": "4a67aa1474ea280b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-130ef5f740e6dbd5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 workflow-engine/workflow-engine-cli.js:78"}, "properties": {"repobilityId": "6a01cde356abc3ee", "scanner": "scanner-primary", "fingerprint": "130ef5f740e6dbd5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e08c89937d62807a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api-server.js:394"}, "properties": {"repobilityId": "ec29e0c3536ed185", "scanner": "scanner-primary", "fingerprint": "e08c89937d62807a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b2d3608bc5c5cfa7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/layout/Sidebar.jsx:66"}, "properties": {"repobilityId": "00bdb27d661d7f99", "scanner": "scanner-primary", "fingerprint": "b2d3608bc5c5cfa7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8fbebac5cbc3a7bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/layout/TopBar.jsx:19"}, "properties": {"repobilityId": "1ba27cc90f7306c7", "scanner": "scanner-primary", "fingerprint": "8fbebac5cbc3a7bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a261f1e287a7f90e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/ApprovalsQueue.jsx:47"}, "properties": {"repobilityId": "1cc46efbf403186c", "scanner": "scanner-primary", "fingerprint": "a261f1e287a7f90e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ead89cdfb83d4183", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/ActionHistoryFeed.jsx:38"}, "properties": {"repobilityId": "f4a91a3ff31d68cf", "scanner": "scanner-primary", "fingerprint": "ead89cdfb83d4183", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0ad979ccdcbb8e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/ClubHealthCard.jsx:58"}, "properties": {"repobilityId": "0619234270bf4bbf", "scanner": "scanner-primary", "fingerprint": "e0ad979ccdcbb8e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bed10772f666ce1e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/dashboard/PlayerAlerts.jsx:32"}, "properties": {"repobilityId": "8e57d789023c3bdd", "scanner": "scanner-primary", "fingerprint": "bed10772f666ce1e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0ea1d9e67a8233b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/components/command-bar/CommandBar.jsx:153"}, "properties": {"repobilityId": "5e19a4261430216e", "scanner": "scanner-primary", "fingerprint": "e0ea1d9e67a8233b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7e80f1727fd3751", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/command-centre/src/pages/CommunicationsPage.jsx:63"}, "properties": {"repobilityId": "d846ebe3cabb2210", "scanner": "scanner-primary", "fingerprint": "a7e80f1727fd3751", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76596073daf6ab32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/mobile/src/components/layout/CommandBar.jsx:20"}, "properties": {"repobilityId": "4acb82c7df6ce629", "scanner": "scanner-primary", "fingerprint": "76596073daf6ab32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd55d6fa526c91cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/mobile/src/components/ui/AlertItem.jsx:34"}, "properties": {"repobilityId": "5c6152293639a290", "scanner": "scanner-primary", "fingerprint": "dd55d6fa526c91cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-227e7849330ba5af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 season-intelligence/season-api.js:151"}, "properties": {"repobilityId": "3c42650dab8e0baa", "scanner": "scanner-primary", "fingerprint": "227e7849330ba5af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19d7fb6f85eeed51", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 season-intelligence/season-cli.js:66"}, "properties": {"repobilityId": "dde75f70a960ae0e", "scanner": "scanner-primary", "fingerprint": "19d7fb6f85eeed51", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-712ab882715f1ca5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 memory-engine/memory-engine-cli.js:43"}, "properties": {"repobilityId": "0f6a2c87375e7a84", "scanner": "scanner-primary", "fingerprint": "712ab882715f1ca5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6db188955c329d2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 autonomous-assistant/assistant-cli.js:42"}, "properties": {"repobilityId": "4541506e513d97c5", "scanner": "scanner-primary", "fingerprint": "e6db188955c329d2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-555fd1462d61d093", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 autonomous-assistant/assistant-api.js:126"}, "properties": {"repobilityId": "9cbe6f2ce8b83df3", "scanner": "scanner-primary", "fingerprint": "555fd1462d61d093", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e7871cdbc59d4dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 actions/action-cli.js:11"}, "properties": {"repobilityId": "e026a4dc4e99f845", "scanner": "scanner-primary", "fingerprint": "4e7871cdbc59d4dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-86da5a175ae5f7b7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learning-engine/learning-api.js:141"}, "properties": {"repobilityId": "afbe94f868f95192", "scanner": "scanner-primary", "fingerprint": "86da5a175ae5f7b7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a14c1712549e1a3e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 learning-engine/learning-cli.js:19"}, "properties": {"repobilityId": "92e286b3ee76c7b7", "scanner": "scanner-primary", "fingerprint": "a14c1712549e1a3e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a66738bbfe60c28", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 communications-engine/communications-engine-cli.js:31"}, "properties": {"repobilityId": "ee025ac84acbabcf", "scanner": "scanner-primary", "fingerprint": "6a66738bbfe60c28", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-022946f615b4abbe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 communications-engine/communications-pack-cli.js:18"}, "properties": {"repobilityId": "c37bc5603ca6b7b6", "scanner": "scanner-primary", "fingerprint": "022946f615b4abbe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-10d73af5e3d8de60", "level": "warning", "message": {"text": "Analyzer timeout: security.scan"}, "properties": {"repobilityId": "err::timeout::security.scan", "scanner": "scanner-primary", "fingerprint": "10d73af5e3d8de60", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["analyzer-error", "timeout"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-76d772df8627e110", "level": "note", "message": {"text": "Very large file: api/_identityStore.js (1576 lines)"}, "properties": {"repobilityId": "b10982e02cf54bf0", "scanner": "scanner-primary", "fingerprint": "76d772df8627e110", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e1cd066ccc5d407e", "level": "note", "message": {"text": "Very large file: actions/action-registry.js (1351 lines)"}, "properties": {"repobilityId": "e8a5bc576d2af152", "scanner": "scanner-primary", "fingerprint": "e1cd066ccc5d407e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2f7463cb319b1153", "level": "note", "message": {"text": "Very large file: mission-control/app.js (2241 lines)"}, "properties": {"repobilityId": "8509eb89dafdbd61", "scanner": "scanner-primary", "fingerprint": "2f7463cb319b1153", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "18c5fd5b03657079", "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": "9c1049a1165c37b9", "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": "90934f7ddb23dcfb", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "2a860982314bfe1e", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "4af031bb9ed080ad", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "f8a7799a59a893d3", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "9978d9d50fa2657e", "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": "ef505b70b490a169", "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": "08c7788747fee9ae", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-38a34a198d1d14f4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/core-guardian.md"}, "properties": {"repobilityId": "0e76e954d84b8e5c", "scanner": "scanner-primary", "fingerprint": "38a34a198d1d14f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/core-guardian.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-262b2f45360cebab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:138"}, "properties": {"repobilityId": "f895439ad2d800e0", "scanner": "scanner-primary", "fingerprint": "262b2f45360cebab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-76dbbf6271a05822", "level": "none", "message": {"text": "Commented-code block (6 lines) in qa/market-intel-agent.js:277"}, "properties": {"repobilityId": "04449ff4b9132cc4", "scanner": "scanner-primary", "fingerprint": "76dbbf6271a05822", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5268982def893f05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/lead-personalisation/coaching-preview.js:106"}, "properties": {"repobilityId": "de08b83b467f962c", "scanner": "scanner-primary", "fingerprint": "5268982def893f05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b9622718fa7d9ebb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/lead-personalisation/outreach-draft.js:40"}, "properties": {"repobilityId": "f9c0778269b5e2fc", "scanner": "scanner-primary", "fingerprint": "b9622718fa7d9ebb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-68672a99d250bea1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/claude.js:19"}, "properties": {"repobilityId": "453dd86a4c36f9ef", "scanner": "scanner-primary", "fingerprint": "68672a99d250bea1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5efcfe33b345678a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/local.js:19"}, "properties": {"repobilityId": "ecb313f261e9349b", "scanner": "scanner-primary", "fingerprint": "5efcfe33b345678a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8d4f60e51c83d6ba", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/gemini.js:20"}, "properties": {"repobilityId": "2f407d6ae3d8fc62", "scanner": "scanner-primary", "fingerprint": "8d4f60e51c83d6ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-388fdd56aa23315c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/coaching-engine/providers/openai.js:17"}, "properties": {"repobilityId": "36f3cadc2034fa68", "scanner": "scanner-primary", "fingerprint": "388fdd56aa23315c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3ba0a571f6dbc490", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/data-integration/data-report.js:137"}, "properties": {"repobilityId": "fa11b8466027ff3a", "scanner": "scanner-primary", "fingerprint": "3ba0a571f6dbc490", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2f5da85f5ece2bec", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/helpers/shared-steps.js:92"}, "properties": {"repobilityId": "50370f188a2b1700", "scanner": "scanner-primary", "fingerprint": "2f5da85f5ece2bec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-098a9388bcd271d5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/assistant.js:49"}, "properties": {"repobilityId": "80f624fa1d2af5f7", "scanner": "scanner-primary", "fingerprint": "098a9388bcd271d5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3e2379cbcad4732f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/session-builder.js:84"}, "properties": {"repobilityId": "6048c6fb688397d1", "scanner": "scanner-primary", "fingerprint": "3e2379cbcad4732f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9ba040e78f6f20b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/law-explainer.js:38"}, "properties": {"repobilityId": "ad679c71cc79c3d9", "scanner": "scanner-primary", "fingerprint": "e9ba040e78f6f20b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-31d81671d85700ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-assistant/drill-finder.js:34"}, "properties": {"repobilityId": "fa32503f35336f1d", "scanner": "scanner-primary", "fingerprint": "31d81671d85700ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8adbc95568f14d5d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/uiMode.C2Efnu2P.js:4"}, "properties": {"repobilityId": "9dff72fbd3852bb4", "scanner": "scanner-primary", "fingerprint": "8adbc95568f14d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b4faa2e12c595e50", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/sw.bundle.js:3"}, "properties": {"repobilityId": "53b69038698dc4cf", "scanner": "scanner-primary", "fingerprint": "b4faa2e12c595e50", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-677f0ba89687d5fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/index.BCnMPevh.js:1"}, "properties": {"repobilityId": "9289bcac77243cbb", "scanner": "scanner-primary", "fingerprint": "677f0ba89687d5fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ead7487d38fa93cf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/snapshot.v8KI4P3m.js:2"}, "properties": {"repobilityId": "ff90b0615edd5e41", "scanner": "scanner-primary", "fingerprint": "ead7487d38fa93cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-abc7e26dfd5e1d93", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/assets/urlMatch-BYQrIQwR.js:1"}, "properties": {"repobilityId": "f5899742f185ba0f", "scanner": "scanner-primary", "fingerprint": "abc7e26dfd5e1d93", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d7bbc56066daefe8", "level": "note", "message": {"text": "Legacy-named symbol `unstable_legacy` in qa/playwright-report/trace/assets/defaultSettingsView-D31xz8zv.js:49"}, "properties": {"repobilityId": "021eaf090e411f6b", "scanner": "scanner-primary", "fingerprint": "d7bbc56066daefe8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a91048923ea8d7be", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/playwright-report/trace/assets/defaultSettingsView-D31xz8zv.js:60"}, "properties": {"repobilityId": "23d5aa166cd23a60", "scanner": "scanner-primary", "fingerprint": "a91048923ea8d7be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5974beb1533d69cf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/rugby-intel/summarize.js:51"}, "properties": {"repobilityId": "e074c2f7fbc022d3", "scanner": "scanner-primary", "fingerprint": "5974beb1533d69cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4e87f331a9f04fe9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/e2e/signup-qa-full.spec.js:462"}, "properties": {"repobilityId": "e83e984e2daa78fa", "scanner": "scanner-primary", "fingerprint": "4e87f331a9f04fe9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8e492659a4234616", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/publish.js:30"}, "properties": {"repobilityId": "313e682881f9aadf", "scanner": "scanner-primary", "fingerprint": "8e492659a4234616", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd10bf92b2755be9", "level": "none", "message": {"text": "Commented-code block (9 lines) in api/chat.js:1"}, "properties": {"repobilityId": "ee0d853dcdd1c43c", "scanner": "scanner-primary", "fingerprint": "dd10bf92b2755be9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ae860da54c9d6de", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/chat.js:509"}, "properties": {"repobilityId": "58d9a90935424867", "scanner": "scanner-primary", "fingerprint": "8ae860da54c9d6de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd05484624b9f4d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_kv.js:2"}, "properties": {"repobilityId": "325e6aa29d87e9e5", "scanner": "scanner-primary", "fingerprint": "fd05484624b9f4d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-913411efebb48cda", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_identityStore.js:1413"}, "properties": {"repobilityId": "7f7d62db13e82502", "scanner": "scanner-primary", "fingerprint": "913411efebb48cda", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a1d65da0c847d067", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_stripe.js:3"}, "properties": {"repobilityId": "f683bab711ed030c", "scanner": "scanner-primary", "fingerprint": "a1d65da0c847d067", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f4c13b56375c2b3", "level": "none", "message": {"text": "Commented-code block (9 lines) in test/identity-system.test.js:823"}, "properties": {"repobilityId": "0e024a14c5fc2395", "scanner": "scanner-primary", "fingerprint": "8f4c13b56375c2b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f76871904eea51e", "level": "none", "message": {"text": "Commented-code block (6 lines) in test/stripe-phase5.test.js:265"}, "properties": {"repobilityId": "5830508bb5622358", "scanner": "scanner-primary", "fingerprint": "0f76871904eea51e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3dac2c1a81630b17", "level": "note", "message": {"text": "Legacy-named symbol `fx_legacy` in test/fixtures.test.js:144"}, "properties": {"repobilityId": "a8328a363d8d7b2f", "scanner": "scanner-primary", "fingerprint": "3dac2c1a81630b17", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f5cdb92bf5050b13", "level": "none", "message": {"text": "Commented-code block (7 lines) in test/club-command-dashboard.test.js:79"}, "properties": {"repobilityId": "3efd2f76e68a44a2", "scanner": "scanner-primary", "fingerprint": "f5cdb92bf5050b13", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9249a664c0f4b1e", "level": "none", "message": {"text": "Commented-code block (5 lines) in test/messaging-stability.test.js:28"}, "properties": {"repobilityId": "9b86190a01eee25f", "scanner": "scanner-primary", "fingerprint": "d9249a664c0f4b1e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57d1ff8af0042fcd", "level": "none", "message": {"text": "Commented-code block (6 lines) in test/match-readiness.test.js:40"}, "properties": {"repobilityId": "a405e3ffa5d86ffb", "scanner": "scanner-primary", "fingerprint": "57d1ff8af0042fcd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-736e8b7526a90a1a", "level": "note", "message": {"text": "Legacy-named symbol `rainy_day_backup` in test/travel-publisher-adoption.test.js:54"}, "properties": {"repobilityId": "bcfb10e11a906485", "scanner": "scanner-primary", "fingerprint": "736e8b7526a90a1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c763d1fca0a09de7", "level": "none", "message": {"text": "Commented-code block (6 lines) in test/subscription-feature-gates.test.js:88"}, "properties": {"repobilityId": "fcd1573490246103", "scanner": "scanner-primary", "fingerprint": "c763d1fca0a09de7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9903639bbd577cab", "level": "note", "message": {"text": "Legacy-named symbol `rainy_day_backup` in test/travel-itinerary-platform.test.js:46"}, "properties": {"repobilityId": "722d7489fe5dc93f", "scanner": "scanner-primary", "fingerprint": "9903639bbd577cab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-92d3fd44146fb969", "level": "none", "message": {"text": "Commented-code block (7 lines) in dashboard/approval-centre/approval-ledger.js:8"}, "properties": {"repobilityId": "3f2be122bdf635a6", "scanner": "scanner-primary", "fingerprint": "92d3fd44146fb969", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ad6212bf5be0904", "level": "none", "message": {"text": "Commented-code block (10 lines) in platform/platform-registry.js:10"}, "properties": {"repobilityId": "e9411fdade347878", "scanner": "scanner-primary", "fingerprint": "2ad6212bf5be0904", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ddeaaed6e21ef8b", "level": "none", "message": {"text": "Commented-code block (7 lines) in platform/platform-orchestrator.js:4"}, "properties": {"repobilityId": "6e66a69d3a77a846", "scanner": "scanner-primary", "fingerprint": "4ddeaaed6e21ef8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7c6aa7a91974320", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api-server.js:361"}, "properties": {"repobilityId": "d883028d7984fe5b", "scanner": "scanner-primary", "fingerprint": "b7c6aa7a91974320", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-026edf357ba57cf3", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/travel-intelligence-orchestrator/constants.js:3"}, "properties": {"repobilityId": "d0c5fcd5500fa145", "scanner": "scanner-primary", "fingerprint": "026edf357ba57cf3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7dc0d87286e5550", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/travel-timeline-platform/constants.js:3"}, "properties": {"repobilityId": "446d5c0b2f8b9147", "scanner": "scanner-primary", "fingerprint": "f7dc0d87286e5550", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38a35ff3145eb994", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/itinerary-platform/service.js:331"}, "properties": {"repobilityId": "9650cc635b458349", "scanner": "scanner-primary", "fingerprint": "38a35ff3145eb994", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0daff7d9b224011d", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/destination-platform/service.js:165"}, "properties": {"repobilityId": "a85747d1fe1c297f", "scanner": "scanner-primary", "fingerprint": "0daff7d9b224011d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bac76d65e3e3bb2", "level": "note", "message": {"text": "Legacy-named symbol `rainy_day_backup` in lib/trip-intelligence-platform/constants.js:5"}, "properties": {"repobilityId": "98de5de07c5ee074", "scanner": "scanner-primary", "fingerprint": "6bac76d65e3e3bb2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b25e0ddfdf601fa2", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/traveller-digital-twin-platform/constants.js:3"}, "properties": {"repobilityId": "0c4e11659bfc196d", "scanner": "scanner-primary", "fingerprint": "b25e0ddfdf601fa2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39e3778dcb04dbd9", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/travel-relationship-graph/constants.js:3"}, "properties": {"repobilityId": "940383f5dd5b6a74", "scanner": "scanner-primary", "fingerprint": "39e3778dcb04dbd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9dd0a971b75870fd", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/approval-platform/constants.js:3"}, "properties": {"repobilityId": "2bb863967f197229", "scanner": "scanner-primary", "fingerprint": "9dd0a971b75870fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8b1a251f6e9f95f", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/travel-insight-engine/constants.js:3"}, "properties": {"repobilityId": "80c4be00bfdd82d3", "scanner": "scanner-primary", "fingerprint": "e8b1a251f6e9f95f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1025fc8e581e6f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/traveller-identity-platform/constants.js:3"}, "properties": {"repobilityId": "5b228f47931438e9", "scanner": "scanner-primary", "fingerprint": "d1025fc8e581e6f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99dee0d713ab809c", "level": "none", "message": {"text": "Commented-code block (11 lines) in season-intelligence/weekly-brief.js:9"}, "properties": {"repobilityId": "5e8c75f8b0429c9a", "scanner": "scanner-primary", "fingerprint": "99dee0d713ab809c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2c9e262b9b9145b", "level": "none", "message": {"text": "Commented-code block (5 lines) in season-intelligence/coach-experience.js:17"}, "properties": {"repobilityId": "2e7ea9a8e10fbc45", "scanner": "scanner-primary", "fingerprint": "d2c9e262b9b9145b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47f3971e31637031", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 season-intelligence/coach-experience.js:86"}, "properties": {"repobilityId": "cc1a1aad1d75a70e", "scanner": "scanner-primary", "fingerprint": "47f3971e31637031", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3a0ddf33e08bd6a6", "level": "none", "message": {"text": "Commented-code block (6 lines) in season-intelligence/match-readiness.js:9"}, "properties": {"repobilityId": "bdd11569a1998247", "scanner": "scanner-primary", "fingerprint": "3a0ddf33e08bd6a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-595230976f8513bb", "level": "none", "message": {"text": "Commented-code block (6 lines) in memory-engine/memory-engine-cli.js:320"}, "properties": {"repobilityId": "547c29df3c4a0dd3", "scanner": "scanner-primary", "fingerprint": "595230976f8513bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae8e608a972eec29", "level": "none", "message": {"text": "Commented-code block (13 lines) in actions/action-registry.js:6"}, "properties": {"repobilityId": "95dbed487184a0e2", "scanner": "scanner-primary", "fingerprint": "ae8e608a972eec29", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d61519e8af159cbb", "level": "none", "message": {"text": "Commented-code block (5 lines) in brain/index.js:9"}, "properties": {"repobilityId": "1b8d181dffe15263", "scanner": "scanner-primary", "fingerprint": "d61519e8af159cbb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17fda1bc79b94f70", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/sw.js:29"}, "properties": {"repobilityId": "367a0dd63645f55e", "scanner": "scanner-primary", "fingerprint": "17fda1bc79b94f70", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a614a04eb58ffc21", "level": "none", "message": {"text": "Commented-code block (9 lines) in mission-control/app.js:1652"}, "properties": {"repobilityId": "0bf8c033e3bd01b3", "scanner": "scanner-primary", "fingerprint": "a614a04eb58ffc21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c41bb1a1f430bd6", "level": "note", "message": {"text": "39 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "4a6a9acd19ef8277", "scanner": "scanner-primary", "fingerprint": "5c41bb1a1f430bd6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-49b85ddca7f305ea", "level": "warning", "message": {"text": "Frontend route `today` has no Link/navigate to it \u2014 app/mobile/src/App.jsx"}, "properties": {"repobilityId": "2c4b658af360bcca", "scanner": "scanner-primary", "fingerprint": "49b85ddca7f305ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6d985cd0d800c488", "level": "warning", "message": {"text": "Frontend route `match` has no Link/navigate to it \u2014 app/mobile/src/App.jsx"}, "properties": {"repobilityId": "03e80583fc1c3648", "scanner": "scanner-primary", "fingerprint": "6d985cd0d800c488", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-01985ff7ed1b8d60", "level": "warning", "message": {"text": "Frontend route `actions` has no Link/navigate to it \u2014 app/mobile/src/App.jsx"}, "properties": {"repobilityId": "2daabefe0d7f0ccd", "scanner": "scanner-primary", "fingerprint": "01985ff7ed1b8d60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c94c1fadb37428fd", "level": "warning", "message": {"text": "Frontend route `alerts` has no Link/navigate to it \u2014 app/mobile/src/App.jsx"}, "properties": {"repobilityId": "39fffb790f7d8cf4", "scanner": "scanner-primary", "fingerprint": "c94c1fadb37428fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ecd61ee3c3198c91", "level": "error", "message": {"text": "Dangling fetch: POST /api/availability (sw.js:138)"}, "properties": {"repobilityId": "12599e64414cc192", "scanner": "scanner-primary", "fingerprint": "ecd61ee3c3198c91", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e92c6fd44dd463e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/market-intel-agent.js:60)"}, "properties": {"repobilityId": "5c2bdf1447d9a342", "scanner": "scanner-primary", "fingerprint": "6e92c6fd44dd463e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3231e53bbbf93091", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/lead-personalisation/coaching-preview.js:106)"}, "properties": {"repobilityId": "aacd4889f19e5f54", "scanner": "scanner-primary", "fingerprint": "3231e53bbbf93091", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-78a0e46b9f28d585", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/lead-personalisation/outreach-draft.js:40)"}, "properties": {"repobilityId": "a7998bc5a08a29bc", "scanner": "scanner-primary", "fingerprint": "78a0e46b9f28d585", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d02ca389c08d8b20", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/market-intel/score-leads.js:28)"}, "properties": {"repobilityId": "bcd5105a3cc926e0", "scanner": "scanner-primary", "fingerprint": "d02ca389c08d8b20", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d9c81bcd80bbeb56", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/coaching-engine/providers/claude.js:19)"}, "properties": {"repobilityId": "087f2326d9edc1c9", "scanner": "scanner-primary", "fingerprint": "d9c81bcd80bbeb56", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c53cb6c95a650d4", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (qa/coaching-engine/providers/openai.js:17)"}, "properties": {"repobilityId": "8a7393d6c43f749d", "scanner": "scanner-primary", "fingerprint": "3c53cb6c95a650d4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-022716a5a3985d1d", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/assistant.js:49)"}, "properties": {"repobilityId": "f380b2c89c41896f", "scanner": "scanner-primary", "fingerprint": "022716a5a3985d1d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ae9ec617636875e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/session-builder.js:84)"}, "properties": {"repobilityId": "0bfdc8744002445f", "scanner": "scanner-primary", "fingerprint": "4ae9ec617636875e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cdf52822cd65cc85", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/law-explainer.js:38)"}, "properties": {"repobilityId": "2ca6dcd9e9515f70", "scanner": "scanner-primary", "fingerprint": "cdf52822cd65cc85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c726f4e32bd86432", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-assistant/drill-finder.js:34)"}, "properties": {"repobilityId": "ad49d57a2d528c55", "scanner": "scanner-primary", "fingerprint": "c726f4e32bd86432", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-775693cdae818ecf", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (qa/rugby-intel/summarize.js:51)"}, "properties": {"repobilityId": "98c49eada0b2b93b", "scanner": "scanner-primary", "fingerprint": "775693cdae818ecf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bef9fe058e757fc1", "level": "error", "message": {"text": "Dangling fetch: POST /api/identity (qa/e2e/signup-qa-full.spec.js:462)"}, "properties": {"repobilityId": "dd4027a02da84281", "scanner": "scanner-primary", "fingerprint": "bef9fe058e757fc1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b97d51955cbb906", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (api/_email.js:18)"}, "properties": {"repobilityId": "43848cb213ba3779", "scanner": "scanner-primary", "fingerprint": "6b97d51955cbb906", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa4c4092a72a265b", "level": "error", "message": {"text": "Dangling fetch: GET /api/health (app/mobile/src/api/client.js:82)"}, "properties": {"repobilityId": "c4acb4ee839266a7", "scanner": "scanner-primary", "fingerprint": "aa4c4092a72a265b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-85c2a7c3baaaf9f1", "level": "error", "message": {"text": "Dangling fetch: GET /api/club/health (app/mobile/src/api/client.js:83)"}, "properties": {"repobilityId": "9629ffe0a40e8e8f", "scanner": "scanner-primary", "fingerprint": "85c2a7c3baaaf9f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-6d19d6a8dc750e40", "level": "error", "message": {"text": "Dangling fetch: GET /api/actions (app/mobile/src/api/client.js:84)"}, "properties": {"repobilityId": "556867dad1550939", "scanner": "scanner-primary", "fingerprint": "6d19d6a8dc750e40", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-189ce6e42893a41c", "level": "error", "message": {"text": "Dangling fetch: POST /api/actions/run (app/mobile/src/api/client.js:85)"}, "properties": {"repobilityId": "a76738b22fb00c5d", "scanner": "scanner-primary", "fingerprint": "189ce6e42893a41c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-440f8c269206ca36", "level": "error", "message": {"text": "Dangling fetch: POST /api/nl (app/mobile/src/api/client.js:89)"}, "properties": {"repobilityId": "15476a4d4770b7ff", "scanner": "scanner-primary", "fingerprint": "440f8c269206ca36", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-225b8769200ebb98", "level": "error", "message": {"text": "Dangling fetch: GET /api/actions/resolve?q=${encodeURIComponent(text)} (app/mobile/src/api/client.js:93)"}, "properties": {"repobilityId": "a9306858ec504b83", "scanner": "scanner-primary", "fingerprint": "225b8769200ebb98", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-c841a0250048f8fc", "level": "error", "message": {"text": "Dangling fetch: GET /api/alerts/injuries (app/mobile/src/api/client.js:94)"}, "properties": {"repobilityId": "d461735af2bb251b", "scanner": "scanner-primary", "fingerprint": "c841a0250048f8fc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-3ca1ce802d4bc864", "level": "error", "message": {"text": "Dangling fetch: GET /api/alerts/attendance (app/mobile/src/api/client.js:95)"}, "properties": {"repobilityId": "6e75f01ddfea01bf", "scanner": "scanner-primary", "fingerprint": "3ca1ce802d4bc864", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-a11dd23a017e667b", "level": "error", "message": {"text": "Dangling fetch: GET /api/approvals (app/mobile/src/api/client.js:97)"}, "properties": {"repobilityId": "406ea256f9e8f62d", "scanner": "scanner-primary", "fingerprint": "a11dd23a017e667b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-01afbda0026841b8", "level": "error", "message": {"text": "Dangling fetch: GET /api/history (app/mobile/src/api/client.js:98)"}, "properties": {"repobilityId": "04f475e6a54db1fc", "scanner": "scanner-primary", "fingerprint": "01afbda0026841b8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-132b52d6c25882b5", "level": "error", "message": {"text": "Dangling fetch: GET /twin/status (app/mobile/src/api/client.js:105)"}, "properties": {"repobilityId": "15ff1480fe6060e3", "scanner": "scanner-primary", "fingerprint": "132b52d6c25882b5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-a38db2e96178563b", "level": "error", "message": {"text": "Dangling fetch: GET /twin/summary (app/mobile/src/api/client.js:106)"}, "properties": {"repobilityId": "d65df487d966cf03", "scanner": "scanner-primary", "fingerprint": "a38db2e96178563b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-b6c72ae36ed51d44", "level": "error", "message": {"text": "Dangling fetch: GET /twin/health (app/mobile/src/api/client.js:107)"}, "properties": {"repobilityId": "c19af67340886fb2", "scanner": "scanner-primary", "fingerprint": "b6c72ae36ed51d44", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-66a24ee05795d372", "level": "error", "message": {"text": "Dangling fetch: GET /twin/risks/critical (app/mobile/src/api/client.js:108)"}, "properties": {"repobilityId": "79165c5242944644", "scanner": "scanner-primary", "fingerprint": "66a24ee05795d372", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-cd723df68190a9cb", "level": "error", "message": {"text": "Dangling fetch: GET /twin/briefing (app/mobile/src/api/client.js:109)"}, "properties": {"repobilityId": "8a4f8585f2d3d00d", "scanner": "scanner-primary", "fingerprint": "cd723df68190a9cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-f9d16e2aa71eb73f", "level": "error", "message": {"text": "Dangling fetch: GET /fixtures/upcoming?limit=${limit ?? 5} (app/mobile/src/api/client.js:116)"}, "properties": {"repobilityId": "7f1abdf5b2df0a10", "scanner": "scanner-primary", "fingerprint": "f9d16e2aa71eb73f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-29320aed18cd9186", "level": "error", "message": {"text": "Dangling fetch: GET /fixtures/recent (app/mobile/src/api/client.js:117)"}, "properties": {"repobilityId": "fb7878eaaecd9184", "scanner": "scanner-primary", "fingerprint": "29320aed18cd9186", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-f9b048e0f897aeb5", "level": "error", "message": {"text": "Dangling fetch: GET /fixtures/${id} (app/mobile/src/api/client.js:118)"}, "properties": {"repobilityId": "ae88bf81ff083b56", "scanner": "scanner-primary", "fingerprint": "f9b048e0f897aeb5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-2cbee98125d4efae", "level": "error", "message": {"text": "Dangling fetch: GET /fixtures/${id}/timeline (app/mobile/src/api/client.js:120)"}, "properties": {"repobilityId": "a94543a9a1ddd892", "scanner": "scanner-primary", "fingerprint": "2cbee98125d4efae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-e69c97dacf3fb0ed", "level": "error", "message": {"text": "Dangling fetch: GET /fixtures/${id}/pack (app/mobile/src/api/client.js:121)"}, "properties": {"repobilityId": "9be875a4c60d1efe", "scanner": "scanner-primary", "fingerprint": "e69c97dacf3fb0ed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-9d771996d7daab7b", "level": "error", "message": {"text": "Dangling fetch: GET /season/standings (app/mobile/src/api/client.js:125)"}, "properties": {"repobilityId": "553287eaf54df606", "scanner": "scanner-primary", "fingerprint": "9d771996d7daab7b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-b2098187a5b7249f", "level": "error", "message": {"text": "Dangling fetch: GET /season/timeline (app/mobile/src/api/client.js:126)"}, "properties": {"repobilityId": "debdd108b207b2c4", "scanner": "scanner-primary", "fingerprint": "b2098187a5b7249f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-bb70089163b270fb", "level": "error", "message": {"text": "Dangling fetch: GET /api/mission-control (mission-control/app.js:310)"}, "properties": {"repobilityId": "65cc2d4be220d9bc", "scanner": "scanner-primary", "fingerprint": "bb70089163b270fb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e1e798b9f2decfa", "level": "error", "message": {"text": "Dangling fetch: GET /api/mission-control?action=market-intel (mission-control/app.js:1242)"}, "properties": {"repobilityId": "80cac2a249bca45f", "scanner": "scanner-primary", "fingerprint": "7e1e798b9f2decfa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e9e08a2465ac4a0c", "level": "error", "message": {"text": "Dangling fetch: GET /api/mission-control?action=discovery (mission-control/app.js:1314)"}, "properties": {"repobilityId": "8c86dabd2f106e83", "scanner": "scanner-primary", "fingerprint": "e9e08a2465ac4a0c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26120b0814fd93f1", "level": "error", "message": {"text": "Dangling fetch: GET /api/mission-control?action=rugby-assistant (mission-control/app.js:1461)"}, "properties": {"repobilityId": "e7b24fae75afd4a7", "scanner": "scanner-primary", "fingerprint": "26120b0814fd93f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dda7018ff26d04d1", "level": "error", "message": {"text": "Dangling fetch: GET /api/mission-control?action=lead-personalise (mission-control/app.js:1600)"}, "properties": {"repobilityId": "669486b83ef6bb7e", "scanner": "scanner-primary", "fingerprint": "dda7018ff26d04d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2c632cf48db87dd9", "level": "note", "message": {"text": "Unused endpoint: USE /ai-copilot"}, "properties": {"repobilityId": "577c6da001c6dbd8", "scanner": "scanner-primary", "fingerprint": "2c632cf48db87dd9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b52ccf6bcf04f732", "level": "note", "message": {"text": "Unused endpoint: GET /phase"}, "properties": {"repobilityId": "a36b7cfd59c8373f", "scanner": "scanner-primary", "fingerprint": "b52ccf6bcf04f732", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db83eab459e8faa2", "level": "note", "message": {"text": "Unused endpoint: GET /phase/prescription"}, "properties": {"repobilityId": "b70dfd7302343e74", "scanner": "scanner-primary", "fingerprint": "db83eab459e8faa2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-31bc5a8070dbf310", "level": "note", "message": {"text": "Unused endpoint: GET /phases"}, "properties": {"repobilityId": "dbb417e16e84b41c", "scanner": "scanner-primary", "fingerprint": "31bc5a8070dbf310", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-70806e9ce848ad87", "level": "note", "message": {"text": "Unused endpoint: GET /predictions"}, "properties": {"repobilityId": "f45eecd6e1f5c08b", "scanner": "scanner-primary", "fingerprint": "70806e9ce848ad87", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-816bf1f13cd40131", "level": "note", "message": {"text": "Unused endpoint: GET /simulation"}, "properties": {"repobilityId": "5449868454303889", "scanner": "scanner-primary", "fingerprint": "816bf1f13cd40131", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b185439eaa31f620", "level": "note", "message": {"text": "Unused endpoint: GET /season"}, "properties": {"repobilityId": "58e4ffb314c8598c", "scanner": "scanner-primary", "fingerprint": "b185439eaa31f620", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4e7af087f89a5db", "level": "note", "message": {"text": "Unused endpoint: POST /snapshot"}, "properties": {"repobilityId": "2a596a3e998df0cc", "scanner": "scanner-primary", "fingerprint": "b4e7af087f89a5db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dad90d47f699ffbc", "level": "note", "message": {"text": "Unused endpoint: GET /trend"}, "properties": {"repobilityId": "7bc3d5b497cb295a", "scanner": "scanner-primary", "fingerprint": "dad90d47f699ffbc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2fac324bb039b212", "level": "note", "message": {"text": "Unused endpoint: GET /briefing"}, "properties": {"repobilityId": "4153de4a413244b1", "scanner": "scanner-primary", "fingerprint": "2fac324bb039b212", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a05bb86942aaac61", "level": "note", "message": {"text": "Unused endpoint: POST /recommendations/:id/dismiss"}, "properties": {"repobilityId": "801003c30d43c167", "scanner": "scanner-primary", "fingerprint": "a05bb86942aaac61", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d4b8ec2a413aa30c", "level": "note", "message": {"text": "Unused endpoint: POST /recommendations/:id/snooze"}, "properties": {"repobilityId": "7604ca2af4d230cc", "scanner": "scanner-primary", "fingerprint": "d4b8ec2a413aa30c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-119476a8fa11ecbf", "level": "note", "message": {"text": "Unused endpoint: POST /recommendations/:id/resolve"}, "properties": {"repobilityId": "1cd3b885457862ee", "scanner": "scanner-primary", "fingerprint": "119476a8fa11ecbf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf8708f93c5621bc", "level": "note", "message": {"text": "Unused endpoint: GET /timeline"}, "properties": {"repobilityId": "be6370e8a5a2e5e5", "scanner": "scanner-primary", "fingerprint": "bf8708f93c5621bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-643015abc723c59f", "level": "note", "message": {"text": "Unused endpoint: GET /decision-support"}, "properties": {"repobilityId": "f2e1c9fcfb8b61e5", "scanner": "scanner-primary", "fingerprint": "643015abc723c59f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4156885d64b4ae18", "level": "note", "message": {"text": "Unused endpoint: GET /automation-report"}, "properties": {"repobilityId": "44ad5f518eadcb42", "scanner": "scanner-primary", "fingerprint": "4156885d64b4ae18", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-69a693dfc33637f4", "level": "note", "message": {"text": "Unused endpoint: POST /run"}, "properties": {"repobilityId": "2b8189a362663e83", "scanner": "scanner-primary", "fingerprint": "69a693dfc33637f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-31b8e5d82ee698d1", "level": "note", "message": {"text": "Unused endpoint: POST /automate"}, "properties": {"repobilityId": "8a14fdf9c85262d7", "scanner": "scanner-primary", "fingerprint": "31b8e5d82ee698d1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}