{"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-bb618715abf72aa3", "name": "Stray `console.log` in TS/JS \u2014 functions/api/contact.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/api/contact.ts:68"}, "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-a35b378fa2a1c31b", "name": "Stray `console.log` in TS/JS \u2014 functions/api/admin/login.ts:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/api/admin/login.ts:81"}, "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-9cd205ed3e04e548", "name": "Stray `console.log` in TS/JS \u2014 functions/api/admin/send-proposal.ts:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/api/admin/send-proposal.ts:123"}, "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-f3170478106befc7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/BelleairHeroPhone.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BelleairHeroPhone.tsx:189"}, "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-108125a250fa22c3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/SnellIsleHeroPhone.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SnellIsleHeroPhone.tsx:164"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-15321e23c8eba076", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/TreasureIslandHeroPhone.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TreasureIslandHeroPhone.tsx:194"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3e7971d9d06b4714", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/StPeteBeachHeroPhone.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/StPeteBeachHeroPhone.tsx:165"}, "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-021e9a9e151d56a4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Hero.tsx:428", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Hero.tsx:428"}, "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-e40a8f33f3a03e10", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/Navbar.tsx:384", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/Navbar.tsx:384"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b2af7d7b4487cad", "name": "\"active\" state uses light bg in a dark theme \u2014 src/pages/PrivacyPolicyPage.tsx:448", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/pages/PrivacyPolicyPage.tsx:448"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2621926a45c48890", "name": "\"active\" state uses light bg in a dark theme \u2014 src/pages/FaqPage.tsx:185", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/pages/FaqPage.tsx:185"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9f782195b808c7e", "name": "\"active\" state uses light bg in a dark theme \u2014 src/pages/ServiceAgreementPage.tsx:678", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/pages/ServiceAgreementPage.tsx:678"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "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-f56f666491779d1f", "name": "Very large file: src/pages/PoolVolumeCalculatorPage.tsx (1887 lines)", "shortDescription": {"text": "Very large file: src/pages/PoolVolumeCalculatorPage.tsx (1887 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "3 test file(s) for 114 source file(s) (ratio 0.03). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 56 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 91 placeholder/mock markers across 17 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. 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": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests. 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-eb646080d454f6e9", "name": "Commented-code block (5 lines) in vite.config.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in vite.config.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-858d1732bc96a6f8", "name": "Commented-code block (5 lines) in functions/api/contact.ts:60", "shortDescription": {"text": "Commented-code block (5 lines) in functions/api/contact.ts:60"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2921952d773a8e61", "name": "Commented-code block (5 lines) in functions/api/admin/login.ts:24", "shortDescription": {"text": "Commented-code block (5 lines) in functions/api/admin/login.ts:24"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e8e2078ffabd668", "name": "Commented-code block (5 lines) in scripts/prerender.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/prerender.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bcbb758bbdeedbc0", "name": "Commented-code block (5 lines) in src/App.tsx:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/App.tsx: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-8a75fb8af36b630c", "name": "Commented-code block (5 lines) in src/components/QuoteChooser.tsx:69", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/QuoteChooser.tsx:69"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e30c69469a3b67d9", "name": "Commented-code block (5 lines) in src/components/StickyMobileCta.tsx:47", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/StickyMobileCta.tsx:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-731a0034b7852409", "name": "Commented-code block (5 lines) in src/components/Footer.tsx:17", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/Footer.tsx: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-c0f48998925b9bc5", "name": "Commented-code block (5 lines) in src/components/ServiceReport.tsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ServiceReport.tsx: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-5f05de3a2b6cc1b7", "name": "Commented-code block (5 lines) in src/components/Hero.tsx:223", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/Hero.tsx:223"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e160c52fc2285b74", "name": "Commented-code block (5 lines) in src/components/SeminoleCoverageMap.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/SeminoleCoverageMap.tsx:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d37907c8cafdb0cb", "name": "Commented-code block (5 lines) in src/components/Navbar.tsx:46", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/Navbar.tsx:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bb19b1a9506f18de", "name": "Commented-code block (5 lines) in src/lib/analytics.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/analytics.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7856e14b61cae90", "name": "Commented-code block (5 lines) in src/lib/businessSchema.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/businessSchema.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce970c0e33add8c2", "name": "Commented-code block (5 lines) in src/pages/StPeteBeachBelowFold.tsx:164", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/StPeteBeachBelowFold.tsx:164"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8307b6236e9149b6", "name": "Commented-code block (5 lines) in src/pages/PoolVolumeCalculatorPage.tsx:429", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/PoolVolumeCalculatorPage.tsx:429"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f050678fb557ac55", "name": "Commented-code block (5 lines) in src/pages/ClearwaterPage.tsx:17", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/ClearwaterPage.tsx: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-c34ffea03098ec45", "name": "Commented-code block (6 lines) in src/pages/LandingPage.tsx:18", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/LandingPage.tsx:18"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9353826af2aebd64", "name": "Commented-code block (6 lines) in src/pages/VariableSpeedPumpsPage.tsx:78", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/VariableSpeedPumpsPage.tsx:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b59e117e5178263", "name": "Commented-code block (5 lines) in src/pages/seminoleFaqs.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/seminoleFaqs.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d2b9be02f0f5ff90", "name": "Commented-code block (9 lines) in src/pages/clearwaterFaqs.ts:1", "shortDescription": {"text": "Commented-code block (9 lines) in src/pages/clearwaterFaqs.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d97bc8b056260cb4", "name": "Commented-code block (5 lines) in src/pages/PoolHeatingCostCalculatorPage.tsx:26", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/PoolHeatingCostCalculatorPage.tsx:26"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b5a76780c3df9aa", "name": "1 env vars used in code but missing from .env.example", "shortDescription": {"text": "1 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `VITE_GA_ID`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-637fd162a3aed1f7", "name": "Frontend route `/belleair-beach-fl` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/belleair-beach-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-47b888857041e66a", "name": "Frontend route `/treasure-island-fl` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/treasure-island-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5e71381c4ae86c4d", "name": "Frontend route `/st-pete-beach-fl` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/st-pete-beach-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0c16c4ab3e21736a", "name": "Frontend route `/snell-isle-fl` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/snell-isle-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-adecd41f3fde065d", "name": "Frontend route `/seminole-fl` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/seminole-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1f16bbf32d7a416a", "name": "Frontend route `/largo-fl` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/largo-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f206404636987fc2", "name": "Frontend route `/clearwater-fl` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/clearwater-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-49335b4e9fae53d8", "name": "Frontend route `/careers` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/careers` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-406143d8507bf4c6", "name": "Frontend route `/faq` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/faq` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-664ce0eefe9f3dbe", "name": "Frontend route `/how-it-works` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/how-it-works` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe0f8cdfc414376c", "name": "Frontend route `/pool-care` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/pool-care` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1735ce5c168e2fea", "name": "Frontend route `/pool-care/nitrates` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/pool-care/nitrates` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b377f35f87b10bf5", "name": "Frontend route `/pool-care/cloudy-pool-water` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/pool-care/cloudy-pool-water` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d6f97e2a9d70a7d", "name": "Frontend route `/pool-care/pool-smells-like-chlorine` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/pool-care/pool-smells-like-chlorine` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-32a06ad4f25a1bed", "name": "Frontend route `/pool-care/pool-service-vs-diy` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/pool-care/pool-service-vs-diy` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9342556a057360dd", "name": "Frontend route `/pool-care/cyanuric-acid` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/pool-care/cyanuric-acid` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f5ab2146de184053", "name": "Frontend route `/pool-care/green-pool` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/pool-care/green-pool` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e6e1c24941d4742", "name": "Frontend route `/pool-care/variable-speed-pumps` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/pool-care/variable-speed-pumps` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de59e1c7e9dd1ade", "name": "Frontend route `/pool-care/salt-water-vs-chlorine` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/pool-care/salt-water-vs-chlorine` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-349b03c47a60e5ff", "name": "Frontend route `/pool-care/how-to-drain-a-pool` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/pool-care/how-to-drain-a-pool` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7b00913bc4d56ed1", "name": "Frontend route `/tools` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/tools` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad86ab5f560466dc", "name": "Frontend route `/tools/pool-volume-calculator` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/tools/pool-volume-calculator` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-df924f10e080c58d", "name": "Frontend route `/tools/pool-heating-cost-calculator` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/tools/pool-heating-cost-calculator` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2f8f924d3ad66ccf", "name": "Frontend route `/contact` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/contact` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8e9387fe910e65db", "name": "Frontend route `/signup` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/signup` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a07a73767228799", "name": "Frontend route `/service-agreement` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/service-agreement` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-36755061c358ec98", "name": "Frontend route `/privacy-policy` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/privacy-policy` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d47341344301241", "name": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20502"}, "properties": {"repository": "suncoastpoolpros/website", "repoUrl": "https://github.com/suncoastpoolpros/website", "branch": "main"}, "results": [{"ruleId": "scanner-bb618715abf72aa3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/api/contact.ts:68"}, "properties": {"repobilityId": "f7c3688cb0a1b56f", "scanner": "scanner-primary", "fingerprint": "bb618715abf72aa3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a35b378fa2a1c31b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/api/admin/login.ts:81"}, "properties": {"repobilityId": "f163569c2018d182", "scanner": "scanner-primary", "fingerprint": "a35b378fa2a1c31b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9cd205ed3e04e548", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/api/admin/send-proposal.ts:123"}, "properties": {"repobilityId": "4e6201ab5035c8d9", "scanner": "scanner-primary", "fingerprint": "9cd205ed3e04e548", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f3170478106befc7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BelleairHeroPhone.tsx:189"}, "properties": {"repobilityId": "b3f0f082878de207", "scanner": "scanner-primary", "fingerprint": "f3170478106befc7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-108125a250fa22c3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SnellIsleHeroPhone.tsx:164"}, "properties": {"repobilityId": "f2140767d3ad791c", "scanner": "scanner-primary", "fingerprint": "108125a250fa22c3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-15321e23c8eba076", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TreasureIslandHeroPhone.tsx:194"}, "properties": {"repobilityId": "ca42099489d731c8", "scanner": "scanner-primary", "fingerprint": "15321e23c8eba076", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3e7971d9d06b4714", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/StPeteBeachHeroPhone.tsx:165"}, "properties": {"repobilityId": "fd2edc7625dd65b6", "scanner": "scanner-primary", "fingerprint": "3e7971d9d06b4714", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-021e9a9e151d56a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Hero.tsx:428"}, "properties": {"repobilityId": "6e019d3115ccb06b", "scanner": "scanner-primary", "fingerprint": "021e9a9e151d56a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e40a8f33f3a03e10", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/Navbar.tsx:384"}, "properties": {"repobilityId": "a1836eab642967c2", "scanner": "scanner-primary", "fingerprint": "e40a8f33f3a03e10", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-9b2af7d7b4487cad", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/pages/PrivacyPolicyPage.tsx:448"}, "properties": {"repobilityId": "3658c560b753b227", "scanner": "scanner-primary", "fingerprint": "9b2af7d7b4487cad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-2621926a45c48890", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/pages/FaqPage.tsx:185"}, "properties": {"repobilityId": "937486cf3a22dbe9", "scanner": "scanner-primary", "fingerprint": "2621926a45c48890", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-c9f782195b808c7e", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/pages/ServiceAgreementPage.tsx:678"}, "properties": {"repobilityId": "7b99deb07e9d7277", "scanner": "scanner-primary", "fingerprint": "c9f782195b808c7e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"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-f56f666491779d1f", "level": "note", "message": {"text": "Very large file: src/pages/PoolVolumeCalculatorPage.tsx (1887 lines)"}, "properties": {"repobilityId": "bfeeaa3721ff0328", "scanner": "scanner-primary", "fingerprint": "f56f666491779d1f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "75d40ea3263a52a6", "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": "7a0e7ac25e45100a", "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": "6d70d864344a4b93", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "c9ba60a5ae336193", "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": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "c7581cdf1f0d5c00", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "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": "c1d804faf343ca2e", "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": "efda2ddc0f77609f", "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": "ad71b763ab8d15b7", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-eb646080d454f6e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in vite.config.ts:13"}, "properties": {"repobilityId": "3d7f6e61d9911847", "scanner": "scanner-primary", "fingerprint": "eb646080d454f6e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-858d1732bc96a6f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/api/contact.ts:60"}, "properties": {"repobilityId": "fff09e95c95514f4", "scanner": "scanner-primary", "fingerprint": "858d1732bc96a6f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2921952d773a8e61", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/api/admin/login.ts:24"}, "properties": {"repobilityId": "5750ed757bf824d7", "scanner": "scanner-primary", "fingerprint": "2921952d773a8e61", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e8e2078ffabd668", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/prerender.mjs:1"}, "properties": {"repobilityId": "ee267737f11a0784", "scanner": "scanner-primary", "fingerprint": "9e8e2078ffabd668", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bcbb758bbdeedbc0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/App.tsx:8"}, "properties": {"repobilityId": "97cc509bc0214e3f", "scanner": "scanner-primary", "fingerprint": "bcbb758bbdeedbc0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a75fb8af36b630c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/QuoteChooser.tsx:69"}, "properties": {"repobilityId": "b99a5540b22bbfc2", "scanner": "scanner-primary", "fingerprint": "8a75fb8af36b630c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e30c69469a3b67d9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/StickyMobileCta.tsx:47"}, "properties": {"repobilityId": "2393662fea25ec62", "scanner": "scanner-primary", "fingerprint": "e30c69469a3b67d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-731a0034b7852409", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/Footer.tsx:17"}, "properties": {"repobilityId": "c76a3a5a5cfe0ac6", "scanner": "scanner-primary", "fingerprint": "731a0034b7852409", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c0f48998925b9bc5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ServiceReport.tsx:4"}, "properties": {"repobilityId": "9253666e7c9d6040", "scanner": "scanner-primary", "fingerprint": "c0f48998925b9bc5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f05de3a2b6cc1b7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/Hero.tsx:223"}, "properties": {"repobilityId": "172f6a507b6cd460", "scanner": "scanner-primary", "fingerprint": "5f05de3a2b6cc1b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e160c52fc2285b74", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/SeminoleCoverageMap.tsx:5"}, "properties": {"repobilityId": "eb1766f6fd506f87", "scanner": "scanner-primary", "fingerprint": "e160c52fc2285b74", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d37907c8cafdb0cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/Navbar.tsx:46"}, "properties": {"repobilityId": "231bd9453327bbfe", "scanner": "scanner-primary", "fingerprint": "d37907c8cafdb0cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb19b1a9506f18de", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/analytics.ts:5"}, "properties": {"repobilityId": "13a59e8a7b6a50c6", "scanner": "scanner-primary", "fingerprint": "bb19b1a9506f18de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7856e14b61cae90", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/businessSchema.ts:3"}, "properties": {"repobilityId": "81e6864764f92858", "scanner": "scanner-primary", "fingerprint": "f7856e14b61cae90", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce970c0e33add8c2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/StPeteBeachBelowFold.tsx:164"}, "properties": {"repobilityId": "ec3b84c853196cc7", "scanner": "scanner-primary", "fingerprint": "ce970c0e33add8c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8307b6236e9149b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/PoolVolumeCalculatorPage.tsx:429"}, "properties": {"repobilityId": "d4e88d77b4420f00", "scanner": "scanner-primary", "fingerprint": "8307b6236e9149b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f050678fb557ac55", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/ClearwaterPage.tsx:17"}, "properties": {"repobilityId": "7d05de2999722e70", "scanner": "scanner-primary", "fingerprint": "f050678fb557ac55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c34ffea03098ec45", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/LandingPage.tsx:18"}, "properties": {"repobilityId": "9244dbe2010e9db8", "scanner": "scanner-primary", "fingerprint": "c34ffea03098ec45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9353826af2aebd64", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/VariableSpeedPumpsPage.tsx:78"}, "properties": {"repobilityId": "88efb1a3ffdc021c", "scanner": "scanner-primary", "fingerprint": "9353826af2aebd64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b59e117e5178263", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/seminoleFaqs.ts:1"}, "properties": {"repobilityId": "c1f29da461f23ff7", "scanner": "scanner-primary", "fingerprint": "2b59e117e5178263", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2b9be02f0f5ff90", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/pages/clearwaterFaqs.ts:1"}, "properties": {"repobilityId": "d46eaac25ee1f646", "scanner": "scanner-primary", "fingerprint": "d2b9be02f0f5ff90", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d97bc8b056260cb4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/PoolHeatingCostCalculatorPage.tsx:26"}, "properties": {"repobilityId": "64692e8b2ce0d9f0", "scanner": "scanner-primary", "fingerprint": "d97bc8b056260cb4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b5a76780c3df9aa", "level": "none", "message": {"text": "1 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d04379b337b44a15", "scanner": "scanner-primary", "fingerprint": "1b5a76780c3df9aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-637fd162a3aed1f7", "level": "warning", "message": {"text": "Frontend route `/belleair-beach-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "14dabc1e1810a11c", "scanner": "scanner-primary", "fingerprint": "637fd162a3aed1f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-47b888857041e66a", "level": "warning", "message": {"text": "Frontend route `/treasure-island-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6dd1c294b0a4d56f", "scanner": "scanner-primary", "fingerprint": "47b888857041e66a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5e71381c4ae86c4d", "level": "warning", "message": {"text": "Frontend route `/st-pete-beach-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c7dda616208bb54b", "scanner": "scanner-primary", "fingerprint": "5e71381c4ae86c4d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0c16c4ab3e21736a", "level": "warning", "message": {"text": "Frontend route `/snell-isle-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "f809d4cd5e93041e", "scanner": "scanner-primary", "fingerprint": "0c16c4ab3e21736a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-adecd41f3fde065d", "level": "warning", "message": {"text": "Frontend route `/seminole-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6e5e803aec6208bb", "scanner": "scanner-primary", "fingerprint": "adecd41f3fde065d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1f16bbf32d7a416a", "level": "warning", "message": {"text": "Frontend route `/largo-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "117348aa7a93215d", "scanner": "scanner-primary", "fingerprint": "1f16bbf32d7a416a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f206404636987fc2", "level": "warning", "message": {"text": "Frontend route `/clearwater-fl` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c50f907e7209368b", "scanner": "scanner-primary", "fingerprint": "f206404636987fc2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-49335b4e9fae53d8", "level": "warning", "message": {"text": "Frontend route `/careers` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "cd71672f120a6c6f", "scanner": "scanner-primary", "fingerprint": "49335b4e9fae53d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-406143d8507bf4c6", "level": "warning", "message": {"text": "Frontend route `/faq` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "f2042d8cc30de5bc", "scanner": "scanner-primary", "fingerprint": "406143d8507bf4c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-664ce0eefe9f3dbe", "level": "warning", "message": {"text": "Frontend route `/how-it-works` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "785c96e7c99cad57", "scanner": "scanner-primary", "fingerprint": "664ce0eefe9f3dbe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fe0f8cdfc414376c", "level": "warning", "message": {"text": "Frontend route `/pool-care` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "58a51cf58643c7c9", "scanner": "scanner-primary", "fingerprint": "fe0f8cdfc414376c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1735ce5c168e2fea", "level": "warning", "message": {"text": "Frontend route `/pool-care/nitrates` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a08868dfceb4514f", "scanner": "scanner-primary", "fingerprint": "1735ce5c168e2fea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b377f35f87b10bf5", "level": "warning", "message": {"text": "Frontend route `/pool-care/cloudy-pool-water` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "e769c49bce3b8dea", "scanner": "scanner-primary", "fingerprint": "b377f35f87b10bf5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2d6f97e2a9d70a7d", "level": "warning", "message": {"text": "Frontend route `/pool-care/pool-smells-like-chlorine` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5df4564c18a7ae3a", "scanner": "scanner-primary", "fingerprint": "2d6f97e2a9d70a7d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-32a06ad4f25a1bed", "level": "warning", "message": {"text": "Frontend route `/pool-care/pool-service-vs-diy` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d8a2d3c55fe01c66", "scanner": "scanner-primary", "fingerprint": "32a06ad4f25a1bed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9342556a057360dd", "level": "warning", "message": {"text": "Frontend route `/pool-care/cyanuric-acid` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b98b95170ba99d51", "scanner": "scanner-primary", "fingerprint": "9342556a057360dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f5ab2146de184053", "level": "warning", "message": {"text": "Frontend route `/pool-care/green-pool` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "dfce94ff81dc7a5b", "scanner": "scanner-primary", "fingerprint": "f5ab2146de184053", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6e6e1c24941d4742", "level": "warning", "message": {"text": "Frontend route `/pool-care/variable-speed-pumps` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d1f2128a11690323", "scanner": "scanner-primary", "fingerprint": "6e6e1c24941d4742", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-de59e1c7e9dd1ade", "level": "warning", "message": {"text": "Frontend route `/pool-care/salt-water-vs-chlorine` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "482de9e16876c2fd", "scanner": "scanner-primary", "fingerprint": "de59e1c7e9dd1ade", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-349b03c47a60e5ff", "level": "warning", "message": {"text": "Frontend route `/pool-care/how-to-drain-a-pool` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6fce300f714f5159", "scanner": "scanner-primary", "fingerprint": "349b03c47a60e5ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7b00913bc4d56ed1", "level": "warning", "message": {"text": "Frontend route `/tools` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5192e0dbcb55d880", "scanner": "scanner-primary", "fingerprint": "7b00913bc4d56ed1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ad86ab5f560466dc", "level": "warning", "message": {"text": "Frontend route `/tools/pool-volume-calculator` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5ee68ef3e2f62662", "scanner": "scanner-primary", "fingerprint": "ad86ab5f560466dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-df924f10e080c58d", "level": "warning", "message": {"text": "Frontend route `/tools/pool-heating-cost-calculator` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "27cbd0aec166f3d9", "scanner": "scanner-primary", "fingerprint": "df924f10e080c58d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2f8f924d3ad66ccf", "level": "warning", "message": {"text": "Frontend route `/contact` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b47bbc5ce41faaaf", "scanner": "scanner-primary", "fingerprint": "2f8f924d3ad66ccf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8e9387fe910e65db", "level": "warning", "message": {"text": "Frontend route `/signup` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9a43492bdaf235d5", "scanner": "scanner-primary", "fingerprint": "8e9387fe910e65db", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2a07a73767228799", "level": "warning", "message": {"text": "Frontend route `/service-agreement` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "76221b5a6bf394a0", "scanner": "scanner-primary", "fingerprint": "2a07a73767228799", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-36755061c358ec98", "level": "warning", "message": {"text": "Frontend route `/privacy-policy` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b78649718eb280e8", "scanner": "scanner-primary", "fingerprint": "36755061c358ec98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3d47341344301241", "level": "warning", "message": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3060fc2a800f6a3c", "scanner": "scanner-primary", "fingerprint": "3d47341344301241", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}