{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d677d6cf3c017012", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed_march_2026_posts.js:154", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed_march_2026_posts.js:154"}, "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-4527cc63af3017ad", "name": "`truncate` class without `title=` for hover reveal \u2014 src/_archive/QuoteModal.tsx:525", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/_archive/QuoteModal.tsx:525"}, "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-76eed4c710a6b1c7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/estimator/ProductProof.tsx:318", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/estimator/ProductProof.tsx:318"}, "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-5ffe72d6147c2df3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/estimator/MultiQuoteCart.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/estimator/MultiQuoteCart.tsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5283eb07a9e9898c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/site/SiteNav.tsx:506", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/site/SiteNav.tsx:506"}, "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-0f87d35c3b988940", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/site/IndustryPage.tsx:114", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/site/IndustryPage.tsx:114"}, "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-483d8c7cba9df070", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/home/ReviewsSection.tsx:115", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/home/ReviewsSection.tsx:115"}, "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-b1bed56f2340e7c0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/GBPProductCard.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/GBPProductCard.tsx:115"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c56cd209ce3eebc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/BatchScheduler.tsx:604", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/BatchScheduler.tsx:604"}, "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-bdb975130c9bc8eb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/TemplateTimeline.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/TemplateTimeline.tsx:56"}, "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-c66ac661478153d6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/CaptionRewriter.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/CaptionRewriter.tsx:185"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9676903570229877", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/PostPreview.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/PostPreview.tsx:130"}, "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-c99f4a09e9c44728", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/ImagePicker.tsx:310", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/ImagePicker.tsx:310"}, "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-05b1f5f60d271ac1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/BlitzPipeline.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/BlitzPipeline.tsx: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-0dbfefb1ac74c1a8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/CalendarGrid.tsx:219", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/CalendarGrid.tsx:219"}, "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-213949aea51406a9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/ImagePromptCard.tsx:34", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/ImagePromptCard.tsx: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-9b97b6a4c9e81c5a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/OutreachQueue.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/OutreachQueue.tsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-477f8807e2300719", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/account/StatusStepper.tsx:19", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/account/StatusStepper.tsx:19"}, "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-68c3e1a5c62bb904", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/account/QuotesList.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/account/QuotesList.tsx:44"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f87a21b570cb5a53", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:293", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:293"}, "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-8f36d4d9c2495a3f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/about/page.tsx:75", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/about/page.tsx:75"}, "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-169e376ac415e6e4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/quote/page.tsx:550", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/quote/page.tsx:550"}, "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-72b4789d5dae3db8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/contact/page.tsx:63", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/contact/page.tsx:63"}, "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-db68a7b77d97361a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/StaffOrdersActions.tsx:1510", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/StaffOrdersActions.tsx:1510"}, "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-85228c3560a028fc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/CustomerHistoryWidget.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/CustomerHistoryWidget.tsx:172"}, "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-257050ce1c07e4c9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/page.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/page.tsx: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-467c7b594f54cf5a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/customers/page.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/customers/page.tsx: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-b2b133c3f4585354", "name": "Icon-only button without accessible name \u2014 src/app/staff/customers/CustomersTable.tsx:125", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/staff/customers/CustomersTable.tsx:125"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4eaf42faf582bca1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/customers/CustomersTable.tsx:420", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/customers/CustomersTable.tsx:420"}, "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-0fe8d940efbcc8f5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/RefundsPendingPanel.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/RefundsPendingPanel.tsx:89"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a7f4f1c1aff4c6b6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/SignupsPanel.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/SignupsPanel.tsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c029ecf35e5e3ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/CartAbandonPanel.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/CartAbandonPanel.tsx:64"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f62436e845dab36f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/BookkeepingRiskPanel.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/BookkeepingRiskPanel.tsx:106"}, "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-c74b116e92670cce", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/LifecycleTable.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/LifecycleTable.tsx:161"}, "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-6c40b3b7265c48ff", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/WaveDraftPanel.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/WaveDraftPanel.tsx:73"}, "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-7bbfaedffd1d7f2d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/ActivityFeedPanel.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/ActivityFeedPanel.tsx:143"}, "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-8c5a20ee64a067d5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/PendingCouponsPanel.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/PendingCouponsPanel.tsx:64"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-077bd3e32028dc9b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/page.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/page.tsx:72"}, "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-422dadb992377f6c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/HeartbeatsPanel.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/HeartbeatsPanel.tsx:81"}, "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-a119db26b81e253c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/FailedEmailsPanel.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/FailedEmailsPanel.tsx:66"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c5fec3c5387bae69", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/IndustryBlitzPanel.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/IndustryBlitzPanel.tsx:86"}, "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-5435fbf3f48db1ee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/StaffActionsPanel.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/StaffActionsPanel.tsx:150"}, "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-872b500205c5c297", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/QuotesPanel.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/QuotesPanel.tsx:84"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d6348310b6d0dcac", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/CouponsPanel.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/CouponsPanel.tsx:65"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-978dfcea4d066bce", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/customer/[email]/page.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/customer/[email]/page.tsx:230"}, "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-a0d2ff1f88da731c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/social/image-prompts/page.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/social/image-prompts/page.tsx:72"}, "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-07a7db61629e92e2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/quotes/page.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/quotes/page.tsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7c276faf00f2ce2", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/upload/route.ts:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/upload/route.ts:105"}, "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-2cbb3e7d0d2dfd95", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/quote-request/route.ts:404", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/quote-request/route.ts:404"}, "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-7cd900d1c64d919e", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/email/unsubscribe-one-click/route.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/email/unsubscribe-one-click/route.ts:48"}, "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-19c9939dd22784e7", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/signup-notify/route.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/signup-notify/route.ts:71"}, "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-68301901fdbf42f3", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/manual-order/route.ts:151", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/manual-order/route.ts: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-d6fe53c276388803", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/resend-payment/route.ts:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/resend-payment/route.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-d348d5c7bf5b9f6e", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/reply/route.ts:128", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/reply/route.ts:128"}, "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-c2d5eb74b10fb5de", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/status/route.ts:228", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/status/route.ts:228"}, "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-cffe6f4d297ccc0e", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/proof/route.ts:207", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/proof/route.ts:207"}, "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-fdc8fd340a311714", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/confirm-etransfer/route.ts:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/confirm-etransfer/route.ts: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-6999f2a75d3cc641", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/notes/route.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/notes/route.ts:48"}, "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-3f321346e44ab9be", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/receipt/route.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/receipt/route.ts:74"}, "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-b0c85520e5e78b60", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/send-customer-email/route.ts:75", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/send-customer-email/route.ts:75"}, "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-cecf32bd6d6f099d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/customers/[id]/assign-discount/route.ts:147", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/customers/[id]/assign-discount/route.ts:147"}, "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-521b39c26a28d023", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/quotes/[id]/send-quote/route.ts:268", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/quotes/[id]/send-quote/route.ts:268"}, "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-2909cfcfce9a3164", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/quotes/[id]/send-reply/route.ts:149", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/quotes/[id]/send-reply/route.ts:149"}, "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-a323c387b24986ca", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/payment-followup/route.ts:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/payment-followup/route.ts:129"}, "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-8d54e602cf05b0ff", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/gsc-backfill/route.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/gsc-backfill/route.ts: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-efe1680c0e2dd6c5", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/aging-orders/route.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/aging-orders/route.ts:65"}, "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-2710655cd09adbfa", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/reconcile-payments/route.ts:272", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/reconcile-payments/route.ts:272"}, "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-42cfa06b0b258502", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/daily-payment-digest/route.ts:287", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/daily-payment-digest/route.ts:287"}, "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-38c02997038ab3d3", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/stale-quotes/route.ts:120", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/stale-quotes/route.ts:120"}, "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-b4fcb863565b560d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/keepalive/route.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/keepalive/route.ts:45"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dab0429cfad2ba13", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/gsc-sync/route.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/gsc-sync/route.ts:103"}, "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-21d27937c067bf8e", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/ga4-sync/route.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/ga4-sync/route.ts:100"}, "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-17b5c251e7c1f731", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/wave-poll/route.ts:159", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/wave-poll/route.ts:159"}, "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-e4b63523e1c3a851", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/account/orders/[id]/upload-file/route.ts:231", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/account/orders/[id]/upload-file/route.ts:231"}, "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-4e9921e65f9f3ee1", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/brevo/route.ts:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/brevo/route.ts:114"}, "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-45aac3ae2dbd6b88", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/wave/route.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/wave/route.ts:100"}, "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-970ffb61025c5f60", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/clover/route.ts:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/clover/route.ts:84"}, "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-df86e404e2c69284", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/resources/page.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/resources/page.tsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-98988dfd4c23f87b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/resources/page.tsx:305", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/resources/page.tsx:305"}, "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-814d4947c0e0bb6a", "name": "Stray `console.log` in TS/JS \u2014 src/app/unsubscribe/page.tsx:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/unsubscribe/page.tsx:40"}, "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-37de935333eb537e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/gallery/page.tsx:69", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/gallery/page.tsx:69"}, "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-e4a720034b36c044", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/portal/[brokerage]/PortalOrderForm.tsx:336", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/portal/[brokerage]/PortalOrderForm.tsx:336"}, "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-25cf2ccbc941d866", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/printing-prices-saskatoon/page.tsx:117", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/printing-prices-saskatoon/page.tsx:117"}, "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-269b60b4540dffe9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/products/[slug]/page.tsx:65", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/products/[slug]/page.tsx:65"}, "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-0995fa342be16062", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/checkout/page.tsx:873", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/checkout/page.tsx:873"}, "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-6b23c0fe5cfde30c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/vehicle-decals-saskatoon/page.tsx:80", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/vehicle-decals-saskatoon/page.tsx:80"}, "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-a06377fc480c33ed", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email/accountWelcome.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/accountWelcome.ts:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-efe30aedc7f8dc60", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email/statusUpdate.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/statusUpdate.ts:57"}, "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-5594e257c78e5216", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email/paymentRequest.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/paymentRequest.ts: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-664d5e767624af07", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email/reviewRequest.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/reviewRequest.ts:57"}, "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-bbd2a24b2cc100a4", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email/staffNotification.ts:110", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/staffNotification.ts:110"}, "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-f6dccf2cf1c1e429", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email/paymentReceipt.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/paymentReceipt.ts:67"}, "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-11a58e0ca82e6297", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email/orderConfirmation.ts:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/orderConfirmation.ts: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-d5393ab356a1c4b5", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email/proofSent.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/proofSent.ts:54"}, "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-70e94f8cbde95c40", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email/signupWelcome.ts:174", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/signupWelcome.ts:174"}, "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-7f97b00e9ed254a5", "name": "Stray `console.log` in TS/JS \u2014 src/lib/analytics/measurementProtocol.ts:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/analytics/measurementProtocol.ts:72"}, "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-8c86e5f2ac6c26ad", "name": "Stray `console.log` in TS/JS \u2014 src/lib/brevo/customerSync.ts:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/brevo/customerSync.ts:133"}, "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-ce0d4184188693de", "name": "Stray `console.log` in TS/JS \u2014 src/lib/pricing/__tests__/sticker-model-v2.test.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pricing/__tests__/sticker-model-v2.test.ts:60"}, "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-008757a37524bfe8", "name": "Privileged port 16 in use", "shortDescription": {"text": "Privileged port 16 in use"}, "fullDescription": {"text": "Port 16 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-70c304fe32fe2998", "name": "Privileged port 10 in use", "shortDescription": {"text": "Privileged port 10 in use"}, "fullDescription": {"text": "Port 10 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a502090149c2970", "name": "Privileged port 14 in use", "shortDescription": {"text": "Privileged port 14 in use"}, "fullDescription": {"text": "Port 14 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c2ab66b016e328aa", "name": "Privileged port 13 in use", "shortDescription": {"text": "Privileged port 13 in use"}, "fullDescription": {"text": "Port 13 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-00d664bf722f39b2", "name": "Privileged port 30 in use", "shortDescription": {"text": "Privileged port 30 in use"}, "fullDescription": {"text": "Port 30 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aeb5ba6a33610d17", "name": "Insecure pattern 'node_child_process' in scripts/zombie-reconcile-interactive.mjs:22", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/zombie-reconcile-interactive.mjs:22"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-59698e49a1a46512", "name": "Insecure pattern 'node_child_process' in scripts/seo-wave-audit.mjs:19", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/seo-wave-audit.mjs:19"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35de5093a51f5a88", "name": "Insecure pattern 'node_child_process' in scripts/hooks/seo-wave-guard.mjs:33", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/hooks/seo-wave-guard.mjs:33"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c93b4f66dd250001", "name": "Insecure pattern 'node_child_process' in scripts/hooks/stop-price-validation.mjs:17", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/hooks/stop-price-validation.mjs:17"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d59fe6a85689e024", "name": "Insecure pattern 'node_child_process' in scripts/hooks/seo-cooldown-check.mjs:30", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/hooks/seo-cooldown-check.mjs:30"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-13749ec160096503", "name": "Possible secret in e2e-playwright/manual-order-e2e.spec.ts", "shortDescription": {"text": "Possible secret in e2e-playwright/manual-order-e2e.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-9d63da04fe956e7e", "name": "Possible secret in e2e-playwright/magic-link-flow.spec.ts", "shortDescription": {"text": "Possible secret in e2e-playwright/magic-link-flow.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-70d65563f80ffbb5", "name": "Possible secret in e2e-playwright/helpers/supabase-admin.ts", "shortDescription": {"text": "Possible secret in e2e-playwright/helpers/supabase-admin.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-f3a4a5883a239b4c", "name": "Insecure pattern 'document_write' in src/components/estimator/QuotePanel.tsx:248", "shortDescription": {"text": "Insecure pattern 'document_write' in src/components/estimator/QuotePanel.tsx:248"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-177fb698b60bf752", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/site/IndustryPage.tsx:114", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/site/IndustryPage.tsx:114"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-874fda5de88326e8", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/home/ReviewsSection.tsx:115", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/home/ReviewsSection.tsx:115"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1cc0195e6ded89a7", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:293", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:293"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4e27b20a12ce9004", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/about/page.tsx:75", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/about/page.tsx:75"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-68a8243027014d2b", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/contact/page.tsx:63", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/contact/page.tsx:63"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27c87d1e9eddeb6c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/resources/page.tsx:305", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/resources/page.tsx:305"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cc19b62c7c86de87", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/gallery/page.tsx:69", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/gallery/page.tsx:69"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b24c683e463f4701", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/printing-prices-saskatoon/page.tsx:117", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/printing-prices-saskatoon/page.tsx:117"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b91e2e013b2814be", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/products/[slug]/page.tsx:65", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/products/[slug]/page.tsx:65"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf5fe5001917a186", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/vehicle-decals-saskatoon/page.tsx:80", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/vehicle-decals-saskatoon/page.tsx:80"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4363fcc36b22794d", "name": "Insecure pattern 'document_write' in src/lib/quoteDocument.ts:108", "shortDescription": {"text": "Insecure pattern 'document_write' in src/lib/quoteDocument.ts:108"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fa9c49d3f90f14d5", "name": "Very large file: src/app/staff/orders/StaffOrdersActions.tsx (1641 lines)", "shortDescription": {"text": "Very large file: src/app/staff/orders/StaffOrdersActions.tsx (1641 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-4ee42c843fdfcdc7", "name": "Very large file: src/app/staff/lifecycle/data.ts (1211 lines)", "shortDescription": {"text": "Very large file: src/app/staff/lifecycle/data.ts (1211 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-b5a689c990d3dab8", "name": "Very large file: src/app/image-sitemap.xml/route.ts (1070 lines)", "shortDescription": {"text": "Very large file: src/app/image-sitemap.xml/route.ts (1070 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-c22626d7425cc7c8", "name": "Very large file: src/app/checkout/page.tsx (1251 lines)", "shortDescription": {"text": "Very large file: src/app/checkout/page.tsx (1251 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": "20 test file(s) for 509 source file(s) (ratio 0.04). 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 558 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 44 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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "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-0c338e4a76f87f75", "name": "Agent authority lacks a verifier contract: .claude/commands/audit-prices.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/audit-prices.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-6f12a0e4bdbb8926", "name": "Commented-code block (5 lines) in next.config.ts:321", "shortDescription": {"text": "Commented-code block (5 lines) in next.config.ts:321"}, "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-e6c13a8789333dee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-stuck-wave-order.mjs:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-stuck-wave-order.mjs:56"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-981f25b371fd82df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-payment-flow.mjs:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-payment-flow.mjs:70"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a65a4c631fb5f1cb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/zombie-reconcile-interactive.mjs:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/zombie-reconcile-interactive.mjs:75"}, "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-5ca67b3c7547c47b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ga4-backfill.mjs:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ga4-backfill.mjs:37"}, "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-19795756b7f258c6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/archive-test-orders.mjs:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/archive-test-orders.mjs:46"}, "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-0279ebe6796adde0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-wave-negative-unitprice.mjs:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-wave-negative-unitprice.mjs:21"}, "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-5a747d3271bbd4df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-stuck-wave-verify.mjs:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-stuck-wave-verify.mjs:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51b38a9e8351dd14", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-clover-stuck-orders.mjs:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-clover-stuck-orders.mjs:59"}, "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-018f9a8acd16ce41", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-wave-invoice-ids.mjs:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-wave-invoice-ids.mjs:31"}, "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-aee584ffe7269b70", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/investigate-drift-zombies.mjs:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/investigate-drift-zombies.mjs:28"}, "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-915246ac2a6b144e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/debug-wave.mjs:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/debug-wave.mjs:18"}, "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-75e23e59a7e114eb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/meta-backfill.mjs:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/meta-backfill.mjs:30"}, "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-2238e6c0a441f322", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/build-gbp-upload.py:149", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/build-gbp-upload.py:149"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a4a852dd7f5bdc5b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-email-flow.mjs:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-email-flow.mjs:46"}, "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-24420a02a18f24b6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/seo-opportunities.mjs:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/seo-opportunities.mjs: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-d1361e9e05af99da", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-wave-payment.mjs:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-wave-payment.mjs: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-1a40377b349397d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/blitz/build-retail-cohort.mjs:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/blitz/build-retail-cohort.mjs:47"}, "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-c81afa3664887367", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/blitz/launch-niche-wave.mjs:87", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/blitz/launch-niche-wave.mjs:87"}, "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-4e06f4ba81892ffa", "name": "Commented-code block (9 lines) in scripts/hooks/price-guard.mjs:8", "shortDescription": {"text": "Commented-code block (9 lines) in scripts/hooks/price-guard.mjs: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-59cbfc52d35c9279", "name": "Commented-code block (6 lines) in scripts/hooks/stop-price-validation.mjs:335", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/hooks/stop-price-validation.mjs:335"}, "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-3f5fecd7e7f1e8ae", "name": "Commented-code block (6 lines) in scripts/hooks/post-edit-price-check.mjs:12", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/hooks/post-edit-price-check.mjs:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f15dd7a073094839", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/harness/generate-pay-link.mjs:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/harness/generate-pay-link.mjs:44"}, "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-939f95e32b973726", "name": "Commented-code block (7 lines) in scripts/harness/reconcile-check.mjs:177", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/harness/reconcile-check.mjs:177"}, "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-742e874e11b10e38", "name": "Commented-code block (7 lines) in e2e-playwright/staff-notification-audio.spec.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in e2e-playwright/staff-notification-audio.spec.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-2e26679e1de72e4d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-playwright/account-dashboard.spec.ts:160", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-playwright/account-dashboard.spec.ts:160"}, "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-5371a7ad9386d0f0", "name": "Commented-code block (5 lines) in e2e-playwright/no-min-charge.spec.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in e2e-playwright/no-min-charge.spec.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-69318489f58a5cfb", "name": "Commented-code block (9 lines) in seo-prep/wave-3c-printing-near-me-saskatoon.tsx:1", "shortDescription": {"text": "Commented-code block (9 lines) in seo-prep/wave-3c-printing-near-me-saskatoon.tsx: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-34347c411c6f1923", "name": "Commented-code block (10 lines) in seo-prep/wave-3c-printing-services-saskatoon.tsx:1", "shortDescription": {"text": "Commented-code block (10 lines) in seo-prep/wave-3c-printing-services-saskatoon.tsx: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-4bd9e45997049d2d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/_archive/QuoteModal.tsx:169", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/_archive/QuoteModal.tsx:169"}, "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-12b9b19193cbd3d4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/estimator/EmailModal.tsx:120", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/estimator/EmailModal.tsx:120"}, "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-b67d2c090c7cf86b", "name": "Commented-code block (5 lines) in src/components/staff/NotificationListener.tsx:59", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/staff/NotificationListener.tsx:59"}, "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-cb1a2a068c5629f9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/staff/quotes/QuoteCard.tsx:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/staff/quotes/QuoteCard.tsx:74"}, "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-e648b83ee1548f1a", "name": "Commented-code block (6 lines) in src/components/product/UnifiedConfigurator.tsx:65", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/product/UnifiedConfigurator.tsx:65"}, "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-8b114d3807b88b2c", "name": "Legacy-named symbol `tc_promo_banner_v1` in src/components/site/PromoBanner.tsx:15", "shortDescription": {"text": "Legacy-named symbol `tc_promo_banner_v1` in src/components/site/PromoBanner.tsx:15"}, "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-7e7473e5fb60009a", "name": "Commented-code block (5 lines) in src/components/site/UtmCapture.tsx:32", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/site/UtmCapture.tsx:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9a75c2dd6dbea8c1", "name": "Commented-code block (5 lines) in src/components/home/ReviewsSection.tsx:63", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/home/ReviewsSection.tsx:63"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7fd109f23371a553", "name": "Commented-code block (5 lines) in src/components/home/HeroSlider.tsx:69", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/home/HeroSlider.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-37858a600d9d3fc4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/BatchScheduler.tsx:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/BatchScheduler.tsx:102"}, "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-c91472317911e869", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/CaptionRewriter.tsx:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/CaptionRewriter.tsx:53"}, "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-c2bb97a01e610afc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/ComposeForm.tsx:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/ComposeForm.tsx:124"}, "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-d5411ef5684daba0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/LeadsTable.tsx:125", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/LeadsTable.tsx:125"}, "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-b4771b76a655f2b8", "name": "Commented-code block (5 lines) in src/app/sitemap.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/sitemap.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-f0ce39fde06e66a7", "name": "Commented-code block (6 lines) in src/app/layout.tsx:11", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/layout.tsx:11"}, "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-89a0a68bfbad734f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/quote/page.tsx:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/quote/page.tsx:159"}, "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-004d9e3f7f784fb8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/page.tsx:168", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/page.tsx:168"}, "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-ff7eda20bd77808a", "name": "Commented-code block (5 lines) in src/app/staff/orders/StaffOrdersActions.tsx:262", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/staff/orders/StaffOrdersActions.tsx:262"}, "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-2c91a49e83c6a576", "name": "Commented-code block (5 lines) in src/app/staff/orders/OrdersTable.tsx:203", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/staff/orders/OrdersTable.tsx:203"}, "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-86e1ad782b946fcb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/coupons/CouponsClient.tsx:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/coupons/CouponsClient.tsx:80"}, "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-655ca13da35947d5", "name": "Commented-code block (13 lines) in src/app/staff/lifecycle/data.ts:42", "shortDescription": {"text": "Commented-code block (13 lines) in src/app/staff/lifecycle/data.ts:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-073670384fce2cd6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/social/[postId]/page.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/social/[postId]/page.tsx:56"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-36ab75c52c61e198", "name": "Commented-code block (6 lines) in src/app/api/upload/route.ts:63", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/upload/route.ts:63"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fbb24066ee616a25", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/quote-request/route.ts:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/quote-request/route.ts:82"}, "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-93097bc60411c965", "name": "Commented-code block (5 lines) in src/app/api/orders/route.ts:160", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/orders/route.ts:160"}, "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-9f253e93d92b9f72", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/auth/signup-notify/route.ts:65", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/auth/signup-notify/route.ts:65"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d914acbee79c12f", "name": "Commented-code block (5 lines) in src/app/api/health/route.ts:49", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/health/route.ts:49"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-909382a8cc180c18", "name": "Commented-code block (5 lines) in src/app/api/staff/manual-order/route.ts:265", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/staff/manual-order/route.ts: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-65dd8ef0fddc7f40", "name": "Commented-code block (7 lines) in src/app/api/staff/quote/wave/route.ts:138", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/staff/quote/wave/route.ts:138"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-068d3a68280eddd9", "name": "Commented-code block (5 lines) in src/app/api/staff/orders/[id]/confirm-etransfer/route.ts:129", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/staff/orders/[id]/confirm-etransfer/route.ts:129"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-85f1865c88200217", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/staff/social/blitz/sync-brevo-lists/route.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/staff/social/blitz/sync-brevo-lists/route.ts:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-59fc6cce8b3651eb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/staff/social/captions/route.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/staff/social/captions/route.ts:72"}, "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-590a8c4493275254", "name": "Commented-code block (5 lines) in src/app/api/cron/reconcile-payments/route.ts:73", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/cron/reconcile-payments/route.ts:73"}, "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-e574ef6b7be16e05", "name": "Commented-code block (5 lines) in src/app/api/cron/daily-payment-digest/route.ts:24", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/cron/daily-payment-digest/route.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-528c59bd54bc2ea9", "name": "Commented-code block (8 lines) in src/app/api/webhooks/clover/route.ts:38", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/api/webhooks/clover/route.ts:38"}, "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-faa6ed7b27e15278", "name": "Commented-code block (5 lines) in src/app/order-confirmed/page.tsx:42", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/order-confirmed/page.tsx:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-063094177177cbdc", "name": "Commented-code block (6 lines) in src/app/account/callback/page.tsx:30", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/account/callback/page.tsx: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-db0b72f98ad0480d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/account/receipt/[id]/page.tsx:87", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/account/receipt/[id]/page.tsx:87"}, "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-93494f273ded08d2", "name": "Commented-code block (5 lines) in src/app/pay/[token]/page.tsx:76", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/pay/[token]/page.tsx:76"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ca0806f9c399c7be", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/checkout/page.tsx:238", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/checkout/page.tsx:238"}, "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-3ae67f5a8c554394", "name": "Commented-code block (5 lines) in src/lib/flags.ts:55", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/flags.ts:55"}, "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-c3f83e564f5896af", "name": "Commented-code block (6 lines) in src/lib/email/smtp.ts:103", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/email/smtp.ts:103"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fea418e360695055", "name": "Commented-code block (10 lines) in src/lib/lifecycle/rollup.ts:106", "shortDescription": {"text": "Commented-code block (10 lines) in src/lib/lifecycle/rollup.ts:106"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c93b0683bcc8e27", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/blitz/process-replies.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/blitz/process-replies.ts:53"}, "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-44d56d96b5843e60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/brevo/customerSync.ts:111", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/brevo/customerSync.ts:111"}, "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-c94f248861a06d20", "name": "Commented-code block (5 lines) in src/lib/engine/index.ts:40", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/engine/index.ts: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-72063644728b416d", "name": "Commented-code block (7 lines) in src/lib/engine/__tests__/engine.test.ts:213", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/engine/__tests__/engine.test.ts:213"}, "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-e5b3df6b17d722bc", "name": "Commented-code block (5 lines) in src/lib/pricing/sticker-model-v2.ts:69", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pricing/sticker-model-v2.ts: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-22a10834cc241101", "name": "Commented-code block (5 lines) in src/lib/pricing/tax.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pricing/tax.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-af5def642781a9d6", "name": "Legacy-named symbol `searchconsole_v1` in src/lib/seo/gsc-client.ts:21", "shortDescription": {"text": "Legacy-named symbol `searchconsole_v1` in src/lib/seo/gsc-client.ts:21"}, "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-b8de7af793bf64e6", "name": "Commented-code block (6 lines) in e2e/smoke.test.ts:217", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/smoke.test.ts:217"}, "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-e8add96a39331650", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/smoke.test.ts:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/smoke.test.ts:5"}, "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-6af648a07c4f5617", "name": "72 env vars used in code but missing from .env.example", "shortDescription": {"text": "72 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_NOTIFY_EMAIL`, `AUTO_YES`, `BASE_URL`, `BLOTATO_API_KEY`, `BREVO_API_KEY`, `BREVO_WEBHOOK_SECRET`, `CI`, `CLOUDFLARE_TURNSTILE_SECRET_KEY` + 64 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}}]}}, "automationDetails": {"id": "repobility/21719"}, "properties": {"repository": "tubby124/truecolor-estimator", "repoUrl": "https://github.com/tubby124/truecolor-estimator", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-d677d6cf3c017012", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed_march_2026_posts.js:154"}, "properties": {"repobilityId": "4bf3bed87d8e2072", "scanner": "scanner-primary", "fingerprint": "d677d6cf3c017012", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4527cc63af3017ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/_archive/QuoteModal.tsx:525"}, "properties": {"repobilityId": "56a9cfb13c56f4a7", "scanner": "scanner-primary", "fingerprint": "4527cc63af3017ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76eed4c710a6b1c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/estimator/ProductProof.tsx:318"}, "properties": {"repobilityId": "6492318ddbb0f6a0", "scanner": "scanner-primary", "fingerprint": "76eed4c710a6b1c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ffe72d6147c2df3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/estimator/MultiQuoteCart.tsx:78"}, "properties": {"repobilityId": "f0b98cff8cce8a17", "scanner": "scanner-primary", "fingerprint": "5ffe72d6147c2df3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5283eb07a9e9898c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/site/SiteNav.tsx:506"}, "properties": {"repobilityId": "e2dce3316c6e719b", "scanner": "scanner-primary", "fingerprint": "5283eb07a9e9898c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f87d35c3b988940", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/site/IndustryPage.tsx:114"}, "properties": {"repobilityId": "89a4dfbacad34e5d", "scanner": "scanner-primary", "fingerprint": "0f87d35c3b988940", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-483d8c7cba9df070", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/home/ReviewsSection.tsx:115"}, "properties": {"repobilityId": "8bc26ec5c674db2d", "scanner": "scanner-primary", "fingerprint": "483d8c7cba9df070", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b1bed56f2340e7c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/GBPProductCard.tsx:115"}, "properties": {"repobilityId": "7bcb49700dd54684", "scanner": "scanner-primary", "fingerprint": "b1bed56f2340e7c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c56cd209ce3eebc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/BatchScheduler.tsx:604"}, "properties": {"repobilityId": "b2f3c7b088a97ea9", "scanner": "scanner-primary", "fingerprint": "4c56cd209ce3eebc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bdb975130c9bc8eb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/TemplateTimeline.tsx:56"}, "properties": {"repobilityId": "eb712902733e3cdf", "scanner": "scanner-primary", "fingerprint": "bdb975130c9bc8eb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c66ac661478153d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/CaptionRewriter.tsx:185"}, "properties": {"repobilityId": "095f9b484e1bea57", "scanner": "scanner-primary", "fingerprint": "c66ac661478153d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9676903570229877", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/PostPreview.tsx:130"}, "properties": {"repobilityId": "990e596824aa9f34", "scanner": "scanner-primary", "fingerprint": "9676903570229877", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c99f4a09e9c44728", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/ImagePicker.tsx:310"}, "properties": {"repobilityId": "6b72d0cb9b7e0336", "scanner": "scanner-primary", "fingerprint": "c99f4a09e9c44728", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-05b1f5f60d271ac1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/BlitzPipeline.tsx:58"}, "properties": {"repobilityId": "3791af0e174215e4", "scanner": "scanner-primary", "fingerprint": "05b1f5f60d271ac1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0dbfefb1ac74c1a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/CalendarGrid.tsx:219"}, "properties": {"repobilityId": "38da47e2fec59ba3", "scanner": "scanner-primary", "fingerprint": "0dbfefb1ac74c1a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-213949aea51406a9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/ImagePromptCard.tsx:34"}, "properties": {"repobilityId": "d3d47f9fa9f47807", "scanner": "scanner-primary", "fingerprint": "213949aea51406a9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b97b6a4c9e81c5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/social/OutreachQueue.tsx:71"}, "properties": {"repobilityId": "61649ab364b71e05", "scanner": "scanner-primary", "fingerprint": "9b97b6a4c9e81c5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-477f8807e2300719", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/account/StatusStepper.tsx:19"}, "properties": {"repobilityId": "9f0103aeb698b466", "scanner": "scanner-primary", "fingerprint": "477f8807e2300719", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-68c3e1a5c62bb904", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/account/QuotesList.tsx:44"}, "properties": {"repobilityId": "6bcda3a0583af084", "scanner": "scanner-primary", "fingerprint": "68c3e1a5c62bb904", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f87a21b570cb5a53", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:293"}, "properties": {"repobilityId": "0d72350965068f5b", "scanner": "scanner-primary", "fingerprint": "f87a21b570cb5a53", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8f36d4d9c2495a3f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/about/page.tsx:75"}, "properties": {"repobilityId": "8fd3d3d868e82023", "scanner": "scanner-primary", "fingerprint": "8f36d4d9c2495a3f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-169e376ac415e6e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/quote/page.tsx:550"}, "properties": {"repobilityId": "889d216d8a5adab4", "scanner": "scanner-primary", "fingerprint": "169e376ac415e6e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72b4789d5dae3db8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/contact/page.tsx:63"}, "properties": {"repobilityId": "11ed0cc1fc8f990a", "scanner": "scanner-primary", "fingerprint": "72b4789d5dae3db8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-db68a7b77d97361a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/StaffOrdersActions.tsx:1510"}, "properties": {"repobilityId": "561f7a9085ff02e3", "scanner": "scanner-primary", "fingerprint": "db68a7b77d97361a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-85228c3560a028fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/CustomerHistoryWidget.tsx:172"}, "properties": {"repobilityId": "b91fa499aa51b529", "scanner": "scanner-primary", "fingerprint": "85228c3560a028fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-257050ce1c07e4c9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/page.tsx:38"}, "properties": {"repobilityId": "90e96dd19936023b", "scanner": "scanner-primary", "fingerprint": "257050ce1c07e4c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-467c7b594f54cf5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/customers/page.tsx:58"}, "properties": {"repobilityId": "5ca19d0a972d77fa", "scanner": "scanner-primary", "fingerprint": "467c7b594f54cf5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2b133c3f4585354", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/staff/customers/CustomersTable.tsx:125"}, "properties": {"repobilityId": "07bdd8ba6c75acb7", "scanner": "scanner-primary", "fingerprint": "b2b133c3f4585354", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4eaf42faf582bca1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/customers/CustomersTable.tsx:420"}, "properties": {"repobilityId": "b130a6bf332726f8", "scanner": "scanner-primary", "fingerprint": "4eaf42faf582bca1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0fe8d940efbcc8f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/RefundsPendingPanel.tsx:89"}, "properties": {"repobilityId": "d7245982d95a7224", "scanner": "scanner-primary", "fingerprint": "0fe8d940efbcc8f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7f4f1c1aff4c6b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/SignupsPanel.tsx:131"}, "properties": {"repobilityId": "a1c1be8cc792cdcc", "scanner": "scanner-primary", "fingerprint": "a7f4f1c1aff4c6b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c029ecf35e5e3ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/CartAbandonPanel.tsx:64"}, "properties": {"repobilityId": "f82fe875d95b5d02", "scanner": "scanner-primary", "fingerprint": "4c029ecf35e5e3ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f62436e845dab36f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/BookkeepingRiskPanel.tsx:106"}, "properties": {"repobilityId": "1b6ea2af3b6e32fc", "scanner": "scanner-primary", "fingerprint": "f62436e845dab36f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c74b116e92670cce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/LifecycleTable.tsx:161"}, "properties": {"repobilityId": "6bf50711661ad66c", "scanner": "scanner-primary", "fingerprint": "c74b116e92670cce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c40b3b7265c48ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/WaveDraftPanel.tsx:73"}, "properties": {"repobilityId": "fe63afc958f24d1f", "scanner": "scanner-primary", "fingerprint": "6c40b3b7265c48ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7bbfaedffd1d7f2d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/ActivityFeedPanel.tsx:143"}, "properties": {"repobilityId": "897492121872c618", "scanner": "scanner-primary", "fingerprint": "7bbfaedffd1d7f2d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c5a20ee64a067d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/PendingCouponsPanel.tsx:64"}, "properties": {"repobilityId": "e26e497debfd4820", "scanner": "scanner-primary", "fingerprint": "8c5a20ee64a067d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-077bd3e32028dc9b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/page.tsx:72"}, "properties": {"repobilityId": "096d12be7ca54642", "scanner": "scanner-primary", "fingerprint": "077bd3e32028dc9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-422dadb992377f6c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/HeartbeatsPanel.tsx:81"}, "properties": {"repobilityId": "d880276064ceca81", "scanner": "scanner-primary", "fingerprint": "422dadb992377f6c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a119db26b81e253c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/FailedEmailsPanel.tsx:66"}, "properties": {"repobilityId": "e29bbe9c326180db", "scanner": "scanner-primary", "fingerprint": "a119db26b81e253c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c5fec3c5387bae69", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/IndustryBlitzPanel.tsx:86"}, "properties": {"repobilityId": "1932323d96b6c960", "scanner": "scanner-primary", "fingerprint": "c5fec3c5387bae69", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5435fbf3f48db1ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/StaffActionsPanel.tsx:150"}, "properties": {"repobilityId": "1062dd3e663cb9fb", "scanner": "scanner-primary", "fingerprint": "5435fbf3f48db1ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-872b500205c5c297", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/QuotesPanel.tsx:84"}, "properties": {"repobilityId": "60dd3213b0b7b582", "scanner": "scanner-primary", "fingerprint": "872b500205c5c297", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6348310b6d0dcac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/CouponsPanel.tsx:65"}, "properties": {"repobilityId": "d3358d385448dad5", "scanner": "scanner-primary", "fingerprint": "d6348310b6d0dcac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-978dfcea4d066bce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/lifecycle/customer/[email]/page.tsx:230"}, "properties": {"repobilityId": "90d84548e9c7e94f", "scanner": "scanner-primary", "fingerprint": "978dfcea4d066bce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a0d2ff1f88da731c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/social/image-prompts/page.tsx:72"}, "properties": {"repobilityId": "96950a77c4973433", "scanner": "scanner-primary", "fingerprint": "a0d2ff1f88da731c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07a7db61629e92e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/quotes/page.tsx:71"}, "properties": {"repobilityId": "69aab3a58e7dc93e", "scanner": "scanner-primary", "fingerprint": "07a7db61629e92e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7c276faf00f2ce2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/upload/route.ts:105"}, "properties": {"repobilityId": "10a6a2e5c09bd09e", "scanner": "scanner-primary", "fingerprint": "e7c276faf00f2ce2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2cbb3e7d0d2dfd95", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/quote-request/route.ts:404"}, "properties": {"repobilityId": "e014d73415e5f56d", "scanner": "scanner-primary", "fingerprint": "2cbb3e7d0d2dfd95", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7cd900d1c64d919e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/email/unsubscribe-one-click/route.ts:48"}, "properties": {"repobilityId": "834ea62847543889", "scanner": "scanner-primary", "fingerprint": "7cd900d1c64d919e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19c9939dd22784e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/signup-notify/route.ts:71"}, "properties": {"repobilityId": "ea11a653ec804dde", "scanner": "scanner-primary", "fingerprint": "19c9939dd22784e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-68301901fdbf42f3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/manual-order/route.ts:151"}, "properties": {"repobilityId": "a7c858f884cd4ca2", "scanner": "scanner-primary", "fingerprint": "68301901fdbf42f3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d6fe53c276388803", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/resend-payment/route.ts:123"}, "properties": {"repobilityId": "396009c4b7a935dc", "scanner": "scanner-primary", "fingerprint": "d6fe53c276388803", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d348d5c7bf5b9f6e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/reply/route.ts:128"}, "properties": {"repobilityId": "3549f5618926cf9d", "scanner": "scanner-primary", "fingerprint": "d348d5c7bf5b9f6e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c2d5eb74b10fb5de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/status/route.ts:228"}, "properties": {"repobilityId": "98c730ce6ef2d3af", "scanner": "scanner-primary", "fingerprint": "c2d5eb74b10fb5de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cffe6f4d297ccc0e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/proof/route.ts:207"}, "properties": {"repobilityId": "5400522122a03a72", "scanner": "scanner-primary", "fingerprint": "cffe6f4d297ccc0e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fdc8fd340a311714", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/confirm-etransfer/route.ts:85"}, "properties": {"repobilityId": "221318995cf19b05", "scanner": "scanner-primary", "fingerprint": "fdc8fd340a311714", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6999f2a75d3cc641", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/notes/route.ts:48"}, "properties": {"repobilityId": "f25be2e3c7b24a5c", "scanner": "scanner-primary", "fingerprint": "6999f2a75d3cc641", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f321346e44ab9be", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/orders/[id]/receipt/route.ts:74"}, "properties": {"repobilityId": "eb034711d667d33c", "scanner": "scanner-primary", "fingerprint": "3f321346e44ab9be", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b0c85520e5e78b60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/send-customer-email/route.ts:75"}, "properties": {"repobilityId": "5f9b7c6e0d1534f0", "scanner": "scanner-primary", "fingerprint": "b0c85520e5e78b60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cecf32bd6d6f099d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/customers/[id]/assign-discount/route.ts:147"}, "properties": {"repobilityId": "c833d755d9f6f7a9", "scanner": "scanner-primary", "fingerprint": "cecf32bd6d6f099d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-521b39c26a28d023", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/quotes/[id]/send-quote/route.ts:268"}, "properties": {"repobilityId": "a37686ff0baf6fad", "scanner": "scanner-primary", "fingerprint": "521b39c26a28d023", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2909cfcfce9a3164", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/staff/quotes/[id]/send-reply/route.ts:149"}, "properties": {"repobilityId": "e25248da844ae50b", "scanner": "scanner-primary", "fingerprint": "2909cfcfce9a3164", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a323c387b24986ca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/payment-followup/route.ts:129"}, "properties": {"repobilityId": "b34251df5fdb4b60", "scanner": "scanner-primary", "fingerprint": "a323c387b24986ca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8d54e602cf05b0ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/gsc-backfill/route.ts:111"}, "properties": {"repobilityId": "a592db854710b8ce", "scanner": "scanner-primary", "fingerprint": "8d54e602cf05b0ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-efe1680c0e2dd6c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/aging-orders/route.ts:65"}, "properties": {"repobilityId": "5d3a778ed59343fb", "scanner": "scanner-primary", "fingerprint": "efe1680c0e2dd6c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2710655cd09adbfa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/reconcile-payments/route.ts:272"}, "properties": {"repobilityId": "6f36ff524afe0033", "scanner": "scanner-primary", "fingerprint": "2710655cd09adbfa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-42cfa06b0b258502", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/daily-payment-digest/route.ts:287"}, "properties": {"repobilityId": "adf13fba1cf50514", "scanner": "scanner-primary", "fingerprint": "42cfa06b0b258502", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-38c02997038ab3d3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/stale-quotes/route.ts:120"}, "properties": {"repobilityId": "f3181c802e15dd49", "scanner": "scanner-primary", "fingerprint": "38c02997038ab3d3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b4fcb863565b560d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/keepalive/route.ts:45"}, "properties": {"repobilityId": "7724f355f84cc83c", "scanner": "scanner-primary", "fingerprint": "b4fcb863565b560d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dab0429cfad2ba13", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/gsc-sync/route.ts:103"}, "properties": {"repobilityId": "b889055e57cbc447", "scanner": "scanner-primary", "fingerprint": "dab0429cfad2ba13", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-21d27937c067bf8e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/ga4-sync/route.ts:100"}, "properties": {"repobilityId": "b406697ee8e715b8", "scanner": "scanner-primary", "fingerprint": "21d27937c067bf8e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-17b5c251e7c1f731", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/wave-poll/route.ts:159"}, "properties": {"repobilityId": "dfc8de9e82516af6", "scanner": "scanner-primary", "fingerprint": "17b5c251e7c1f731", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e4b63523e1c3a851", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/account/orders/[id]/upload-file/route.ts:231"}, "properties": {"repobilityId": "d3aecbb70d0b877b", "scanner": "scanner-primary", "fingerprint": "e4b63523e1c3a851", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e9921e65f9f3ee1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/brevo/route.ts:114"}, "properties": {"repobilityId": "e215a2e6d89bcf50", "scanner": "scanner-primary", "fingerprint": "4e9921e65f9f3ee1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-45aac3ae2dbd6b88", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/wave/route.ts:100"}, "properties": {"repobilityId": "9db5738f175ba51e", "scanner": "scanner-primary", "fingerprint": "45aac3ae2dbd6b88", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-970ffb61025c5f60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/clover/route.ts:84"}, "properties": {"repobilityId": "626b9bb2a310b78e", "scanner": "scanner-primary", "fingerprint": "970ffb61025c5f60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-df86e404e2c69284", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/resources/page.tsx:112"}, "properties": {"repobilityId": "1badbe38d112db06", "scanner": "scanner-primary", "fingerprint": "df86e404e2c69284", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98988dfd4c23f87b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/resources/page.tsx:305"}, "properties": {"repobilityId": "e4e255ed6807de53", "scanner": "scanner-primary", "fingerprint": "98988dfd4c23f87b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-814d4947c0e0bb6a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/unsubscribe/page.tsx:40"}, "properties": {"repobilityId": "ab10540097096ede", "scanner": "scanner-primary", "fingerprint": "814d4947c0e0bb6a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-37de935333eb537e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/gallery/page.tsx:69"}, "properties": {"repobilityId": "06b0ccf3c55d8602", "scanner": "scanner-primary", "fingerprint": "37de935333eb537e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e4a720034b36c044", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/portal/[brokerage]/PortalOrderForm.tsx:336"}, "properties": {"repobilityId": "17a46215e32a3a26", "scanner": "scanner-primary", "fingerprint": "e4a720034b36c044", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25cf2ccbc941d866", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/printing-prices-saskatoon/page.tsx:117"}, "properties": {"repobilityId": "2645875ba167c8f6", "scanner": "scanner-primary", "fingerprint": "25cf2ccbc941d866", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-269b60b4540dffe9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/products/[slug]/page.tsx:65"}, "properties": {"repobilityId": "bbc067aa345d1b50", "scanner": "scanner-primary", "fingerprint": "269b60b4540dffe9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0995fa342be16062", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/checkout/page.tsx:873"}, "properties": {"repobilityId": "27177db08dac7f3e", "scanner": "scanner-primary", "fingerprint": "0995fa342be16062", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b23c0fe5cfde30c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/vehicle-decals-saskatoon/page.tsx:80"}, "properties": {"repobilityId": "3e234b8b65316c17", "scanner": "scanner-primary", "fingerprint": "6b23c0fe5cfde30c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a06377fc480c33ed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/accountWelcome.ts:41"}, "properties": {"repobilityId": "55307b25f95d6398", "scanner": "scanner-primary", "fingerprint": "a06377fc480c33ed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-efe30aedc7f8dc60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/statusUpdate.ts:57"}, "properties": {"repobilityId": "66a8236f05f29dee", "scanner": "scanner-primary", "fingerprint": "efe30aedc7f8dc60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5594e257c78e5216", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/paymentRequest.ts:78"}, "properties": {"repobilityId": "2a79266d9540df9a", "scanner": "scanner-primary", "fingerprint": "5594e257c78e5216", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-664d5e767624af07", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/reviewRequest.ts:57"}, "properties": {"repobilityId": "cab209b72f0ab651", "scanner": "scanner-primary", "fingerprint": "664d5e767624af07", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bbd2a24b2cc100a4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/staffNotification.ts:110"}, "properties": {"repobilityId": "fe2ed3371a93595d", "scanner": "scanner-primary", "fingerprint": "bbd2a24b2cc100a4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6dccf2cf1c1e429", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/paymentReceipt.ts:67"}, "properties": {"repobilityId": "a77d10acd236ad87", "scanner": "scanner-primary", "fingerprint": "f6dccf2cf1c1e429", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-11a58e0ca82e6297", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/orderConfirmation.ts:108"}, "properties": {"repobilityId": "945cb9d58b49ef98", "scanner": "scanner-primary", "fingerprint": "11a58e0ca82e6297", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5393ab356a1c4b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/proofSent.ts:54"}, "properties": {"repobilityId": "47ee3cd3e6d1dae8", "scanner": "scanner-primary", "fingerprint": "d5393ab356a1c4b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-70e94f8cbde95c40", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/signupWelcome.ts:174"}, "properties": {"repobilityId": "cea71b20b35f847f", "scanner": "scanner-primary", "fingerprint": "70e94f8cbde95c40", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f97b00e9ed254a5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/analytics/measurementProtocol.ts:72"}, "properties": {"repobilityId": "50f8a66e9e629d56", "scanner": "scanner-primary", "fingerprint": "7f97b00e9ed254a5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8c86e5f2ac6c26ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/brevo/customerSync.ts:133"}, "properties": {"repobilityId": "ebc9c7d75143af2c", "scanner": "scanner-primary", "fingerprint": "8c86e5f2ac6c26ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ce0d4184188693de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pricing/__tests__/sticker-model-v2.test.ts:60"}, "properties": {"repobilityId": "a7a1e121e93fed0e", "scanner": "scanner-primary", "fingerprint": "ce0d4184188693de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-008757a37524bfe8", "level": "warning", "message": {"text": "Privileged port 16 in use"}, "properties": {"repobilityId": "d31009168c502ace", "scanner": "scanner-primary", "fingerprint": "008757a37524bfe8", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/reconcile-payments-cron.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-70c304fe32fe2998", "level": "warning", "message": {"text": "Privileged port 10 in use"}, "properties": {"repobilityId": "735372d6b5594915", "scanner": "scanner-primary", "fingerprint": "70c304fe32fe2998", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/reconcile-payments-cron.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a502090149c2970", "level": "warning", "message": {"text": "Privileged port 14 in use"}, "properties": {"repobilityId": "2dbd4b719a1412ff", "scanner": "scanner-primary", "fingerprint": "7a502090149c2970", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cron-ga4-sync.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c2ab66b016e328aa", "level": "warning", "message": {"text": "Privileged port 13 in use"}, "properties": {"repobilityId": "79d721e4d6f64798", "scanner": "scanner-primary", "fingerprint": "c2ab66b016e328aa", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cron-ga4-sync.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-00d664bf722f39b2", "level": "warning", "message": {"text": "Privileged port 30 in use"}, "properties": {"repobilityId": "54f172e7d16fc662", "scanner": "scanner-primary", "fingerprint": "00d664bf722f39b2", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cron-ga4-sync.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aeb5ba6a33610d17", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/zombie-reconcile-interactive.mjs:22"}, "properties": {"repobilityId": "636bafe38acc269c", "scanner": "scanner-primary", "fingerprint": "aeb5ba6a33610d17", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/zombie-reconcile-interactive.mjs"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-59698e49a1a46512", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/seo-wave-audit.mjs:19"}, "properties": {"repobilityId": "ad0a318cf47d5266", "scanner": "scanner-primary", "fingerprint": "59698e49a1a46512", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/seo-wave-audit.mjs"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-35de5093a51f5a88", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/hooks/seo-wave-guard.mjs:33"}, "properties": {"repobilityId": "2bd78c61fe5611f4", "scanner": "scanner-primary", "fingerprint": "35de5093a51f5a88", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/hooks/seo-wave-guard.mjs"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-c93b4f66dd250001", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/hooks/stop-price-validation.mjs:17"}, "properties": {"repobilityId": "fe2970dc48a728d7", "scanner": "scanner-primary", "fingerprint": "c93b4f66dd250001", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/hooks/stop-price-validation.mjs"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-d59fe6a85689e024", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/hooks/seo-cooldown-check.mjs:30"}, "properties": {"repobilityId": "7308f33122063141", "scanner": "scanner-primary", "fingerprint": "d59fe6a85689e024", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/hooks/seo-cooldown-check.mjs"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-13749ec160096503", "level": "error", "message": {"text": "Possible secret in e2e-playwright/manual-order-e2e.spec.ts"}, "properties": {"repobilityId": "0412aa2bf9d2bdd0", "scanner": "scanner-primary", "fingerprint": "13749ec160096503", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-playwright/manual-order-e2e.spec.ts"}, "region": {"startLine": 235}}}]}, {"ruleId": "scanner-13749ec160096503", "level": "error", "message": {"text": "Possible secret in e2e-playwright/manual-order-e2e.spec.ts"}, "properties": {"repobilityId": "0412aa2bf9d2bdd0", "scanner": "scanner-primary", "fingerprint": "13749ec160096503", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-playwright/manual-order-e2e.spec.ts"}, "region": {"startLine": 322}}}]}, {"ruleId": "scanner-9d63da04fe956e7e", "level": "error", "message": {"text": "Possible secret in e2e-playwright/magic-link-flow.spec.ts"}, "properties": {"repobilityId": "7c82836f96a7fa8d", "scanner": "scanner-primary", "fingerprint": "9d63da04fe956e7e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-playwright/magic-link-flow.spec.ts"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-70d65563f80ffbb5", "level": "error", "message": {"text": "Possible secret in e2e-playwright/helpers/supabase-admin.ts"}, "properties": {"repobilityId": "5e3fb9fe5e6baa91", "scanner": "scanner-primary", "fingerprint": "70d65563f80ffbb5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e-playwright/helpers/supabase-admin.ts"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-f3a4a5883a239b4c", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/components/estimator/QuotePanel.tsx:248"}, "properties": {"repobilityId": "f720f96953c6ef1e", "scanner": "scanner-primary", "fingerprint": "f3a4a5883a239b4c", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/estimator/QuotePanel.tsx"}, "region": {"startLine": 248}}}]}, {"ruleId": "scanner-177fb698b60bf752", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/site/IndustryPage.tsx:114"}, "properties": {"repobilityId": "d588829f5499d81b", "scanner": "scanner-primary", "fingerprint": "177fb698b60bf752", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/site/IndustryPage.tsx"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-874fda5de88326e8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/home/ReviewsSection.tsx:115"}, "properties": {"repobilityId": "78e2091d6d8e0888", "scanner": "scanner-primary", "fingerprint": "874fda5de88326e8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/home/ReviewsSection.tsx"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-1cc0195e6ded89a7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:293"}, "properties": {"repobilityId": "0bca654fa2052eb0", "scanner": "scanner-primary", "fingerprint": "1cc0195e6ded89a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/layout.tsx"}, "region": {"startLine": 293}}}]}, {"ruleId": "scanner-4e27b20a12ce9004", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/about/page.tsx:75"}, "properties": {"repobilityId": "7ba73de1c01fa8e9", "scanner": "scanner-primary", "fingerprint": "4e27b20a12ce9004", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/about/page.tsx"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-68a8243027014d2b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/contact/page.tsx:63"}, "properties": {"repobilityId": "97a54c40ac5659cf", "scanner": "scanner-primary", "fingerprint": "68a8243027014d2b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/contact/page.tsx"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-27c87d1e9eddeb6c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/resources/page.tsx:305"}, "properties": {"repobilityId": "a5fd6af9d7cd75de", "scanner": "scanner-primary", "fingerprint": "27c87d1e9eddeb6c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/resources/page.tsx"}, "region": {"startLine": 305}}}]}, {"ruleId": "scanner-cc19b62c7c86de87", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/gallery/page.tsx:69"}, "properties": {"repobilityId": "1af9499f3e9d5913", "scanner": "scanner-primary", "fingerprint": "cc19b62c7c86de87", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/gallery/page.tsx"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-b24c683e463f4701", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/printing-prices-saskatoon/page.tsx:117"}, "properties": {"repobilityId": "52e41938e377d36b", "scanner": "scanner-primary", "fingerprint": "b24c683e463f4701", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/printing-prices-saskatoon/page.tsx"}, "region": {"startLine": 117}}}]}, {"ruleId": "scanner-b91e2e013b2814be", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/products/[slug]/page.tsx:65"}, "properties": {"repobilityId": "d158475aa8100153", "scanner": "scanner-primary", "fingerprint": "b91e2e013b2814be", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/products/[slug]/page.tsx"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-cf5fe5001917a186", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/vehicle-decals-saskatoon/page.tsx:80"}, "properties": {"repobilityId": "6e03b6cb0ad7b6ec", "scanner": "scanner-primary", "fingerprint": "cf5fe5001917a186", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/vehicle-decals-saskatoon/page.tsx"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-4363fcc36b22794d", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/lib/quoteDocument.ts:108"}, "properties": {"repobilityId": "d30dd42b8ae80713", "scanner": "scanner-primary", "fingerprint": "4363fcc36b22794d", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/quoteDocument.ts"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-fa9c49d3f90f14d5", "level": "note", "message": {"text": "Very large file: src/app/staff/orders/StaffOrdersActions.tsx (1641 lines)"}, "properties": {"repobilityId": "219cda58f421b981", "scanner": "scanner-primary", "fingerprint": "fa9c49d3f90f14d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4ee42c843fdfcdc7", "level": "note", "message": {"text": "Very large file: src/app/staff/lifecycle/data.ts (1211 lines)"}, "properties": {"repobilityId": "874ea4e57b2c4152", "scanner": "scanner-primary", "fingerprint": "4ee42c843fdfcdc7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b5a689c990d3dab8", "level": "note", "message": {"text": "Very large file: src/app/image-sitemap.xml/route.ts (1070 lines)"}, "properties": {"repobilityId": "ab0e3f7d28b55078", "scanner": "scanner-primary", "fingerprint": "b5a689c990d3dab8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c22626d7425cc7c8", "level": "note", "message": {"text": "Very large file: src/app/checkout/page.tsx (1251 lines)"}, "properties": {"repobilityId": "f699f5f098f355f3", "scanner": "scanner-primary", "fingerprint": "c22626d7425cc7c8", "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": "a9ed9946e2a02e89", "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": "222e1e0be4cb7d6b", "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": "4034f486222a2eb3", "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": "eb70e853b54bb974", "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": "298cfe458d7c44f5", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "64ef360aaf7a6458", "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": "2f9aadd0301d06ac", "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": "7090164d5094595a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0c338e4a76f87f75", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/audit-prices.md"}, "properties": {"repobilityId": "a23b441ceff5ae50", "scanner": "scanner-primary", "fingerprint": "0c338e4a76f87f75", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/audit-prices.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6f12a0e4bdbb8926", "level": "none", "message": {"text": "Commented-code block (5 lines) in next.config.ts:321"}, "properties": {"repobilityId": "ae0cf8be9ab35d35", "scanner": "scanner-primary", "fingerprint": "6f12a0e4bdbb8926", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e6c13a8789333dee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-stuck-wave-order.mjs:56"}, "properties": {"repobilityId": "07582751c49e79b3", "scanner": "scanner-primary", "fingerprint": "e6c13a8789333dee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-981f25b371fd82df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-payment-flow.mjs:70"}, "properties": {"repobilityId": "83f12553763723b5", "scanner": "scanner-primary", "fingerprint": "981f25b371fd82df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a65a4c631fb5f1cb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/zombie-reconcile-interactive.mjs:75"}, "properties": {"repobilityId": "a3027b62b89275cf", "scanner": "scanner-primary", "fingerprint": "a65a4c631fb5f1cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5ca67b3c7547c47b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ga4-backfill.mjs:37"}, "properties": {"repobilityId": "8cc73f27638da483", "scanner": "scanner-primary", "fingerprint": "5ca67b3c7547c47b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-19795756b7f258c6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/archive-test-orders.mjs:46"}, "properties": {"repobilityId": "a616a60b15411e9e", "scanner": "scanner-primary", "fingerprint": "19795756b7f258c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0279ebe6796adde0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-wave-negative-unitprice.mjs:21"}, "properties": {"repobilityId": "554c24c97757e97f", "scanner": "scanner-primary", "fingerprint": "0279ebe6796adde0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5a747d3271bbd4df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-stuck-wave-verify.mjs:35"}, "properties": {"repobilityId": "3e81b402d3766e4a", "scanner": "scanner-primary", "fingerprint": "5a747d3271bbd4df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51b38a9e8351dd14", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-clover-stuck-orders.mjs:59"}, "properties": {"repobilityId": "0013295713002e9c", "scanner": "scanner-primary", "fingerprint": "51b38a9e8351dd14", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-018f9a8acd16ce41", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-wave-invoice-ids.mjs:31"}, "properties": {"repobilityId": "c412cb029480f912", "scanner": "scanner-primary", "fingerprint": "018f9a8acd16ce41", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aee584ffe7269b70", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/investigate-drift-zombies.mjs:28"}, "properties": {"repobilityId": "40ea052a08b2a486", "scanner": "scanner-primary", "fingerprint": "aee584ffe7269b70", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-915246ac2a6b144e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/debug-wave.mjs:18"}, "properties": {"repobilityId": "84ae0333724ff8fd", "scanner": "scanner-primary", "fingerprint": "915246ac2a6b144e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-75e23e59a7e114eb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/meta-backfill.mjs:30"}, "properties": {"repobilityId": "ce099d4d47820d98", "scanner": "scanner-primary", "fingerprint": "75e23e59a7e114eb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2238e6c0a441f322", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/build-gbp-upload.py:149"}, "properties": {"repobilityId": "39c95a7a613d0076", "scanner": "scanner-primary", "fingerprint": "2238e6c0a441f322", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a4a852dd7f5bdc5b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-email-flow.mjs:46"}, "properties": {"repobilityId": "2d55cd3556e31bd5", "scanner": "scanner-primary", "fingerprint": "a4a852dd7f5bdc5b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-24420a02a18f24b6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/seo-opportunities.mjs:40"}, "properties": {"repobilityId": "1dcbfa227001b2ac", "scanner": "scanner-primary", "fingerprint": "24420a02a18f24b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d1361e9e05af99da", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-wave-payment.mjs:19"}, "properties": {"repobilityId": "3516e6d4a1cd3da7", "scanner": "scanner-primary", "fingerprint": "d1361e9e05af99da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a40377b349397d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/blitz/build-retail-cohort.mjs:47"}, "properties": {"repobilityId": "108ed0778f199f31", "scanner": "scanner-primary", "fingerprint": "1a40377b349397d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c81afa3664887367", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/blitz/launch-niche-wave.mjs:87"}, "properties": {"repobilityId": "45a865db7b84763a", "scanner": "scanner-primary", "fingerprint": "c81afa3664887367", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4e06f4ba81892ffa", "level": "none", "message": {"text": "Commented-code block (9 lines) in scripts/hooks/price-guard.mjs:8"}, "properties": {"repobilityId": "b09ea208457ec6de", "scanner": "scanner-primary", "fingerprint": "4e06f4ba81892ffa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59cbfc52d35c9279", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/hooks/stop-price-validation.mjs:335"}, "properties": {"repobilityId": "ff104389e9643b81", "scanner": "scanner-primary", "fingerprint": "59cbfc52d35c9279", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f5fecd7e7f1e8ae", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/hooks/post-edit-price-check.mjs:12"}, "properties": {"repobilityId": "c46cbbaa4706a9a7", "scanner": "scanner-primary", "fingerprint": "3f5fecd7e7f1e8ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f15dd7a073094839", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/harness/generate-pay-link.mjs:44"}, "properties": {"repobilityId": "a8c3848d5924338a", "scanner": "scanner-primary", "fingerprint": "f15dd7a073094839", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-939f95e32b973726", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/harness/reconcile-check.mjs:177"}, "properties": {"repobilityId": "07011442876a68fb", "scanner": "scanner-primary", "fingerprint": "939f95e32b973726", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-742e874e11b10e38", "level": "none", "message": {"text": "Commented-code block (7 lines) in e2e-playwright/staff-notification-audio.spec.ts:5"}, "properties": {"repobilityId": "5272a1d2d0cc8bcb", "scanner": "scanner-primary", "fingerprint": "742e874e11b10e38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e26679e1de72e4d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e-playwright/account-dashboard.spec.ts:160"}, "properties": {"repobilityId": "f2b652c19549502f", "scanner": "scanner-primary", "fingerprint": "2e26679e1de72e4d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5371a7ad9386d0f0", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e-playwright/no-min-charge.spec.ts:5"}, "properties": {"repobilityId": "403ae814a93bc6d2", "scanner": "scanner-primary", "fingerprint": "5371a7ad9386d0f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69318489f58a5cfb", "level": "none", "message": {"text": "Commented-code block (9 lines) in seo-prep/wave-3c-printing-near-me-saskatoon.tsx:1"}, "properties": {"repobilityId": "0d5fd311b8f930ce", "scanner": "scanner-primary", "fingerprint": "69318489f58a5cfb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34347c411c6f1923", "level": "none", "message": {"text": "Commented-code block (10 lines) in seo-prep/wave-3c-printing-services-saskatoon.tsx:1"}, "properties": {"repobilityId": "f08338b6b4c89f2f", "scanner": "scanner-primary", "fingerprint": "34347c411c6f1923", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4bd9e45997049d2d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/_archive/QuoteModal.tsx:169"}, "properties": {"repobilityId": "d594d3ea2c7016d6", "scanner": "scanner-primary", "fingerprint": "4bd9e45997049d2d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12b9b19193cbd3d4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/estimator/EmailModal.tsx:120"}, "properties": {"repobilityId": "d0810e54a4cf5213", "scanner": "scanner-primary", "fingerprint": "12b9b19193cbd3d4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b67d2c090c7cf86b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/staff/NotificationListener.tsx:59"}, "properties": {"repobilityId": "082914810a617c87", "scanner": "scanner-primary", "fingerprint": "b67d2c090c7cf86b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb1a2a068c5629f9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/staff/quotes/QuoteCard.tsx:74"}, "properties": {"repobilityId": "4999e808cccad61c", "scanner": "scanner-primary", "fingerprint": "cb1a2a068c5629f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e648b83ee1548f1a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/product/UnifiedConfigurator.tsx:65"}, "properties": {"repobilityId": "e4996c7b4603f660", "scanner": "scanner-primary", "fingerprint": "e648b83ee1548f1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b114d3807b88b2c", "level": "note", "message": {"text": "Legacy-named symbol `tc_promo_banner_v1` in src/components/site/PromoBanner.tsx:15"}, "properties": {"repobilityId": "566f5321f000a23d", "scanner": "scanner-primary", "fingerprint": "8b114d3807b88b2c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7e7473e5fb60009a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/site/UtmCapture.tsx:32"}, "properties": {"repobilityId": "8687fbdfa0d68305", "scanner": "scanner-primary", "fingerprint": "7e7473e5fb60009a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a75c2dd6dbea8c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/home/ReviewsSection.tsx:63"}, "properties": {"repobilityId": "6fdfedc861c45672", "scanner": "scanner-primary", "fingerprint": "9a75c2dd6dbea8c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fd109f23371a553", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/home/HeroSlider.tsx:69"}, "properties": {"repobilityId": "46297e9567fac0c9", "scanner": "scanner-primary", "fingerprint": "7fd109f23371a553", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37858a600d9d3fc4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/BatchScheduler.tsx:102"}, "properties": {"repobilityId": "686ca48d6ed5d95d", "scanner": "scanner-primary", "fingerprint": "37858a600d9d3fc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c91472317911e869", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/CaptionRewriter.tsx:53"}, "properties": {"repobilityId": "0cd2b784e626bbfb", "scanner": "scanner-primary", "fingerprint": "c91472317911e869", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c2bb97a01e610afc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/ComposeForm.tsx:124"}, "properties": {"repobilityId": "8b88f26352b923d7", "scanner": "scanner-primary", "fingerprint": "c2bb97a01e610afc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5411ef5684daba0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/social/LeadsTable.tsx:125"}, "properties": {"repobilityId": "ac418dd8dc4ccafa", "scanner": "scanner-primary", "fingerprint": "d5411ef5684daba0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b4771b76a655f2b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/sitemap.ts:5"}, "properties": {"repobilityId": "1066971082e9c657", "scanner": "scanner-primary", "fingerprint": "b4771b76a655f2b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f0ce39fde06e66a7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/layout.tsx:11"}, "properties": {"repobilityId": "bf6806aedc6e91f4", "scanner": "scanner-primary", "fingerprint": "f0ce39fde06e66a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-89a0a68bfbad734f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/quote/page.tsx:159"}, "properties": {"repobilityId": "e64e5ffda115bab3", "scanner": "scanner-primary", "fingerprint": "89a0a68bfbad734f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-004d9e3f7f784fb8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/page.tsx:168"}, "properties": {"repobilityId": "1747ca6e4e13013e", "scanner": "scanner-primary", "fingerprint": "004d9e3f7f784fb8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ff7eda20bd77808a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/staff/orders/StaffOrdersActions.tsx:262"}, "properties": {"repobilityId": "1a2deeffdd1aa0b2", "scanner": "scanner-primary", "fingerprint": "ff7eda20bd77808a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c91a49e83c6a576", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/staff/orders/OrdersTable.tsx:203"}, "properties": {"repobilityId": "8d18845948141707", "scanner": "scanner-primary", "fingerprint": "2c91a49e83c6a576", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86e1ad782b946fcb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/coupons/CouponsClient.tsx:80"}, "properties": {"repobilityId": "90a5bf76beaade58", "scanner": "scanner-primary", "fingerprint": "86e1ad782b946fcb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-655ca13da35947d5", "level": "none", "message": {"text": "Commented-code block (13 lines) in src/app/staff/lifecycle/data.ts:42"}, "properties": {"repobilityId": "dfcede61474a0281", "scanner": "scanner-primary", "fingerprint": "655ca13da35947d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-073670384fce2cd6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/social/[postId]/page.tsx:56"}, "properties": {"repobilityId": "a81cbe34cee1f860", "scanner": "scanner-primary", "fingerprint": "073670384fce2cd6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36ab75c52c61e198", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/upload/route.ts:63"}, "properties": {"repobilityId": "818141fb3a441f98", "scanner": "scanner-primary", "fingerprint": "36ab75c52c61e198", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fbb24066ee616a25", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/quote-request/route.ts:82"}, "properties": {"repobilityId": "baee877dac2c21ea", "scanner": "scanner-primary", "fingerprint": "fbb24066ee616a25", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93097bc60411c965", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/orders/route.ts:160"}, "properties": {"repobilityId": "b5ff536a31f0c628", "scanner": "scanner-primary", "fingerprint": "93097bc60411c965", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f253e93d92b9f72", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/auth/signup-notify/route.ts:65"}, "properties": {"repobilityId": "89abe1151dc1d3bb", "scanner": "scanner-primary", "fingerprint": "9f253e93d92b9f72", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d914acbee79c12f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/health/route.ts:49"}, "properties": {"repobilityId": "72de4349a2a37a29", "scanner": "scanner-primary", "fingerprint": "2d914acbee79c12f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-909382a8cc180c18", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/staff/manual-order/route.ts:265"}, "properties": {"repobilityId": "99738dc3f438634b", "scanner": "scanner-primary", "fingerprint": "909382a8cc180c18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-65dd8ef0fddc7f40", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/staff/quote/wave/route.ts:138"}, "properties": {"repobilityId": "cc8fec8e89610711", "scanner": "scanner-primary", "fingerprint": "65dd8ef0fddc7f40", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-068d3a68280eddd9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/staff/orders/[id]/confirm-etransfer/route.ts:129"}, "properties": {"repobilityId": "5c3e64c389d1df0d", "scanner": "scanner-primary", "fingerprint": "068d3a68280eddd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85f1865c88200217", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/staff/social/blitz/sync-brevo-lists/route.ts:35"}, "properties": {"repobilityId": "67062de6e2b5dfc3", "scanner": "scanner-primary", "fingerprint": "85f1865c88200217", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-59fc6cce8b3651eb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/staff/social/captions/route.ts:72"}, "properties": {"repobilityId": "4105fb6876664961", "scanner": "scanner-primary", "fingerprint": "59fc6cce8b3651eb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-590a8c4493275254", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/cron/reconcile-payments/route.ts:73"}, "properties": {"repobilityId": "968d766b7dd2bdd5", "scanner": "scanner-primary", "fingerprint": "590a8c4493275254", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e574ef6b7be16e05", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/cron/daily-payment-digest/route.ts:24"}, "properties": {"repobilityId": "81c404502af219b5", "scanner": "scanner-primary", "fingerprint": "e574ef6b7be16e05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-528c59bd54bc2ea9", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/api/webhooks/clover/route.ts:38"}, "properties": {"repobilityId": "8a28ac90987987aa", "scanner": "scanner-primary", "fingerprint": "528c59bd54bc2ea9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-faa6ed7b27e15278", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/order-confirmed/page.tsx:42"}, "properties": {"repobilityId": "9baaf78417ddc8cf", "scanner": "scanner-primary", "fingerprint": "faa6ed7b27e15278", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-063094177177cbdc", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/account/callback/page.tsx:30"}, "properties": {"repobilityId": "19c77358efcf1268", "scanner": "scanner-primary", "fingerprint": "063094177177cbdc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db0b72f98ad0480d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/account/receipt/[id]/page.tsx:87"}, "properties": {"repobilityId": "36b3bee7e679e1dd", "scanner": "scanner-primary", "fingerprint": "db0b72f98ad0480d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93494f273ded08d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/pay/[token]/page.tsx:76"}, "properties": {"repobilityId": "6d3557e28adc55ee", "scanner": "scanner-primary", "fingerprint": "93494f273ded08d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ca0806f9c399c7be", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/checkout/page.tsx:238"}, "properties": {"repobilityId": "a65958a097c9bdc3", "scanner": "scanner-primary", "fingerprint": "ca0806f9c399c7be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3ae67f5a8c554394", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/flags.ts:55"}, "properties": {"repobilityId": "bec058ff720f836e", "scanner": "scanner-primary", "fingerprint": "3ae67f5a8c554394", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3f83e564f5896af", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/email/smtp.ts:103"}, "properties": {"repobilityId": "21ca8dcfbe7d8b72", "scanner": "scanner-primary", "fingerprint": "c3f83e564f5896af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fea418e360695055", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/lib/lifecycle/rollup.ts:106"}, "properties": {"repobilityId": "8821d6df6fc35380", "scanner": "scanner-primary", "fingerprint": "fea418e360695055", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c93b0683bcc8e27", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/blitz/process-replies.ts:53"}, "properties": {"repobilityId": "9a5c8017fa048eae", "scanner": "scanner-primary", "fingerprint": "2c93b0683bcc8e27", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-44d56d96b5843e60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/brevo/customerSync.ts:111"}, "properties": {"repobilityId": "7d02d7eff4263db0", "scanner": "scanner-primary", "fingerprint": "44d56d96b5843e60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c94f248861a06d20", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/engine/index.ts:40"}, "properties": {"repobilityId": "76f653a372e7b8f2", "scanner": "scanner-primary", "fingerprint": "c94f248861a06d20", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72063644728b416d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/engine/__tests__/engine.test.ts:213"}, "properties": {"repobilityId": "f9b85bafdfb99e33", "scanner": "scanner-primary", "fingerprint": "72063644728b416d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5b3df6b17d722bc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pricing/sticker-model-v2.ts:69"}, "properties": {"repobilityId": "f574e22db4cba3f2", "scanner": "scanner-primary", "fingerprint": "e5b3df6b17d722bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22a10834cc241101", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pricing/tax.ts:3"}, "properties": {"repobilityId": "13f8a727aaf05608", "scanner": "scanner-primary", "fingerprint": "22a10834cc241101", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af5def642781a9d6", "level": "note", "message": {"text": "Legacy-named symbol `searchconsole_v1` in src/lib/seo/gsc-client.ts:21"}, "properties": {"repobilityId": "58f3e0cedf45acc9", "scanner": "scanner-primary", "fingerprint": "af5def642781a9d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b8de7af793bf64e6", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/smoke.test.ts:217"}, "properties": {"repobilityId": "d3aa1c9e4d18a7ee", "scanner": "scanner-primary", "fingerprint": "b8de7af793bf64e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8add96a39331650", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/smoke.test.ts:5"}, "properties": {"repobilityId": "2b392871d7cbf33f", "scanner": "scanner-primary", "fingerprint": "e8add96a39331650", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6af648a07c4f5617", "level": "note", "message": {"text": "72 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "f5b46f215a507c37", "scanner": "scanner-primary", "fingerprint": "6af648a07c4f5617", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}