{"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-a8532806f932c225", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-cosrx-snail96-inci.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-cosrx-snail96-inci.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-d5a4a14a565c8e76", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-green-tangerine-correct.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-green-tangerine-correct.ts:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c5adeb0787ea687c", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-curation-v10-8-1.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-curation-v10-8-1.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-403722a4f6eaa0cd", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-image-by-source.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-image-by-source.ts:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-98f8b86bbb248113", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-sunscreen-tier1.ts:196", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-sunscreen-tier1.ts:196"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f849697a0e77ed0b", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-image-url-host.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-image-url-host.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-57a40ff900442001", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-sunscreen-tier2.ts:188", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-sunscreen-tier2.ts:188"}, "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-f6535d945d47fd17", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-bailey-pm.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-bailey-pm.ts:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-92bddfe7e8c8f8dc", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-non-skincare.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-non-skincare.ts:28"}, "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-ed75fb990b9cd230", "name": "Stray `console.log` in TS/JS \u2014 scripts/apply-trending-history.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-trending-history.ts:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-58cddd2a80f53b59", "name": "Stray `console.log` in TS/JS \u2014 scripts/debug-bailey-exclusions.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/debug-bailey-exclusions.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-6b54dbe792844c60", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-backfill.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-backfill.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-d69ffa09bfa36614", "name": "Stray `console.log` in TS/JS \u2014 scripts/normalize-brands.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/normalize-brands.ts:56"}, "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-74b156a0835b9226", "name": "Stray `console.log` in TS/JS \u2014 scripts/relink-bailey-custom-entries.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/relink-bailey-custom-entries.ts:80"}, "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-0f8d4ee8b45364fe", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-location-text.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-location-text.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-086a2ee336a57e30", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-phase-aware-widget.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-phase-aware-widget.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-85327f81b5b2ed7a", "name": "Stray `console.log` in TS/JS \u2014 scripts/smoke-test-bp76.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/smoke-test-bp76.ts:58"}, "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-8e80d01643e1b7d2", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-bailey-product-images.ts:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-bailey-product-images.ts:69"}, "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-07f5d96b3d4b85bb", "name": "Stray `console.log` in TS/JS \u2014 scripts/fast-link.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fast-link.ts:51"}, "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-753dacc98e27c33b", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-import.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-import.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-47f0231c395ace1d", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-curation-v10-8-5.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-curation-v10-8-5.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-35a3c3d5256a7541", "name": "Stray `console.log` in TS/JS \u2014 scripts/enrich-ingredients.ts:116", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/enrich-ingredients.ts:116"}, "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-a8afe9a33237349a", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-image-coverage.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-image-coverage.ts: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-c2b2d1717746b2bf", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-bailey-sub.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-bailey-sub.ts:15"}, "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-19588abefc1f59fd", "name": "Stray `console.log` in TS/JS \u2014 scripts/enrich-stub-products.ts:353", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/enrich-stub-products.ts:353"}, "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-a3a20d8e0464124d", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-postgrest-cap.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-postgrest-cap.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-a36e14200357eb65", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-torriden.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-torriden.ts:35"}, "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-4f11be132b00ade0", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-text-leaks.ts:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-text-leaks.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-03f8e05ccdfcfa59", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-catalog-images.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-catalog-images.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-7db905d84ede6789", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-content-posts.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-content-posts.ts: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-73b15aecb3f0ee03", "name": "Stray `console.log` in TS/JS \u2014 scripts/reprocess-failed.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reprocess-failed.ts:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-711e39b6338f8fef", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-catalog-images.ts:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-catalog-images.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-9b48fd078f9351f7", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-bailey-library-images.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-bailey-library-images.ts:23"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-25960244489111e4", "name": "Stray `console.log` in TS/JS \u2014 scripts/delete-seeded-posts.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/delete-seeded-posts.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5715843ff5c4d065", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-reddit.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-reddit.ts:50"}, "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-6435afdd7110b9ef", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-blog-posts.ts:270", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-blog-posts.ts:270"}, "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-056620b6825b4229", "name": "Stray `console.log` in TS/JS \u2014 scripts/reproduce-api-curated.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reproduce-api-curated.ts:46"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7fa01b5ce6cb4be", "name": "Stray `console.log` in TS/JS \u2014 scripts/canary-resolver-bp76.ts:241", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/canary-resolver-bp76.ts:241"}, "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-d8a01fd84d7f1983", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-price-scraper.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-price-scraper.ts:27"}, "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-53e2ed589a2a7c89", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-water-resistant-sunscreen.ts:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-water-resistant-sunscreen.ts:93"}, "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-ba966ff9f46af9a5", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-review-queue-backfill.ts:167", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-review-queue-backfill.ts:167"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d224bd6fef91718a", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-community-reviews.ts:162", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-community-reviews.ts:162"}, "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-ccaca3ce6df33713", "name": "Stray `console.log` in TS/JS \u2014 scripts/reset-processing.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reset-processing.ts:28"}, "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-461cb6d151f36c81", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-curation-v10-8-2.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-curation-v10-8-2.ts:37"}, "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-2f5c0c1898abd029", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-decision-memory.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-decision-memory.ts:73"}, "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-aecec349693b03c3", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-brands-dedup.ts:90", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-brands-dedup.ts:90"}, "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-c93b69b4cd1aa05d", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-suspect-fits.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-suspect-fits.ts: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-a1472562b03a43ad", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-bestsellers.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-bestsellers.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-3cdd0364056eafc5", "name": "Stray `console.log` in TS/JS \u2014 scripts/numbuzin-fix.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/numbuzin-fix.ts:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5feccdd55af67abe", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-prices.ts:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-prices.ts:81"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-640c999285cb7860", "name": "Stray `console.log` in TS/JS \u2014 scripts/debug-stylekorean.ts:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/debug-stylekorean.ts:4"}, "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-6be3b51df72cdd0f", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-olive-young-prices.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-olive-young-prices.ts:43"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c0cf3245787b0b07", "name": "Stray `console.log` in TS/JS \u2014 scripts/inspect-api-response.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/inspect-api-response.ts:28"}, "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-f950c6ba33df8307", "name": "Stray `console.log` in TS/JS \u2014 scripts/reset-failed.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reset-failed.ts:26"}, "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-1ed0cc806898e393", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-conversation-summaries.ts:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-conversation-summaries.ts:70"}, "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-07dcbfdf017a1d05", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-bailey-phases.ts:246", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-bailey-phases.ts:246"}, "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-8ef9ffa51a340726", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-bailey-summary.ts:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-bailey-summary.ts:83"}, "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-3bcf6d2a848488ac", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-tinted-sunscreen.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-tinted-sunscreen.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-1afc3287b1ef7ac8", "name": "Stray `console.log` in TS/JS \u2014 scripts/create-ai-usage-table.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-ai-usage-table.ts:35"}, "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-3b6980263382b27f", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-cosmetics-pass3.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-cosmetics-pass3.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-4c1399141445e21e", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-cosmetics-pass2.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-cosmetics-pass2.ts:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-983978059b951ab9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/library/LibraryAddModal.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/library/LibraryAddModal.tsx:164"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-332b633cd2aece9e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/library/ProductLibraryCard.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/library/ProductLibraryCard.tsx:176"}, "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-dcd688149def1742", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tracking/ExpiryCard.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tracking/ExpiryCard.tsx:95"}, "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-bdb97d4ff7f65169", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/EnrichmentSections.tsx:368", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/EnrichmentSections.tsx:368"}, "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-b2e1d98bb1fd5a6a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sunscreen/SunscreenCard.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sunscreen/SunscreenCard.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-2b037968bed938cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/IntelligenceWidgets.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/IntelligenceWidgets.tsx:139"}, "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-a75fcc6052af710e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/RecentScansWidget.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/RecentScansWidget.tsx:113"}, "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-cedc5c26478abf42", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/ExpiringProductsWidget.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/ExpiringProductsWidget.tsx:100"}, "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-52d65ba3e38dac1f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/ReformulationAlert.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/ReformulationAlert.tsx:98"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f36718ce726e6c5f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/TrendingProductCard.tsx:26", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/TrendingProductCard.tsx:26"}, "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-7de03f0bb6c0932d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ingredients/IngredientEnrichmentSection.tsx:178", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ingredients/IngredientEnrichmentSection.tsx:178"}, "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-1df599c527bf82fb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/TrendingCard.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/TrendingCard.tsx:194"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d3250dc7638ea75", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/TikTokCapture.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/TikTokCapture.tsx:139"}, "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-82f3312f3a21101b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/CommunityInsights.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/CommunityInsights.tsx:127"}, "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-24667884f2978f81", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/ReviewCard.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/ReviewCard.tsx:80"}, "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-cdea86083a416a8e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/routine/RoutineEffectiveness.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/routine/RoutineEffectiveness.tsx:97"}, "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-d2bb62f24d68b9cc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/routine/AddProductModal.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/routine/AddProductModal.tsx:196"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8efd11306acffac", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/routine/RoutineGenerator.tsx:182", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/routine/RoutineGenerator.tsx:182"}, "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-8adfd3229d670c69", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dupes/DupeCard.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dupes/DupeCard.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-6be54b3cd25cb82a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/scan/ScanResults.tsx:418", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/scan/ScanResults.tsx:418"}, "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-052c09a64dba9047", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/skin-profile/PhasePhotoGallery.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/skin-profile/PhasePhotoGallery.tsx:171"}, "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-8c271697b0f5312c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/products/IngredientList.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/products/IngredientList.tsx:94"}, "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-bba4ffebc29807dd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/products/IngredientPicker.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/products/IngredientPicker.tsx:203"}, "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-7849112124e0ce2a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/products/ProductCard.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/products/ProductCard.tsx:108"}, "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-8f92efc05e4a1fd0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shelf-scan/CollectionGrid.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shelf-scan/CollectionGrid.tsx:68"}, "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-10a1849a5c558efc", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:102", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:102"}, "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-a496612038ef59b5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/blog/page.tsx:99", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/blog/page.tsx:99"}, "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-bd6230af0727776c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/blog/[slug]/page.tsx:235", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/blog/[slug]/page.tsx:235"}, "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-248b5352a7be8b9d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/content/ingest/route.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/content/ingest/route.ts:88"}, "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-aef995b7a270a556", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/guardian-watch/route.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/guardian-watch/route.ts:49"}, "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-0f1a66481afa303a", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/seasonal-adjustments/route.ts:117", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/seasonal-adjustments/route.ts:117"}, "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-2a7f3ee470af050d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/grade-nudge-outcomes/route.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/grade-nudge-outcomes/route.ts:58"}, "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-67374b19d8256790", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/retry-enrichment-queue/route.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/retry-enrichment-queue/route.ts:62"}, "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-722207adcb585de0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/ingredients/page.tsx:167", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/ingredients/page.tsx:167"}, "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-b6224db06942b2d5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/ingredients/[slug]/page.tsx:453", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/ingredients/[slug]/page.tsx:453"}, "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-6917c56aa33d9450", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/tracking/page.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/tracking/page.tsx:177"}, "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-d5516d37329a501d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(app)/browse/[id]/page.tsx:213", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(app)/browse/[id]/page.tsx:213"}, "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-a02472715f58c7f2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/sunscreen/page.tsx:531", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/sunscreen/page.tsx:531"}, "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-328ac546350a434d", "name": "\"active\" state uses light bg in a dark theme \u2014 src/app/(app)/trending/page.tsx:248", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/app/(app)/trending/page.tsx:248"}, "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-18c606f986e73f05", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/routine/page.tsx:317", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/routine/page.tsx:317"}, "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-3b963fc1af36798b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/pipeline/page.tsx:393", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/pipeline/page.tsx:393"}, "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-71b83f7c0e599e62", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/widget/page.tsx:290", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/widget/page.tsx:290"}, "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-f89b9fec780b5681", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dupes/page.tsx:259", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dupes/page.tsx:259"}, "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-6eafa473f4861d8e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profile/page.tsx:229", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profile/page.tsx:229"}, "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-e34f4a1f9081cb9a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/skin-profile/page.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/skin-profile/page.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-75308af9658625b1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/yuri/page.tsx:253", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/yuri/page.tsx:253"}, "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-fd5a7a5dfb09b362", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/products/page.tsx:140", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/products/page.tsx:140"}, "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-81bdcadbc310eba7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/products/[id]/page.tsx:401", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/products/[id]/page.tsx:401"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8ee01feea96a55c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/products/[id]/page.tsx:388", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/products/[id]/page.tsx:388"}, "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-6b5a127caac715d6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/best/page.tsx:167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/best/page.tsx:167"}, "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-bf9bc7d4a20e69b2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/best/page.tsx:125", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/best/page.tsx:125"}, "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-697d6cb91abcb9ab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/best/[category]/page.tsx:464", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/best/[category]/page.tsx:464"}, "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-6a80ae647c4aa4cf", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/best/[category]/page.tsx:352", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/best/[category]/page.tsx:352"}, "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-093343282051170a", "name": "Stray `console.log` in TS/JS \u2014 src/lib/intelligence/trend-scorer.ts:162", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/intelligence/trend-scorer.ts:162"}, "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-b483fcd58b3b8cca", "name": "Stray `console.log` in TS/JS \u2014 src/lib/reddit/mention-scanner.ts:264", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/reddit/mention-scanner.ts:264"}, "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-5843865085c45baa", "name": "Stray `console.log` in TS/JS \u2014 src/lib/reddit/oauth.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/reddit/oauth.ts:73"}, "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-e0f9aee5b647a7ae", "name": "Stray `console.log` in TS/JS \u2014 src/lib/reddit/trend-aggregator.ts:227", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/reddit/trend-aggregator.ts:227"}, "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-a4b5ecc49b1092e1", "name": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/price-matcher.ts:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/price-matcher.ts:127"}, "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-cd13165ac43991ef", "name": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/ingredient-linker.ts:217", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/ingredient-linker.ts:217"}, "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-c5a39c72a67c5383", "name": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/backfill-trending.ts:142", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/backfill-trending.ts:142"}, "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-ecc93319e824950f", "name": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/sources/olive-young.ts:154", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/sources/olive-young.ts: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-5d4ca15ddb3b7167", "name": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/sources/olive-young-bestsellers.ts:235", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/sources/olive-young-bestsellers.ts:235"}, "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-f26a8a00ce286fdb", "name": "Stray `console.log` in TS/JS \u2014 src/lib/yuri/memory.ts:1751", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/yuri/memory.ts:1751"}, "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-3a03244da460ac5c", "name": "Insecure pattern 'dangerous_innerhtml' in CLAUDE.md:327", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in CLAUDE.md:327"}, "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-a75303dc0e830c3d", "name": "Insecure pattern 'node_child_process' in scripts/load-env-run.cjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/load-env-run.cjs:2"}, "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-21fd7dcfc0aff00c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:102", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:102"}, "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-8d2673aec69d8d8b", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/blog/page.tsx:99", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/blog/page.tsx:99"}, "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-7dac84815356af9e", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/blog/[slug]/page.tsx:235", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/blog/[slug]/page.tsx:235"}, "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-531c806dfe505f72", "name": "Insecure pattern 'cors_wildcard' in src/app/api/img/route.ts:101", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/img/route.ts:101"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c737ec25f67052b1", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/ingredients/page.tsx:167", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/ingredients/page.tsx:167"}, "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-7753fab40fd14c15", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/ingredients/[slug]/page.tsx:453", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/ingredients/[slug]/page.tsx:453"}, "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-48f9045d12131b71", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(app)/browse/[id]/page.tsx:213", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(app)/browse/[id]/page.tsx:213"}, "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-5303be948e8b4c6c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/products/page.tsx:140", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/products/page.tsx:140"}, "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-779cfd6f12a69647", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/products/[id]/page.tsx:388", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/products/[id]/page.tsx:388"}, "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-cef8376acef0944c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/best/page.tsx:125", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/best/page.tsx:125"}, "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-cdc6265fe6991ea7", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/best/[category]/page.tsx:352", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/best/[category]/page.tsx:352"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8bf1cace15d2aec2", "name": "Very large file: src/lib/intelligence/product-curation.ts (1332 lines)", "shortDescription": {"text": "Very large file: src/lib/intelligence/product-curation.ts (1332 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-00b9febcc1b7fccf", "name": "Very large file: src/lib/yuri/tools.ts (2810 lines)", "shortDescription": {"text": "Very large file: src/lib/yuri/tools.ts (2810 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-060c71ab4d6a41d4", "name": "Very large file: src/lib/yuri/advisor.ts (1403 lines)", "shortDescription": {"text": "Very large file: src/lib/yuri/advisor.ts (1403 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-771c3d79dcf37503", "name": "Very large file: src/lib/yuri/memory.ts (1945 lines)", "shortDescription": {"text": "Very large file: src/lib/yuri/memory.ts (1945 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": "2 test file(s) for 390 source file(s) (ratio 0.01). 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-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "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 971 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 76 placeholder/mock markers across 36 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests, operator-readme. 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-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7c49d2acdb43102e", "name": "Agent authority lacks a verifier contract: .claude/commands/ai-first-guard.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/ai-first-guard.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-ec1c60ecf392f1b5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 next.config.js:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 next.config.js:79"}, "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-05dc1d983e53b44e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fix-green-tangerine-correct.ts:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fix-green-tangerine-correct.ts:7"}, "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-8adc512cc93df60c", "name": "Commented-code block (6 lines) in scripts/backfill-sunscreen-tier1.ts:39", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/backfill-sunscreen-tier1.ts:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17cbe0e08bbfab89", "name": "Commented-code block (8 lines) in scripts/backfill-sunscreen-tier2.ts:40", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/backfill-sunscreen-tier2.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-9e407d93f26ac7e5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/apply-trending-history.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/apply-trending-history.ts:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51239934cfab9e1a", "name": "Commented-code block (5 lines) in scripts/relink-bailey-custom-entries.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/relink-bailey-custom-entries.ts: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-6b4970a5e25345ab", "name": "Commented-code block (6 lines) in scripts/fast-link.ts:81", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/fast-link.ts:81"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-daeff3109945ab8c", "name": "Commented-code block (5 lines) in scripts/enrich-stub-products.ts:372", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/enrich-stub-products.ts:372"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5ca15e289546af03", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/enrich-stub-products.ts:120", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/enrich-stub-products.ts: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-04b6ddff433ad1c0", "name": "Commented-code block (5 lines) in scripts/reproduce-api-curated.ts:34", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/reproduce-api-curated.ts:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5af24051a75fd1e8", "name": "Commented-code block (12 lines) in scripts/backfill-water-resistant-sunscreen.ts:35", "shortDescription": {"text": "Commented-code block (12 lines) in scripts/backfill-water-resistant-sunscreen.ts:35"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-48e6c8824f5f6ea6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/numbuzin-fix.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/numbuzin-fix.ts:33"}, "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-0fd3affe52bde4c7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/inspect-api-response.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/inspect-api-response.ts: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-36748e40af93c7cc", "name": "Commented-code block (6 lines) in scripts/backfill-tinted-sunscreen.ts:30", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/backfill-tinted-sunscreen.ts: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-cb8180ca8eb2b2eb", "name": "Commented-code block (5 lines) in src/components/library/InRoutineSection.tsx:119", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/library/InRoutineSection.tsx:119"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f43afc6729a70df", "name": "Commented-code block (7 lines) in src/components/ui/LazyImage.tsx:74", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/ui/LazyImage.tsx:74"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dc06bd7bc52ac89e", "name": "Commented-code block (8 lines) in src/components/sunscreen/SunscreenFilters.tsx:56", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/sunscreen/SunscreenFilters.tsx:56"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06ed35ae60cb5f0e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/IntelligenceWidgets.tsx:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/IntelligenceWidgets.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-20986b06cefd7e36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/RecentScansWidget.tsx:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/RecentScansWidget.tsx:49"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2e4b303de0fd30c7", "name": "Legacy-named symbol `ss_scanner_discovery_dismissed_v1` in src/components/dashboard/ScannerDiscoveryBanner.tsx:22", "shortDescription": {"text": "Legacy-named symbol `ss_scanner_discovery_dismissed_v1` in src/components/dashboard/ScannerDiscoveryBanner.tsx:22"}, "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-90bc43f4d2807006", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/YuriNudgeCard.tsx:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/YuriNudgeCard.tsx:36"}, "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-f630f9c7326a8a9d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/SkinProfileWidget.tsx:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/SkinProfileWidget.tsx:41"}, "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-fbb29e7ffd65f467", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ingredients/IngredientEnrichmentSection.tsx:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ingredients/IngredientEnrichmentSection.tsx:90"}, "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-88e9e8aa9192a535", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/community/CommunityInsights.tsx:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/community/CommunityInsights.tsx:67"}, "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-8d83c2b598d0ded2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/routine/CycleAdjustment.tsx:173", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/routine/CycleAdjustment.tsx:173"}, "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-b7c69d8fa684e602", "name": "Commented-code block (5 lines) in src/components/glass-skin/ProgressTimeline.tsx:34", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/glass-skin/ProgressTimeline.tsx:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3d71ccce9de6683c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/scan/ScanResults.tsx:130", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/scan/ScanResults.tsx:130"}, "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-a24c3344d2684fd1", "name": "Commented-code block (5 lines) in src/components/products/ProductEnrichment.tsx:45", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/products/ProductEnrichment.tsx:45"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-581e1d06cd35bddc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/products/ProductEnrichment.tsx:65", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/products/ProductEnrichment.tsx: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-4c277dc6c7226794", "name": "Commented-code block (7 lines) in src/components/products/ProductIntelligenceSection.tsx:29", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/products/ProductIntelligenceSection.tsx:29"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-28747490a25736f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/products/ProductIntelligenceSection.tsx:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/products/ProductIntelligenceSection.tsx:67"}, "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-3ce927cc449b56d4", "name": "Commented-code block (6 lines) in src/components/yuri/ChatInput.tsx:36", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/yuri/ChatInput.tsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe53af759ea8a782", "name": "Commented-code block (5 lines) in src/components/yuri/ChatMessage.tsx:36", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/yuri/ChatMessage.tsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0a5969f5c4bc129", "name": "Commented-code block (6 lines) in src/app/api/library/reactions/route.ts:60", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/library/reactions/route.ts:60"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-63e441bf92028393", "name": "Commented-code block (10 lines) in src/app/api/weather/routine/route.ts:11", "shortDescription": {"text": "Commented-code block (10 lines) in src/app/api/weather/routine/route.ts: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-55ad3cd247edc1fc", "name": "Commented-code block (5 lines) in src/app/api/sunscreen/route.ts:77", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/sunscreen/route.ts:77"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c30c2ee741d9253", "name": "Commented-code block (10 lines) in src/app/api/sunscreen/profile/route.ts:121", "shortDescription": {"text": "Commented-code block (10 lines) in src/app/api/sunscreen/profile/route.ts:121"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c719108a2eb3f854", "name": "Commented-code block (5 lines) in src/app/api/ingredients/[id]/enrichment/route.ts:120", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/ingredients/[id]/enrichment/route.ts:120"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-523fbf9f4101a489", "name": "Commented-code block (5 lines) in src/app/api/routine/generate/route.ts:48", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/routine/generate/route.ts:48"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ab52c4ab82d33b0", "name": "Commented-code block (5 lines) in src/app/api/admin/pipeline/dashboard/route.ts:177", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/admin/pipeline/dashboard/route.ts: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-9ca44cb0883eb1d4", "name": "Commented-code block (5 lines) in src/app/api/admin/products/search/route.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/admin/products/search/route.ts:14"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-67f4f844fe91cc5c", "name": "Commented-code block (9 lines) in src/app/api/cron/proactive-nudge/route.ts:144", "shortDescription": {"text": "Commented-code block (9 lines) in src/app/api/cron/proactive-nudge/route.ts:144"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-40ead1d713857f75", "name": "Commented-code block (5 lines) in src/app/api/widget/chat/route.ts:488", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/widget/chat/route.ts:488"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df23099f5e270c39", "name": "Commented-code block (5 lines) in src/app/api/products/curated/route.ts:116", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/products/curated/route.ts:116"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd280698b57f0db0", "name": "Commented-code block (6 lines) in src/app/api/products/discovery/route.ts:17", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/products/discovery/route.ts:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be34b14d2a6bbe4a", "name": "Commented-code block (5 lines) in src/app/api/yuri/chat/route.ts:108", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/yuri/chat/route.ts:108"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9f708486b11320ba", "name": "Commented-code block (5 lines) in src/app/api/yuri/onboarding/route.ts:358", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/yuri/onboarding/route.ts:358"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27f95cab876306ee", "name": "Commented-code block (5 lines) in src/app/(app)/library/page.tsx:137", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(app)/library/page.tsx:137"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eae24918a6078449", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/tracking/page.tsx:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/tracking/page.tsx:93"}, "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-d9a6b4fde459d95d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/browse/[id]/page.tsx:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/browse/[id]/page.tsx:133"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-335d8074feb2b791", "name": "Commented-code block (8 lines) in src/app/(app)/sunscreen/page.tsx:471", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/(app)/sunscreen/page.tsx:471"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1cb71a0c8544e8d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/sunscreen/page.tsx:161", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/sunscreen/page.tsx:161"}, "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-dd74e3dc4c0ff545", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/trending/page.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/trending/page.tsx: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-9120653bc3457d01", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/community/page.tsx:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/community/page.tsx:63"}, "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-97ecf29b5baae357", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/routine/page.tsx:169", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/routine/page.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-a80b27bc5fbf2ba7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dupes/page.tsx:130", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dupes/page.tsx:130"}, "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-126adb7a8292e8df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/profile/page.tsx:186", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/profile/page.tsx:186"}, "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-9a47a7fbc5bb4c51", "name": "Commented-code block (6 lines) in src/app/(app)/yuri/page.tsx:59", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/(app)/yuri/page.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-d992e5a799dc615f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/yuri/page.tsx:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/yuri/page.tsx:78"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-829b8c7451b2e9dc", "name": "Commented-code block (7 lines) in src/app/products/page.tsx:59", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/products/page.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-e7a1be992d6e36df", "name": "Commented-code block (5 lines) in src/app/products/[id]/page.tsx:242", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/products/[id]/page.tsx:242"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-90acf893ff3c532f", "name": "Commented-code block (6 lines) in src/lib/ai-config.ts:94", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai-config.ts:94"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1fdbdf818f0dc595", "name": "Commented-code block (6 lines) in src/lib/intelligence/skin-breakdown.ts:390", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/intelligence/skin-breakdown.ts:390"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a82c17092525d37", "name": "Commented-code block (13 lines) in src/lib/intelligence/ingredient-overlap.ts:11", "shortDescription": {"text": "Commented-code block (13 lines) in src/lib/intelligence/ingredient-overlap.ts: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-f3052ac183478c07", "name": "Commented-code block (5 lines) in src/lib/intelligence/routine-effectiveness.ts:175", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/intelligence/routine-effectiveness.ts:175"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06df7375436374e6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/intelligence/routine-effectiveness.ts:328", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/intelligence/routine-effectiveness.ts:328"}, "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-c264f63bb20463fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/intelligence/weather-routine.ts:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/intelligence/weather-routine.ts:67"}, "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-cc4578fa6ca14369", "name": "Commented-code block (5 lines) in src/lib/intelligence/ingredient-match.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/intelligence/ingredient-match.ts:41"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e4b29db61cb680d", "name": "Commented-code block (9 lines) in src/lib/intelligence/product-curation.ts:126", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/intelligence/product-curation.ts:126"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b5d7e33c89287d3", "name": "Commented-code block (6 lines) in src/lib/intelligence/nudge-eligibility.ts:184", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/intelligence/nudge-eligibility.ts:184"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57498767eb943c65", "name": "Commented-code block (6 lines) in src/lib/learning/effectiveness.ts:355", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/learning/effectiveness.ts:355"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b7bdf199fe9fd0ac", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/reddit/oauth.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/reddit/oauth.ts:52"}, "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-a2a9bc4c4e15b0fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/pipeline/scraper-base.ts:123", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/pipeline/scraper-base.ts:123"}, "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-c895b4f8abd16298", "name": "Commented-code block (6 lines) in src/lib/pipeline/sources/olive-young.ts:118", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/pipeline/sources/olive-young.ts:118"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5122e16a4ea89bec", "name": "Commented-code block (5 lines) in src/lib/pipeline/sources/olive-young-bestsellers.ts:488", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pipeline/sources/olive-young-bestsellers.ts:488"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-32c73da5331f0177", "name": "Commented-code block (5 lines) in src/lib/scanning/enrich-scan.ts:165", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/scanning/enrich-scan.ts:165"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ec77c1cab04e169", "name": "Commented-code block (6 lines) in src/lib/yuri/voice-cleanup.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/yuri/voice-cleanup.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-828dea1f9f3f62ba", "name": "Commented-code block (12 lines) in src/lib/yuri/tools.ts:83", "shortDescription": {"text": "Commented-code block (12 lines) in src/lib/yuri/tools.ts:83"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11e9f16ffe2c54b6", "name": "Commented-code block (5 lines) in src/lib/yuri/advisor.ts:291", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/yuri/advisor.ts:291"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7042dc64c00ec76", "name": "Commented-code block (5 lines) in src/lib/yuri/memory.ts:294", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/yuri/memory.ts:294"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0b8a115828025a26", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/yuri/memory.ts:1843", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/yuri/memory.ts:1843"}, "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-026a562c23080099", "name": "Commented-code block (6 lines) in src/hooks/useYuri.ts:47", "shortDescription": {"text": "Commented-code block (6 lines) in src/hooks/useYuri.ts:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19087"}, "properties": {"repository": "scottaicode/seoul-sister", "repoUrl": "https://github.com/scottaicode/seoul-sister", "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-a8532806f932c225", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-cosrx-snail96-inci.ts:71"}, "properties": {"repobilityId": "63d017d55fd8e2bc", "scanner": "scanner-primary", "fingerprint": "a8532806f932c225", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5a4a14a565c8e76", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-green-tangerine-correct.ts:19"}, "properties": {"repobilityId": "3feff21912d3f0a0", "scanner": "scanner-primary", "fingerprint": "d5a4a14a565c8e76", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c5adeb0787ea687c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-curation-v10-8-1.ts:41"}, "properties": {"repobilityId": "2e0cca95f0aaebcf", "scanner": "scanner-primary", "fingerprint": "c5adeb0787ea687c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-403722a4f6eaa0cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-image-by-source.ts:33"}, "properties": {"repobilityId": "d5ebb8ad93888ca5", "scanner": "scanner-primary", "fingerprint": "403722a4f6eaa0cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-98f8b86bbb248113", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-sunscreen-tier1.ts:196"}, "properties": {"repobilityId": "41a1c58f20de3ec7", "scanner": "scanner-primary", "fingerprint": "98f8b86bbb248113", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f849697a0e77ed0b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-image-url-host.ts:31"}, "properties": {"repobilityId": "d253e93695ca306b", "scanner": "scanner-primary", "fingerprint": "f849697a0e77ed0b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-57a40ff900442001", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-sunscreen-tier2.ts:188"}, "properties": {"repobilityId": "38e16e59b069c7f7", "scanner": "scanner-primary", "fingerprint": "57a40ff900442001", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6535d945d47fd17", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-bailey-pm.ts:38"}, "properties": {"repobilityId": "3940f0a9304ee04d", "scanner": "scanner-primary", "fingerprint": "f6535d945d47fd17", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-92bddfe7e8c8f8dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-non-skincare.ts:28"}, "properties": {"repobilityId": "92047ea261752c00", "scanner": "scanner-primary", "fingerprint": "92bddfe7e8c8f8dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed75fb990b9cd230", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-trending-history.ts:18"}, "properties": {"repobilityId": "f20c358f53c6706d", "scanner": "scanner-primary", "fingerprint": "ed75fb990b9cd230", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-58cddd2a80f53b59", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/debug-bailey-exclusions.ts:45"}, "properties": {"repobilityId": "24844f30fa61e25b", "scanner": "scanner-primary", "fingerprint": "58cddd2a80f53b59", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6b54dbe792844c60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-backfill.ts:48"}, "properties": {"repobilityId": "d57ce762f1012aa3", "scanner": "scanner-primary", "fingerprint": "6b54dbe792844c60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d69ffa09bfa36614", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/normalize-brands.ts:56"}, "properties": {"repobilityId": "6a91e0d6ef91137e", "scanner": "scanner-primary", "fingerprint": "d69ffa09bfa36614", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-74b156a0835b9226", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/relink-bailey-custom-entries.ts:80"}, "properties": {"repobilityId": "ec2b6d2e2ddd619c", "scanner": "scanner-primary", "fingerprint": "74b156a0835b9226", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f8d4ee8b45364fe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-location-text.ts:71"}, "properties": {"repobilityId": "8a0f2e34466388fe", "scanner": "scanner-primary", "fingerprint": "0f8d4ee8b45364fe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-086a2ee336a57e30", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-phase-aware-widget.ts:48"}, "properties": {"repobilityId": "d31e1ef8ebd7fb56", "scanner": "scanner-primary", "fingerprint": "086a2ee336a57e30", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85327f81b5b2ed7a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/smoke-test-bp76.ts:58"}, "properties": {"repobilityId": "4aa781711adaa04a", "scanner": "scanner-primary", "fingerprint": "85327f81b5b2ed7a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e80d01643e1b7d2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-bailey-product-images.ts:69"}, "properties": {"repobilityId": "bcff9ae8b483afc0", "scanner": "scanner-primary", "fingerprint": "8e80d01643e1b7d2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-07f5d96b3d4b85bb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fast-link.ts:51"}, "properties": {"repobilityId": "2da4763663bcc306", "scanner": "scanner-primary", "fingerprint": "07f5d96b3d4b85bb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-753dacc98e27c33b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-import.ts:57"}, "properties": {"repobilityId": "d390433b115f2957", "scanner": "scanner-primary", "fingerprint": "753dacc98e27c33b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-47f0231c395ace1d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-curation-v10-8-5.ts:54"}, "properties": {"repobilityId": "2ef68dc7917ffad4", "scanner": "scanner-primary", "fingerprint": "47f0231c395ace1d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-35a3c3d5256a7541", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/enrich-ingredients.ts:116"}, "properties": {"repobilityId": "a17472f894babd43", "scanner": "scanner-primary", "fingerprint": "35a3c3d5256a7541", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a8afe9a33237349a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-image-coverage.ts:40"}, "properties": {"repobilityId": "d09795d891760747", "scanner": "scanner-primary", "fingerprint": "a8afe9a33237349a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c2b2d1717746b2bf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-bailey-sub.ts:15"}, "properties": {"repobilityId": "391a3d9d1ee26094", "scanner": "scanner-primary", "fingerprint": "c2b2d1717746b2bf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19588abefc1f59fd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/enrich-stub-products.ts:353"}, "properties": {"repobilityId": "6e59aae8fecd7816", "scanner": "scanner-primary", "fingerprint": "19588abefc1f59fd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a3a20d8e0464124d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-postgrest-cap.ts:41"}, "properties": {"repobilityId": "1d7b8a49cf766844", "scanner": "scanner-primary", "fingerprint": "a3a20d8e0464124d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a36e14200357eb65", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-torriden.ts:35"}, "properties": {"repobilityId": "938b9633fd21ca12", "scanner": "scanner-primary", "fingerprint": "a36e14200357eb65", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4f11be132b00ade0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-text-leaks.ts:123"}, "properties": {"repobilityId": "500273fddc0f8488", "scanner": "scanner-primary", "fingerprint": "4f11be132b00ade0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-03f8e05ccdfcfa59", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-catalog-images.ts:45"}, "properties": {"repobilityId": "878996fcee837ae5", "scanner": "scanner-primary", "fingerprint": "03f8e05ccdfcfa59", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7db905d84ede6789", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-content-posts.ts:40"}, "properties": {"repobilityId": "dcd4c219b52b3102", "scanner": "scanner-primary", "fingerprint": "7db905d84ede6789", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-73b15aecb3f0ee03", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reprocess-failed.ts:14"}, "properties": {"repobilityId": "877e3ea651ec31ec", "scanner": "scanner-primary", "fingerprint": "73b15aecb3f0ee03", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-711e39b6338f8fef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-catalog-images.ts:84"}, "properties": {"repobilityId": "9169562920bef352", "scanner": "scanner-primary", "fingerprint": "711e39b6338f8fef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b48fd078f9351f7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-bailey-library-images.ts:23"}, "properties": {"repobilityId": "a8f285ef5caa911a", "scanner": "scanner-primary", "fingerprint": "9b48fd078f9351f7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25960244489111e4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/delete-seeded-posts.ts:17"}, "properties": {"repobilityId": "115c50fe6e27141a", "scanner": "scanner-primary", "fingerprint": "25960244489111e4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5715843ff5c4d065", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-reddit.ts:50"}, "properties": {"repobilityId": "462a17b21ace5362", "scanner": "scanner-primary", "fingerprint": "5715843ff5c4d065", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6435afdd7110b9ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-blog-posts.ts:270"}, "properties": {"repobilityId": "f074773a544e7c7e", "scanner": "scanner-primary", "fingerprint": "6435afdd7110b9ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-056620b6825b4229", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reproduce-api-curated.ts:46"}, "properties": {"repobilityId": "144534c8c56cbdc8", "scanner": "scanner-primary", "fingerprint": "056620b6825b4229", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d7fa01b5ce6cb4be", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/canary-resolver-bp76.ts:241"}, "properties": {"repobilityId": "e7545b5350888aaf", "scanner": "scanner-primary", "fingerprint": "d7fa01b5ce6cb4be", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8a01fd84d7f1983", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-price-scraper.ts:27"}, "properties": {"repobilityId": "d91c11fba38e0b69", "scanner": "scanner-primary", "fingerprint": "d8a01fd84d7f1983", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-53e2ed589a2a7c89", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-water-resistant-sunscreen.ts:93"}, "properties": {"repobilityId": "01d818aae8512b60", "scanner": "scanner-primary", "fingerprint": "53e2ed589a2a7c89", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ba966ff9f46af9a5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-review-queue-backfill.ts:167"}, "properties": {"repobilityId": "a6dffd07f12a88ec", "scanner": "scanner-primary", "fingerprint": "ba966ff9f46af9a5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d224bd6fef91718a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-community-reviews.ts:162"}, "properties": {"repobilityId": "17f51069d0ccd331", "scanner": "scanner-primary", "fingerprint": "d224bd6fef91718a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ccaca3ce6df33713", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reset-processing.ts:28"}, "properties": {"repobilityId": "cc8d630b9d0352c0", "scanner": "scanner-primary", "fingerprint": "ccaca3ce6df33713", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-461cb6d151f36c81", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-curation-v10-8-2.ts:37"}, "properties": {"repobilityId": "3f2a3cfb3eb5b636", "scanner": "scanner-primary", "fingerprint": "461cb6d151f36c81", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f5c0c1898abd029", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-decision-memory.ts:73"}, "properties": {"repobilityId": "e043803ecdbdde94", "scanner": "scanner-primary", "fingerprint": "2f5c0c1898abd029", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aecec349693b03c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-brands-dedup.ts:90"}, "properties": {"repobilityId": "f0a4ae762a298ae0", "scanner": "scanner-primary", "fingerprint": "aecec349693b03c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c93b69b4cd1aa05d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-suspect-fits.ts:40"}, "properties": {"repobilityId": "68b095bfdacae99d", "scanner": "scanner-primary", "fingerprint": "c93b69b4cd1aa05d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1472562b03a43ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-bestsellers.ts:48"}, "properties": {"repobilityId": "6f5881fb14eaec5a", "scanner": "scanner-primary", "fingerprint": "a1472562b03a43ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3cdd0364056eafc5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/numbuzin-fix.ts:32"}, "properties": {"repobilityId": "06edab8cdc1c5450", "scanner": "scanner-primary", "fingerprint": "3cdd0364056eafc5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5feccdd55af67abe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-prices.ts:81"}, "properties": {"repobilityId": "1375307b43ce371f", "scanner": "scanner-primary", "fingerprint": "5feccdd55af67abe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-640c999285cb7860", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/debug-stylekorean.ts:4"}, "properties": {"repobilityId": "d7ea09948899006a", "scanner": "scanner-primary", "fingerprint": "640c999285cb7860", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6be3b51df72cdd0f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-olive-young-prices.ts:43"}, "properties": {"repobilityId": "aad1248bd59fcc54", "scanner": "scanner-primary", "fingerprint": "6be3b51df72cdd0f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c0cf3245787b0b07", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/inspect-api-response.ts:28"}, "properties": {"repobilityId": "6392681c98b1705c", "scanner": "scanner-primary", "fingerprint": "c0cf3245787b0b07", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f950c6ba33df8307", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reset-failed.ts:26"}, "properties": {"repobilityId": "59d7bf727b315b6e", "scanner": "scanner-primary", "fingerprint": "f950c6ba33df8307", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1ed0cc806898e393", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-conversation-summaries.ts:70"}, "properties": {"repobilityId": "a49c5957cd6593c6", "scanner": "scanner-primary", "fingerprint": "1ed0cc806898e393", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-07dcbfdf017a1d05", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-bailey-phases.ts:246"}, "properties": {"repobilityId": "974f0ddfcd22f0bd", "scanner": "scanner-primary", "fingerprint": "07dcbfdf017a1d05", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ef9ffa51a340726", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-bailey-summary.ts:83"}, "properties": {"repobilityId": "40fa0e4fe8c969c4", "scanner": "scanner-primary", "fingerprint": "8ef9ffa51a340726", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3bcf6d2a848488ac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-tinted-sunscreen.ts:60"}, "properties": {"repobilityId": "a409d9b3f8259a9a", "scanner": "scanner-primary", "fingerprint": "3bcf6d2a848488ac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1afc3287b1ef7ac8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-ai-usage-table.ts:35"}, "properties": {"repobilityId": "5c5d05e62abef74d", "scanner": "scanner-primary", "fingerprint": "1afc3287b1ef7ac8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b6980263382b27f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-cosmetics-pass3.ts:54"}, "properties": {"repobilityId": "f7467d9553594792", "scanner": "scanner-primary", "fingerprint": "3b6980263382b27f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4c1399141445e21e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-cosmetics-pass2.ts:19"}, "properties": {"repobilityId": "fd094be2ca42dae8", "scanner": "scanner-primary", "fingerprint": "4c1399141445e21e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-983978059b951ab9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/library/LibraryAddModal.tsx:164"}, "properties": {"repobilityId": "3ba77bd2727ebb1e", "scanner": "scanner-primary", "fingerprint": "983978059b951ab9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-332b633cd2aece9e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/library/ProductLibraryCard.tsx:176"}, "properties": {"repobilityId": "0ef67d63763ff0e7", "scanner": "scanner-primary", "fingerprint": "332b633cd2aece9e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dcd688149def1742", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tracking/ExpiryCard.tsx:95"}, "properties": {"repobilityId": "92d065c81edf2066", "scanner": "scanner-primary", "fingerprint": "dcd688149def1742", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bdb97d4ff7f65169", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/EnrichmentSections.tsx:368"}, "properties": {"repobilityId": "8146774b2c81cb77", "scanner": "scanner-primary", "fingerprint": "bdb97d4ff7f65169", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2e1d98bb1fd5a6a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sunscreen/SunscreenCard.tsx:58"}, "properties": {"repobilityId": "d10e927bf3e8c71b", "scanner": "scanner-primary", "fingerprint": "b2e1d98bb1fd5a6a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b037968bed938cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/IntelligenceWidgets.tsx:139"}, "properties": {"repobilityId": "8ec64732d487d9b2", "scanner": "scanner-primary", "fingerprint": "2b037968bed938cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a75fcc6052af710e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/RecentScansWidget.tsx:113"}, "properties": {"repobilityId": "d59306801a76e9df", "scanner": "scanner-primary", "fingerprint": "a75fcc6052af710e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cedc5c26478abf42", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/ExpiringProductsWidget.tsx:100"}, "properties": {"repobilityId": "cf0413b41905bc11", "scanner": "scanner-primary", "fingerprint": "cedc5c26478abf42", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-52d65ba3e38dac1f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/ReformulationAlert.tsx:98"}, "properties": {"repobilityId": "7f9840ce0bb4715c", "scanner": "scanner-primary", "fingerprint": "52d65ba3e38dac1f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f36718ce726e6c5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/TrendingProductCard.tsx:26"}, "properties": {"repobilityId": "afb98030b3063b6b", "scanner": "scanner-primary", "fingerprint": "f36718ce726e6c5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7de03f0bb6c0932d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ingredients/IngredientEnrichmentSection.tsx:178"}, "properties": {"repobilityId": "c0e6974817943baf", "scanner": "scanner-primary", "fingerprint": "7de03f0bb6c0932d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1df599c527bf82fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/TrendingCard.tsx:194"}, "properties": {"repobilityId": "36f27588468f7a26", "scanner": "scanner-primary", "fingerprint": "1df599c527bf82fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d3250dc7638ea75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/TikTokCapture.tsx:139"}, "properties": {"repobilityId": "3ed0553eae9806ee", "scanner": "scanner-primary", "fingerprint": "1d3250dc7638ea75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-82f3312f3a21101b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/CommunityInsights.tsx:127"}, "properties": {"repobilityId": "b6103e75d16985c4", "scanner": "scanner-primary", "fingerprint": "82f3312f3a21101b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24667884f2978f81", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/community/ReviewCard.tsx:80"}, "properties": {"repobilityId": "6d4821586b30031a", "scanner": "scanner-primary", "fingerprint": "24667884f2978f81", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cdea86083a416a8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/routine/RoutineEffectiveness.tsx:97"}, "properties": {"repobilityId": "0d66f15d87e3d0d3", "scanner": "scanner-primary", "fingerprint": "cdea86083a416a8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2bb62f24d68b9cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/routine/AddProductModal.tsx:196"}, "properties": {"repobilityId": "096fe07829e2b245", "scanner": "scanner-primary", "fingerprint": "d2bb62f24d68b9cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8efd11306acffac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/routine/RoutineGenerator.tsx:182"}, "properties": {"repobilityId": "ef3728cb574d2432", "scanner": "scanner-primary", "fingerprint": "f8efd11306acffac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8adfd3229d670c69", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dupes/DupeCard.tsx:86"}, "properties": {"repobilityId": "bb25d150a6ab948e", "scanner": "scanner-primary", "fingerprint": "8adfd3229d670c69", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6be54b3cd25cb82a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/scan/ScanResults.tsx:418"}, "properties": {"repobilityId": "3129a94737e77626", "scanner": "scanner-primary", "fingerprint": "6be54b3cd25cb82a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-052c09a64dba9047", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/skin-profile/PhasePhotoGallery.tsx:171"}, "properties": {"repobilityId": "99ddca043e2ab0fa", "scanner": "scanner-primary", "fingerprint": "052c09a64dba9047", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c271697b0f5312c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/products/IngredientList.tsx:94"}, "properties": {"repobilityId": "dccd35aa3db91d5f", "scanner": "scanner-primary", "fingerprint": "8c271697b0f5312c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bba4ffebc29807dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/products/IngredientPicker.tsx:203"}, "properties": {"repobilityId": "eb8673d27c053b5a", "scanner": "scanner-primary", "fingerprint": "bba4ffebc29807dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7849112124e0ce2a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/products/ProductCard.tsx:108"}, "properties": {"repobilityId": "cdfe70d259e4e192", "scanner": "scanner-primary", "fingerprint": "7849112124e0ce2a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f92efc05e4a1fd0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shelf-scan/CollectionGrid.tsx:68"}, "properties": {"repobilityId": "21f79f0a0afb3a3c", "scanner": "scanner-primary", "fingerprint": "8f92efc05e4a1fd0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10a1849a5c558efc", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:102"}, "properties": {"repobilityId": "0d72350965068f5b", "scanner": "scanner-primary", "fingerprint": "10a1849a5c558efc", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a496612038ef59b5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/blog/page.tsx:99"}, "properties": {"repobilityId": "41b4d8ab3226bd10", "scanner": "scanner-primary", "fingerprint": "a496612038ef59b5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-bd6230af0727776c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/blog/[slug]/page.tsx:235"}, "properties": {"repobilityId": "edc166468e8868e7", "scanner": "scanner-primary", "fingerprint": "bd6230af0727776c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-248b5352a7be8b9d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/content/ingest/route.ts:88"}, "properties": {"repobilityId": "529b5e1ff62a3c00", "scanner": "scanner-primary", "fingerprint": "248b5352a7be8b9d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aef995b7a270a556", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/guardian-watch/route.ts:49"}, "properties": {"repobilityId": "a270e55db6dcb7c7", "scanner": "scanner-primary", "fingerprint": "aef995b7a270a556", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f1a66481afa303a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/seasonal-adjustments/route.ts:117"}, "properties": {"repobilityId": "05fe4c2ef25cdc6c", "scanner": "scanner-primary", "fingerprint": "0f1a66481afa303a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a7f3ee470af050d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/grade-nudge-outcomes/route.ts:58"}, "properties": {"repobilityId": "c71ad2704895e8c8", "scanner": "scanner-primary", "fingerprint": "2a7f3ee470af050d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-67374b19d8256790", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/retry-enrichment-queue/route.ts:62"}, "properties": {"repobilityId": "02ea970af4a16980", "scanner": "scanner-primary", "fingerprint": "67374b19d8256790", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-722207adcb585de0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/ingredients/page.tsx:167"}, "properties": {"repobilityId": "b344ddace07db7f6", "scanner": "scanner-primary", "fingerprint": "722207adcb585de0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b6224db06942b2d5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/ingredients/[slug]/page.tsx:453"}, "properties": {"repobilityId": "e89171d7da33cc4e", "scanner": "scanner-primary", "fingerprint": "b6224db06942b2d5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6917c56aa33d9450", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/tracking/page.tsx:177"}, "properties": {"repobilityId": "0fea9b96c9eff2ef", "scanner": "scanner-primary", "fingerprint": "6917c56aa33d9450", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5516d37329a501d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(app)/browse/[id]/page.tsx:213"}, "properties": {"repobilityId": "e000f8c379b4782a", "scanner": "scanner-primary", "fingerprint": "d5516d37329a501d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a02472715f58c7f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/sunscreen/page.tsx:531"}, "properties": {"repobilityId": "0497624e6d8ab818", "scanner": "scanner-primary", "fingerprint": "a02472715f58c7f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-328ac546350a434d", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/app/(app)/trending/page.tsx:248"}, "properties": {"repobilityId": "6b1f3b634225e51d", "scanner": "scanner-primary", "fingerprint": "328ac546350a434d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-18c606f986e73f05", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/routine/page.tsx:317"}, "properties": {"repobilityId": "5d15dff936e403a5", "scanner": "scanner-primary", "fingerprint": "18c606f986e73f05", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b963fc1af36798b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/pipeline/page.tsx:393"}, "properties": {"repobilityId": "6be2342da54b57df", "scanner": "scanner-primary", "fingerprint": "3b963fc1af36798b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71b83f7c0e599e62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/widget/page.tsx:290"}, "properties": {"repobilityId": "94d16dbe61570c66", "scanner": "scanner-primary", "fingerprint": "71b83f7c0e599e62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f89b9fec780b5681", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dupes/page.tsx:259"}, "properties": {"repobilityId": "e48e0ef66e027f80", "scanner": "scanner-primary", "fingerprint": "f89b9fec780b5681", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6eafa473f4861d8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profile/page.tsx:229"}, "properties": {"repobilityId": "463480cedbec4de5", "scanner": "scanner-primary", "fingerprint": "6eafa473f4861d8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e34f4a1f9081cb9a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/skin-profile/page.tsx:185"}, "properties": {"repobilityId": "e67eaff6971f3a0d", "scanner": "scanner-primary", "fingerprint": "e34f4a1f9081cb9a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75308af9658625b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/yuri/page.tsx:253"}, "properties": {"repobilityId": "b537935b165a3e95", "scanner": "scanner-primary", "fingerprint": "75308af9658625b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fd5a7a5dfb09b362", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/products/page.tsx:140"}, "properties": {"repobilityId": "f1c97b129e80f3f1", "scanner": "scanner-primary", "fingerprint": "fd5a7a5dfb09b362", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-81bdcadbc310eba7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/products/[id]/page.tsx:401"}, "properties": {"repobilityId": "24cf18fafed66630", "scanner": "scanner-primary", "fingerprint": "81bdcadbc310eba7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8ee01feea96a55c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/products/[id]/page.tsx:388"}, "properties": {"repobilityId": "4e0c6ab5de509ce0", "scanner": "scanner-primary", "fingerprint": "f8ee01feea96a55c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6b5a127caac715d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/best/page.tsx:167"}, "properties": {"repobilityId": "c8eb4e43d2bf879d", "scanner": "scanner-primary", "fingerprint": "6b5a127caac715d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf9bc7d4a20e69b2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/best/page.tsx:125"}, "properties": {"repobilityId": "5357668efe4f110c", "scanner": "scanner-primary", "fingerprint": "bf9bc7d4a20e69b2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-697d6cb91abcb9ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/best/[category]/page.tsx:464"}, "properties": {"repobilityId": "7f3f6d11f5480584", "scanner": "scanner-primary", "fingerprint": "697d6cb91abcb9ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a80ae647c4aa4cf", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/best/[category]/page.tsx:352"}, "properties": {"repobilityId": "2dfb73935484b7a8", "scanner": "scanner-primary", "fingerprint": "6a80ae647c4aa4cf", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-093343282051170a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/intelligence/trend-scorer.ts:162"}, "properties": {"repobilityId": "a14273dd11fcefab", "scanner": "scanner-primary", "fingerprint": "093343282051170a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b483fcd58b3b8cca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/reddit/mention-scanner.ts:264"}, "properties": {"repobilityId": "208a579447905f04", "scanner": "scanner-primary", "fingerprint": "b483fcd58b3b8cca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5843865085c45baa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/reddit/oauth.ts:73"}, "properties": {"repobilityId": "0bf762f88e931f1e", "scanner": "scanner-primary", "fingerprint": "5843865085c45baa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e0f9aee5b647a7ae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/reddit/trend-aggregator.ts:227"}, "properties": {"repobilityId": "b5b8081d58baf9a0", "scanner": "scanner-primary", "fingerprint": "e0f9aee5b647a7ae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a4b5ecc49b1092e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/price-matcher.ts:127"}, "properties": {"repobilityId": "21430cb457bb486b", "scanner": "scanner-primary", "fingerprint": "a4b5ecc49b1092e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd13165ac43991ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/ingredient-linker.ts:217"}, "properties": {"repobilityId": "33b1a48de12b88f9", "scanner": "scanner-primary", "fingerprint": "cd13165ac43991ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c5a39c72a67c5383", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/backfill-trending.ts:142"}, "properties": {"repobilityId": "6ace318a297c47d6", "scanner": "scanner-primary", "fingerprint": "c5a39c72a67c5383", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ecc93319e824950f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/sources/olive-young.ts:154"}, "properties": {"repobilityId": "fb475c11dffb550d", "scanner": "scanner-primary", "fingerprint": "ecc93319e824950f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d4ca15ddb3b7167", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pipeline/sources/olive-young-bestsellers.ts:235"}, "properties": {"repobilityId": "cbb7c17c97955150", "scanner": "scanner-primary", "fingerprint": "5d4ca15ddb3b7167", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f26a8a00ce286fdb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/yuri/memory.ts:1751"}, "properties": {"repobilityId": "b60c6a5a91fc9815", "scanner": "scanner-primary", "fingerprint": "f26a8a00ce286fdb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3a03244da460ac5c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in CLAUDE.md:327"}, "properties": {"repobilityId": "1d599077e226eef8", "scanner": "scanner-primary", "fingerprint": "3a03244da460ac5c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 327}}}]}, {"ruleId": "scanner-a75303dc0e830c3d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/load-env-run.cjs:2"}, "properties": {"repobilityId": "67f4ccb4e02ce009", "scanner": "scanner-primary", "fingerprint": "a75303dc0e830c3d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/load-env-run.cjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-21fd7dcfc0aff00c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:102"}, "properties": {"repobilityId": "0bca654fa2052eb0", "scanner": "scanner-primary", "fingerprint": "21fd7dcfc0aff00c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/layout.tsx"}, "region": {"startLine": 102}}}]}, {"ruleId": "scanner-8d2673aec69d8d8b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/blog/page.tsx:99"}, "properties": {"repobilityId": "0f7434f401785d28", "scanner": "scanner-primary", "fingerprint": "8d2673aec69d8d8b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/blog/page.tsx"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-7dac84815356af9e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/blog/[slug]/page.tsx:235"}, "properties": {"repobilityId": "df5a2a4c38f975f6", "scanner": "scanner-primary", "fingerprint": "7dac84815356af9e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/blog/[slug]/page.tsx"}, "region": {"startLine": 235}}}]}, {"ruleId": "scanner-531c806dfe505f72", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/img/route.ts:101"}, "properties": {"repobilityId": "e8950cd3fab92673", "scanner": "scanner-primary", "fingerprint": "531c806dfe505f72", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/img/route.ts"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-c737ec25f67052b1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/ingredients/page.tsx:167"}, "properties": {"repobilityId": "77812507f2817364", "scanner": "scanner-primary", "fingerprint": "c737ec25f67052b1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/ingredients/page.tsx"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-7753fab40fd14c15", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/ingredients/[slug]/page.tsx:453"}, "properties": {"repobilityId": "3d84a3c93ef462c4", "scanner": "scanner-primary", "fingerprint": "7753fab40fd14c15", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/ingredients/[slug]/page.tsx"}, "region": {"startLine": 453}}}]}, {"ruleId": "scanner-48f9045d12131b71", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(app)/browse/[id]/page.tsx:213"}, "properties": {"repobilityId": "a4f9f8a656bb0c62", "scanner": "scanner-primary", "fingerprint": "48f9045d12131b71", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(app)/browse/[id]/page.tsx"}, "region": {"startLine": 213}}}]}, {"ruleId": "scanner-5303be948e8b4c6c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/products/page.tsx:140"}, "properties": {"repobilityId": "1427734a6b3fe68d", "scanner": "scanner-primary", "fingerprint": "5303be948e8b4c6c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/products/page.tsx"}, "region": {"startLine": 140}}}]}, {"ruleId": "scanner-779cfd6f12a69647", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/products/[id]/page.tsx:388"}, "properties": {"repobilityId": "1baa2b3159067c68", "scanner": "scanner-primary", "fingerprint": "779cfd6f12a69647", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/products/[id]/page.tsx"}, "region": {"startLine": 388}}}]}, {"ruleId": "scanner-cef8376acef0944c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/best/page.tsx:125"}, "properties": {"repobilityId": "91f3db694d1d48c1", "scanner": "scanner-primary", "fingerprint": "cef8376acef0944c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/best/page.tsx"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-cdc6265fe6991ea7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/best/[category]/page.tsx:352"}, "properties": {"repobilityId": "be8ef9c2c39daa26", "scanner": "scanner-primary", "fingerprint": "cdc6265fe6991ea7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/best/[category]/page.tsx"}, "region": {"startLine": 352}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-8bf1cace15d2aec2", "level": "note", "message": {"text": "Very large file: src/lib/intelligence/product-curation.ts (1332 lines)"}, "properties": {"repobilityId": "c5d9a7981e768677", "scanner": "scanner-primary", "fingerprint": "8bf1cace15d2aec2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-00b9febcc1b7fccf", "level": "note", "message": {"text": "Very large file: src/lib/yuri/tools.ts (2810 lines)"}, "properties": {"repobilityId": "2d6fa14798597123", "scanner": "scanner-primary", "fingerprint": "00b9febcc1b7fccf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-060c71ab4d6a41d4", "level": "note", "message": {"text": "Very large file: src/lib/yuri/advisor.ts (1403 lines)"}, "properties": {"repobilityId": "0c8d4834aa72582b", "scanner": "scanner-primary", "fingerprint": "060c71ab4d6a41d4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-771c3d79dcf37503", "level": "note", "message": {"text": "Very large file: src/lib/yuri/memory.ts (1945 lines)"}, "properties": {"repobilityId": "9fff983207254483", "scanner": "scanner-primary", "fingerprint": "771c3d79dcf37503", "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": "a0297ffaa763baa5", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "1488e14c812cce4e", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "09b45eb4673d1bcb", "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": "d686d451fed16c2d", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "631e0ee1c0c6d7d0", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "bc8913904879355e", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "b8a8e66bd71d76f1", "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": "9b875700f4de48b4", "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": "e6ecdc5daea92d35", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 785}}}]}, {"ruleId": "scanner-7c49d2acdb43102e", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/ai-first-guard.md"}, "properties": {"repobilityId": "a722bf85e8d361d8", "scanner": "scanner-primary", "fingerprint": "7c49d2acdb43102e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/ai-first-guard.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ec1c60ecf392f1b5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 next.config.js:79"}, "properties": {"repobilityId": "190b62c8de06255c", "scanner": "scanner-primary", "fingerprint": "ec1c60ecf392f1b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-05dc1d983e53b44e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fix-green-tangerine-correct.ts:7"}, "properties": {"repobilityId": "6ade28050472c972", "scanner": "scanner-primary", "fingerprint": "05dc1d983e53b44e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8adc512cc93df60c", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/backfill-sunscreen-tier1.ts:39"}, "properties": {"repobilityId": "e789dbe2a27c7b36", "scanner": "scanner-primary", "fingerprint": "8adc512cc93df60c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17cbe0e08bbfab89", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/backfill-sunscreen-tier2.ts:40"}, "properties": {"repobilityId": "aa6e0b3a94a847e8", "scanner": "scanner-primary", "fingerprint": "17cbe0e08bbfab89", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e407d93f26ac7e5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/apply-trending-history.ts:27"}, "properties": {"repobilityId": "225bfedf2b301094", "scanner": "scanner-primary", "fingerprint": "9e407d93f26ac7e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51239934cfab9e1a", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/relink-bailey-custom-entries.ts:11"}, "properties": {"repobilityId": "d5b4deb9265a4eb0", "scanner": "scanner-primary", "fingerprint": "51239934cfab9e1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b4970a5e25345ab", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/fast-link.ts:81"}, "properties": {"repobilityId": "215bce846336d8ba", "scanner": "scanner-primary", "fingerprint": "6b4970a5e25345ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-daeff3109945ab8c", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/enrich-stub-products.ts:372"}, "properties": {"repobilityId": "76b591df905e3e10", "scanner": "scanner-primary", "fingerprint": "daeff3109945ab8c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ca15e289546af03", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/enrich-stub-products.ts:120"}, "properties": {"repobilityId": "6300a3922a8c49db", "scanner": "scanner-primary", "fingerprint": "5ca15e289546af03", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-04b6ddff433ad1c0", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/reproduce-api-curated.ts:34"}, "properties": {"repobilityId": "f4821cbc0fb02558", "scanner": "scanner-primary", "fingerprint": "04b6ddff433ad1c0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5af24051a75fd1e8", "level": "none", "message": {"text": "Commented-code block (12 lines) in scripts/backfill-water-resistant-sunscreen.ts:35"}, "properties": {"repobilityId": "168a614929063ff2", "scanner": "scanner-primary", "fingerprint": "5af24051a75fd1e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48e6c8824f5f6ea6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/numbuzin-fix.ts:33"}, "properties": {"repobilityId": "4673bc74e1fb5bde", "scanner": "scanner-primary", "fingerprint": "48e6c8824f5f6ea6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0fd3affe52bde4c7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/inspect-api-response.ts:40"}, "properties": {"repobilityId": "ed1e61c22c44cfaa", "scanner": "scanner-primary", "fingerprint": "0fd3affe52bde4c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36748e40af93c7cc", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/backfill-tinted-sunscreen.ts:30"}, "properties": {"repobilityId": "84746c1d1916aebc", "scanner": "scanner-primary", "fingerprint": "36748e40af93c7cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb8180ca8eb2b2eb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/library/InRoutineSection.tsx:119"}, "properties": {"repobilityId": "aaa6193cfffa0980", "scanner": "scanner-primary", "fingerprint": "cb8180ca8eb2b2eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f43afc6729a70df", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/ui/LazyImage.tsx:74"}, "properties": {"repobilityId": "ee12776de13d848d", "scanner": "scanner-primary", "fingerprint": "2f43afc6729a70df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc06bd7bc52ac89e", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/sunscreen/SunscreenFilters.tsx:56"}, "properties": {"repobilityId": "4613becf3e22a42f", "scanner": "scanner-primary", "fingerprint": "dc06bd7bc52ac89e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06ed35ae60cb5f0e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/IntelligenceWidgets.tsx:74"}, "properties": {"repobilityId": "c42c1f1e2dea68ec", "scanner": "scanner-primary", "fingerprint": "06ed35ae60cb5f0e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-20986b06cefd7e36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/RecentScansWidget.tsx:49"}, "properties": {"repobilityId": "319b946ca25b98ab", "scanner": "scanner-primary", "fingerprint": "20986b06cefd7e36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e4b303de0fd30c7", "level": "note", "message": {"text": "Legacy-named symbol `ss_scanner_discovery_dismissed_v1` in src/components/dashboard/ScannerDiscoveryBanner.tsx:22"}, "properties": {"repobilityId": "d57024fff64be56d", "scanner": "scanner-primary", "fingerprint": "2e4b303de0fd30c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-90bc43f4d2807006", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/YuriNudgeCard.tsx:36"}, "properties": {"repobilityId": "1162979cf04f1742", "scanner": "scanner-primary", "fingerprint": "90bc43f4d2807006", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f630f9c7326a8a9d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/SkinProfileWidget.tsx:41"}, "properties": {"repobilityId": "51f9660116724683", "scanner": "scanner-primary", "fingerprint": "f630f9c7326a8a9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fbb29e7ffd65f467", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ingredients/IngredientEnrichmentSection.tsx:90"}, "properties": {"repobilityId": "6d0ce14df3ff3cfa", "scanner": "scanner-primary", "fingerprint": "fbb29e7ffd65f467", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-88e9e8aa9192a535", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/community/CommunityInsights.tsx:67"}, "properties": {"repobilityId": "49fbf670806dc633", "scanner": "scanner-primary", "fingerprint": "88e9e8aa9192a535", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8d83c2b598d0ded2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/routine/CycleAdjustment.tsx:173"}, "properties": {"repobilityId": "217d758eb7721674", "scanner": "scanner-primary", "fingerprint": "8d83c2b598d0ded2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b7c69d8fa684e602", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/glass-skin/ProgressTimeline.tsx:34"}, "properties": {"repobilityId": "c068c1b08f096bdd", "scanner": "scanner-primary", "fingerprint": "b7c69d8fa684e602", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d71ccce9de6683c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/scan/ScanResults.tsx:130"}, "properties": {"repobilityId": "4f5c0f71d1578531", "scanner": "scanner-primary", "fingerprint": "3d71ccce9de6683c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a24c3344d2684fd1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/products/ProductEnrichment.tsx:45"}, "properties": {"repobilityId": "ade19d4051e44392", "scanner": "scanner-primary", "fingerprint": "a24c3344d2684fd1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-581e1d06cd35bddc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/products/ProductEnrichment.tsx:65"}, "properties": {"repobilityId": "b06e4cbc721f8d36", "scanner": "scanner-primary", "fingerprint": "581e1d06cd35bddc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4c277dc6c7226794", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/products/ProductIntelligenceSection.tsx:29"}, "properties": {"repobilityId": "645810612d5e0365", "scanner": "scanner-primary", "fingerprint": "4c277dc6c7226794", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-28747490a25736f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/products/ProductIntelligenceSection.tsx:67"}, "properties": {"repobilityId": "dbd2c3c89f7169aa", "scanner": "scanner-primary", "fingerprint": "28747490a25736f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3ce927cc449b56d4", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/yuri/ChatInput.tsx:36"}, "properties": {"repobilityId": "54e301eebd763080", "scanner": "scanner-primary", "fingerprint": "3ce927cc449b56d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe53af759ea8a782", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/yuri/ChatMessage.tsx:36"}, "properties": {"repobilityId": "4efba1c8b1848b98", "scanner": "scanner-primary", "fingerprint": "fe53af759ea8a782", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0a5969f5c4bc129", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/library/reactions/route.ts:60"}, "properties": {"repobilityId": "89abb8e9ea954d61", "scanner": "scanner-primary", "fingerprint": "e0a5969f5c4bc129", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63e441bf92028393", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/app/api/weather/routine/route.ts:11"}, "properties": {"repobilityId": "cb7eaa372e880e50", "scanner": "scanner-primary", "fingerprint": "63e441bf92028393", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55ad3cd247edc1fc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/sunscreen/route.ts:77"}, "properties": {"repobilityId": "1d0df1d05b5cf80c", "scanner": "scanner-primary", "fingerprint": "55ad3cd247edc1fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4c30c2ee741d9253", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/app/api/sunscreen/profile/route.ts:121"}, "properties": {"repobilityId": "614a4493933cea0a", "scanner": "scanner-primary", "fingerprint": "4c30c2ee741d9253", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c719108a2eb3f854", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/ingredients/[id]/enrichment/route.ts:120"}, "properties": {"repobilityId": "04c79a6261343fca", "scanner": "scanner-primary", "fingerprint": "c719108a2eb3f854", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-523fbf9f4101a489", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/routine/generate/route.ts:48"}, "properties": {"repobilityId": "855828735d5ddf2d", "scanner": "scanner-primary", "fingerprint": "523fbf9f4101a489", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ab52c4ab82d33b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/admin/pipeline/dashboard/route.ts:177"}, "properties": {"repobilityId": "98fa3443d51024f3", "scanner": "scanner-primary", "fingerprint": "3ab52c4ab82d33b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ca44cb0883eb1d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/admin/products/search/route.ts:14"}, "properties": {"repobilityId": "0a8788a6f841bc8e", "scanner": "scanner-primary", "fingerprint": "9ca44cb0883eb1d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67f4f844fe91cc5c", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/app/api/cron/proactive-nudge/route.ts:144"}, "properties": {"repobilityId": "ebe496081d1c8cc1", "scanner": "scanner-primary", "fingerprint": "67f4f844fe91cc5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40ead1d713857f75", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/widget/chat/route.ts:488"}, "properties": {"repobilityId": "362af4a0e0de6b4e", "scanner": "scanner-primary", "fingerprint": "40ead1d713857f75", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df23099f5e270c39", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/products/curated/route.ts:116"}, "properties": {"repobilityId": "4c25a8cfcbd14829", "scanner": "scanner-primary", "fingerprint": "df23099f5e270c39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd280698b57f0db0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/products/discovery/route.ts:17"}, "properties": {"repobilityId": "990e33d64f27d010", "scanner": "scanner-primary", "fingerprint": "cd280698b57f0db0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be34b14d2a6bbe4a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/yuri/chat/route.ts:108"}, "properties": {"repobilityId": "117eb220c7aed557", "scanner": "scanner-primary", "fingerprint": "be34b14d2a6bbe4a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f708486b11320ba", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/yuri/onboarding/route.ts:358"}, "properties": {"repobilityId": "249e15a11626a95b", "scanner": "scanner-primary", "fingerprint": "9f708486b11320ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27f95cab876306ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(app)/library/page.tsx:137"}, "properties": {"repobilityId": "aec0a914520efc68", "scanner": "scanner-primary", "fingerprint": "27f95cab876306ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eae24918a6078449", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/tracking/page.tsx:93"}, "properties": {"repobilityId": "e512c1076913d924", "scanner": "scanner-primary", "fingerprint": "eae24918a6078449", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9a6b4fde459d95d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/browse/[id]/page.tsx:133"}, "properties": {"repobilityId": "dda4033bbe4b2bd7", "scanner": "scanner-primary", "fingerprint": "d9a6b4fde459d95d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-335d8074feb2b791", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/(app)/sunscreen/page.tsx:471"}, "properties": {"repobilityId": "55b5bd6b05d38725", "scanner": "scanner-primary", "fingerprint": "335d8074feb2b791", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1cb71a0c8544e8d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/sunscreen/page.tsx:161"}, "properties": {"repobilityId": "1fd468c851ca1d40", "scanner": "scanner-primary", "fingerprint": "c1cb71a0c8544e8d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dd74e3dc4c0ff545", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/trending/page.tsx:82"}, "properties": {"repobilityId": "0840809ed9a5f150", "scanner": "scanner-primary", "fingerprint": "dd74e3dc4c0ff545", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9120653bc3457d01", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/community/page.tsx:63"}, "properties": {"repobilityId": "a44ed685fe0c3e71", "scanner": "scanner-primary", "fingerprint": "9120653bc3457d01", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97ecf29b5baae357", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/routine/page.tsx:169"}, "properties": {"repobilityId": "a27decf695a1c091", "scanner": "scanner-primary", "fingerprint": "97ecf29b5baae357", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a80b27bc5fbf2ba7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dupes/page.tsx:130"}, "properties": {"repobilityId": "c3111a11d2653b40", "scanner": "scanner-primary", "fingerprint": "a80b27bc5fbf2ba7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-126adb7a8292e8df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/profile/page.tsx:186"}, "properties": {"repobilityId": "eb7cd4ddf7aa1fac", "scanner": "scanner-primary", "fingerprint": "126adb7a8292e8df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9a47a7fbc5bb4c51", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/(app)/yuri/page.tsx:59"}, "properties": {"repobilityId": "22575d2a31167e15", "scanner": "scanner-primary", "fingerprint": "9a47a7fbc5bb4c51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d992e5a799dc615f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/yuri/page.tsx:78"}, "properties": {"repobilityId": "089930365319e2dc", "scanner": "scanner-primary", "fingerprint": "d992e5a799dc615f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-829b8c7451b2e9dc", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/products/page.tsx:59"}, "properties": {"repobilityId": "ef82230e24096cf9", "scanner": "scanner-primary", "fingerprint": "829b8c7451b2e9dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7a1be992d6e36df", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/products/[id]/page.tsx:242"}, "properties": {"repobilityId": "8473fe9b225b34b7", "scanner": "scanner-primary", "fingerprint": "e7a1be992d6e36df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90acf893ff3c532f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai-config.ts:94"}, "properties": {"repobilityId": "80093ae88b5dae53", "scanner": "scanner-primary", "fingerprint": "90acf893ff3c532f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1fdbdf818f0dc595", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/intelligence/skin-breakdown.ts:390"}, "properties": {"repobilityId": "461ad63493150376", "scanner": "scanner-primary", "fingerprint": "1fdbdf818f0dc595", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a82c17092525d37", "level": "none", "message": {"text": "Commented-code block (13 lines) in src/lib/intelligence/ingredient-overlap.ts:11"}, "properties": {"repobilityId": "3015b08aad686b75", "scanner": "scanner-primary", "fingerprint": "2a82c17092525d37", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3052ac183478c07", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/intelligence/routine-effectiveness.ts:175"}, "properties": {"repobilityId": "ebab9a1a3d666c04", "scanner": "scanner-primary", "fingerprint": "f3052ac183478c07", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06df7375436374e6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/intelligence/routine-effectiveness.ts:328"}, "properties": {"repobilityId": "022cf71ea4e5f3d5", "scanner": "scanner-primary", "fingerprint": "06df7375436374e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c264f63bb20463fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/intelligence/weather-routine.ts:67"}, "properties": {"repobilityId": "738b165358f0daaa", "scanner": "scanner-primary", "fingerprint": "c264f63bb20463fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cc4578fa6ca14369", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/intelligence/ingredient-match.ts:41"}, "properties": {"repobilityId": "3cb436f2e83e997f", "scanner": "scanner-primary", "fingerprint": "cc4578fa6ca14369", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e4b29db61cb680d", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/intelligence/product-curation.ts:126"}, "properties": {"repobilityId": "585ffe251501a78b", "scanner": "scanner-primary", "fingerprint": "8e4b29db61cb680d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b5d7e33c89287d3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/intelligence/nudge-eligibility.ts:184"}, "properties": {"repobilityId": "c0ae9cc9d3f4829e", "scanner": "scanner-primary", "fingerprint": "7b5d7e33c89287d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57498767eb943c65", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/learning/effectiveness.ts:355"}, "properties": {"repobilityId": "65717393034ea667", "scanner": "scanner-primary", "fingerprint": "57498767eb943c65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7bdf199fe9fd0ac", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/reddit/oauth.ts:52"}, "properties": {"repobilityId": "601e3a6a379fcf30", "scanner": "scanner-primary", "fingerprint": "b7bdf199fe9fd0ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a2a9bc4c4e15b0fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/pipeline/scraper-base.ts:123"}, "properties": {"repobilityId": "5687045010cee3b0", "scanner": "scanner-primary", "fingerprint": "a2a9bc4c4e15b0fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c895b4f8abd16298", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/pipeline/sources/olive-young.ts:118"}, "properties": {"repobilityId": "db405aa82359a48e", "scanner": "scanner-primary", "fingerprint": "c895b4f8abd16298", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5122e16a4ea89bec", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pipeline/sources/olive-young-bestsellers.ts:488"}, "properties": {"repobilityId": "ad61acfd4934987e", "scanner": "scanner-primary", "fingerprint": "5122e16a4ea89bec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-32c73da5331f0177", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/scanning/enrich-scan.ts:165"}, "properties": {"repobilityId": "0f14f30fb51dab80", "scanner": "scanner-primary", "fingerprint": "32c73da5331f0177", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1ec77c1cab04e169", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/yuri/voice-cleanup.ts:1"}, "properties": {"repobilityId": "85aab223ccafc6cc", "scanner": "scanner-primary", "fingerprint": "1ec77c1cab04e169", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-828dea1f9f3f62ba", "level": "none", "message": {"text": "Commented-code block (12 lines) in src/lib/yuri/tools.ts:83"}, "properties": {"repobilityId": "5ce74366dac3abc6", "scanner": "scanner-primary", "fingerprint": "828dea1f9f3f62ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11e9f16ffe2c54b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/yuri/advisor.ts:291"}, "properties": {"repobilityId": "a152b674aec987e3", "scanner": "scanner-primary", "fingerprint": "11e9f16ffe2c54b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7042dc64c00ec76", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/yuri/memory.ts:294"}, "properties": {"repobilityId": "3eb28890417896f8", "scanner": "scanner-primary", "fingerprint": "f7042dc64c00ec76", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b8a115828025a26", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/yuri/memory.ts:1843"}, "properties": {"repobilityId": "7e34a04af02fd524", "scanner": "scanner-primary", "fingerprint": "0b8a115828025a26", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-026a562c23080099", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/hooks/useYuri.ts:47"}, "properties": {"repobilityId": "f0f3c6dbc7e4a13a", "scanner": "scanner-primary", "fingerprint": "026a562c23080099", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}