{"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-c2311fc791ba6b41", "name": "Stray `console.log` in TS/JS \u2014 test/global-teardown.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/global-teardown.ts:55"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e24d5fb4f180a8b7", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-accessibility.js:238", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-accessibility.js:238"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-90f9901526fb454e", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-idor-storage.js:259", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-idor-storage.js:259"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5653b79b4dc77117", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-instructions.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-instructions.ts:66"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ecf1cd82734a969f", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-junk-mealplan-recipes.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-junk-mealplan-recipes.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-68e955f2bb8cb486", "name": "Stray `console.log` in TS/JS \u2014 scripts/coverage-ratchet.ts:204", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/coverage-ratchet.ts:204"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7099bd47bfdae9b1", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-domain-map.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-domain-map.ts:100"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00ee044a0159a80f", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-recipe-images.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-recipe-images.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-a715f6a07c1d0f92", "name": "Stray `console.log` in TS/JS \u2014 scripts/delegate-copilot-issue.ts:752", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/delegate-copilot-issue.ts:752"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e9121050712669ee", "name": "Stray `console.log` in TS/JS \u2014 scripts/canonicalize-recipe.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/canonicalize-recipe.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-fa98be345cac1593", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-copilot-instructions.ts:97", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-copilot-instructions.ts:97"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-74a7736adf5cd5f9", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-jsdom-pragma.js:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-jsdom-pragma.js: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-54e157be3004f747", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-ingredient-icons.ts:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-ingredient-icons.ts:129"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fbcc1a0c87b48b2f", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-junk-recipes.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-junk-recipes.ts:21"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fb207c18f7e4fc16", "name": "Stray `console.log` in TS/JS \u2014 scripts/build.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build.js: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-e154da25daec4952", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-hardcoded-colors.js:160", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-hardcoded-colors.js: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-d7b9f2e31e8d421f", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-app-assets.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-app-assets.ts:56"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e12f02d127cae4f", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-eval-dataset-secrets.js:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-eval-dataset-secrets.js:131"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a4c44949d63a8454", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-timestamptz-migration.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-timestamptz-migration.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-3bf5d3c8831cece0", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-recipe-ingredients.ts:159", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-recipe-ingredients.ts:159"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb36d20a822d55c3", "name": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/ingest.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/ingest.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-18021ab12dff928f", "name": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/export.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/export.ts:60"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1af37503c22624c1", "name": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/hook-equivalence-check.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/hook-equivalence-check.ts:78"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3f935f757510b6", "name": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/add.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/add.ts:59"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94c21c82bbbdecdc", "name": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/integration-check.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/integration-check.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-d5324fd7ef0a3029", "name": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/dedup-report.ts:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/dedup-report.ts: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-d3be5ebea5b689e7", "name": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/parity-check.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/parity-check.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-7677d26571788ffe", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-recipe-images.ts:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-recipe-images.ts:69"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a305919470df3e96", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/cleanup-retention.ts:405", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/cleanup-retention.ts:405"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-57bde8b14d4ac34d", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/seed-recipes.ts:229", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/seed-recipes.ts:229"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3f44dcacaa9ed3f7", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-avatars.ts:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-avatars.ts:69"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b19e60ef38fe1f65", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-recipe-allergens.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-recipe-allergens.ts:78"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3f7705e9d3a1822c", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-barcode-nutrition.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-barcode-nutrition.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-537760fcc0173cf0", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-images-to-r2.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-images-to-r2.ts:88"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83dfbeab5fb51a76", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-community-nutrition.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-community-nutrition.ts:92"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c17d38b00b03d8c7", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/cleanup-seed-recipes.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/cleanup-seed-recipes.ts:65"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-14d8c1dfd2767090", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-community-meal-types.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-community-meal-types.ts:21"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9409bf0548730475", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-meal-types.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-meal-types.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-e235462290c583af", "name": "Stray `console.log` in TS/JS \u2014 server/routes/api-docs.ts:137", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/routes/api-docs.ts:137"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17b810f261cf70f7", "name": "Stray `console.log` in TS/JS \u2014 evals/lib/runner-core.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 evals/lib/runner-core.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-ee84c5cbe71cd936", "name": "Privileged port 27 in use", "shortDescription": {"text": "Privileged port 27 in use"}, "fullDescription": {"text": "Port 27 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f87f70db505ac6c7", "name": "Insecure pattern 'node_child_process' in scripts/delegate-copilot-issue.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/delegate-copilot-issue.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-fb7135840997f3d0", "name": "Insecure pattern 'node_child_process' in scripts/mutation-explore.mjs:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/mutation-explore.mjs:8"}, "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-15ea283f88add6b3", "name": "Insecure pattern 'node_child_process' in scripts/build.js:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/build.js:3"}, "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-e719eb02c2060b08", "name": "Insecure pattern 'node_child_process' in scripts/__tests__/check-eval-dataset-secrets.test.ts:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/__tests__/check-eval-dataset-secrets.test.ts:5"}, "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-460a6533e2aaaf01", "name": "Insecure pattern 'node_child_process' in scripts/lib/__tests__/path-domains.test.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/lib/__tests__/path-domains.test.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-362e55b13a98ea9a", "name": "Insecure pattern 'node_child_process' in scripts/solutions-db/hook-equivalence-check.ts:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/solutions-db/hook-equivalence-check.ts:10"}, "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-affb42b00196e06b", "name": "Insecure pattern 'cors_wildcard' in server/routes/public-api.ts:132", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in server/routes/public-api.ts:132"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-65aa740cba4a4a73", "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-af930df47c1df96b", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@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-6351d74dc7713a3a", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@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-f774525e35947738", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@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-cb639d9a10a47b23", "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-4e84b2102819e9b8", "name": "Very large file: shared/schema.ts (1835 lines)", "shortDescription": {"text": "Very large file: shared/schema.ts (1835 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-aba2095ac97be57e", "name": "50 TODO/FIXME markers", "shortDescription": {"text": "50 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 314 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 74 placeholder/mock markers across 45 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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc55229a7a3c078d", "name": "Agent authority lacks a verifier contract: .mcp.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d84092d6e24f0b30", "name": "Agent authority lacks a verifier contract: .claude/agents/todo-researcher.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/todo-researcher.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-aef9872ebbd2b160", "name": "Agent authority lacks a verifier contract: .github/copilot-instructions.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .github/copilot-instructions.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-c312c4eebe991564", "name": "Commented-code block (5 lines) in react-native.config.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in react-native.config.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2808241eab2695e7", "name": "Commented-code block (5 lines) in stryker.explore.conf.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in stryker.explore.conf.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b5e5eb4d4e9bc44", "name": "Commented-code block (6 lines) in vitest.config.ts:27", "shortDescription": {"text": "Commented-code block (6 lines) in vitest.config.ts:27"}, "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-4a362c1699232eab", "name": "Commented-code block (5 lines) in client/navigation/ChatStackNavigator.tsx:46", "shortDescription": {"text": "Commented-code block (5 lines) in client/navigation/ChatStackNavigator.tsx:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-31d858afe329b250", "name": "Commented-code block (5 lines) in client/screens/NotebookEntryScreen.tsx:51", "shortDescription": {"text": "Commented-code block (5 lines) in client/screens/NotebookEntryScreen.tsx:51"}, "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-f5730f3a3118a595", "name": "Commented-code block (6 lines) in client/screens/CoachRemindersScreen.tsx:64", "shortDescription": {"text": "Commented-code block (6 lines) in client/screens/CoachRemindersScreen.tsx:64"}, "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-7610eb80a54d25d3", "name": "Commented-code block (6 lines) in client/screens/ScanScreen.tsx:415", "shortDescription": {"text": "Commented-code block (6 lines) in client/screens/ScanScreen.tsx:415"}, "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-fc1e3ac9548cf265", "name": "Commented-code block (5 lines) in client/screens/BatchScanScreen.tsx:142", "shortDescription": {"text": "Commented-code block (5 lines) in client/screens/BatchScanScreen.tsx:142"}, "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-e7edd63f0e2d6d9a", "name": "Commented-code block (5 lines) in client/screens/meal-plan/RecipeBrowserScreen.tsx:381", "shortDescription": {"text": "Commented-code block (5 lines) in client/screens/meal-plan/RecipeBrowserScreen.tsx:381"}, "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-7e7e276339fce8ed", "name": "Commented-code block (5 lines) in client/constants/theme.ts:32", "shortDescription": {"text": "Commented-code block (5 lines) in client/constants/theme.ts:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8cb6ccae21e66aa", "name": "Commented-code block (5 lines) in client/components/CoachOverlayContent.tsx:67", "shortDescription": {"text": "Commented-code block (5 lines) in client/components/CoachOverlayContent.tsx:67"}, "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-a80a7d29701be2dd", "name": "Commented-code block (5 lines) in client/components/RecipeGenerationModal.tsx:98", "shortDescription": {"text": "Commented-code block (5 lines) in client/components/RecipeGenerationModal.tsx:98"}, "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-653e93b44efc20af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/home/CuratedRecipeCarousel.tsx:139", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/home/CuratedRecipeCarousel.tsx:139"}, "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-c69f92420cb65278", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/home/RecipeCarousel.tsx:109", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/home/RecipeCarousel.tsx:109"}, "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-82301a1e5de51942", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/home/CarouselError.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/home/CarouselError.tsx:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1bb25675ce2d5e8d", "name": "Commented-code block (6 lines) in client/components/coach/CoachChat.tsx:202", "shortDescription": {"text": "Commented-code block (6 lines) in client/components/coach/CoachChat.tsx:202"}, "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-599725fa8e943efe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/coach/CoachChat.tsx:202", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/coach/CoachChat.tsx:202"}, "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-dba87c9e238d5b36", "name": "Commented-code block (6 lines) in client/components/recipe-wizard/InstructionsStep.tsx:289", "shortDescription": {"text": "Commented-code block (6 lines) in client/components/recipe-wizard/InstructionsStep.tsx:289"}, "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-915fbce357abb484", "name": "Commented-code block (5 lines) in client/components/recipe-wizard/PreviewStep.tsx:119", "shortDescription": {"text": "Commented-code block (5 lines) in client/components/recipe-wizard/PreviewStep.tsx:119"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1049f240e7f32980", "name": "Commented-code block (5 lines) in client/camera/components/CameraView.tsx:153", "shortDescription": {"text": "Commented-code block (5 lines) in client/camera/components/CameraView.tsx:153"}, "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-78cddc28c837512b", "name": "Commented-code block (5 lines) in client/camera/components/CameraView.ios.tsx:180", "shortDescription": {"text": "Commented-code block (5 lines) in client/camera/components/CameraView.ios.tsx:180"}, "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-fc70c05eb17b4861", "name": "Commented-code block (7 lines) in client/camera/hooks/__tests__/useCamera.test.ts:468", "shortDescription": {"text": "Commented-code block (7 lines) in client/camera/hooks/__tests__/useCamera.test.ts:468"}, "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-19f460719f654b27", "name": "Commented-code block (5 lines) in client/lib/serving-size-utils.ts:280", "shortDescription": {"text": "Commented-code block (5 lines) in client/lib/serving-size-utils.ts:280"}, "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-b0368da89f055dbd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/lib/photo-upload.ts:179", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/lib/photo-upload.ts:179"}, "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-cadcd04e74430b3e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/lib/query-client.ts:180", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/lib/query-client.ts:180"}, "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-40f63ddddb451042", "name": "Legacy-named symbol `cook_session_backup` in client/lib/cook-session-storage.ts:10", "shortDescription": {"text": "Legacy-named symbol `cook_session_backup` in client/lib/cook-session-storage.ts:10"}, "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-2930fe6309bcbf52", "name": "Commented-code block (5 lines) in client/lib/token-storage.ts:46", "shortDescription": {"text": "Commented-code block (5 lines) in client/lib/token-storage.ts:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0ef8eba8cfef1712", "name": "Legacy-named symbol `cook_session_backup` in client/lib/__tests__/cook-session-storage.test.ts:49", "shortDescription": {"text": "Legacy-named symbol `cook_session_backup` in client/lib/__tests__/cook-session-storage.test.ts:49"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b921c268a8a88467", "name": "Commented-code block (5 lines) in client/lib/__tests__/offline-queue-drain.test.ts:248", "shortDescription": {"text": "Commented-code block (5 lines) in client/lib/__tests__/offline-queue-drain.test.ts:248"}, "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-255393f565fd0dac", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useCarouselRecipes.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useCarouselRecipes.ts:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5aab01a679d9e557", "name": "Commented-code block (5 lines) in client/hooks/useNutritionLookup.ts:402", "shortDescription": {"text": "Commented-code block (5 lines) in client/hooks/useNutritionLookup.ts:402"}, "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-53d1bb0dd4750ac7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useNutritionLookup.ts:199", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useNutritionLookup.ts:199"}, "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-beeb18b461d92542", "name": "Commented-code block (5 lines) in client/hooks/useCoachStream.ts:53", "shortDescription": {"text": "Commented-code block (5 lines) in client/hooks/useCoachStream.ts:53"}, "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-5dcf6c60de981387", "name": "Commented-code block (6 lines) in client/hooks/useQuickLogSession.ts:320", "shortDescription": {"text": "Commented-code block (6 lines) in client/hooks/useQuickLogSession.ts:320"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b71fcabecec42e6f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useSavedItems.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useSavedItems.ts:37"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f623000094192755", "name": "Commented-code block (5 lines) in client/hooks/useAuth.ts:55", "shortDescription": {"text": "Commented-code block (5 lines) in client/hooks/useAuth.ts:55"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7173deb01e173229", "name": "Commented-code block (6 lines) in client/hooks/useHistoryData.ts:149", "shortDescription": {"text": "Commented-code block (6 lines) in client/hooks/useHistoryData.ts:149"}, "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-9804d3d72e5e5013", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useHistoryData.ts:118", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useHistoryData.ts:118"}, "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-874ee03e6de21a2f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useMenuScan.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useMenuScan.ts:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7b930ed0844b9e61", "name": "Commented-code block (5 lines) in client/hooks/useSpeechToText.ts:95", "shortDescription": {"text": "Commented-code block (5 lines) in client/hooks/useSpeechToText.ts:95"}, "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-b7661fc9d1e59ba5", "name": "Commented-code block (5 lines) in client/hooks/useMicronutrients.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in client/hooks/useMicronutrients.ts:31"}, "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-0d8c85e60c653167", "name": "Commented-code block (6 lines) in client/hooks/useChat.ts:314", "shortDescription": {"text": "Commented-code block (6 lines) in client/hooks/useChat.ts:314"}, "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-e29f11b9be3525cc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/__tests__/useAuth.test.ts:139", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/__tests__/useAuth.test.ts:139"}, "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-d94acaa4999b642b", "name": "Commented-code block (8 lines) in client/context/OnboardingContext.tsx:86", "shortDescription": {"text": "Commented-code block (8 lines) in client/context/OnboardingContext.tsx:86"}, "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-5fd07ec5752c7b49", "name": "Commented-code block (7 lines) in client/context/__tests__/PremiumContext.test.ts:13", "shortDescription": {"text": "Commented-code block (7 lines) in client/context/__tests__/PremiumContext.test.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-341b869f60bbd083", "name": "Commented-code block (7 lines) in test/global-teardown.ts:75", "shortDescription": {"text": "Commented-code block (7 lines) in test/global-teardown.ts:75"}, "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-6f0ef545abbc0403", "name": "Commented-code block (5 lines) in test/setup.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in test/setup.ts:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fec30bf60be0e5f2", "name": "Commented-code block (7 lines) in test/mocks/react-native-reanimated.ts:22", "shortDescription": {"text": "Commented-code block (7 lines) in test/mocks/react-native-reanimated.ts:22"}, "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-5427315d463477bd", "name": "Commented-code block (7 lines) in shared/schema.ts:556", "shortDescription": {"text": "Commented-code block (7 lines) in shared/schema.ts:556"}, "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-e65df41b4625361c", "name": "Commented-code block (5 lines) in shared/schemas/taste-picks.ts:23", "shortDescription": {"text": "Commented-code block (5 lines) in shared/schemas/taste-picks.ts:23"}, "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-217959238bcac752", "name": "Legacy-named symbol `community_recipes_instructions_backup` in scripts/migrate-instructions.ts:68", "shortDescription": {"text": "Legacy-named symbol `community_recipes_instructions_backup` in scripts/migrate-instructions.ts:68"}, "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-00bb1342f11d292b", "name": "Commented-code block (6 lines) in scripts/build-domain-map.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/build-domain-map.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-471fa56f51f778ac", "name": "Commented-code block (7 lines) in scripts/delegate-copilot-issue.ts:101", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/delegate-copilot-issue.ts:101"}, "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-71be228ec6592958", "name": "Commented-code block (7 lines) in scripts/mutation-explore.mjs:1", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/mutation-explore.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-887981720b2a9d3f", "name": "Commented-code block (6 lines) in scripts/build-copilot-instructions.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/build-copilot-instructions.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c06696e7d69f5463", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/patch-mlkit-simulator.py:129", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/patch-mlkit-simulator.py:129"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bb6c5f09a477335c", "name": "Commented-code block (5 lines) in scripts/lib/path-domains.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/lib/path-domains.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-568e76d75873ffec", "name": "Commented-code block (6 lines) in scripts/solutions-db/lib/sql-guard.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/solutions-db/lib/sql-guard.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-721089220c2c8db8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 eslint-plugin-ocrecipes/__tests__/rules.test.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 eslint-plugin-ocrecipes/__tests__/rules.test.ts:88"}, "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-b5d643957417399f", "name": "Commented-code block (5 lines) in server/index.ts:35", "shortDescription": {"text": "Commented-code block (5 lines) in server/index.ts:35"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8086f21c331a95cf", "name": "Commented-code block (11 lines) in server/__tests__/storage.test.ts:3", "shortDescription": {"text": "Commented-code block (11 lines) in server/__tests__/storage.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-02cea33d53399b5d", "name": "Commented-code block (6 lines) in server/__tests__/auth.test.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in server/__tests__/auth.test.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3c8683a45cc309a0", "name": "Commented-code block (5 lines) in server/scripts/cleanup-retention.ts:161", "shortDescription": {"text": "Commented-code block (5 lines) in server/scripts/cleanup-retention.ts:161"}, "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-068e2a64f87e8af9", "name": "Commented-code block (6 lines) in server/scripts/seed-recipes.ts:529", "shortDescription": {"text": "Commented-code block (6 lines) in server/scripts/seed-recipes.ts:529"}, "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-2a129e8a0fc3d3e0", "name": "Commented-code block (6 lines) in server/scripts/backfill-recipe-allergens.ts:37", "shortDescription": {"text": "Commented-code block (6 lines) in server/scripts/backfill-recipe-allergens.ts:37"}, "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-a3ccb5db75645525", "name": "Commented-code block (5 lines) in server/lib/openai.ts:23", "shortDescription": {"text": "Commented-code block (5 lines) in server/lib/openai.ts:23"}, "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-80ada5f3591daf72", "name": "Legacy-named symbol `toolOld` in server/lib/__tests__/chat-history-truncate.test.ts:69", "shortDescription": {"text": "Legacy-named symbol `toolOld` in server/lib/__tests__/chat-history-truncate.test.ts:69"}, "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-94ecf19ff9508427", "name": "Commented-code block (5 lines) in server/lib/__tests__/image-store.test.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in server/lib/__tests__/image-store.test.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f3f674e097c3b9f", "name": "Commented-code block (6 lines) in server/routes/verification.ts:116", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/verification.ts:116"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7042f98e2d67a5c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/api-docs.ts:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/api-docs.ts:132"}, "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-edcd31038005a2d0", "name": "Commented-code block (5 lines) in server/routes/grocery.ts:98", "shortDescription": {"text": "Commented-code block (5 lines) in server/routes/grocery.ts:98"}, "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-f6935e5336ae703a", "name": "Commented-code block (5 lines) in server/routes/recipe-generate.ts:78", "shortDescription": {"text": "Commented-code block (5 lines) in server/routes/recipe-generate.ts:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-803fec1e0fac367f", "name": "Commented-code block (6 lines) in server/routes/export.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/export.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7068731b5c983b59", "name": "Commented-code block (5 lines) in server/routes/profile.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in server/routes/profile.ts:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b42f722d58a2be4", "name": "Commented-code block (7 lines) in server/routes/cooking.ts:219", "shortDescription": {"text": "Commented-code block (7 lines) in server/routes/cooking.ts:219"}, "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-93306002e10e38df", "name": "Commented-code block (7 lines) in server/routes/__tests__/auth-account-throttle.test.ts:11", "shortDescription": {"text": "Commented-code block (7 lines) in server/routes/__tests__/auth-account-throttle.test.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-337bae9ea5c30b08", "name": "Commented-code block (7 lines) in server/routes/__tests__/meal-plan.test.ts:64", "shortDescription": {"text": "Commented-code block (7 lines) in server/routes/__tests__/meal-plan.test.ts:64"}, "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-f8cd6ba34b90cde1", "name": "Commented-code block (6 lines) in server/routes/__tests__/auth.test.ts:50", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/__tests__/auth.test.ts:50"}, "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-555170e30e277391", "name": "Commented-code block (5 lines) in server/routes/__tests__/recipe-search.test.ts:131", "shortDescription": {"text": "Commented-code block (5 lines) in server/routes/__tests__/recipe-search.test.ts:131"}, "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-530231f39f09e1ac", "name": "Commented-code block (6 lines) in server/routes/__tests__/chat.test.ts:65", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/__tests__/chat.test.ts:65"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2fde9d72d8119461", "name": "Commented-code block (6 lines) in server/routes/__tests__/recipes.test.ts:91", "shortDescription": {"text": "Commented-code block (6 lines) in server/routes/__tests__/recipes.test.ts:91"}, "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-be43930be5d1fa6b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/recipe-import.ts:434", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/recipe-import.ts:434"}, "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-24143559b47914fa", "name": "Commented-code block (5 lines) in server/services/coach-intent-classifier.ts:38", "shortDescription": {"text": "Commented-code block (5 lines) in server/services/coach-intent-classifier.ts:38"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-969914ae20738a5c", "name": "Commented-code block (5 lines) in server/services/coach-pro-chat.ts:541", "shortDescription": {"text": "Commented-code block (5 lines) in server/services/coach-pro-chat.ts:541"}, "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-46773aab50a08b4c", "name": "Commented-code block (9 lines) in server/services/barcode-lookup.ts:290", "shortDescription": {"text": "Commented-code block (9 lines) in server/services/barcode-lookup.ts:290"}, "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-064fb6feae7e069d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/micronutrient-lookup.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/micronutrient-lookup.ts:75"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-10f5f891f0fa53b7", "name": "Commented-code block (5 lines) in server/services/recipe-search.ts:211", "shortDescription": {"text": "Commented-code block (5 lines) in server/services/recipe-search.ts:211"}, "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-0d080a8e6ff5027d", "name": "Commented-code block (6 lines) in server/services/nutrition-lookup.ts:93", "shortDescription": {"text": "Commented-code block (6 lines) in server/services/nutrition-lookup.ts:93"}, "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-a12bb510c4dd51e3", "name": "Commented-code block (9 lines) in server/services/__tests__/nutrition-lookup.test.ts:389", "shortDescription": {"text": "Commented-code block (9 lines) in server/services/__tests__/nutrition-lookup.test.ts:389"}, "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-1742f2d9df141c78", "name": "Commented-code block (5 lines) in server/services/__tests__/coach-intent-classifier.test.ts:105", "shortDescription": {"text": "Commented-code block (5 lines) in server/services/__tests__/coach-intent-classifier.test.ts:105"}, "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-dd046daa8e6ab44f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/__tests__/notification-scheduler.test.ts:487", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/__tests__/notification-scheduler.test.ts:487"}, "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-4a65c3916176c82d", "name": "Commented-code block (6 lines) in server/storage/recipe-from-chat.ts:92", "shortDescription": {"text": "Commented-code block (6 lines) in server/storage/recipe-from-chat.ts:92"}, "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-dbaaf790b4f3379d", "name": "Commented-code block (6 lines) in server/storage/nutrition.ts:471", "shortDescription": {"text": "Commented-code block (6 lines) in server/storage/nutrition.ts:471"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c127ae3f9ea8d23b", "name": "Commented-code block (6 lines) in server/storage/verification.ts:232", "shortDescription": {"text": "Commented-code block (6 lines) in server/storage/verification.ts:232"}, "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-e4233a7cde228aa5", "name": "Commented-code block (5 lines) in server/storage/users.ts:167", "shortDescription": {"text": "Commented-code block (5 lines) in server/storage/users.ts:167"}, "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-ad22241ad637a89e", "name": "Commented-code block (6 lines) in server/storage/carousel.ts:127", "shortDescription": {"text": "Commented-code block (6 lines) in server/storage/carousel.ts:127"}, "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-e5459035bc7dd224", "name": "Commented-code block (8 lines) in server/storage/cookbooks.ts:31", "shortDescription": {"text": "Commented-code block (8 lines) in server/storage/cookbooks.ts:31"}, "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-8b04232beeac2bb1", "name": "Commented-code block (5 lines) in server/storage/export.ts:46", "shortDescription": {"text": "Commented-code block (5 lines) in server/storage/export.ts:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa14120560664cec", "name": "Commented-code block (6 lines) in server/storage/meal-plan-recipes-crud.ts:98", "shortDescription": {"text": "Commented-code block (6 lines) in server/storage/meal-plan-recipes-crud.ts:98"}, "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-cf4ec6e0d038f759", "name": "Commented-code block (5 lines) in server/storage/taste-picks.ts:62", "shortDescription": {"text": "Commented-code block (5 lines) in server/storage/taste-picks.ts:62"}, "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-cd27f9a2c521dce5", "name": "Commented-code block (5 lines) in server/storage/chat.ts:332", "shortDescription": {"text": "Commented-code block (5 lines) in server/storage/chat.ts:332"}, "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-4f87a7b7a57f6b5d", "name": "Commented-code block (5 lines) in server/storage/sessions.ts:193", "shortDescription": {"text": "Commented-code block (5 lines) in server/storage/sessions.ts:193"}, "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-46f5a2709a4ada9f", "name": "Commented-code block (6 lines) in server/storage/coach-notebook.ts:53", "shortDescription": {"text": "Commented-code block (6 lines) in server/storage/coach-notebook.ts:53"}, "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-7223f3eabf30103e", "name": "Commented-code block (5 lines) in server/storage/reformulation.ts:54", "shortDescription": {"text": "Commented-code block (5 lines) in server/storage/reformulation.ts:54"}, "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-2d7adf2686595944", "name": "Commented-code block (6 lines) in server/storage/__tests__/cookbooks.test.ts:321", "shortDescription": {"text": "Commented-code block (6 lines) in server/storage/__tests__/cookbooks.test.ts:321"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc3c142ad670bb96", "name": "Commented-code block (7 lines) in server/storage/__tests__/reformulation.test.ts:202", "shortDescription": {"text": "Commented-code block (7 lines) in server/storage/__tests__/reformulation.test.ts:202"}, "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-58056af1d59732c1", "name": "Commented-code block (8 lines) in server/storage/__tests__/verification.concurrent.test.ts:132", "shortDescription": {"text": "Commented-code block (8 lines) in server/storage/__tests__/verification.concurrent.test.ts:132"}, "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-d6fa8882301ee447", "name": "Commented-code block (5 lines) in server/storage/__tests__/api-keys.test.ts:120", "shortDescription": {"text": "Commented-code block (5 lines) in server/storage/__tests__/api-keys.test.ts:120"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1de90a75d46ce03f", "name": "Commented-code block (7 lines) in server/storage/__tests__/verification.test.ts:395", "shortDescription": {"text": "Commented-code block (7 lines) in server/storage/__tests__/verification.test.ts:395"}, "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-225f49ed1d0d55cd", "name": "Commented-code block (5 lines) in server/storage/__tests__/carousel.test.ts:64", "shortDescription": {"text": "Commented-code block (5 lines) in server/storage/__tests__/carousel.test.ts:64"}, "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-742bbfbcbcd0066d", "name": "Commented-code block (9 lines) in server/storage/__tests__/users.test.ts:238", "shortDescription": {"text": "Commented-code block (9 lines) in server/storage/__tests__/users.test.ts:238"}, "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-99ced821ea7674cf", "name": "Commented-code block (5 lines) in server/storage/__tests__/chat.test.ts:235", "shortDescription": {"text": "Commented-code block (5 lines) in server/storage/__tests__/chat.test.ts:235"}, "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-f6be44eaf85a60d9", "name": "Commented-code block (5 lines) in server/storage/__tests__/meal-plan-recipes.test.ts:513", "shortDescription": {"text": "Commented-code block (5 lines) in server/storage/__tests__/meal-plan-recipes.test.ts:513"}, "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-aa372c3db5038b15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 evals/runner-photo-analysis.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 evals/runner-photo-analysis.ts:41"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4c317ce0ecda6691", "name": "Commented-code block (6 lines) in evals/lib/dataset-schemas.ts:175", "shortDescription": {"text": "Commented-code block (6 lines) in evals/lib/dataset-schemas.ts:175"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9f5aacf76ccb86b4", "name": "Dangling fetch: GET http://localhost:8081/status (scripts/build.js:90)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:8081/status (scripts/build.js:90)"}, "fullDescription": {"text": "`scripts/build.js:90` calls `GET http://localhost:8081/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:8081/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-116d0624a0fec880", "name": "Dangling fetch: GET http://localhost:8081/manifest (scripts/build.js:210)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:8081/manifest (scripts/build.js:210)"}, "fullDescription": {"text": "`scripts/build.js:210` calls `GET http://localhost:8081/manifest` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:8081/manifest`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-77a3a3e95a387969", "name": "Dangling fetch: GET /api/items (eslint-plugin-ocrecipes/__tests__/rules.test.ts:88)", "shortDescription": {"text": "Dangling fetch: GET /api/items (eslint-plugin-ocrecipes/__tests__/rules.test.ts:88)"}, "fullDescription": {"text": "`eslint-plugin-ocrecipes/__tests__/rules.test.ts:88` calls `GET /api/items` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/items`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9921ad06bd067d03", "name": "Dangling fetch: GET /api/items (eslint-plugin-ocrecipes/__tests__/rules.test.ts:108)", "shortDescription": {"text": "Dangling fetch: GET /api/items (eslint-plugin-ocrecipes/__tests__/rules.test.ts:108)"}, "fullDescription": {"text": "`eslint-plugin-ocrecipes/__tests__/rules.test.ts:108` calls `GET /api/items` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/items`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ab3f0cd0a0f43f17", "name": "Dangling fetch: GET https://api.ocrecipes.com/api/v1/products/012345678901 (server/routes/api-docs.ts:132)", "shortDescription": {"text": "Dangling fetch: GET https://api.ocrecipes.com/api/v1/products/012345678901 (server/routes/api-docs.ts:132)"}, "fullDescription": {"text": "`server/routes/api-docs.ts:132` calls `GET https://api.ocrecipes.com/api/v1/products/012345678901` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.ocrecipes.com/api/v1/products/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c049479a179cbaf0", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/services/receipt-validation.ts:310)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/services/receipt-validation.ts:310)"}, "fullDescription": {"text": "`server/services/receipt-validation.ts:310` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f80ac91c06dc3ecb", "name": "Dangling fetch: GET https://world.openfoodfacts.org/api/v0/product/${variant}.json (server/services/barcode-lookup.ts:26", "shortDescription": {"text": "Dangling fetch: GET https://world.openfoodfacts.org/api/v0/product/${variant}.json (server/services/barcode-lookup.ts:265)"}, "fullDescription": {"text": "`server/services/barcode-lookup.ts:265` calls `GET https://world.openfoodfacts.org/api/v0/product/${variant}.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/world.openfoodfacts.org/api/v0/product/<p>.json`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f734d015ba8a3787", "name": "Dangling fetch: GET https://api.api-ninjas.com/v1/nutrition?query=${encodeURIComponent(query)} (server/services/nutritio", "shortDescription": {"text": "Dangling fetch: GET https://api.api-ninjas.com/v1/nutrition?query=${encodeURIComponent(query)} (server/services/nutrition-lookup.ts:221)"}, "fullDescription": {"text": "`server/services/nutrition-lookup.ts:221` calls `GET https://api.api-ninjas.com/v1/nutrition?query=${encodeURIComponent(query)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.api-ninjas.com/v1/nutrition`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-78ab9d532b2a9fc2", "name": "Dangling fetch: GET https://food-nutrition.canada.ca/api/canadian-nutrient-file/food/?lang=en&type=json (server/services", "shortDescription": {"text": "Dangling fetch: GET https://food-nutrition.canada.ca/api/canadian-nutrient-file/food/?lang=en&type=json (server/services/nutrition-lookup.ts:310)"}, "fullDescription": {"text": "`server/services/nutrition-lookup.ts:310` calls `GET https://food-nutrition.canada.ca/api/canadian-nutrient-file/food/?lang=en&type=json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/food-nutrition.canada.ca/api/canadian-nutrient-file/food`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e074e8e592600ad1", "name": "Dangling fetch: GET https://food-nutrition.canada.ca/api/canadian-nutrient-file/nutrientamount/?lang=en&type=json&id=${m", "shortDescription": {"text": "Dangling fetch: GET https://food-nutrition.canada.ca/api/canadian-nutrient-file/nutrientamount/?lang=en&type=json&id=${matchCode} (server/services/nutrition-lookup.ts:475)"}, "fullDescription": {"text": "`server/services/nutrition-lookup.ts:475` calls `GET https://food-nutrition.canada.ca/api/canadian-nutrient-file/nutrientamount/?lang=en&type=json&id=${matchCode}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/food-nutrition.canada.ca/api/canadian-nutrient-file/nutrientamount`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-814d238112f10561", "name": "Dangling fetch: POST https://api.nal.usda.gov/fdc/v1/foods/search?query=${encodeURIComponent(query)}&pageSize=1&api_key=", "shortDescription": {"text": "Dangling fetch: POST https://api.nal.usda.gov/fdc/v1/foods/search?query=${encodeURIComponent(query)}&pageSize=1&api_key=${USDA_API_KEY} (server/services/nutrition-lookup.ts:560)"}, "fullDescription": {"text": "`server/services/nutrition-lookup.ts:560` calls `POST https://api.nal.usda.gov/fdc/v1/foods/search?query=${encodeURIComponent(query)}&pageSize=1&api_key=${USDA_API_KEY}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.nal.usda.gov/fdc/v1/foods/search`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3b59435b3211a9df", "name": "Unused endpoint: USE /assets", "shortDescription": {"text": "Unused endpoint: USE /assets"}, "fullDescription": {"text": "`server/index.ts` declares `USE /assets` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-28bb10466cea252e", "name": "Unused endpoint: USE /api/avatars", "shortDescription": {"text": "Unused endpoint: USE /api/avatars"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/avatars` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5745e46f4488e4a4", "name": "Unused endpoint: USE /api/recipe-images", "shortDescription": {"text": "Unused endpoint: USE /api/recipe-images"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/recipe-images` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`server/index.ts` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2be58bb794eba5b4", "name": "Unused endpoint: GET /api/nutrition/lookup", "shortDescription": {"text": "Unused endpoint: GET /api/nutrition/lookup"}, "fullDescription": {"text": "`server/routes/nutrition.ts` declares `GET /api/nutrition/lookup` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27aa6c9338b1d040", "name": "Unused endpoint: GET /api/nutrition/barcode/:code", "shortDescription": {"text": "Unused endpoint: GET /api/nutrition/barcode/:code"}, "fullDescription": {"text": "`server/routes/nutrition.ts` declares `GET /api/nutrition/barcode/:code` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f11ea5b6ca20a63", "name": "Unused endpoint: GET /api/scanned-items/frequent", "shortDescription": {"text": "Unused endpoint: GET /api/scanned-items/frequent"}, "fullDescription": {"text": "`server/routes/nutrition.ts` declares `GET /api/scanned-items/frequent` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f33f98f3621e8dde", "name": "Unused endpoint: GET /api/scanned-items", "shortDescription": {"text": "Unused endpoint: GET /api/scanned-items"}, "fullDescription": {"text": "`server/routes/nutrition.ts` declares `GET /api/scanned-items` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-235a24d1eed4fb24", "name": "Unused endpoint: GET /api/scanned-items/:id", "shortDescription": {"text": "Unused endpoint: GET /api/scanned-items/:id"}, "fullDescription": {"text": "`server/routes/nutrition.ts` declares `GET /api/scanned-items/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bcb251ce23abfdea", "name": "Unused endpoint: POST /api/scanned-items", "shortDescription": {"text": "Unused endpoint: POST /api/scanned-items"}, "fullDescription": {"text": "`server/routes/nutrition.ts` declares `POST /api/scanned-items` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea75085a7efc8da9", "name": "Unused endpoint: POST /api/scanned-items/:id/favourite", "shortDescription": {"text": "Unused endpoint: POST /api/scanned-items/:id/favourite"}, "fullDescription": {"text": "`server/routes/nutrition.ts` declares `POST /api/scanned-items/:id/favourite` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d524c98e7fb23b8", "name": "Unused endpoint: DELETE /api/scanned-items/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/scanned-items/:id"}, "fullDescription": {"text": "`server/routes/nutrition.ts` declares `DELETE /api/scanned-items/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5154a20c8be95fff", "name": "Unused endpoint: GET /api/daily-summary", "shortDescription": {"text": "Unused endpoint: GET /api/daily-summary"}, "fullDescription": {"text": "`server/routes/nutrition.ts` declares `GET /api/daily-summary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5b3437e64c8f7b4", "name": "Unused endpoint: POST /api/auth/register", "shortDescription": {"text": "Unused endpoint: POST /api/auth/register"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd55aa0818a7c897", "name": "Unused endpoint: POST /api/auth/login", "shortDescription": {"text": "Unused endpoint: POST /api/auth/login"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d5a39262ac205120", "name": "Unused endpoint: POST /api/auth/logout", "shortDescription": {"text": "Unused endpoint: POST /api/auth/logout"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee4aa5ddab88c9dc", "name": "Unused endpoint: GET /api/auth/me", "shortDescription": {"text": "Unused endpoint: GET /api/auth/me"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `GET /api/auth/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-777caeb29516f12f", "name": "Unused endpoint: PUT /api/auth/profile", "shortDescription": {"text": "Unused endpoint: PUT /api/auth/profile"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `PUT /api/auth/profile` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a4efe307fed78b8b", "name": "Unused endpoint: DELETE /api/auth/account", "shortDescription": {"text": "Unused endpoint: DELETE /api/auth/account"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `DELETE /api/auth/account` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b0dff791507cb74", "name": "Unused endpoint: POST /api/user/avatar", "shortDescription": {"text": "Unused endpoint: POST /api/user/avatar"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/user/avatar` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ddc8c8ee823ae9f", "name": "Unused endpoint: DELETE /api/user/avatar", "shortDescription": {"text": "Unused endpoint: DELETE /api/user/avatar"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `DELETE /api/user/avatar` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8bed13197410b2ef", "name": "Unused endpoint: POST /api/batch/save", "shortDescription": {"text": "Unused endpoint: POST /api/batch/save"}, "fullDescription": {"text": "`server/routes/batch-scan.ts` declares `POST /api/batch/save` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6cb918eef3c0f568", "name": "Unused endpoint: POST /api/food/parse-text", "shortDescription": {"text": "Unused endpoint: POST /api/food/parse-text"}, "fullDescription": {"text": "`server/routes/food.ts` declares `POST /api/food/parse-text` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ac0516f97ea3902", "name": "Unused endpoint: POST /api/food/transcribe", "shortDescription": {"text": "Unused endpoint: POST /api/food/transcribe"}, "fullDescription": {"text": "`server/routes/food.ts` declares `POST /api/food/transcribe` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-53c43f8213c15d9e", "name": "Unused endpoint: POST /api/verification/submit", "shortDescription": {"text": "Unused endpoint: POST /api/verification/submit"}, "fullDescription": {"text": "`server/routes/verification.ts` declares `POST /api/verification/submit` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37ce55faa2f1c27e", "name": "Unused endpoint: POST /api/verification/front-label", "shortDescription": {"text": "Unused endpoint: POST /api/verification/front-label"}, "fullDescription": {"text": "`server/routes/verification.ts` declares `POST /api/verification/front-label` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-54bc0527bbbf8d76", "name": "Unused endpoint: POST /api/verification/front-label/confirm", "shortDescription": {"text": "Unused endpoint: POST /api/verification/front-label/confirm"}, "fullDescription": {"text": "`server/routes/verification.ts` declares `POST /api/verification/front-label/confirm` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f608e6c68d2ae6b1", "name": "Unused endpoint: GET /api/verification/reformulation-flags", "shortDescription": {"text": "Unused endpoint: GET /api/verification/reformulation-flags"}, "fullDescription": {"text": "`server/routes/verification.ts` declares `GET /api/verification/reformulation-flags` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2be95ad57ee5da2f", "name": "Unused endpoint: POST /api/verification/reformulation-flags/:flagId/resolve", "shortDescription": {"text": "Unused endpoint: POST /api/verification/reformulation-flags/:flagId/resolve"}, "fullDescription": {"text": "`server/routes/verification.ts` declares `POST /api/verification/reformulation-flags/:flagId/resolve` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fac1fb0a08156cff", "name": "Unused endpoint: GET /api/verification/user-count", "shortDescription": {"text": "Unused endpoint: GET /api/verification/user-count"}, "fullDescription": {"text": "`server/routes/verification.ts` declares `GET /api/verification/user-count` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b426d82ebd58e2cd", "name": "Unused endpoint: GET /api/verification/:barcode", "shortDescription": {"text": "Unused endpoint: GET /api/verification/:barcode"}, "fullDescription": {"text": "`server/routes/verification.ts` declares `GET /api/verification/:barcode` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dda377705ba9743e", "name": "Unused endpoint: GET /api/coach/notebook", "shortDescription": {"text": "Unused endpoint: GET /api/coach/notebook"}, "fullDescription": {"text": "`server/routes/notebook.ts` declares `GET /api/coach/notebook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f3d2806d7523101", "name": "Unused endpoint: POST /api/coach/notebook", "shortDescription": {"text": "Unused endpoint: POST /api/coach/notebook"}, "fullDescription": {"text": "`server/routes/notebook.ts` declares `POST /api/coach/notebook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99b90b81ce0ef0cd", "name": "Unused endpoint: PATCH /api/coach/notebook/:id", "shortDescription": {"text": "Unused endpoint: PATCH /api/coach/notebook/:id"}, "fullDescription": {"text": "`server/routes/notebook.ts` declares `PATCH /api/coach/notebook/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eea04b1633e97d26", "name": "Unused endpoint: DELETE /api/coach/notebook/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/coach/notebook/:id"}, "fullDescription": {"text": "`server/routes/notebook.ts` declares `DELETE /api/coach/notebook/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0339ea0dc47e7070", "name": "Unused endpoint: GET /api/reminders/pending", "shortDescription": {"text": "Unused endpoint: GET /api/reminders/pending"}, "fullDescription": {"text": "`server/routes/reminders.ts` declares `GET /api/reminders/pending` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3526cef9fd507417", "name": "Unused endpoint: POST /api/reminders/acknowledge", "shortDescription": {"text": "Unused endpoint: POST /api/reminders/acknowledge"}, "fullDescription": {"text": "`server/routes/reminders.ts` declares `POST /api/reminders/acknowledge` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fa3c224bf7c45ff2", "name": "Unused endpoint: PATCH /api/reminders/mutes", "shortDescription": {"text": "Unused endpoint: PATCH /api/reminders/mutes"}, "fullDescription": {"text": "`server/routes/reminders.ts` declares `PATCH /api/reminders/mutes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-204e9e41973145e0", "name": "Unused endpoint: GET /api/saved-items", "shortDescription": {"text": "Unused endpoint: GET /api/saved-items"}, "fullDescription": {"text": "`server/routes/saved-items.ts` declares `GET /api/saved-items` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d4cc9a91dc0bffa8", "name": "Unused endpoint: GET /api/saved-items/count", "shortDescription": {"text": "Unused endpoint: GET /api/saved-items/count"}, "fullDescription": {"text": "`server/routes/saved-items.ts` declares `GET /api/saved-items/count` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a02cc863eaafac1", "name": "Unused endpoint: POST /api/saved-items", "shortDescription": {"text": "Unused endpoint: POST /api/saved-items"}, "fullDescription": {"text": "`server/routes/saved-items.ts` declares `POST /api/saved-items` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-98801dfa35412dce", "name": "Unused endpoint: DELETE /api/saved-items/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/saved-items/:id"}, "fullDescription": {"text": "`server/routes/saved-items.ts` declares `DELETE /api/saved-items/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f46cb4ef071fc81", "name": "Unused endpoint: GET /api/v1/docs", "shortDescription": {"text": "Unused endpoint: GET /api/v1/docs"}, "fullDescription": {"text": "`server/routes/api-docs.ts` declares `GET /api/v1/docs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-da6ed798b1f474d2", "name": "Unused endpoint: GET /api/meal-plan/recipes", "shortDescription": {"text": "Unused endpoint: GET /api/meal-plan/recipes"}, "fullDescription": {"text": "`server/routes/meal-plan.ts` declares `GET /api/meal-plan/recipes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c523ea12e6aab841", "name": "Unused endpoint: GET /api/meal-plan/recipes/:id", "shortDescription": {"text": "Unused endpoint: GET /api/meal-plan/recipes/:id"}, "fullDescription": {"text": "`server/routes/meal-plan.ts` declares `GET /api/meal-plan/recipes/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc77e3034337942e", "name": "Unused endpoint: POST /api/meal-plan/recipes", "shortDescription": {"text": "Unused endpoint: POST /api/meal-plan/recipes"}, "fullDescription": {"text": "`server/routes/meal-plan.ts` declares `POST /api/meal-plan/recipes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b2de78eaeb6670b2", "name": "Unused endpoint: PUT /api/meal-plan/recipes/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/meal-plan/recipes/:id"}, "fullDescription": {"text": "`server/routes/meal-plan.ts` declares `PUT /api/meal-plan/recipes/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e5d4934ae77179a2", "name": "Unused endpoint: DELETE /api/meal-plan/recipes/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/meal-plan/recipes/:id"}, "fullDescription": {"text": "`server/routes/meal-plan.ts` declares `DELETE /api/meal-plan/recipes/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6a19dcd879ed752", "name": "Unused endpoint: GET /api/meal-plan", "shortDescription": {"text": "Unused endpoint: GET /api/meal-plan"}, "fullDescription": {"text": "`server/routes/meal-plan.ts` declares `GET /api/meal-plan` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-294f8c40154e24a9", "name": "Unused endpoint: POST /api/meal-plan/items", "shortDescription": {"text": "Unused endpoint: POST /api/meal-plan/items"}, "fullDescription": {"text": "`server/routes/meal-plan.ts` declares `POST /api/meal-plan/items` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22978"}, "properties": {"repository": "Xertox1234/OCRecipes", "repoUrl": "https://github.com/Xertox1234/OCRecipes", "branch": "main"}, "results": [{"ruleId": "scanner-c2311fc791ba6b41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/global-teardown.ts:55"}, "properties": {"repobilityId": "b04cbabf2dd8c380", "scanner": "scanner-primary", "fingerprint": "c2311fc791ba6b41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e24d5fb4f180a8b7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-accessibility.js:238"}, "properties": {"repobilityId": "119c438fa44c24ec", "scanner": "scanner-primary", "fingerprint": "e24d5fb4f180a8b7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-90f9901526fb454e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-idor-storage.js:259"}, "properties": {"repobilityId": "a85992a68d05b94e", "scanner": "scanner-primary", "fingerprint": "90f9901526fb454e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5653b79b4dc77117", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-instructions.ts:66"}, "properties": {"repobilityId": "291b17e0edfe0e58", "scanner": "scanner-primary", "fingerprint": "5653b79b4dc77117", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ecf1cd82734a969f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-junk-mealplan-recipes.ts:27"}, "properties": {"repobilityId": "fe1b81748f44864b", "scanner": "scanner-primary", "fingerprint": "ecf1cd82734a969f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-68e955f2bb8cb486", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/coverage-ratchet.ts:204"}, "properties": {"repobilityId": "164bb0b9ad6507d7", "scanner": "scanner-primary", "fingerprint": "68e955f2bb8cb486", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7099bd47bfdae9b1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-domain-map.ts:100"}, "properties": {"repobilityId": "e7c99583fb37f914", "scanner": "scanner-primary", "fingerprint": "7099bd47bfdae9b1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-00ee044a0159a80f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-recipe-images.ts:32"}, "properties": {"repobilityId": "46d4efa142a6dbeb", "scanner": "scanner-primary", "fingerprint": "00ee044a0159a80f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a715f6a07c1d0f92", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/delegate-copilot-issue.ts:752"}, "properties": {"repobilityId": "7370433479bcbb56", "scanner": "scanner-primary", "fingerprint": "a715f6a07c1d0f92", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e9121050712669ee", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/canonicalize-recipe.ts:24"}, "properties": {"repobilityId": "23dd422d91fb7119", "scanner": "scanner-primary", "fingerprint": "e9121050712669ee", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fa98be345cac1593", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-copilot-instructions.ts:97"}, "properties": {"repobilityId": "e794fd13ddc430b8", "scanner": "scanner-primary", "fingerprint": "fa98be345cac1593", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-74a7736adf5cd5f9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-jsdom-pragma.js:105"}, "properties": {"repobilityId": "556dd8ed7910f497", "scanner": "scanner-primary", "fingerprint": "74a7736adf5cd5f9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54e157be3004f747", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-ingredient-icons.ts:129"}, "properties": {"repobilityId": "0c01f8e3cb77fdd7", "scanner": "scanner-primary", "fingerprint": "54e157be3004f747", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fbcc1a0c87b48b2f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-junk-recipes.ts:21"}, "properties": {"repobilityId": "0b0e77bdbdc83588", "scanner": "scanner-primary", "fingerprint": "fbcc1a0c87b48b2f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb207c18f7e4fc16", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build.js:20"}, "properties": {"repobilityId": "bec84472234cc3b8", "scanner": "scanner-primary", "fingerprint": "fb207c18f7e4fc16", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e154da25daec4952", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-hardcoded-colors.js:160"}, "properties": {"repobilityId": "7cfb58942090ccea", "scanner": "scanner-primary", "fingerprint": "e154da25daec4952", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d7b9f2e31e8d421f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-app-assets.ts:56"}, "properties": {"repobilityId": "08e61322d56612e6", "scanner": "scanner-primary", "fingerprint": "d7b9f2e31e8d421f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e12f02d127cae4f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-eval-dataset-secrets.js:131"}, "properties": {"repobilityId": "40ddfa9c24179580", "scanner": "scanner-primary", "fingerprint": "3e12f02d127cae4f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a4c44949d63a8454", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-timestamptz-migration.ts:23"}, "properties": {"repobilityId": "8bc52b13fc6a478e", "scanner": "scanner-primary", "fingerprint": "a4c44949d63a8454", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3bf5d3c8831cece0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-recipe-ingredients.ts:159"}, "properties": {"repobilityId": "150158480bb97757", "scanner": "scanner-primary", "fingerprint": "3bf5d3c8831cece0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb36d20a822d55c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/ingest.ts:27"}, "properties": {"repobilityId": "dd68fd47e13230dd", "scanner": "scanner-primary", "fingerprint": "eb36d20a822d55c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-18021ab12dff928f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/export.ts:60"}, "properties": {"repobilityId": "dffb4ef20d24063d", "scanner": "scanner-primary", "fingerprint": "18021ab12dff928f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1af37503c22624c1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/hook-equivalence-check.ts:78"}, "properties": {"repobilityId": "32e219a7a7e99ebc", "scanner": "scanner-primary", "fingerprint": "1af37503c22624c1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ea3f935f757510b6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/add.ts:59"}, "properties": {"repobilityId": "6930fe76dc9b1ec9", "scanner": "scanner-primary", "fingerprint": "ea3f935f757510b6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-94c21c82bbbdecdc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/integration-check.ts:27"}, "properties": {"repobilityId": "9b770766d7c825ad", "scanner": "scanner-primary", "fingerprint": "94c21c82bbbdecdc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5324fd7ef0a3029", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/dedup-report.ts:76"}, "properties": {"repobilityId": "d7b6e098409d3abc", "scanner": "scanner-primary", "fingerprint": "d5324fd7ef0a3029", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d3be5ebea5b689e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/solutions-db/parity-check.ts:26"}, "properties": {"repobilityId": "0bc03f014ef5aa64", "scanner": "scanner-primary", "fingerprint": "d3be5ebea5b689e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7677d26571788ffe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-recipe-images.ts:69"}, "properties": {"repobilityId": "7a7e1442b13f0360", "scanner": "scanner-primary", "fingerprint": "7677d26571788ffe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a305919470df3e96", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/cleanup-retention.ts:405"}, "properties": {"repobilityId": "4ccc52299e4e2757", "scanner": "scanner-primary", "fingerprint": "a305919470df3e96", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-57bde8b14d4ac34d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/seed-recipes.ts:229"}, "properties": {"repobilityId": "c3b1aa2c9d74f8a6", "scanner": "scanner-primary", "fingerprint": "57bde8b14d4ac34d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f44dcacaa9ed3f7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-avatars.ts:69"}, "properties": {"repobilityId": "5eab9d9eac86ff51", "scanner": "scanner-primary", "fingerprint": "3f44dcacaa9ed3f7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b19e60ef38fe1f65", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-recipe-allergens.ts:78"}, "properties": {"repobilityId": "ac92d86703c52fed", "scanner": "scanner-primary", "fingerprint": "b19e60ef38fe1f65", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f7705e9d3a1822c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-barcode-nutrition.ts:15"}, "properties": {"repobilityId": "fb5dc317ab86af63", "scanner": "scanner-primary", "fingerprint": "3f7705e9d3a1822c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-537760fcc0173cf0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-images-to-r2.ts:88"}, "properties": {"repobilityId": "2323d3a7a55b4c48", "scanner": "scanner-primary", "fingerprint": "537760fcc0173cf0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83dfbeab5fb51a76", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-community-nutrition.ts:92"}, "properties": {"repobilityId": "a5d4f2dcb2a36960", "scanner": "scanner-primary", "fingerprint": "83dfbeab5fb51a76", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c17d38b00b03d8c7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/cleanup-seed-recipes.ts:65"}, "properties": {"repobilityId": "adf7a5a22942e27b", "scanner": "scanner-primary", "fingerprint": "c17d38b00b03d8c7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14d8c1dfd2767090", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-community-meal-types.ts:21"}, "properties": {"repobilityId": "bd4499150b08506b", "scanner": "scanner-primary", "fingerprint": "14d8c1dfd2767090", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9409bf0548730475", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/backfill-meal-types.ts:13"}, "properties": {"repobilityId": "1d170036e787a7b8", "scanner": "scanner-primary", "fingerprint": "9409bf0548730475", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e235462290c583af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/routes/api-docs.ts:137"}, "properties": {"repobilityId": "9c8b532f69aa5cc4", "scanner": "scanner-primary", "fingerprint": "e235462290c583af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-17b810f261cf70f7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 evals/lib/runner-core.ts:99"}, "properties": {"repobilityId": "b2124c19fddb5630", "scanner": "scanner-primary", "fingerprint": "17b810f261cf70f7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ee84c5cbe71cd936", "level": "warning", "message": {"text": "Privileged port 27 in use"}, "properties": {"repobilityId": "69cb2b980eb576a0", "scanner": "scanner-primary", "fingerprint": "ee84c5cbe71cd936", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f87f70db505ac6c7", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/delegate-copilot-issue.ts:1"}, "properties": {"repobilityId": "867d885b6fc3a171", "scanner": "scanner-primary", "fingerprint": "f87f70db505ac6c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/delegate-copilot-issue.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fb7135840997f3d0", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/mutation-explore.mjs:8"}, "properties": {"repobilityId": "c5246e54a9b6959f", "scanner": "scanner-primary", "fingerprint": "fb7135840997f3d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/mutation-explore.mjs"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-15ea283f88add6b3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/build.js:3"}, "properties": {"repobilityId": "92d9ca3cb748b2da", "scanner": "scanner-primary", "fingerprint": "15ea283f88add6b3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build.js"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-e719eb02c2060b08", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/__tests__/check-eval-dataset-secrets.test.ts:5"}, "properties": {"repobilityId": "3187909d84c44342", "scanner": "scanner-primary", "fingerprint": "e719eb02c2060b08", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/__tests__/check-eval-dataset-secrets.test.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-460a6533e2aaaf01", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/lib/__tests__/path-domains.test.ts:2"}, "properties": {"repobilityId": "7de4b82779168cd6", "scanner": "scanner-primary", "fingerprint": "460a6533e2aaaf01", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/lib/__tests__/path-domains.test.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-362e55b13a98ea9a", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/solutions-db/hook-equivalence-check.ts:10"}, "properties": {"repobilityId": "49f990a854f38600", "scanner": "scanner-primary", "fingerprint": "362e55b13a98ea9a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/solutions-db/hook-equivalence-check.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-affb42b00196e06b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in server/routes/public-api.ts:132"}, "properties": {"repobilityId": "27924ad7fdbb6bc5", "scanner": "scanner-primary", "fingerprint": "affb42b00196e06b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/routes/public-api.ts"}, "region": {"startLine": 132}}}]}, {"ruleId": "scanner-65aa740cba4a4a73", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8860eac61a1ebe26", "scanner": "scanner-primary", "fingerprint": "65aa740cba4a4a73", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-65aa740cba4a4a73", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "549a2de1ac0c3fa9", "scanner": "scanner-primary", "fingerprint": "65aa740cba4a4a73", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-65aa740cba4a4a73", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a5721e15e3a54aa2", "scanner": "scanner-primary", "fingerprint": "65aa740cba4a4a73", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-af930df47c1df96b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "70aac0be7ae790e7", "scanner": "scanner-primary", "fingerprint": "af930df47c1df96b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-smoke.yml"}, "region": {"startLine": 110}}}]}, {"ruleId": "scanner-6351d74dc7713a3a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8df2777b829e2c15", "scanner": "scanner-primary", "fingerprint": "6351d74dc7713a3a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/mutation-goal-safety.yml"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-f774525e35947738", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1b7e17b24d4a8667", "scanner": "scanner-primary", "fingerprint": "f774525e35947738", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/mutation.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4e84b2102819e9b8", "level": "note", "message": {"text": "Very large file: shared/schema.ts (1835 lines)"}, "properties": {"repobilityId": "43ade807c81236e6", "scanner": "scanner-primary", "fingerprint": "4e84b2102819e9b8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aba2095ac97be57e", "level": "note", "message": {"text": "50 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "aba2095ac97be57e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "d5bf621dcd6882f5", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "6fa79c858fc457ee", "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": "1d18eef1eecf6140", "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": "91d060d90fbd89f4", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "9cda849f9dfff9e6", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "85f8f2a4d5cd84f1", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "935d5a1d6aea14e4", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-cc55229a7a3c078d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "properties": {"repobilityId": "51942fb3d5b8b5b4", "scanner": "scanner-primary", "fingerprint": "cc55229a7a3c078d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "mcp_config"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".mcp.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d84092d6e24f0b30", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/todo-researcher.md"}, "properties": {"repobilityId": "accfbbcc43cb8a48", "scanner": "scanner-primary", "fingerprint": "d84092d6e24f0b30", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/todo-researcher.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aef9872ebbd2b160", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .github/copilot-instructions.md"}, "properties": {"repobilityId": "0f079956bea4eb94", "scanner": "scanner-primary", "fingerprint": "aef9872ebbd2b160", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agent_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/copilot-instructions.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c312c4eebe991564", "level": "none", "message": {"text": "Commented-code block (5 lines) in react-native.config.js:1"}, "properties": {"repobilityId": "beb6eb1b6ce9971d", "scanner": "scanner-primary", "fingerprint": "c312c4eebe991564", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2808241eab2695e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in stryker.explore.conf.mjs:1"}, "properties": {"repobilityId": "a1b4365a34c96f27", "scanner": "scanner-primary", "fingerprint": "2808241eab2695e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b5e5eb4d4e9bc44", "level": "none", "message": {"text": "Commented-code block (6 lines) in vitest.config.ts:27"}, "properties": {"repobilityId": "d715403c3fb25f5e", "scanner": "scanner-primary", "fingerprint": "8b5e5eb4d4e9bc44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4a362c1699232eab", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/navigation/ChatStackNavigator.tsx:46"}, "properties": {"repobilityId": "49b91bdc636f4eea", "scanner": "scanner-primary", "fingerprint": "4a362c1699232eab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31d858afe329b250", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/screens/NotebookEntryScreen.tsx:51"}, "properties": {"repobilityId": "f78f3f0521c502ee", "scanner": "scanner-primary", "fingerprint": "31d858afe329b250", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5730f3a3118a595", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/screens/CoachRemindersScreen.tsx:64"}, "properties": {"repobilityId": "8fa6336c73b91c3b", "scanner": "scanner-primary", "fingerprint": "f5730f3a3118a595", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7610eb80a54d25d3", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/screens/ScanScreen.tsx:415"}, "properties": {"repobilityId": "ac422a3dc1e34123", "scanner": "scanner-primary", "fingerprint": "7610eb80a54d25d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc1e3ac9548cf265", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/screens/BatchScanScreen.tsx:142"}, "properties": {"repobilityId": "471a861691e56003", "scanner": "scanner-primary", "fingerprint": "fc1e3ac9548cf265", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7edd63f0e2d6d9a", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/screens/meal-plan/RecipeBrowserScreen.tsx:381"}, "properties": {"repobilityId": "68eb970101f6724c", "scanner": "scanner-primary", "fingerprint": "e7edd63f0e2d6d9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e7e276339fce8ed", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/constants/theme.ts:32"}, "properties": {"repobilityId": "7cead20a77f64e90", "scanner": "scanner-primary", "fingerprint": "7e7e276339fce8ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8cb6ccae21e66aa", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/components/CoachOverlayContent.tsx:67"}, "properties": {"repobilityId": "a268ac324828170b", "scanner": "scanner-primary", "fingerprint": "f8cb6ccae21e66aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a80a7d29701be2dd", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/components/RecipeGenerationModal.tsx:98"}, "properties": {"repobilityId": "1f89f23066c67660", "scanner": "scanner-primary", "fingerprint": "a80a7d29701be2dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-653e93b44efc20af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/home/CuratedRecipeCarousel.tsx:139"}, "properties": {"repobilityId": "331bc32c0b4ce2d2", "scanner": "scanner-primary", "fingerprint": "653e93b44efc20af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c69f92420cb65278", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/home/RecipeCarousel.tsx:109"}, "properties": {"repobilityId": "2641357e990d2824", "scanner": "scanner-primary", "fingerprint": "c69f92420cb65278", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-82301a1e5de51942", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/home/CarouselError.tsx:29"}, "properties": {"repobilityId": "f24d9da70d040e05", "scanner": "scanner-primary", "fingerprint": "82301a1e5de51942", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1bb25675ce2d5e8d", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/components/coach/CoachChat.tsx:202"}, "properties": {"repobilityId": "715d0f4a4ef6600a", "scanner": "scanner-primary", "fingerprint": "1bb25675ce2d5e8d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-599725fa8e943efe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/components/coach/CoachChat.tsx:202"}, "properties": {"repobilityId": "a104e209e163393d", "scanner": "scanner-primary", "fingerprint": "599725fa8e943efe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dba87c9e238d5b36", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/components/recipe-wizard/InstructionsStep.tsx:289"}, "properties": {"repobilityId": "9338f6c31882ec25", "scanner": "scanner-primary", "fingerprint": "dba87c9e238d5b36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-915fbce357abb484", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/components/recipe-wizard/PreviewStep.tsx:119"}, "properties": {"repobilityId": "560438e61939dfd3", "scanner": "scanner-primary", "fingerprint": "915fbce357abb484", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1049f240e7f32980", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/camera/components/CameraView.tsx:153"}, "properties": {"repobilityId": "1ba737a65612ddd7", "scanner": "scanner-primary", "fingerprint": "1049f240e7f32980", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78cddc28c837512b", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/camera/components/CameraView.ios.tsx:180"}, "properties": {"repobilityId": "fb78ad6c7f446cc4", "scanner": "scanner-primary", "fingerprint": "78cddc28c837512b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc70c05eb17b4861", "level": "none", "message": {"text": "Commented-code block (7 lines) in client/camera/hooks/__tests__/useCamera.test.ts:468"}, "properties": {"repobilityId": "b57feb99965e409e", "scanner": "scanner-primary", "fingerprint": "fc70c05eb17b4861", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-19f460719f654b27", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/lib/serving-size-utils.ts:280"}, "properties": {"repobilityId": "3fec6893c33911e1", "scanner": "scanner-primary", "fingerprint": "19f460719f654b27", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0368da89f055dbd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/lib/photo-upload.ts:179"}, "properties": {"repobilityId": "08144ce11bab0761", "scanner": "scanner-primary", "fingerprint": "b0368da89f055dbd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cadcd04e74430b3e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/lib/query-client.ts:180"}, "properties": {"repobilityId": "e6f9ec0cb01e7957", "scanner": "scanner-primary", "fingerprint": "cadcd04e74430b3e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-40f63ddddb451042", "level": "note", "message": {"text": "Legacy-named symbol `cook_session_backup` in client/lib/cook-session-storage.ts:10"}, "properties": {"repobilityId": "b4ad602ccaaaf76a", "scanner": "scanner-primary", "fingerprint": "40f63ddddb451042", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2930fe6309bcbf52", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/lib/token-storage.ts:46"}, "properties": {"repobilityId": "cb5bd00de3575767", "scanner": "scanner-primary", "fingerprint": "2930fe6309bcbf52", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ef8eba8cfef1712", "level": "note", "message": {"text": "Legacy-named symbol `cook_session_backup` in client/lib/__tests__/cook-session-storage.test.ts:49"}, "properties": {"repobilityId": "16ec28540798ab9d", "scanner": "scanner-primary", "fingerprint": "0ef8eba8cfef1712", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b921c268a8a88467", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/lib/__tests__/offline-queue-drain.test.ts:248"}, "properties": {"repobilityId": "e035c4e8b499b51c", "scanner": "scanner-primary", "fingerprint": "b921c268a8a88467", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-255393f565fd0dac", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useCarouselRecipes.ts:28"}, "properties": {"repobilityId": "4b30cc3ac2670b2b", "scanner": "scanner-primary", "fingerprint": "255393f565fd0dac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5aab01a679d9e557", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/hooks/useNutritionLookup.ts:402"}, "properties": {"repobilityId": "dc3bc643b83800da", "scanner": "scanner-primary", "fingerprint": "5aab01a679d9e557", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53d1bb0dd4750ac7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useNutritionLookup.ts:199"}, "properties": {"repobilityId": "9e3415b5802c228a", "scanner": "scanner-primary", "fingerprint": "53d1bb0dd4750ac7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-beeb18b461d92542", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/hooks/useCoachStream.ts:53"}, "properties": {"repobilityId": "78847200a0b186e6", "scanner": "scanner-primary", "fingerprint": "beeb18b461d92542", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5dcf6c60de981387", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/hooks/useQuickLogSession.ts:320"}, "properties": {"repobilityId": "14fb573e6ddee8b8", "scanner": "scanner-primary", "fingerprint": "5dcf6c60de981387", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b71fcabecec42e6f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useSavedItems.ts:37"}, "properties": {"repobilityId": "785e1c5d432c60c2", "scanner": "scanner-primary", "fingerprint": "b71fcabecec42e6f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f623000094192755", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/hooks/useAuth.ts:55"}, "properties": {"repobilityId": "19ee6623518a0c1a", "scanner": "scanner-primary", "fingerprint": "f623000094192755", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7173deb01e173229", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/hooks/useHistoryData.ts:149"}, "properties": {"repobilityId": "e7e6e00100207a51", "scanner": "scanner-primary", "fingerprint": "7173deb01e173229", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9804d3d72e5e5013", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useHistoryData.ts:118"}, "properties": {"repobilityId": "3524c4b5b9503a17", "scanner": "scanner-primary", "fingerprint": "9804d3d72e5e5013", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-874ee03e6de21a2f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/useMenuScan.ts:35"}, "properties": {"repobilityId": "85057887fecbf0ae", "scanner": "scanner-primary", "fingerprint": "874ee03e6de21a2f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7b930ed0844b9e61", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/hooks/useSpeechToText.ts:95"}, "properties": {"repobilityId": "939db5f3b63c3709", "scanner": "scanner-primary", "fingerprint": "7b930ed0844b9e61", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7661fc9d1e59ba5", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/hooks/useMicronutrients.ts:31"}, "properties": {"repobilityId": "4c82b43293c18c6f", "scanner": "scanner-primary", "fingerprint": "b7661fc9d1e59ba5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d8c85e60c653167", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/hooks/useChat.ts:314"}, "properties": {"repobilityId": "6a77f1333fe57ac0", "scanner": "scanner-primary", "fingerprint": "0d8c85e60c653167", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e29f11b9be3525cc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/hooks/__tests__/useAuth.test.ts:139"}, "properties": {"repobilityId": "6e52a3c89c509c14", "scanner": "scanner-primary", "fingerprint": "e29f11b9be3525cc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d94acaa4999b642b", "level": "none", "message": {"text": "Commented-code block (8 lines) in client/context/OnboardingContext.tsx:86"}, "properties": {"repobilityId": "9dcd2076bbab1e1a", "scanner": "scanner-primary", "fingerprint": "d94acaa4999b642b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fd07ec5752c7b49", "level": "none", "message": {"text": "Commented-code block (7 lines) in client/context/__tests__/PremiumContext.test.ts:13"}, "properties": {"repobilityId": "ef8a0970ae5fc7bd", "scanner": "scanner-primary", "fingerprint": "5fd07ec5752c7b49", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-341b869f60bbd083", "level": "none", "message": {"text": "Commented-code block (7 lines) in test/global-teardown.ts:75"}, "properties": {"repobilityId": "06df8b5cc4ff9683", "scanner": "scanner-primary", "fingerprint": "341b869f60bbd083", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f0ef545abbc0403", "level": "none", "message": {"text": "Commented-code block (5 lines) in test/setup.ts:12"}, "properties": {"repobilityId": "80e9c32e61587fa2", "scanner": "scanner-primary", "fingerprint": "6f0ef545abbc0403", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fec30bf60be0e5f2", "level": "none", "message": {"text": "Commented-code block (7 lines) in test/mocks/react-native-reanimated.ts:22"}, "properties": {"repobilityId": "48403d7d993bf2ac", "scanner": "scanner-primary", "fingerprint": "fec30bf60be0e5f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5427315d463477bd", "level": "none", "message": {"text": "Commented-code block (7 lines) in shared/schema.ts:556"}, "properties": {"repobilityId": "caad486aedf6c9f4", "scanner": "scanner-primary", "fingerprint": "5427315d463477bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e65df41b4625361c", "level": "none", "message": {"text": "Commented-code block (5 lines) in shared/schemas/taste-picks.ts:23"}, "properties": {"repobilityId": "e8e3cfa4a4576a2b", "scanner": "scanner-primary", "fingerprint": "e65df41b4625361c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-217959238bcac752", "level": "note", "message": {"text": "Legacy-named symbol `community_recipes_instructions_backup` in scripts/migrate-instructions.ts:68"}, "properties": {"repobilityId": "c7d9f359317c9f54", "scanner": "scanner-primary", "fingerprint": "217959238bcac752", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-00bb1342f11d292b", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/build-domain-map.ts:10"}, "properties": {"repobilityId": "378fe61ee10bd9c5", "scanner": "scanner-primary", "fingerprint": "00bb1342f11d292b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-471fa56f51f778ac", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/delegate-copilot-issue.ts:101"}, "properties": {"repobilityId": "bf2c87bb30fbc120", "scanner": "scanner-primary", "fingerprint": "471fa56f51f778ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71be228ec6592958", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/mutation-explore.mjs:1"}, "properties": {"repobilityId": "d0b16c09c3ca657e", "scanner": "scanner-primary", "fingerprint": "71be228ec6592958", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-887981720b2a9d3f", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/build-copilot-instructions.ts:6"}, "properties": {"repobilityId": "68d564b535b70f34", "scanner": "scanner-primary", "fingerprint": "887981720b2a9d3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c06696e7d69f5463", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/patch-mlkit-simulator.py:129"}, "properties": {"repobilityId": "d30e05daefd77125", "scanner": "scanner-primary", "fingerprint": "c06696e7d69f5463", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb6c5f09a477335c", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/lib/path-domains.ts:4"}, "properties": {"repobilityId": "57f846eeab9c822a", "scanner": "scanner-primary", "fingerprint": "bb6c5f09a477335c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-568e76d75873ffec", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/solutions-db/lib/sql-guard.ts:1"}, "properties": {"repobilityId": "b07f5b435aaf7dc2", "scanner": "scanner-primary", "fingerprint": "568e76d75873ffec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-721089220c2c8db8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 eslint-plugin-ocrecipes/__tests__/rules.test.ts:88"}, "properties": {"repobilityId": "5bb11d0659ead8ba", "scanner": "scanner-primary", "fingerprint": "721089220c2c8db8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b5d643957417399f", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/index.ts:35"}, "properties": {"repobilityId": "8e840b7bf5c86cd4", "scanner": "scanner-primary", "fingerprint": "b5d643957417399f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8086f21c331a95cf", "level": "none", "message": {"text": "Commented-code block (11 lines) in server/__tests__/storage.test.ts:3"}, "properties": {"repobilityId": "37aec1f8a7e517d0", "scanner": "scanner-primary", "fingerprint": "8086f21c331a95cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02cea33d53399b5d", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/__tests__/auth.test.ts:10"}, "properties": {"repobilityId": "187a30e5a11f107c", "scanner": "scanner-primary", "fingerprint": "02cea33d53399b5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c8683a45cc309a0", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/scripts/cleanup-retention.ts:161"}, "properties": {"repobilityId": "581ede759169c636", "scanner": "scanner-primary", "fingerprint": "3c8683a45cc309a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-068e2a64f87e8af9", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/scripts/seed-recipes.ts:529"}, "properties": {"repobilityId": "6fd42987b7b9dbf1", "scanner": "scanner-primary", "fingerprint": "068e2a64f87e8af9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a129e8a0fc3d3e0", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/scripts/backfill-recipe-allergens.ts:37"}, "properties": {"repobilityId": "4b811fca1eab3f09", "scanner": "scanner-primary", "fingerprint": "2a129e8a0fc3d3e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3ccb5db75645525", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/lib/openai.ts:23"}, "properties": {"repobilityId": "d8373961a2c10f3d", "scanner": "scanner-primary", "fingerprint": "a3ccb5db75645525", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80ada5f3591daf72", "level": "note", "message": {"text": "Legacy-named symbol `toolOld` in server/lib/__tests__/chat-history-truncate.test.ts:69"}, "properties": {"repobilityId": "6757e2570ec0b6c6", "scanner": "scanner-primary", "fingerprint": "80ada5f3591daf72", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-94ecf19ff9508427", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/lib/__tests__/image-store.test.ts:4"}, "properties": {"repobilityId": "8700a655e09ebcb6", "scanner": "scanner-primary", "fingerprint": "94ecf19ff9508427", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f3f674e097c3b9f", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/verification.ts:116"}, "properties": {"repobilityId": "cb57f21a39aedf13", "scanner": "scanner-primary", "fingerprint": "1f3f674e097c3b9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7042f98e2d67a5c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/api-docs.ts:132"}, "properties": {"repobilityId": "f938124681aecae0", "scanner": "scanner-primary", "fingerprint": "f7042f98e2d67a5c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-edcd31038005a2d0", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routes/grocery.ts:98"}, "properties": {"repobilityId": "fac6cfeb289320e0", "scanner": "scanner-primary", "fingerprint": "edcd31038005a2d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6935e5336ae703a", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routes/recipe-generate.ts:78"}, "properties": {"repobilityId": "dcd8349674e06f06", "scanner": "scanner-primary", "fingerprint": "f6935e5336ae703a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-803fec1e0fac367f", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/export.ts:9"}, "properties": {"repobilityId": "188750426d89da6b", "scanner": "scanner-primary", "fingerprint": "803fec1e0fac367f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7068731b5c983b59", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routes/profile.ts:47"}, "properties": {"repobilityId": "2cfdd375d74bdc60", "scanner": "scanner-primary", "fingerprint": "7068731b5c983b59", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b42f722d58a2be4", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/routes/cooking.ts:219"}, "properties": {"repobilityId": "15df2b5d625a8f2c", "scanner": "scanner-primary", "fingerprint": "3b42f722d58a2be4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93306002e10e38df", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/routes/__tests__/auth-account-throttle.test.ts:11"}, "properties": {"repobilityId": "f0fc6b9f239b5b03", "scanner": "scanner-primary", "fingerprint": "93306002e10e38df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-337bae9ea5c30b08", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/routes/__tests__/meal-plan.test.ts:64"}, "properties": {"repobilityId": "2f0fb61bec40fbd9", "scanner": "scanner-primary", "fingerprint": "337bae9ea5c30b08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8cd6ba34b90cde1", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/__tests__/auth.test.ts:50"}, "properties": {"repobilityId": "e2928fb24c34c54b", "scanner": "scanner-primary", "fingerprint": "f8cd6ba34b90cde1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-555170e30e277391", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routes/__tests__/recipe-search.test.ts:131"}, "properties": {"repobilityId": "40983522c5b975b3", "scanner": "scanner-primary", "fingerprint": "555170e30e277391", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-530231f39f09e1ac", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/__tests__/chat.test.ts:65"}, "properties": {"repobilityId": "8eeb08951025504c", "scanner": "scanner-primary", "fingerprint": "530231f39f09e1ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2fde9d72d8119461", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/routes/__tests__/recipes.test.ts:91"}, "properties": {"repobilityId": "994f5451212ba605", "scanner": "scanner-primary", "fingerprint": "2fde9d72d8119461", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be43930be5d1fa6b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/recipe-import.ts:434"}, "properties": {"repobilityId": "274690d8021c53f6", "scanner": "scanner-primary", "fingerprint": "be43930be5d1fa6b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-24143559b47914fa", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/services/coach-intent-classifier.ts:38"}, "properties": {"repobilityId": "070af90083d9b08e", "scanner": "scanner-primary", "fingerprint": "24143559b47914fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-969914ae20738a5c", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/services/coach-pro-chat.ts:541"}, "properties": {"repobilityId": "75999ca86797cd93", "scanner": "scanner-primary", "fingerprint": "969914ae20738a5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46773aab50a08b4c", "level": "none", "message": {"text": "Commented-code block (9 lines) in server/services/barcode-lookup.ts:290"}, "properties": {"repobilityId": "228131cb7bfb10d4", "scanner": "scanner-primary", "fingerprint": "46773aab50a08b4c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-064fb6feae7e069d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/micronutrient-lookup.ts:75"}, "properties": {"repobilityId": "f3c4fff1cf836bbf", "scanner": "scanner-primary", "fingerprint": "064fb6feae7e069d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-10f5f891f0fa53b7", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/services/recipe-search.ts:211"}, "properties": {"repobilityId": "b9d449686cb48502", "scanner": "scanner-primary", "fingerprint": "10f5f891f0fa53b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d080a8e6ff5027d", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/services/nutrition-lookup.ts:93"}, "properties": {"repobilityId": "d0b81334890ee16b", "scanner": "scanner-primary", "fingerprint": "0d080a8e6ff5027d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a12bb510c4dd51e3", "level": "none", "message": {"text": "Commented-code block (9 lines) in server/services/__tests__/nutrition-lookup.test.ts:389"}, "properties": {"repobilityId": "5a17af6cd9776fff", "scanner": "scanner-primary", "fingerprint": "a12bb510c4dd51e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1742f2d9df141c78", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/services/__tests__/coach-intent-classifier.test.ts:105"}, "properties": {"repobilityId": "e1064f86098ca81a", "scanner": "scanner-primary", "fingerprint": "1742f2d9df141c78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd046daa8e6ab44f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/__tests__/notification-scheduler.test.ts:487"}, "properties": {"repobilityId": "1cab0f3360eaf320", "scanner": "scanner-primary", "fingerprint": "dd046daa8e6ab44f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4a65c3916176c82d", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/storage/recipe-from-chat.ts:92"}, "properties": {"repobilityId": "9dc4b027c83390f6", "scanner": "scanner-primary", "fingerprint": "4a65c3916176c82d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbaaf790b4f3379d", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/storage/nutrition.ts:471"}, "properties": {"repobilityId": "3bf8901378ff92de", "scanner": "scanner-primary", "fingerprint": "dbaaf790b4f3379d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c127ae3f9ea8d23b", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/storage/verification.ts:232"}, "properties": {"repobilityId": "6667e8aacdf744a2", "scanner": "scanner-primary", "fingerprint": "c127ae3f9ea8d23b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4233a7cde228aa5", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/storage/users.ts:167"}, "properties": {"repobilityId": "f1415ab2078f6c08", "scanner": "scanner-primary", "fingerprint": "e4233a7cde228aa5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad22241ad637a89e", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/storage/carousel.ts:127"}, "properties": {"repobilityId": "dfa08e07893ce5d3", "scanner": "scanner-primary", "fingerprint": "ad22241ad637a89e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5459035bc7dd224", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/storage/cookbooks.ts:31"}, "properties": {"repobilityId": "c7f689f75b6da1d0", "scanner": "scanner-primary", "fingerprint": "e5459035bc7dd224", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b04232beeac2bb1", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/storage/export.ts:46"}, "properties": {"repobilityId": "2547a387ecccdae5", "scanner": "scanner-primary", "fingerprint": "8b04232beeac2bb1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa14120560664cec", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/storage/meal-plan-recipes-crud.ts:98"}, "properties": {"repobilityId": "3c18ce0af43d4104", "scanner": "scanner-primary", "fingerprint": "fa14120560664cec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf4ec6e0d038f759", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/storage/taste-picks.ts:62"}, "properties": {"repobilityId": "b37e2b6b53565aea", "scanner": "scanner-primary", "fingerprint": "cf4ec6e0d038f759", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd27f9a2c521dce5", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/storage/chat.ts:332"}, "properties": {"repobilityId": "ef203e28ea3e469f", "scanner": "scanner-primary", "fingerprint": "cd27f9a2c521dce5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f87a7b7a57f6b5d", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/storage/sessions.ts:193"}, "properties": {"repobilityId": "c4af0b088f1924c6", "scanner": "scanner-primary", "fingerprint": "4f87a7b7a57f6b5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46f5a2709a4ada9f", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/storage/coach-notebook.ts:53"}, "properties": {"repobilityId": "e1ac6ad8f8b628d8", "scanner": "scanner-primary", "fingerprint": "46f5a2709a4ada9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7223f3eabf30103e", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/storage/reformulation.ts:54"}, "properties": {"repobilityId": "6b283e5a565bebae", "scanner": "scanner-primary", "fingerprint": "7223f3eabf30103e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d7adf2686595944", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/storage/__tests__/cookbooks.test.ts:321"}, "properties": {"repobilityId": "aba3e9873aaa5772", "scanner": "scanner-primary", "fingerprint": "2d7adf2686595944", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc3c142ad670bb96", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/storage/__tests__/reformulation.test.ts:202"}, "properties": {"repobilityId": "abe57d8f039ab0fa", "scanner": "scanner-primary", "fingerprint": "fc3c142ad670bb96", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58056af1d59732c1", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/storage/__tests__/verification.concurrent.test.ts:132"}, "properties": {"repobilityId": "8829f28535613a97", "scanner": "scanner-primary", "fingerprint": "58056af1d59732c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d6fa8882301ee447", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/storage/__tests__/api-keys.test.ts:120"}, "properties": {"repobilityId": "e486d91344ea4e0d", "scanner": "scanner-primary", "fingerprint": "d6fa8882301ee447", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1de90a75d46ce03f", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/storage/__tests__/verification.test.ts:395"}, "properties": {"repobilityId": "cc65b6c6986e6490", "scanner": "scanner-primary", "fingerprint": "1de90a75d46ce03f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-225f49ed1d0d55cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/storage/__tests__/carousel.test.ts:64"}, "properties": {"repobilityId": "81fc84b9c91befbe", "scanner": "scanner-primary", "fingerprint": "225f49ed1d0d55cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-742bbfbcbcd0066d", "level": "none", "message": {"text": "Commented-code block (9 lines) in server/storage/__tests__/users.test.ts:238"}, "properties": {"repobilityId": "903246cda6bbcd3b", "scanner": "scanner-primary", "fingerprint": "742bbfbcbcd0066d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99ced821ea7674cf", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/storage/__tests__/chat.test.ts:235"}, "properties": {"repobilityId": "52eeaad09ec4fb2a", "scanner": "scanner-primary", "fingerprint": "99ced821ea7674cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6be44eaf85a60d9", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/storage/__tests__/meal-plan-recipes.test.ts:513"}, "properties": {"repobilityId": "8f9377fb71b60689", "scanner": "scanner-primary", "fingerprint": "f6be44eaf85a60d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa372c3db5038b15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 evals/runner-photo-analysis.ts:41"}, "properties": {"repobilityId": "829a5a20a1acdfa6", "scanner": "scanner-primary", "fingerprint": "aa372c3db5038b15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4c317ce0ecda6691", "level": "none", "message": {"text": "Commented-code block (6 lines) in evals/lib/dataset-schemas.ts:175"}, "properties": {"repobilityId": "4f5e0017d62abb31", "scanner": "scanner-primary", "fingerprint": "4c317ce0ecda6691", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f5aacf76ccb86b4", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:8081/status (scripts/build.js:90)"}, "properties": {"repobilityId": "e51417d21189e21f", "scanner": "scanner-primary", "fingerprint": "9f5aacf76ccb86b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-116d0624a0fec880", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:8081/manifest (scripts/build.js:210)"}, "properties": {"repobilityId": "cc92f55a241a7e7e", "scanner": "scanner-primary", "fingerprint": "116d0624a0fec880", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-77a3a3e95a387969", "level": "error", "message": {"text": "Dangling fetch: GET /api/items (eslint-plugin-ocrecipes/__tests__/rules.test.ts:88)"}, "properties": {"repobilityId": "efd0fbd935b1f8a4", "scanner": "scanner-primary", "fingerprint": "77a3a3e95a387969", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9921ad06bd067d03", "level": "error", "message": {"text": "Dangling fetch: GET /api/items (eslint-plugin-ocrecipes/__tests__/rules.test.ts:108)"}, "properties": {"repobilityId": "078de786136d4d19", "scanner": "scanner-primary", "fingerprint": "9921ad06bd067d03", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab3f0cd0a0f43f17", "level": "error", "message": {"text": "Dangling fetch: GET https://api.ocrecipes.com/api/v1/products/012345678901 (server/routes/api-docs.ts:132)"}, "properties": {"repobilityId": "9ff441c71c80020e", "scanner": "scanner-primary", "fingerprint": "ab3f0cd0a0f43f17", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c049479a179cbaf0", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/services/receipt-validation.ts:310)"}, "properties": {"repobilityId": "b4ce110fadcc45c1", "scanner": "scanner-primary", "fingerprint": "c049479a179cbaf0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f80ac91c06dc3ecb", "level": "error", "message": {"text": "Dangling fetch: GET https://world.openfoodfacts.org/api/v0/product/${variant}.json (server/services/barcode-lookup.ts:265)"}, "properties": {"repobilityId": "b0be61fe5deb52f6", "scanner": "scanner-primary", "fingerprint": "f80ac91c06dc3ecb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f734d015ba8a3787", "level": "error", "message": {"text": "Dangling fetch: GET https://api.api-ninjas.com/v1/nutrition?query=${encodeURIComponent(query)} (server/services/nutrition-lookup.ts:221)"}, "properties": {"repobilityId": "f5eac7ece537c2cc", "scanner": "scanner-primary", "fingerprint": "f734d015ba8a3787", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-78ab9d532b2a9fc2", "level": "error", "message": {"text": "Dangling fetch: GET https://food-nutrition.canada.ca/api/canadian-nutrient-file/food/?lang=en&type=json (server/services/nutrition-lookup.ts:310)"}, "properties": {"repobilityId": "7d8bcaa53b8f947e", "scanner": "scanner-primary", "fingerprint": "78ab9d532b2a9fc2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e074e8e592600ad1", "level": "error", "message": {"text": "Dangling fetch: GET https://food-nutrition.canada.ca/api/canadian-nutrient-file/nutrientamount/?lang=en&type=json&id=${matchCode} (server/services/nutrition-lookup.ts:475)"}, "properties": {"repobilityId": "288fa445adfafc5d", "scanner": "scanner-primary", "fingerprint": "e074e8e592600ad1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-814d238112f10561", "level": "error", "message": {"text": "Dangling fetch: POST https://api.nal.usda.gov/fdc/v1/foods/search?query=${encodeURIComponent(query)}&pageSize=1&api_key=${USDA_API_KEY} (server/services/nutrition-lookup.ts:560)"}, "properties": {"repobilityId": "a0f31691dab97c9b", "scanner": "scanner-primary", "fingerprint": "814d238112f10561", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b59435b3211a9df", "level": "note", "message": {"text": "Unused endpoint: USE /assets"}, "properties": {"repobilityId": "5272fdc04a51dd35", "scanner": "scanner-primary", "fingerprint": "3b59435b3211a9df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-28bb10466cea252e", "level": "note", "message": {"text": "Unused endpoint: USE /api/avatars"}, "properties": {"repobilityId": "443fd6a6406a929e", "scanner": "scanner-primary", "fingerprint": "28bb10466cea252e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5745e46f4488e4a4", "level": "note", "message": {"text": "Unused endpoint: USE /api/recipe-images"}, "properties": {"repobilityId": "800113ea25885b32", "scanner": "scanner-primary", "fingerprint": "5745e46f4488e4a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "779ee59986e3e7ae", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2be58bb794eba5b4", "level": "note", "message": {"text": "Unused endpoint: GET /api/nutrition/lookup"}, "properties": {"repobilityId": "884700bdb821e5af", "scanner": "scanner-primary", "fingerprint": "2be58bb794eba5b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27aa6c9338b1d040", "level": "note", "message": {"text": "Unused endpoint: GET /api/nutrition/barcode/:code"}, "properties": {"repobilityId": "f8336413d1c2aa1d", "scanner": "scanner-primary", "fingerprint": "27aa6c9338b1d040", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f11ea5b6ca20a63", "level": "note", "message": {"text": "Unused endpoint: GET /api/scanned-items/frequent"}, "properties": {"repobilityId": "d543c2daa299c1b9", "scanner": "scanner-primary", "fingerprint": "4f11ea5b6ca20a63", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f33f98f3621e8dde", "level": "note", "message": {"text": "Unused endpoint: GET /api/scanned-items"}, "properties": {"repobilityId": "bf143867dd9f0a3a", "scanner": "scanner-primary", "fingerprint": "f33f98f3621e8dde", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-235a24d1eed4fb24", "level": "note", "message": {"text": "Unused endpoint: GET /api/scanned-items/:id"}, "properties": {"repobilityId": "b163440123fd7b52", "scanner": "scanner-primary", "fingerprint": "235a24d1eed4fb24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bcb251ce23abfdea", "level": "note", "message": {"text": "Unused endpoint: POST /api/scanned-items"}, "properties": {"repobilityId": "6df07d05e8f5e69b", "scanner": "scanner-primary", "fingerprint": "bcb251ce23abfdea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea75085a7efc8da9", "level": "note", "message": {"text": "Unused endpoint: POST /api/scanned-items/:id/favourite"}, "properties": {"repobilityId": "7c8ce1dcbc55bc11", "scanner": "scanner-primary", "fingerprint": "ea75085a7efc8da9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d524c98e7fb23b8", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/scanned-items/:id"}, "properties": {"repobilityId": "d88e2b6f7e23e4f4", "scanner": "scanner-primary", "fingerprint": "4d524c98e7fb23b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5154a20c8be95fff", "level": "note", "message": {"text": "Unused endpoint: GET /api/daily-summary"}, "properties": {"repobilityId": "ddf3ea6474ebad82", "scanner": "scanner-primary", "fingerprint": "5154a20c8be95fff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5b3437e64c8f7b4", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/register"}, "properties": {"repobilityId": "2e831dc80d10ce24", "scanner": "scanner-primary", "fingerprint": "a5b3437e64c8f7b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd55aa0818a7c897", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/login"}, "properties": {"repobilityId": "522689be46d2d797", "scanner": "scanner-primary", "fingerprint": "fd55aa0818a7c897", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d5a39262ac205120", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/logout"}, "properties": {"repobilityId": "121c458712cd6e23", "scanner": "scanner-primary", "fingerprint": "d5a39262ac205120", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee4aa5ddab88c9dc", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/me"}, "properties": {"repobilityId": "78d8c5a03d884396", "scanner": "scanner-primary", "fingerprint": "ee4aa5ddab88c9dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-777caeb29516f12f", "level": "note", "message": {"text": "Unused endpoint: PUT /api/auth/profile"}, "properties": {"repobilityId": "00532090a9143943", "scanner": "scanner-primary", "fingerprint": "777caeb29516f12f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a4efe307fed78b8b", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/auth/account"}, "properties": {"repobilityId": "a8af68708fa45b27", "scanner": "scanner-primary", "fingerprint": "a4efe307fed78b8b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b0dff791507cb74", "level": "note", "message": {"text": "Unused endpoint: POST /api/user/avatar"}, "properties": {"repobilityId": "c2cf869910a49824", "scanner": "scanner-primary", "fingerprint": "7b0dff791507cb74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ddc8c8ee823ae9f", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/user/avatar"}, "properties": {"repobilityId": "2786e4818a471c29", "scanner": "scanner-primary", "fingerprint": "9ddc8c8ee823ae9f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8bed13197410b2ef", "level": "note", "message": {"text": "Unused endpoint: POST /api/batch/save"}, "properties": {"repobilityId": "e438140cd539a295", "scanner": "scanner-primary", "fingerprint": "8bed13197410b2ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6cb918eef3c0f568", "level": "note", "message": {"text": "Unused endpoint: POST /api/food/parse-text"}, "properties": {"repobilityId": "a772673447574c68", "scanner": "scanner-primary", "fingerprint": "6cb918eef3c0f568", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3ac0516f97ea3902", "level": "note", "message": {"text": "Unused endpoint: POST /api/food/transcribe"}, "properties": {"repobilityId": "57df97aadcf46d74", "scanner": "scanner-primary", "fingerprint": "3ac0516f97ea3902", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-53c43f8213c15d9e", "level": "note", "message": {"text": "Unused endpoint: POST /api/verification/submit"}, "properties": {"repobilityId": "f2e6012192315887", "scanner": "scanner-primary", "fingerprint": "53c43f8213c15d9e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37ce55faa2f1c27e", "level": "note", "message": {"text": "Unused endpoint: POST /api/verification/front-label"}, "properties": {"repobilityId": "4164c729450e994d", "scanner": "scanner-primary", "fingerprint": "37ce55faa2f1c27e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-54bc0527bbbf8d76", "level": "note", "message": {"text": "Unused endpoint: POST /api/verification/front-label/confirm"}, "properties": {"repobilityId": "c6236f8576ecbe7b", "scanner": "scanner-primary", "fingerprint": "54bc0527bbbf8d76", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f608e6c68d2ae6b1", "level": "note", "message": {"text": "Unused endpoint: GET /api/verification/reformulation-flags"}, "properties": {"repobilityId": "a43e531d69dd9a61", "scanner": "scanner-primary", "fingerprint": "f608e6c68d2ae6b1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2be95ad57ee5da2f", "level": "note", "message": {"text": "Unused endpoint: POST /api/verification/reformulation-flags/:flagId/resolve"}, "properties": {"repobilityId": "a2a05b974c0b9f92", "scanner": "scanner-primary", "fingerprint": "2be95ad57ee5da2f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fac1fb0a08156cff", "level": "note", "message": {"text": "Unused endpoint: GET /api/verification/user-count"}, "properties": {"repobilityId": "ddae11feea9dbb3a", "scanner": "scanner-primary", "fingerprint": "fac1fb0a08156cff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b426d82ebd58e2cd", "level": "note", "message": {"text": "Unused endpoint: GET /api/verification/:barcode"}, "properties": {"repobilityId": "8313d56635578f5d", "scanner": "scanner-primary", "fingerprint": "b426d82ebd58e2cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dda377705ba9743e", "level": "note", "message": {"text": "Unused endpoint: GET /api/coach/notebook"}, "properties": {"repobilityId": "1455470f89a76bb0", "scanner": "scanner-primary", "fingerprint": "dda377705ba9743e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0f3d2806d7523101", "level": "note", "message": {"text": "Unused endpoint: POST /api/coach/notebook"}, "properties": {"repobilityId": "693f092d5c2ea899", "scanner": "scanner-primary", "fingerprint": "0f3d2806d7523101", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99b90b81ce0ef0cd", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/coach/notebook/:id"}, "properties": {"repobilityId": "4c20f5c623b671fc", "scanner": "scanner-primary", "fingerprint": "99b90b81ce0ef0cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eea04b1633e97d26", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/coach/notebook/:id"}, "properties": {"repobilityId": "4b9d07d4ac4550ac", "scanner": "scanner-primary", "fingerprint": "eea04b1633e97d26", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0339ea0dc47e7070", "level": "note", "message": {"text": "Unused endpoint: GET /api/reminders/pending"}, "properties": {"repobilityId": "4a358ee97efcedf8", "scanner": "scanner-primary", "fingerprint": "0339ea0dc47e7070", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3526cef9fd507417", "level": "note", "message": {"text": "Unused endpoint: POST /api/reminders/acknowledge"}, "properties": {"repobilityId": "6159160dac99eec1", "scanner": "scanner-primary", "fingerprint": "3526cef9fd507417", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa3c224bf7c45ff2", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/reminders/mutes"}, "properties": {"repobilityId": "47bc350287c13a7e", "scanner": "scanner-primary", "fingerprint": "fa3c224bf7c45ff2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-204e9e41973145e0", "level": "note", "message": {"text": "Unused endpoint: GET /api/saved-items"}, "properties": {"repobilityId": "66b6db6a23e4437f", "scanner": "scanner-primary", "fingerprint": "204e9e41973145e0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d4cc9a91dc0bffa8", "level": "note", "message": {"text": "Unused endpoint: GET /api/saved-items/count"}, "properties": {"repobilityId": "873b40be39c2ddcf", "scanner": "scanner-primary", "fingerprint": "d4cc9a91dc0bffa8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4a02cc863eaafac1", "level": "note", "message": {"text": "Unused endpoint: POST /api/saved-items"}, "properties": {"repobilityId": "e17b5e9970cb878f", "scanner": "scanner-primary", "fingerprint": "4a02cc863eaafac1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98801dfa35412dce", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/saved-items/:id"}, "properties": {"repobilityId": "8bb101c117eb12a9", "scanner": "scanner-primary", "fingerprint": "98801dfa35412dce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f46cb4ef071fc81", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/docs"}, "properties": {"repobilityId": "036ff9216597f3a5", "scanner": "scanner-primary", "fingerprint": "1f46cb4ef071fc81", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-da6ed798b1f474d2", "level": "note", "message": {"text": "Unused endpoint: GET /api/meal-plan/recipes"}, "properties": {"repobilityId": "e36105c19a3c6b03", "scanner": "scanner-primary", "fingerprint": "da6ed798b1f474d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c523ea12e6aab841", "level": "note", "message": {"text": "Unused endpoint: GET /api/meal-plan/recipes/:id"}, "properties": {"repobilityId": "a381b10f2bbb6f7c", "scanner": "scanner-primary", "fingerprint": "c523ea12e6aab841", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc77e3034337942e", "level": "note", "message": {"text": "Unused endpoint: POST /api/meal-plan/recipes"}, "properties": {"repobilityId": "998e34270a0093db", "scanner": "scanner-primary", "fingerprint": "bc77e3034337942e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b2de78eaeb6670b2", "level": "note", "message": {"text": "Unused endpoint: PUT /api/meal-plan/recipes/:id"}, "properties": {"repobilityId": "c449301d99cfb84d", "scanner": "scanner-primary", "fingerprint": "b2de78eaeb6670b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5d4934ae77179a2", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/meal-plan/recipes/:id"}, "properties": {"repobilityId": "62f26630336bead0", "scanner": "scanner-primary", "fingerprint": "e5d4934ae77179a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f6a19dcd879ed752", "level": "note", "message": {"text": "Unused endpoint: GET /api/meal-plan"}, "properties": {"repobilityId": "34f0a73ae7c9b7b7", "scanner": "scanner-primary", "fingerprint": "f6a19dcd879ed752", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-294f8c40154e24a9", "level": "note", "message": {"text": "Unused endpoint: POST /api/meal-plan/items"}, "properties": {"repobilityId": "b3250cc70fa4ad46", "scanner": "scanner-primary", "fingerprint": "294f8c40154e24a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}