{"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-4b584a0859fb1a4d", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/test-import.ts:1", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/test-import.ts:1"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f7edccae00026ca", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/app/actions.ts:189", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/app/actions.ts:189"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-110a10c22389578d", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/app/actions.ts:160", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/app/actions.ts:160"}, "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-161080d07be9e489", "name": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/app/lanes/page.tsx:734", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/app/lanes/page.tsx:734"}, "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-c36462b3c2823fec", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/app/lanes/page.tsx:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/app/lanes/page.tsx:65"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-53b1524a99714360", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/app/icon_overview/page.tsx:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/app/icon_overview/page.tsx:74"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3739d45c86b8273c", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/tests/shortlist-delta.test.ts:238", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/tests/shortlist-delta.test.ts:238"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-391d7e8e789430f6", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/tests/shortlist-delta.test.ts:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/tests/shortlist-delta.test.ts:105"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dd96bb62d34ed73f", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/tests/functions-metadata.test.ts:95", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/tests/functions-metadata.test.ts:95"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c9fd5243fba1bdf", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/tests/impression-rejection.test.ts:179", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/tests/impression-rejection.test.ts:179"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b4db7d303d3a597", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-extended-scenarios.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-extended-scenarios.ts:30"}, "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-1932e7be472fe92c", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/retrigger-recipe-icons.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/retrigger-recipe-icons.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-138497c31b0250b9", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-vetting.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-vetting.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-e98f933d4e2eca5f", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-shortlist-entries.ts:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-shortlist-entries.ts:47"}, "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-d50079d82fcb1413", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/pull-db.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/pull-db.ts:44"}, "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-dd9ffc78a4309d4b", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-dupe-recipes.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-dupe-recipes.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-18661a5505b040f3", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-vertex-embedding.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-vertex-embedding.ts:89"}, "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-55abb530a091933c", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/reset-db.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/reset-db.ts:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-29b613bc2ffc3be1", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/audit-icon-schema.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/audit-icon-schema.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-91f7729f256b2989", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-names.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-names.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-e49caf0b9de1cc18", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/prebuild.js:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/prebuild.js: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-93150295b943581a", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-comprehensive.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-comprehensive.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-0e3a7b831b4140f6", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/verify-env.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/verify-env.ts:20"}, "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-507dff1996091013", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/audit-icon-urls.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/audit-icon-urls.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-bfa8278a190889a1", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/eval-icon-vision-terms.ts:107", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/eval-icon-vision-terms.ts:107"}, "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-17ea03aae6143e9a", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/audit-icon-index.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/audit-icon-index.ts:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15c1906afa7c420c", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-recipe-shortlists.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-recipe-shortlists.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-899f792edbd462c4", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/analyze-recipe-ingredients.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/analyze-recipe-ingredients.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-90f2ef7d295d24c1", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-real-recipes.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-real-recipes.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-7d33287bf4125a34", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-genkit.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-genkit.ts:8"}, "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-7980fbac35937c64", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-duplicates.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-duplicates.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-f3430357f1957107", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/reprocess-backgrounds.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/reprocess-backgrounds.ts:30"}, "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-32caa5b27ed32893", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-flow.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-flow.ts:24"}, "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-cdd87bdd98f7618e", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/export-icon-index.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/export-icon-index.ts:39"}, "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-10f00b950e4ced57", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-search-terms.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-search-terms.ts:44"}, "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-4f4294d1a5c867e7", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/debug-recipe-nodes.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/debug-recipe-nodes.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-043a6902543174e3", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/migrate-icon-struct.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/migrate-icon-struct.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-8800299c2143ca2e", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-recipes.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-recipes.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-af5fefec1c358381", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-index.ts:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-index.ts:72"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-049882b54038238d", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/search-test.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/search-test.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-3860774fcc843531", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/fetch-real-icons.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/fetch-real-icons.ts:24"}, "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-69ee39337937ac77", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backup-staging.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backup-staging.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d62851d40ceab0ed", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/migrate-recipe-icons.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/migrate-recipe-icons.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-fab7d840d918ed15", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/create-icon-index.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/create-icon-index.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-3b4d04e00de60e5c", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-search-terms.ts:177", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-search-terms.ts:177"}, "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-fbfa5c1b740929eb", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/debug-adjust.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/debug-adjust.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-10138fe9f2eee8a8", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/analyze-ingredients.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/analyze-ingredients.ts:39"}, "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-fcd10155f178b482", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/reprocess-recipes.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/reprocess-recipes.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-adc83d502d1ef249", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-chat-adjust.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-chat-adjust.ts:34"}, "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-28e8e893359e1765", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/migrate-ingredients.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/migrate-ingredients.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-f174cdda4b90d40c", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-embeddings.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-embeddings.ts:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7401d2195d6061c5", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/verify-bg-removal.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/verify-bg-removal.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9b1ee3398015341", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icons-flat.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icons-flat.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-1956b23c903236ba", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/repair-queue.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/repair-queue.ts:16"}, "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-6dff09201300d286", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-search.ts:153", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-search.ts:153"}, "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-44d6a995182c8512", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/make-admin.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/make-admin.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-a9777973ed04cf86", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-debug-recipes.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-debug-recipes.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-6c3f8583fe25ae01", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-metadata.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-metadata.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc7f65159923c8dd", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-zombies.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-zombies.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc71133059a9b8c9", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-deletion-sync.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-deletion-sync.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-f35f0a51a34e0530", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/eval-embeddings.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/eval-embeddings.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-59df868e60acf79f", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/check-queue.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/check-queue.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2e60e9eacbd7c6ea", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-thumbs.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-thumbs.ts:30"}, "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-b0b10b6e173d4db6", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/list-models.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/list-models.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-fe838220974fa19e", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-placeholders.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-placeholders.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-c310fda0fc7d025a", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-integrity.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-integrity.ts:24"}, "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-d74d4c6c7cfb1c6c", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-visual-description.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-visual-description.ts:34"}, "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-8950c1c9bfe3f9a1", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/fix-broken-icons.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/fix-broken-icons.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-47087ccd72d8e65d", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/fix-stuck-recipes.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/fix-stuck-recipes.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-180fce8d34f5f9f1", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/fix-phantom-icons.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/fix-phantom-icons.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-2b879baab0c31c09", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/dump-search-terms.ts:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/dump-search-terms.ts:63"}, "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-e35bdad1d6d3964f", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/find-icon.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/find-icon.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-84baa3b686bf28f1", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-ing-struct.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-ing-struct.ts:9"}, "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-af161e4919c24f7d", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/quick-log-fetch.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/quick-log-fetch.ts:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d22298076cf1cc4a", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-recipe-nodes.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-recipe-nodes.ts:7"}, "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-8db699e20b6e0e5c", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/list-icons.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/list-icons.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-c6f5d0c88b42310c", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/cloud-timeline.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/cloud-timeline.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-4171f0d1e4bc2e87", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/inspect-db.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/inspect-db.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-9fb03adce4120f44", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/analyze-recipe.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/analyze-recipe.ts:16"}, "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-11499d1ffe4deb42", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/recipe-logs.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/recipe-logs.ts:8"}, "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-18e687f09e1861c9", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/dump-node.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/dump-node.ts:9"}, "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-454ae74b254b2040", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/debug-resolve.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/debug-resolve.ts:12"}, "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-855ab7eb145a4acd", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/list-nodes.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/list-nodes.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b78b38b35a2aff0", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-db.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-db.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f8a978def7387f7b", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/list-latest-recipes.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/list-latest-recipes.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-09cd15312c1c69f9", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/forensics-query.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/forensics-query.ts:8"}, "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-bb914e7fc182a712", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/debug-cache.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/debug-cache.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-0badc1ecc35e5b05", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/test-connection.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/test-connection.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d16139c057ef72e", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-icon.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-icon.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-c5c3d4170fc6674a", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/lib/db-tools.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/lib/db-tools.ts:99"}, "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-72562aa781765c1e", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/scripts/download-model.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/scripts/download-model.js:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3c29fbc8681eeac0", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/src/index.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/src/index.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-8d8248c21d82489e", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/src/icon-generator.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/src/icon-generator.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c97659e6c3414126", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/src/vector-search/index.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/src/vector-search/index.ts:24"}, "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-11edc2c3ea442070", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/auth-provider.tsx:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/auth-provider.tsx:52"}, "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-c6118c81b2bd4508", "name": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/components/queue-monitor.tsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/components/queue-monitor.tsx:138"}, "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-aca7894ebf3845bb", "name": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/components/shared-gallery.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/components/shared-gallery.tsx:125"}, "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-e5db553784ac2131", "name": "React Flow <Controls> without dark theming \u2014 recipe-lanes/components/recipe-lanes/react-flow-diagram.tsx:818", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 recipe-lanes/components/recipe-lanes/react-flow-diagram.tsx:818"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a612803d8ea858c8", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/components/recipe-lanes/react-flow-diagram.tsx:527", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/components/recipe-lanes/react-flow-diagram.tsx:527"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5f0fa4e370109063", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/recipe-lanes/hooks/useSaveAndFork.ts:151", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/recipe-lanes/hooks/useSaveAndFork.ts:151"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-902a8a95b221cbd4", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/recipe-lanes/hooks/useHistoryManager.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/recipe-lanes/hooks/useHistoryManager.ts:64"}, "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-dd2676c71590acb3", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/recipe-lanes/nodes/minimal-node.tsx:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/recipe-lanes/nodes/minimal-node.tsx:130"}, "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-ff68dc77de95452f", "name": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/components/recipe-lanes/ui/ingredients-sidebar.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/components/recipe-lanes/ui/ingredients-sidebar.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-db3b55857c68bd23", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/server-vector-search.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/server-vector-search.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-ef1d5df2d4298df6", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/flows.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/flows.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5cdbd369f17e8095", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/firebase-client.ts:59", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/firebase-client.ts:59"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7f4ec39c51efc86", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/firebase-admin.js:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/firebase-admin.js:76"}, "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-3b008d7f18faede3", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/data-service.ts:346", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/data-service.ts:346"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-383d00b273c79141", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/data-service.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/data-service.ts:111"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3f973f114403a1ad", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/ai-service.ts:128", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/ai-service.ts:128"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f79585ce3b1c2022", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/ai-service.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/ai-service.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-4c10e4acb3006e05", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/firebase-admin.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/firebase-admin.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-bfec1b82ed7b1fe0", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/recipe-lanes/layout.ts:241", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/recipe-lanes/layout.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-42d8c7789a0a815a", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/recipe-lanes/types.ts:151", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/recipe-lanes/types.ts:151"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e52abf168659ef7", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/e2e/graph.spec.ts:124", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/e2e/graph.spec.ts:124"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20f36cc73ffcf7b5", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/e2e/icons.spec.ts:69", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/e2e/icons.spec.ts:69"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a372f9d761d76be8", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/loading.spec.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/loading.spec.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-150c7eb1feb4d662", "name": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/e2e/regressions.spec.ts:169", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/e2e/regressions.spec.ts:169"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a6d370dbb5a8982", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/layout-mode-persistence.spec.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/layout-mode-persistence.spec.ts:44"}, "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-151aa417900f28ee", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/fixtures.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/fixtures.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-6880cdab11935495", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/admin-utils.ts:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/admin-utils.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-3ddf480e4b16ffbb", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/screenshot.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/screenshot.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-e79c6454d6d59120", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/seed-data.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/seed-data.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-08c099e99b12913b", "name": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/actions.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/actions.ts:74"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7bcc5907b8adf11b", "name": "Runtime dotenv file present in repo: recipe-lanes/.env.test", "shortDescription": {"text": "Runtime dotenv file present in repo: recipe-lanes/.env.test"}, "fullDescription": {"text": "`recipe-lanes/.env.test` looks like a runtime dotenv file. It contains secret-looking assignments for NEXT_PUBLIC_FIREBASE_API_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-f39fcf6a8776894f", "name": "Insecure pattern 'node_child_process' in recipe-lanes/scripts/investigation/quick-log-fetch.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in recipe-lanes/scripts/investigation/quick-log-fetch.ts:1"}, "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-92a0e210c49d0ab8", "name": "Insecure pattern 'node_child_process' in recipe-lanes/scripts/investigation/cloud-timeline.ts:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in recipe-lanes/scripts/investigation/cloud-timeline.ts:6"}, "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-96e84e54f5574c61", "name": "Insecure pattern 'node_child_process' in recipe-lanes/scripts/investigation/recipe-logs.ts:45", "shortDescription": {"text": "Insecure pattern 'node_child_process' in recipe-lanes/scripts/investigation/recipe-logs.ts:45"}, "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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d7e8d370403d6cd", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e21f19e6855b894f", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d2284d459f0f8d6", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ec7f8d5552853d0", "name": "Very large file: recipe-lanes/app/lanes/page.tsx (1253 lines)", "shortDescription": {"text": "Very large file: recipe-lanes/app/lanes/page.tsx (1253 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-a229b546ca2e79f2", "name": "Very large file: recipe-lanes/lib/data-service.ts (1816 lines)", "shortDescription": {"text": "Very large file: recipe-lanes/lib/data-service.ts (1816 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 900 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 38 placeholder/mock markers across 17 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.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-ab776c4d4705906b", "name": "Agent authority lacks a verifier contract: skills/verify-app/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: skills/verify-app/SKILL.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-d67aa48e76ed9bc2", "name": "Commented-code block (5 lines) in recipe-lanes/app/actions.ts:97", "shortDescription": {"text": "Commented-code block (5 lines) in recipe-lanes/app/actions.ts:97"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ef657ba4f3ae77d", "name": "Commented-code block (6 lines) in recipe-lanes/app/lanes/page.tsx:374", "shortDescription": {"text": "Commented-code block (6 lines) in recipe-lanes/app/lanes/page.tsx:374"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5f361e02a4eeaf31", "name": "Commented-code block (6 lines) in recipe-lanes/tests/shortlist-delta.test.ts:159", "shortDescription": {"text": "Commented-code block (6 lines) in recipe-lanes/tests/shortlist-delta.test.ts:159"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e15caeb8c4d5b5d", "name": "Commented-code block (6 lines) in recipe-lanes/tests/verify-production-logic.test.ts:28", "shortDescription": {"text": "Commented-code block (6 lines) in recipe-lanes/tests/verify-production-logic.test.ts:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6128c7be9b91a6e2", "name": "Commented-code block (6 lines) in recipe-lanes/tests/icon-shortlist.test.ts:423", "shortDescription": {"text": "Commented-code block (6 lines) in recipe-lanes/tests/icon-shortlist.test.ts:423"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6bca246deaed1263", "name": "Commented-code block (10 lines) in recipe-lanes/tests/icon-index.test.ts:58", "shortDescription": {"text": "Commented-code block (10 lines) in recipe-lanes/tests/icon-index.test.ts:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17e2b2471b39ee0c", "name": "Commented-code block (7 lines) in recipe-lanes/tests/icon-pipeline.test.ts:334", "shortDescription": {"text": "Commented-code block (7 lines) in recipe-lanes/tests/icon-pipeline.test.ts:334"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df885b3021f7a2f1", "name": "Commented-code block (5 lines) in recipe-lanes/tests/forge-gate-regression.test.ts:16", "shortDescription": {"text": "Commented-code block (5 lines) in recipe-lanes/tests/forge-gate-regression.test.ts:16"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e35d64c43c1f875c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-vertex-embedding.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-vertex-embedding.ts:54"}, "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-8fe2d497a96a1acb", "name": "Commented-code block (5 lines) in recipe-lanes/scripts/prebuild.js:8", "shortDescription": {"text": "Commented-code block (5 lines) in recipe-lanes/scripts/prebuild.js:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b474cf15bdb3e7a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/eval-icon-vision-terms.ts:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/eval-icon-vision-terms.ts:64"}, "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-b54d2750c49b2b4e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-search-terms.ts:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-search-terms.ts: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-097a0960937fcee1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-icon-index.ts:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-icon-index.ts:43"}, "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-9522896d9d137e43", "name": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/search-test.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/search-test.ts:22"}, "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-4071f3d1344e3c3e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/fetch-real-icons.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/fetch-real-icons.ts:39"}, "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-b3f28d0c6b15325d", "name": "Legacy-named symbol `staging_backup` in recipe-lanes/scripts/backup-staging.ts:24", "shortDescription": {"text": "Legacy-named symbol `staging_backup` in recipe-lanes/scripts/backup-staging.ts:24"}, "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-d9109930b1e47d1e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-icon-search-terms.ts:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-icon-search-terms.ts:86"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a180183e062e99e2", "name": "Commented-code block (5 lines) in recipe-lanes/scripts/test-search.ts:40", "shortDescription": {"text": "Commented-code block (5 lines) in recipe-lanes/scripts/test-search.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-e22ebb79cada51ba", "name": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/components/auth-provider.tsx:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/components/auth-provider.tsx:76"}, "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-7c8d13286e9a1ab6", "name": "Commented-code block (8 lines) in recipe-lanes/components/recipe-lanes/react-flow-diagram.tsx:226", "shortDescription": {"text": "Commented-code block (8 lines) in recipe-lanes/components/recipe-lanes/react-flow-diagram.tsx:226"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-12161c4b5c669a95", "name": "Commented-code block (7 lines) in recipe-lanes/components/recipe-lanes/nodes/minimal-node-classic.tsx:69", "shortDescription": {"text": "Commented-code block (7 lines) in recipe-lanes/components/recipe-lanes/nodes/minimal-node-classic.tsx:69"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b340a4940c69099b", "name": "Commented-code block (7 lines) in recipe-lanes/lib/icon-queue-config.ts:33", "shortDescription": {"text": "Commented-code block (7 lines) in recipe-lanes/lib/icon-queue-config.ts:33"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-67b771cbdd00534f", "name": "Commented-code block (6 lines) in recipe-lanes/lib/flows.ts:44", "shortDescription": {"text": "Commented-code block (6 lines) in recipe-lanes/lib/flows.ts:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cad0419869d87e00", "name": "Commented-code block (7 lines) in recipe-lanes/lib/data-service.ts:194", "shortDescription": {"text": "Commented-code block (7 lines) in recipe-lanes/lib/data-service.ts:194"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-429a4c56f47cd937", "name": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/lib/ai-service.ts:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/lib/ai-service.ts:85"}, "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-77bbf0d12a2519e2", "name": "Commented-code block (7 lines) in recipe-lanes/lib/recipe-lanes/model-utils.ts:308", "shortDescription": {"text": "Commented-code block (7 lines) in recipe-lanes/lib/recipe-lanes/model-utils.ts:308"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-55886faad5000f87", "name": "Commented-code block (10 lines) in recipe-lanes/lib/recipe-lanes/layout.ts:268", "shortDescription": {"text": "Commented-code block (10 lines) in recipe-lanes/lib/recipe-lanes/layout.ts:268"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fcc259008965b121", "name": "Commented-code block (5 lines) in recipe-lanes/lib/stores/recipe-store.ts:257", "shortDescription": {"text": "Commented-code block (5 lines) in recipe-lanes/lib/stores/recipe-store.ts:257"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-515c80c4b554a8ee", "name": "Commented-code block (5 lines) in recipe-lanes/e2e/layout-persistence.spec.ts:117", "shortDescription": {"text": "Commented-code block (5 lines) in recipe-lanes/e2e/layout-persistence.spec.ts:117"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0373b12d6a9d7399", "name": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/e2e/utils/admin-utils.ts:144", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/e2e/utils/admin-utils.ts:144"}, "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}}]}}, "automationDetails": {"id": "repobility/24664"}, "properties": {"repository": "bohemian-miser/RecipeLanes", "repoUrl": "https://github.com/bohemian-miser/RecipeLanes", "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-4b584a0859fb1a4d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/test-import.ts:1"}, "properties": {"repobilityId": "0da3d46785704029", "scanner": "scanner-primary", "fingerprint": "4b584a0859fb1a4d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f7edccae00026ca", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/app/actions.ts:189"}, "properties": {"repobilityId": "51d9b30c522c727a", "scanner": "scanner-primary", "fingerprint": "1f7edccae00026ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-110a10c22389578d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/app/actions.ts:160"}, "properties": {"repobilityId": "e9fe460d3f7f1d87", "scanner": "scanner-primary", "fingerprint": "110a10c22389578d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-161080d07be9e489", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/app/lanes/page.tsx:734"}, "properties": {"repobilityId": "2ea6aeee8222615f", "scanner": "scanner-primary", "fingerprint": "161080d07be9e489", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c36462b3c2823fec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/app/lanes/page.tsx:65"}, "properties": {"repobilityId": "85e9eb5a2a24a349", "scanner": "scanner-primary", "fingerprint": "c36462b3c2823fec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-53b1524a99714360", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/app/icon_overview/page.tsx:74"}, "properties": {"repobilityId": "b92d292c602a250d", "scanner": "scanner-primary", "fingerprint": "53b1524a99714360", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3739d45c86b8273c", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/tests/shortlist-delta.test.ts:238"}, "properties": {"repobilityId": "9daa0f744ebbdfcd", "scanner": "scanner-primary", "fingerprint": "3739d45c86b8273c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-391d7e8e789430f6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/tests/shortlist-delta.test.ts:105"}, "properties": {"repobilityId": "2d77bdd6bd3986f2", "scanner": "scanner-primary", "fingerprint": "391d7e8e789430f6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd96bb62d34ed73f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/tests/functions-metadata.test.ts:95"}, "properties": {"repobilityId": "5ea24cfb58211d64", "scanner": "scanner-primary", "fingerprint": "dd96bb62d34ed73f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c9fd5243fba1bdf", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/tests/impression-rejection.test.ts:179"}, "properties": {"repobilityId": "ae4d0e000dbce8e9", "scanner": "scanner-primary", "fingerprint": "7c9fd5243fba1bdf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3b4db7d303d3a597", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-extended-scenarios.ts:30"}, "properties": {"repobilityId": "02f2659ebd072105", "scanner": "scanner-primary", "fingerprint": "3b4db7d303d3a597", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1932e7be472fe92c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/retrigger-recipe-icons.ts:25"}, "properties": {"repobilityId": "dfc924159e334ee3", "scanner": "scanner-primary", "fingerprint": "1932e7be472fe92c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-138497c31b0250b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-vetting.ts:26"}, "properties": {"repobilityId": "b424160bc281448a", "scanner": "scanner-primary", "fingerprint": "138497c31b0250b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e98f933d4e2eca5f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-shortlist-entries.ts:47"}, "properties": {"repobilityId": "dbbda6c00c3c995e", "scanner": "scanner-primary", "fingerprint": "e98f933d4e2eca5f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d50079d82fcb1413", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/pull-db.ts:44"}, "properties": {"repobilityId": "74aa8c5c308c6566", "scanner": "scanner-primary", "fingerprint": "d50079d82fcb1413", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd9ffc78a4309d4b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-dupe-recipes.ts:37"}, "properties": {"repobilityId": "465b7fe402132036", "scanner": "scanner-primary", "fingerprint": "dd9ffc78a4309d4b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-18661a5505b040f3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-vertex-embedding.ts:89"}, "properties": {"repobilityId": "d9b2df01ad2b795a", "scanner": "scanner-primary", "fingerprint": "18661a5505b040f3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-55abb530a091933c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/reset-db.ts:67"}, "properties": {"repobilityId": "d2c4b76cc380c8ea", "scanner": "scanner-primary", "fingerprint": "55abb530a091933c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-29b613bc2ffc3be1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/audit-icon-schema.ts:32"}, "properties": {"repobilityId": "5564933799be4773", "scanner": "scanner-primary", "fingerprint": "29b613bc2ffc3be1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-91f7729f256b2989", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-names.ts:27"}, "properties": {"repobilityId": "d3042767983542ec", "scanner": "scanner-primary", "fingerprint": "91f7729f256b2989", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e49caf0b9de1cc18", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/prebuild.js:54"}, "properties": {"repobilityId": "0fb9ed05299e414f", "scanner": "scanner-primary", "fingerprint": "e49caf0b9de1cc18", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-93150295b943581a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-comprehensive.ts:35"}, "properties": {"repobilityId": "a3d5ff01d8b53844", "scanner": "scanner-primary", "fingerprint": "93150295b943581a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e3a7b831b4140f6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/verify-env.ts:20"}, "properties": {"repobilityId": "4417e6b4c6400503", "scanner": "scanner-primary", "fingerprint": "0e3a7b831b4140f6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-507dff1996091013", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/audit-icon-urls.ts:26"}, "properties": {"repobilityId": "64b190baed21708c", "scanner": "scanner-primary", "fingerprint": "507dff1996091013", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bfa8278a190889a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/eval-icon-vision-terms.ts:107"}, "properties": {"repobilityId": "6ce8d71bb9e6cba9", "scanner": "scanner-primary", "fingerprint": "bfa8278a190889a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-17ea03aae6143e9a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/audit-icon-index.ts:53"}, "properties": {"repobilityId": "72d8d6530d9ad8ef", "scanner": "scanner-primary", "fingerprint": "17ea03aae6143e9a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-15c1906afa7c420c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-recipe-shortlists.ts:41"}, "properties": {"repobilityId": "3b16f0ed18c5027f", "scanner": "scanner-primary", "fingerprint": "15c1906afa7c420c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-899f792edbd462c4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/analyze-recipe-ingredients.ts:27"}, "properties": {"repobilityId": "07b66b3eb00ff2d2", "scanner": "scanner-primary", "fingerprint": "899f792edbd462c4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-90f2ef7d295d24c1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-real-recipes.ts:23"}, "properties": {"repobilityId": "08e1bb98110799f9", "scanner": "scanner-primary", "fingerprint": "90f2ef7d295d24c1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d33287bf4125a34", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-genkit.ts:8"}, "properties": {"repobilityId": "442b40c250f5ea8d", "scanner": "scanner-primary", "fingerprint": "7d33287bf4125a34", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7980fbac35937c64", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-duplicates.ts:26"}, "properties": {"repobilityId": "f439db6407ec395f", "scanner": "scanner-primary", "fingerprint": "7980fbac35937c64", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f3430357f1957107", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/reprocess-backgrounds.ts:30"}, "properties": {"repobilityId": "5ff32977ab7f84f5", "scanner": "scanner-primary", "fingerprint": "f3430357f1957107", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-32caa5b27ed32893", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-flow.ts:24"}, "properties": {"repobilityId": "ec036735242f57cc", "scanner": "scanner-primary", "fingerprint": "32caa5b27ed32893", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cdd87bdd98f7618e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/export-icon-index.ts:39"}, "properties": {"repobilityId": "3ab0bcf1e1de86c7", "scanner": "scanner-primary", "fingerprint": "cdd87bdd98f7618e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-10f00b950e4ced57", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-search-terms.ts:44"}, "properties": {"repobilityId": "a7794488656b7893", "scanner": "scanner-primary", "fingerprint": "10f00b950e4ced57", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4f4294d1a5c867e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/debug-recipe-nodes.ts:10"}, "properties": {"repobilityId": "6a991562abea2111", "scanner": "scanner-primary", "fingerprint": "4f4294d1a5c867e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-043a6902543174e3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/migrate-icon-struct.ts:27"}, "properties": {"repobilityId": "5a69319fdfb96707", "scanner": "scanner-primary", "fingerprint": "043a6902543174e3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8800299c2143ca2e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-recipes.ts:38"}, "properties": {"repobilityId": "55713ea3b821ae3f", "scanner": "scanner-primary", "fingerprint": "8800299c2143ca2e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-af5fefec1c358381", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-index.ts:72"}, "properties": {"repobilityId": "70a579315ff89d4d", "scanner": "scanner-primary", "fingerprint": "af5fefec1c358381", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-049882b54038238d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/search-test.ts:48"}, "properties": {"repobilityId": "d497987a8463a1be", "scanner": "scanner-primary", "fingerprint": "049882b54038238d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3860774fcc843531", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/fetch-real-icons.ts:24"}, "properties": {"repobilityId": "c79f113fae5e1160", "scanner": "scanner-primary", "fingerprint": "3860774fcc843531", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-69ee39337937ac77", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backup-staging.ts:13"}, "properties": {"repobilityId": "4a5e996a6ff196f7", "scanner": "scanner-primary", "fingerprint": "69ee39337937ac77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d62851d40ceab0ed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/migrate-recipe-icons.ts:27"}, "properties": {"repobilityId": "c6995bf164b7767d", "scanner": "scanner-primary", "fingerprint": "d62851d40ceab0ed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fab7d840d918ed15", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/create-icon-index.ts:51"}, "properties": {"repobilityId": "2d01f3dbf88ffb1f", "scanner": "scanner-primary", "fingerprint": "fab7d840d918ed15", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b4d04e00de60e5c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-search-terms.ts:177"}, "properties": {"repobilityId": "9b233e6f5e7629f1", "scanner": "scanner-primary", "fingerprint": "3b4d04e00de60e5c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fbfa5c1b740929eb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/debug-adjust.ts:28"}, "properties": {"repobilityId": "0fb38ae8ccbdcb39", "scanner": "scanner-primary", "fingerprint": "fbfa5c1b740929eb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-10138fe9f2eee8a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/analyze-ingredients.ts:39"}, "properties": {"repobilityId": "40f52c1b760e31e8", "scanner": "scanner-primary", "fingerprint": "10138fe9f2eee8a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fcd10155f178b482", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/reprocess-recipes.ts:26"}, "properties": {"repobilityId": "8680056810dad02e", "scanner": "scanner-primary", "fingerprint": "fcd10155f178b482", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-adc83d502d1ef249", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-chat-adjust.ts:34"}, "properties": {"repobilityId": "bb313ef05ce7c2e5", "scanner": "scanner-primary", "fingerprint": "adc83d502d1ef249", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-28e8e893359e1765", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/migrate-ingredients.ts:26"}, "properties": {"repobilityId": "d6b5d8737ae6a078", "scanner": "scanner-primary", "fingerprint": "28e8e893359e1765", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f174cdda4b90d40c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-embeddings.ts:42"}, "properties": {"repobilityId": "cd9647d5625469db", "scanner": "scanner-primary", "fingerprint": "f174cdda4b90d40c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7401d2195d6061c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/verify-bg-removal.ts:25"}, "properties": {"repobilityId": "e44b444fe9e35098", "scanner": "scanner-primary", "fingerprint": "7401d2195d6061c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c9b1ee3398015341", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icons-flat.ts:19"}, "properties": {"repobilityId": "4c318527c5123945", "scanner": "scanner-primary", "fingerprint": "c9b1ee3398015341", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1956b23c903236ba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/repair-queue.ts:16"}, "properties": {"repobilityId": "e7b06222cd9cd7e4", "scanner": "scanner-primary", "fingerprint": "1956b23c903236ba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6dff09201300d286", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-search.ts:153"}, "properties": {"repobilityId": "d6c449b532076d51", "scanner": "scanner-primary", "fingerprint": "6dff09201300d286", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-44d6a995182c8512", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/make-admin.ts:28"}, "properties": {"repobilityId": "22cd4ebaa913b4e4", "scanner": "scanner-primary", "fingerprint": "44d6a995182c8512", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a9777973ed04cf86", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-debug-recipes.ts:14"}, "properties": {"repobilityId": "24d11d899900dbee", "scanner": "scanner-primary", "fingerprint": "a9777973ed04cf86", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c3f8583fe25ae01", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-metadata.ts:22"}, "properties": {"repobilityId": "c4c66d2fef4591be", "scanner": "scanner-primary", "fingerprint": "6c3f8583fe25ae01", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cc7f65159923c8dd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-zombies.ts:22"}, "properties": {"repobilityId": "f6344a87bcece957", "scanner": "scanner-primary", "fingerprint": "cc7f65159923c8dd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bc71133059a9b8c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-deletion-sync.ts:35"}, "properties": {"repobilityId": "4cfac9179a2b00f9", "scanner": "scanner-primary", "fingerprint": "bc71133059a9b8c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f35f0a51a34e0530", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/eval-embeddings.ts:41"}, "properties": {"repobilityId": "44ad66250304147b", "scanner": "scanner-primary", "fingerprint": "f35f0a51a34e0530", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-59df868e60acf79f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/check-queue.ts:10"}, "properties": {"repobilityId": "44395895d996bb8d", "scanner": "scanner-primary", "fingerprint": "59df868e60acf79f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2e60e9eacbd7c6ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-thumbs.ts:30"}, "properties": {"repobilityId": "6e83943b5266b61b", "scanner": "scanner-primary", "fingerprint": "2e60e9eacbd7c6ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b0b10b6e173d4db6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/list-models.ts:33"}, "properties": {"repobilityId": "6bf373935b8e01ed", "scanner": "scanner-primary", "fingerprint": "b0b10b6e173d4db6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fe838220974fa19e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/cleanup-placeholders.ts:26"}, "properties": {"repobilityId": "ab9e737bee3634ca", "scanner": "scanner-primary", "fingerprint": "fe838220974fa19e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c310fda0fc7d025a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/test-integrity.ts:24"}, "properties": {"repobilityId": "249523bea5eb7593", "scanner": "scanner-primary", "fingerprint": "c310fda0fc7d025a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d74d4c6c7cfb1c6c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/backfill-icon-visual-description.ts:34"}, "properties": {"repobilityId": "9ab26f93e5ee9aed", "scanner": "scanner-primary", "fingerprint": "d74d4c6c7cfb1c6c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8950c1c9bfe3f9a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/fix-broken-icons.ts:25"}, "properties": {"repobilityId": "b222248c949fd9c9", "scanner": "scanner-primary", "fingerprint": "8950c1c9bfe3f9a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-47087ccd72d8e65d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/fix-stuck-recipes.ts:13"}, "properties": {"repobilityId": "27c8dc3ebb304023", "scanner": "scanner-primary", "fingerprint": "47087ccd72d8e65d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-180fce8d34f5f9f1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/fix-phantom-icons.ts:27"}, "properties": {"repobilityId": "6e81804f011a7f9e", "scanner": "scanner-primary", "fingerprint": "180fce8d34f5f9f1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2b879baab0c31c09", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/dump-search-terms.ts:63"}, "properties": {"repobilityId": "283f94b8a86ae1bc", "scanner": "scanner-primary", "fingerprint": "2b879baab0c31c09", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e35bdad1d6d3964f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/find-icon.ts:43"}, "properties": {"repobilityId": "8ec374a1975e70ce", "scanner": "scanner-primary", "fingerprint": "e35bdad1d6d3964f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-84baa3b686bf28f1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-ing-struct.ts:9"}, "properties": {"repobilityId": "7cf238e407ac182d", "scanner": "scanner-primary", "fingerprint": "84baa3b686bf28f1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-af161e4919c24f7d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/quick-log-fetch.ts:11"}, "properties": {"repobilityId": "914d54b7b9092982", "scanner": "scanner-primary", "fingerprint": "af161e4919c24f7d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d22298076cf1cc4a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-recipe-nodes.ts:7"}, "properties": {"repobilityId": "aaafee0d331c918b", "scanner": "scanner-primary", "fingerprint": "d22298076cf1cc4a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8db699e20b6e0e5c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/list-icons.ts:14"}, "properties": {"repobilityId": "52fee6a67ab6bb94", "scanner": "scanner-primary", "fingerprint": "8db699e20b6e0e5c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6f5d0c88b42310c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/cloud-timeline.ts:17"}, "properties": {"repobilityId": "019ecead34a104eb", "scanner": "scanner-primary", "fingerprint": "c6f5d0c88b42310c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4171f0d1e4bc2e87", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/inspect-db.ts:17"}, "properties": {"repobilityId": "7ca2ab6d5fcba43d", "scanner": "scanner-primary", "fingerprint": "4171f0d1e4bc2e87", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9fb03adce4120f44", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/analyze-recipe.ts:16"}, "properties": {"repobilityId": "f38832a27c1fef84", "scanner": "scanner-primary", "fingerprint": "9fb03adce4120f44", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-11499d1ffe4deb42", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/recipe-logs.ts:8"}, "properties": {"repobilityId": "06067936a36551a2", "scanner": "scanner-primary", "fingerprint": "11499d1ffe4deb42", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-18e687f09e1861c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/dump-node.ts:9"}, "properties": {"repobilityId": "b808207a4f876389", "scanner": "scanner-primary", "fingerprint": "18e687f09e1861c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-454ae74b254b2040", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/debug-resolve.ts:12"}, "properties": {"repobilityId": "aa6530454a47cacb", "scanner": "scanner-primary", "fingerprint": "454ae74b254b2040", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-855ab7eb145a4acd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/list-nodes.ts:10"}, "properties": {"repobilityId": "ce00eb3e9bbd00dd", "scanner": "scanner-primary", "fingerprint": "855ab7eb145a4acd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7b78b38b35a2aff0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-db.ts:22"}, "properties": {"repobilityId": "49b9291b5a907493", "scanner": "scanner-primary", "fingerprint": "7b78b38b35a2aff0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f8a978def7387f7b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/list-latest-recipes.ts:14"}, "properties": {"repobilityId": "84bff2fa729689a4", "scanner": "scanner-primary", "fingerprint": "f8a978def7387f7b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09cd15312c1c69f9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/forensics-query.ts:8"}, "properties": {"repobilityId": "0ea0372f253f06f2", "scanner": "scanner-primary", "fingerprint": "09cd15312c1c69f9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb914e7fc182a712", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/debug-cache.ts:23"}, "properties": {"repobilityId": "43eeb66271146e9f", "scanner": "scanner-primary", "fingerprint": "bb914e7fc182a712", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0badc1ecc35e5b05", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/test-connection.ts:13"}, "properties": {"repobilityId": "efcf4889bc274a5e", "scanner": "scanner-primary", "fingerprint": "0badc1ecc35e5b05", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d16139c057ef72e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/investigation/check-icon.ts:31"}, "properties": {"repobilityId": "79fcb35e92c0ba3c", "scanner": "scanner-primary", "fingerprint": "9d16139c057ef72e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c5c3d4170fc6674a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/scripts/lib/db-tools.ts:99"}, "properties": {"repobilityId": "2d6836563a1a0453", "scanner": "scanner-primary", "fingerprint": "c5c3d4170fc6674a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-72562aa781765c1e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/scripts/download-model.js:14"}, "properties": {"repobilityId": "0c3f52ace3ebfdcc", "scanner": "scanner-primary", "fingerprint": "72562aa781765c1e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3c29fbc8681eeac0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/src/index.ts:73"}, "properties": {"repobilityId": "006ada14b81749bf", "scanner": "scanner-primary", "fingerprint": "3c29fbc8681eeac0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8d8248c21d82489e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/src/icon-generator.ts:25"}, "properties": {"repobilityId": "c8c923455bb5fa29", "scanner": "scanner-primary", "fingerprint": "8d8248c21d82489e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c97659e6c3414126", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/functions/src/vector-search/index.ts:24"}, "properties": {"repobilityId": "57756e6203a18c5f", "scanner": "scanner-primary", "fingerprint": "c97659e6c3414126", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-11edc2c3ea442070", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/auth-provider.tsx:52"}, "properties": {"repobilityId": "c763f6b896fac456", "scanner": "scanner-primary", "fingerprint": "11edc2c3ea442070", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6118c81b2bd4508", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/components/queue-monitor.tsx:138"}, "properties": {"repobilityId": "8e882f1c79735008", "scanner": "scanner-primary", "fingerprint": "c6118c81b2bd4508", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aca7894ebf3845bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/components/shared-gallery.tsx:125"}, "properties": {"repobilityId": "716424d19747ea3b", "scanner": "scanner-primary", "fingerprint": "aca7894ebf3845bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5db553784ac2131", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 recipe-lanes/components/recipe-lanes/react-flow-diagram.tsx:818"}, "properties": {"repobilityId": "5c8e054f6cf8286c", "scanner": "scanner-primary", "fingerprint": "e5db553784ac2131", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-a612803d8ea858c8", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/components/recipe-lanes/react-flow-diagram.tsx:527"}, "properties": {"repobilityId": "92e4143e4a669e03", "scanner": "scanner-primary", "fingerprint": "a612803d8ea858c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5f0fa4e370109063", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/recipe-lanes/hooks/useSaveAndFork.ts:151"}, "properties": {"repobilityId": "f1fb2e9e77faeef9", "scanner": "scanner-primary", "fingerprint": "5f0fa4e370109063", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-902a8a95b221cbd4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/recipe-lanes/hooks/useHistoryManager.ts:64"}, "properties": {"repobilityId": "47793ef6e86db4b2", "scanner": "scanner-primary", "fingerprint": "902a8a95b221cbd4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd2676c71590acb3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/components/recipe-lanes/nodes/minimal-node.tsx:130"}, "properties": {"repobilityId": "4a407f324e086ed3", "scanner": "scanner-primary", "fingerprint": "dd2676c71590acb3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ff68dc77de95452f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 recipe-lanes/components/recipe-lanes/ui/ingredients-sidebar.tsx:95"}, "properties": {"repobilityId": "ed978e8e606b380a", "scanner": "scanner-primary", "fingerprint": "ff68dc77de95452f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db3b55857c68bd23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/server-vector-search.ts:37"}, "properties": {"repobilityId": "3496fbc97e3a4811", "scanner": "scanner-primary", "fingerprint": "db3b55857c68bd23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef1d5df2d4298df6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/flows.ts:22"}, "properties": {"repobilityId": "e671e5cd545732a3", "scanner": "scanner-primary", "fingerprint": "ef1d5df2d4298df6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5cdbd369f17e8095", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/firebase-client.ts:59"}, "properties": {"repobilityId": "1810a34f68b5df3b", "scanner": "scanner-primary", "fingerprint": "5cdbd369f17e8095", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f7f4ec39c51efc86", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/firebase-admin.js:76"}, "properties": {"repobilityId": "5ef09c062ad74aae", "scanner": "scanner-primary", "fingerprint": "f7f4ec39c51efc86", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b008d7f18faede3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/data-service.ts:346"}, "properties": {"repobilityId": "b36aa53281749ce6", "scanner": "scanner-primary", "fingerprint": "3b008d7f18faede3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-383d00b273c79141", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/data-service.ts:111"}, "properties": {"repobilityId": "91fdb5d52ed96091", "scanner": "scanner-primary", "fingerprint": "383d00b273c79141", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f973f114403a1ad", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/ai-service.ts:128"}, "properties": {"repobilityId": "d35ae4344d37bbb5", "scanner": "scanner-primary", "fingerprint": "3f973f114403a1ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f79585ce3b1c2022", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/ai-service.ts:73"}, "properties": {"repobilityId": "d511ca3c346ccafa", "scanner": "scanner-primary", "fingerprint": "f79585ce3b1c2022", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4c10e4acb3006e05", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/firebase-admin.ts:28"}, "properties": {"repobilityId": "71c95f8ee05daf54", "scanner": "scanner-primary", "fingerprint": "4c10e4acb3006e05", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bfec1b82ed7b1fe0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/lib/recipe-lanes/layout.ts:241"}, "properties": {"repobilityId": "ae1d227e2ab87c10", "scanner": "scanner-primary", "fingerprint": "bfec1b82ed7b1fe0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-42d8c7789a0a815a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/lib/recipe-lanes/types.ts:151"}, "properties": {"repobilityId": "40c72de018563020", "scanner": "scanner-primary", "fingerprint": "42d8c7789a0a815a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-4e52abf168659ef7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/e2e/graph.spec.ts:124"}, "properties": {"repobilityId": "3732b4671d21da8b", "scanner": "scanner-primary", "fingerprint": "4e52abf168659ef7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-20f36cc73ffcf7b5", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/e2e/icons.spec.ts:69"}, "properties": {"repobilityId": "c6f300d161683414", "scanner": "scanner-primary", "fingerprint": "20f36cc73ffcf7b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-a372f9d761d76be8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/loading.spec.ts:13"}, "properties": {"repobilityId": "d7d3ef0959adaf20", "scanner": "scanner-primary", "fingerprint": "a372f9d761d76be8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-150c7eb1feb4d662", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 recipe-lanes/e2e/regressions.spec.ts:169"}, "properties": {"repobilityId": "9fcdecdca9bbf814", "scanner": "scanner-primary", "fingerprint": "150c7eb1feb4d662", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2a6d370dbb5a8982", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/layout-mode-persistence.spec.ts:44"}, "properties": {"repobilityId": "f8826088c34f0e76", "scanner": "scanner-primary", "fingerprint": "2a6d370dbb5a8982", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-151aa417900f28ee", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/fixtures.ts:57"}, "properties": {"repobilityId": "3b353af629b6eeb0", "scanner": "scanner-primary", "fingerprint": "151aa417900f28ee", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6880cdab11935495", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/admin-utils.ts:83"}, "properties": {"repobilityId": "d005ddf907ab76bf", "scanner": "scanner-primary", "fingerprint": "6880cdab11935495", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ddf480e4b16ffbb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/screenshot.ts:71"}, "properties": {"repobilityId": "af6c1c61049bae56", "scanner": "scanner-primary", "fingerprint": "3ddf480e4b16ffbb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e79c6454d6d59120", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/seed-data.ts:38"}, "properties": {"repobilityId": "a6212431862f62b9", "scanner": "scanner-primary", "fingerprint": "e79c6454d6d59120", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-08c099e99b12913b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 recipe-lanes/e2e/utils/actions.ts:74"}, "properties": {"repobilityId": "a227c1b9e981e830", "scanner": "scanner-primary", "fingerprint": "08c099e99b12913b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7bcc5907b8adf11b", "level": "error", "message": {"text": "Runtime dotenv file present in repo: recipe-lanes/.env.test"}, "properties": {"repobilityId": "33ecfad105faff2c", "scanner": "scanner-primary", "fingerprint": "7bcc5907b8adf11b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "recipe-lanes/.env.test"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f39fcf6a8776894f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in recipe-lanes/scripts/investigation/quick-log-fetch.ts:1"}, "properties": {"repobilityId": "4081e17fb6d67545", "scanner": "scanner-primary", "fingerprint": "f39fcf6a8776894f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "recipe-lanes/scripts/investigation/quick-log-fetch.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-92a0e210c49d0ab8", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in recipe-lanes/scripts/investigation/cloud-timeline.ts:6"}, "properties": {"repobilityId": "886d97a909f83708", "scanner": "scanner-primary", "fingerprint": "92a0e210c49d0ab8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "recipe-lanes/scripts/investigation/cloud-timeline.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-96e84e54f5574c61", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in recipe-lanes/scripts/investigation/recipe-logs.ts:45"}, "properties": {"repobilityId": "50e23324b4c965bf", "scanner": "scanner-primary", "fingerprint": "96e84e54f5574c61", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "recipe-lanes/scripts/investigation/recipe-logs.ts"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-9d7e8d370403d6cd", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3a0235107252cfc5", "scanner": "scanner-primary", "fingerprint": "9d7e8d370403d6cd", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-backend.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-9d7e8d370403d6cd", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "89788623d2d5bbf6", "scanner": "scanner-primary", "fingerprint": "9d7e8d370403d6cd", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-backend.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-9d7e8d370403d6cd", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "89788623d2d5bbf6", "scanner": "scanner-primary", "fingerprint": "9d7e8d370403d6cd", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-backend.yml"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-e21f19e6855b894f", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "94124e52a900748b", "scanner": "scanner-primary", "fingerprint": "e21f19e6855b894f", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/compute-umap.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ce2ca11407a99c04", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ce2ca11407a99c04", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 123}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54c8f1b47dd62535", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-1d2284d459f0f8d6", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "5139d57dc47e076d", "scanner": "scanner-primary", "fingerprint": "1d2284d459f0f8d6", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "recipe-lanes/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5ec7f8d5552853d0", "level": "note", "message": {"text": "Very large file: recipe-lanes/app/lanes/page.tsx (1253 lines)"}, "properties": {"repobilityId": "4411e0a1fc5ac7df", "scanner": "scanner-primary", "fingerprint": "5ec7f8d5552853d0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a229b546ca2e79f2", "level": "note", "message": {"text": "Very large file: recipe-lanes/lib/data-service.ts (1816 lines)"}, "properties": {"repobilityId": "c611d53f33f07f74", "scanner": "scanner-primary", "fingerprint": "a229b546ca2e79f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "fd3cb1277368cf11", "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": "be47e99e4690840b", "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": "b39e730635c4af47", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ab776c4d4705906b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: skills/verify-app/SKILL.md"}, "properties": {"repobilityId": "9985382483574e28", "scanner": "scanner-primary", "fingerprint": "ab776c4d4705906b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/verify-app/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d67aa48e76ed9bc2", "level": "none", "message": {"text": "Commented-code block (5 lines) in recipe-lanes/app/actions.ts:97"}, "properties": {"repobilityId": "dea47deab6b4b6a9", "scanner": "scanner-primary", "fingerprint": "d67aa48e76ed9bc2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ef657ba4f3ae77d", "level": "none", "message": {"text": "Commented-code block (6 lines) in recipe-lanes/app/lanes/page.tsx:374"}, "properties": {"repobilityId": "c54a6fdda2c78c33", "scanner": "scanner-primary", "fingerprint": "9ef657ba4f3ae77d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f361e02a4eeaf31", "level": "none", "message": {"text": "Commented-code block (6 lines) in recipe-lanes/tests/shortlist-delta.test.ts:159"}, "properties": {"repobilityId": "e8f911501f539fd8", "scanner": "scanner-primary", "fingerprint": "5f361e02a4eeaf31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e15caeb8c4d5b5d", "level": "none", "message": {"text": "Commented-code block (6 lines) in recipe-lanes/tests/verify-production-logic.test.ts:28"}, "properties": {"repobilityId": "1a0250128f2c9737", "scanner": "scanner-primary", "fingerprint": "1e15caeb8c4d5b5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6128c7be9b91a6e2", "level": "none", "message": {"text": "Commented-code block (6 lines) in recipe-lanes/tests/icon-shortlist.test.ts:423"}, "properties": {"repobilityId": "754608f8f00f778c", "scanner": "scanner-primary", "fingerprint": "6128c7be9b91a6e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bca246deaed1263", "level": "none", "message": {"text": "Commented-code block (10 lines) in recipe-lanes/tests/icon-index.test.ts:58"}, "properties": {"repobilityId": "5b040f1d953d0cbd", "scanner": "scanner-primary", "fingerprint": "6bca246deaed1263", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17e2b2471b39ee0c", "level": "none", "message": {"text": "Commented-code block (7 lines) in recipe-lanes/tests/icon-pipeline.test.ts:334"}, "properties": {"repobilityId": "748cfbf18d8832b7", "scanner": "scanner-primary", "fingerprint": "17e2b2471b39ee0c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df885b3021f7a2f1", "level": "none", "message": {"text": "Commented-code block (5 lines) in recipe-lanes/tests/forge-gate-regression.test.ts:16"}, "properties": {"repobilityId": "2b3e2d54b998d470", "scanner": "scanner-primary", "fingerprint": "df885b3021f7a2f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e35d64c43c1f875c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-vertex-embedding.ts:54"}, "properties": {"repobilityId": "e9091b1b98a8543b", "scanner": "scanner-primary", "fingerprint": "e35d64c43c1f875c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8fe2d497a96a1acb", "level": "none", "message": {"text": "Commented-code block (5 lines) in recipe-lanes/scripts/prebuild.js:8"}, "properties": {"repobilityId": "12696ef8e63cc084", "scanner": "scanner-primary", "fingerprint": "8fe2d497a96a1acb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b474cf15bdb3e7a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/eval-icon-vision-terms.ts:64"}, "properties": {"repobilityId": "efb2abc14f0cd96d", "scanner": "scanner-primary", "fingerprint": "8b474cf15bdb3e7a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b54d2750c49b2b4e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-search-terms.ts:63"}, "properties": {"repobilityId": "33f53fc7bbfae572", "scanner": "scanner-primary", "fingerprint": "b54d2750c49b2b4e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-097a0960937fcee1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-icon-index.ts:43"}, "properties": {"repobilityId": "a4f41ad554f0aa69", "scanner": "scanner-primary", "fingerprint": "097a0960937fcee1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9522896d9d137e43", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/search-test.ts:22"}, "properties": {"repobilityId": "14ca9e864ec1a1fb", "scanner": "scanner-primary", "fingerprint": "9522896d9d137e43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4071f3d1344e3c3e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/fetch-real-icons.ts:39"}, "properties": {"repobilityId": "51c3047ce917c9f7", "scanner": "scanner-primary", "fingerprint": "4071f3d1344e3c3e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b3f28d0c6b15325d", "level": "note", "message": {"text": "Legacy-named symbol `staging_backup` in recipe-lanes/scripts/backup-staging.ts:24"}, "properties": {"repobilityId": "d80ed6f175b93d74", "scanner": "scanner-primary", "fingerprint": "b3f28d0c6b15325d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d9109930b1e47d1e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/scripts/backfill-icon-search-terms.ts:86"}, "properties": {"repobilityId": "dee08a327caeadaa", "scanner": "scanner-primary", "fingerprint": "d9109930b1e47d1e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a180183e062e99e2", "level": "none", "message": {"text": "Commented-code block (5 lines) in recipe-lanes/scripts/test-search.ts:40"}, "properties": {"repobilityId": "a9f60f05e72efcdb", "scanner": "scanner-primary", "fingerprint": "a180183e062e99e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e22ebb79cada51ba", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/components/auth-provider.tsx:76"}, "properties": {"repobilityId": "22be0de1ad3b9114", "scanner": "scanner-primary", "fingerprint": "e22ebb79cada51ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7c8d13286e9a1ab6", "level": "none", "message": {"text": "Commented-code block (8 lines) in recipe-lanes/components/recipe-lanes/react-flow-diagram.tsx:226"}, "properties": {"repobilityId": "9e982f4cd37c20ae", "scanner": "scanner-primary", "fingerprint": "7c8d13286e9a1ab6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-12161c4b5c669a95", "level": "none", "message": {"text": "Commented-code block (7 lines) in recipe-lanes/components/recipe-lanes/nodes/minimal-node-classic.tsx:69"}, "properties": {"repobilityId": "f3b9119cd7d06830", "scanner": "scanner-primary", "fingerprint": "12161c4b5c669a95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b340a4940c69099b", "level": "none", "message": {"text": "Commented-code block (7 lines) in recipe-lanes/lib/icon-queue-config.ts:33"}, "properties": {"repobilityId": "e9c150494ed4f7c0", "scanner": "scanner-primary", "fingerprint": "b340a4940c69099b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67b771cbdd00534f", "level": "none", "message": {"text": "Commented-code block (6 lines) in recipe-lanes/lib/flows.ts:44"}, "properties": {"repobilityId": "5fcb03a319152fc8", "scanner": "scanner-primary", "fingerprint": "67b771cbdd00534f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cad0419869d87e00", "level": "none", "message": {"text": "Commented-code block (7 lines) in recipe-lanes/lib/data-service.ts:194"}, "properties": {"repobilityId": "a38790531c9c9b5e", "scanner": "scanner-primary", "fingerprint": "cad0419869d87e00", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-429a4c56f47cd937", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/lib/ai-service.ts:85"}, "properties": {"repobilityId": "5d2ce0cc09e02866", "scanner": "scanner-primary", "fingerprint": "429a4c56f47cd937", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-77bbf0d12a2519e2", "level": "none", "message": {"text": "Commented-code block (7 lines) in recipe-lanes/lib/recipe-lanes/model-utils.ts:308"}, "properties": {"repobilityId": "321408b50fe3da41", "scanner": "scanner-primary", "fingerprint": "77bbf0d12a2519e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55886faad5000f87", "level": "none", "message": {"text": "Commented-code block (10 lines) in recipe-lanes/lib/recipe-lanes/layout.ts:268"}, "properties": {"repobilityId": "3433dee19aec1900", "scanner": "scanner-primary", "fingerprint": "55886faad5000f87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fcc259008965b121", "level": "none", "message": {"text": "Commented-code block (5 lines) in recipe-lanes/lib/stores/recipe-store.ts:257"}, "properties": {"repobilityId": "5fc2558d82d06f9d", "scanner": "scanner-primary", "fingerprint": "fcc259008965b121", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-515c80c4b554a8ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in recipe-lanes/e2e/layout-persistence.spec.ts:117"}, "properties": {"repobilityId": "c644ce67ae925c09", "scanner": "scanner-primary", "fingerprint": "515c80c4b554a8ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0373b12d6a9d7399", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 recipe-lanes/e2e/utils/admin-utils.ts:144"}, "properties": {"repobilityId": "047b86415e9b7443", "scanner": "scanner-primary", "fingerprint": "0373b12d6a9d7399", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}