{"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-9e7ca3e5ed8dee55", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/RecipeViewer.jsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/RecipeViewer.jsx:36"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e607961adbf4f937", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SavingsBreakdown.jsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SavingsBreakdown.jsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1f6a9911c57f5f6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RecipeDetail.jsx:456", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RecipeDetail.jsx:456"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-01b2c40f7a0ea8e1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Admin.jsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Admin.jsx:279"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3996af1a989eb4b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AdminFeedbackDashboard.jsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AdminFeedbackDashboard.jsx:177"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f36b373cbabd706e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AdminRecipes.jsx:700", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AdminRecipes.jsx:700"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c0291789dc8c75b8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PriceAlerts.jsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PriceAlerts.jsx:43"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ebb17fc240a63e6", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/services/api.js:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/services/api.js:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b4d9a2d1a6bc231", "name": "Stray `console.log` in TS/JS \u2014 scripts/genMobileIcons.js:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/genMobileIcons.js:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78dcafd1250f234a", "name": "TODO/FIXME marker in shipping code \u2014 mobile/src/api/nativeAuth.ts:23", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 mobile/src/api/nativeAuth.ts:23"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7c13520176346cc", "name": "Stray `console.log` in TS/JS \u2014 backend/server.js:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/server.js:91"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-86cc3a19d6b18514", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/checkDealsCache.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/checkDealsCache.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-295b555a83a7ea5f", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeDonnaHay.js:128", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeDonnaHay.js:128"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00b6c94eb380b4a2", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/testDonnaHayImage.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testDonnaHayImage.js:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-85f412bce953da11", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/createRecipeCacheTable.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/createRecipeCacheTable.js:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb8b93ca2ede5f38", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeWomensWeekly.js:166", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeWomensWeekly.js:166"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-09cce858b4856da4", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/testProteinFilter.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testProteinFilter.js:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c20e4595fc2ccdfd", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/testFormDisqualifiers.js:256", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testFormDisqualifiers.js:256"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb5b1c24e62dad73", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/testEndToEnd.js:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testEndToEnd.js:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-97b21be98be7eed1", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/testCategorization.js:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testCategorization.js:46"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3f3698628f6c8f6f", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/dashboard.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/dashboard.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-c0d8fc17a981a897", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeJulieGoodwin.js:313", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeJulieGoodwin.js:313"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9cc3221ad189acff", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/enrichRecipes.js:231", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/enrichRecipes.js:231"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3cc490ea229050a", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/testNonFoodFilter.js:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testNonFoodFilter.js:127"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef66345104e7715a", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrateToPostgres.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrateToPostgres.js:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e99ca90769a107d", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/fixProductCategories.js:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/fixProductCategories.js:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5cb52f4b63d5fc1a", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/fixHtmlEntities.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/fixHtmlEntities.js: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-ff6735e80a1b986f", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/checkDatabase.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/checkDatabase.js:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-531ceb86a9752132", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/retryEnrichment.js:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/retryEnrichment.js:119"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36eabe13a9430f17", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/testWoolworthsAPI.js:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testWoolworthsAPI.js:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4435b67b2baaf0bb", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/auditMatching.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/auditMatching.js:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17f8279c0c3a980a", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/fixDonnaHayImages.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/fixDonnaHayImages.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-881c683731078d0f", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeJamieOliver.js:408", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeJamieOliver.js:408"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-762e1fec957ca851", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/discoverStateCatalogues.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/discoverStateCatalogues.js: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-88b4e1bb7b7eb423", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/compareMatching.js:167", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/compareMatching.js:167"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5601e1451d431001", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeRecipes.js:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeRecipes.js:63"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5028ba032e447e29", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/testColesEnrich.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testColesEnrich.js: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-1d0baf2af412302e", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/reviewMatches.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/reviewMatches.js: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-1ee424a59844c99d", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/verifyDatabase.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/verifyDatabase.js:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83e185995fc4156e", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/reproGenerateWeekly.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/reproGenerateWeekly.js:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-97d71d53cae57529", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/testProductLookup.js:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testProductLookup.js:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f4453bfab2222e15", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/seedDatabase/seedWoolworths.js:208", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seedDatabase/seedWoolworths.js:208"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6d9a6416c8e2e9f", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/seedDatabase/seedColes.js:192", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seedDatabase/seedColes.js:192"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-027a09023d3ae5d7", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/seedDatabase/seedOpenFoodFacts.js:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seedDatabase/seedOpenFoodFacts.js:102"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0c9489b67a4a00d", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/dumpCandidatePairs.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/dumpCandidatePairs.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-6b6d5e86ab559c07", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/analyzeVariety.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/analyzeVariety.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-d47b9ed17446370e", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/regenRecipesOnly.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/regenRecipesOnly.js:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e123c411baede557", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/debugCatalogueFetch.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/debugCatalogueFetch.js: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-5c9544dd984149d5", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkFrameHeaders.js:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkFrameHeaders.js:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f362086e03bc6562", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testStatePipeline.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testStatePipeline.js:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d0480cd9b91ed1b2", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testEdgeCache.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testEdgeCache.js: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-19125dc44ac51163", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/mapCatalogueLandscape.js:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/mapCatalogueLandscape.js:49"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1423791bae07d9c2", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkBarcodeIndex.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkBarcodeIndex.js:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4542691162e91d12", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkDigitIngredients.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkDigitIngredients.js:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2fd401bdcd0c0a41", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkContentBoundary.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkContentBoundary.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a425b81b2c09c87", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkStateArtifacts.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkStateArtifacts.js:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a893afc41ef7d50", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/evalMatchModels.js:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/evalMatchModels.js:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-25e2a662ffbc63e7", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/storeSpread.js:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/storeSpread.js:29"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9c300144168d71ed", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/analyzeHeroCoverage.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/analyzeHeroCoverage.js:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32ff3369853e35df", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/buildIngredientVocab.js:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/buildIngredientVocab.js:93"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3bc7d8ea00013cd8", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testStateDeals.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testStateDeals.js: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-34cabd359032eec5", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testLocationParam.js:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testLocationParam.js:35"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c11baee1e0738fd5", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkEdgeStore.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkEdgeStore.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ccff8c12a14493e9", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testLocZeroFetch.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testLocZeroFetch.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f213c1353e358bf5", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testStableIds.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testStableIds.js:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3204652b68f14c35", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/probeCatalogueTitle.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/probeCatalogueTitle.js:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-422bfebc2d828d41", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testHeroSelection.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testHeroSelection.js: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-db7a27af13fd9069", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkUsersColumns.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkUsersColumns.js:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8f34b8e7b3005e45", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/diagnostics/inspectBadMatches.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/diagnostics/inspectBadMatches.js:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5bd4cfc79b059d8c", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/diagnostics/productionDiagnostics.js:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/diagnostics/productionDiagnostics.js:123"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-823da86973273067", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/consolidate/exportFromOldDb.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/consolidate/exportFromOldDb.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffd4f63b26be05ca", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/consolidate/importToNewDb.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/consolidate/importToNewDb.js:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-931266e48ae70201", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/renormalizeNames.js:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/renormalizeNames.js:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-351cb92c52f901a1", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addMatchFeedback.js:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addMatchFeedback.js:40"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5eb37ec91f0894b0", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addIngredientBlocklist.js:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addIngredientBlocklist.js:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-039fc5afeca61023", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addRecipesTable.js:82", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addRecipesTable.js:82"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e66d61448ffabbdb", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addPremiumTables.js:96", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addPremiumTables.js:96"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-088fbf57e1a8b8ec", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addRecipeControlFlags.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addRecipeControlFlags.js: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-f2b357b6fb4015ad", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addUserPantriesTable.js:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addUserPantriesTable.js:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-13c577f4ff4abcfc", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addStateColumn.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addStateColumn.js: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-e44f0b6f9512ef8d", "name": "Stray `console.log` in TS/JS \u2014 backend/database/pg.js:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/database/pg.js:123"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2fdcbd70992925c", "name": "Stray `console.log` in TS/JS \u2014 backend/database/sqlite.js:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/database/sqlite.js:30"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a94aa1510981d5e3", "name": "Stray `console.log` in TS/JS \u2014 backend/routes/recipes.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/routes/recipes.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-8ca3b1ff0d10aea6", "name": "Stray `console.log` in TS/JS \u2014 backend/routes/deals.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/routes/deals.js:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-53cefe664403db2d", "name": "Stray `console.log` in TS/JS \u2014 backend/services/woolworthsEnrich.js:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/woolworthsEnrich.js:51"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af432617e00b79f1", "name": "Stray `console.log` in TS/JS \u2014 backend/services/woolworths.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/woolworths.js: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-9d9af75be918ee1b", "name": "Stray `console.log` in TS/JS \u2014 backend/services/recipeCostService.js:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/recipeCostService.js:101"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a9c3306de90b2ec", "name": "Stray `console.log` in TS/JS \u2014 backend/services/recipeMatcher.js:137", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/recipeMatcher.js: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-ee1a934ed8ab4833", "name": "Stray `console.log` in TS/JS \u2014 backend/services/salefinder.js:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/salefinder.js:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9c390ec33f549c4", "name": "Stray `console.log` in TS/JS \u2014 backend/services/publisherEmbedService.js:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/publisherEmbedService.js:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d9f756cf318d1aa2", "name": "Stray `console.log` in TS/JS \u2014 backend/services/coles.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/coles.js: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-f240c6b9c593c324", "name": "Stray `console.log` in TS/JS \u2014 backend/services/aiMatcher.js:304", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/aiMatcher.js:304"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbd772d4caf7f98e", "name": "Stray `console.log` in TS/JS \u2014 backend/services/productCategorizer.js:162", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/productCategorizer.js:162"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-535d0d987a6c106d", "name": "Stray `console.log` in TS/JS \u2014 backend/services/recipeService.js:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/recipeService.js:80"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9cc12a8c762b4b55", "name": "Stray `console.log` in TS/JS \u2014 backend/services/matchEdgeService.js:230", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/matchEdgeService.js:230"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94a24b46851e56ea", "name": "Stray `console.log` in TS/JS \u2014 backend/services/dealService.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/dealService.js:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9fb571826ae834d2", "name": "Stray `console.log` in TS/JS \u2014 backend/services/colesEnrich.js:90", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/colesEnrich.js:90"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15e62b10a65dee99", "name": "Stray `console.log` in TS/JS \u2014 backend/services/iga.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/iga.js:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f33e8b19011e686", "name": "Privileged port 17 in use", "shortDescription": {"text": "Privileged port 17 in use"}, "fullDescription": {"text": "Port 17 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-a399389f5f17b106", "name": "Runtime dotenv file present in repo: frontend/.env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: frontend/.env.production"}, "fullDescription": {"text": "`frontend/.env.production` looks like a runtime dotenv file. No high-confidence secret value was matched, but runtime dotenv files often drift into live credentials. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "16 test file(s) for 182 source file(s) (ratio 0.09). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 837 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 34 placeholder/mock markers across 19 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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-785916274910fcbd", "name": "Commented-code block (6 lines) in frontend/src/App.jsx:138", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/App.jsx:138"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ee1c91497fff8265", "name": "Commented-code block (6 lines) in backend/server.js:77", "shortDescription": {"text": "Commented-code block (6 lines) in backend/server.js:77"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fab7b4c8bac8e7a6", "name": "Commented-code block (5 lines) in backend/config/matching.js:197", "shortDescription": {"text": "Commented-code block (5 lines) in backend/config/matching.js:197"}, "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-290d1143793a6b8f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/scripts/testEndToEnd.js:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/scripts/testEndToEnd.js:11"}, "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-25b0004e9904e007", "name": "Legacy-named symbol `passOld` in backend/scripts/testNonFoodFilter.js:194", "shortDescription": {"text": "Legacy-named symbol `passOld` in backend/scripts/testNonFoodFilter.js:194"}, "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-7cd6a680a96dd261", "name": "Commented-code block (6 lines) in backend/database/pg.js:102", "shortDescription": {"text": "Commented-code block (6 lines) in backend/database/pg.js:102"}, "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-f3a1bdd418bbf7bb", "name": "Commented-code block (6 lines) in backend/services/recipeMatcher.js:530", "shortDescription": {"text": "Commented-code block (6 lines) in backend/services/recipeMatcher.js:530"}, "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-5439d6b05e86a0d4", "name": "Commented-code block (8 lines) in backend/services/salefinder.js:441", "shortDescription": {"text": "Commented-code block (8 lines) in backend/services/salefinder.js:441"}, "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-c24e1540705707da", "name": "Commented-code block (10 lines) in backend/services/recipeService.js:102", "shortDescription": {"text": "Commented-code block (10 lines) in backend/services/recipeService.js:102"}, "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-2d928ee69bd838b4", "name": "Commented-code block (5 lines) in backend/services/dealService.js:468", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/dealService.js: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-ec216b26866a8934", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/services/dealService.js:436", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/services/dealService.js:436"}, "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-233b0bd9f081439e", "name": "Commented-code block (6 lines) in backend/services/colesEnrich.js:36", "shortDescription": {"text": "Commented-code block (6 lines) in backend/services/colesEnrich.js:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc0f9d8e41b33b0e", "name": "11 env vars used in code but missing from .env.example", "shortDescription": {"text": "11 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DATABASE_URL`, `DEV`, `EXCLUDED_RECIPE_SOURCES`, `MATCH_EDGE_MODEL`, `NEW_DATABASE_URL`, `NODE_ENV`, `OLD_DATABASE_URL`, `RECIPE_COST_MODEL` + 3 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-82e5b564ff0e5720", "name": "Frontend route `/store/:store` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/store/:store` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9ffc8576fb44b4f1", "name": "Frontend route `/store/:store/deal/:dealName` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/store/:store/deal/:dealName` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35d609b5f45bc79b", "name": "Frontend route `/recipes/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/recipes/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-67e33b9240639146", "name": "Dangling fetch: GET https://www.donnahay.com.au/recipes/dinner/agadashi-tofu-dumplings (backend/scripts/testDonnaHayImag", "shortDescription": {"text": "Dangling fetch: GET https://www.donnahay.com.au/recipes/dinner/agadashi-tofu-dumplings (backend/scripts/testDonnaHayImage.js:4)"}, "fullDescription": {"text": "`backend/scripts/testDonnaHayImage.js:4` calls `GET https://www.donnahay.com.au/recipes/dinner/agadashi-tofu-dumplings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.donnahay.com.au/recipes/dinner/agadashi-tofu-dumplings`\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-a8ed3a02729c2519", "name": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${c.id} (backend/scripts/eval/debugCatalogueFet", "shortDescription": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${c.id} (backend/scripts/eval/debugCatalogueFetch.js:33)"}, "fullDescription": {"text": "`backend/scripts/eval/debugCatalogueFetch.js:33` calls `GET https://embed.salefinder.com.au/productlist/category/${c.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/embed.salefinder.com.au/productlist/category/<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-5efc7fa9c595f0ea", "name": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${id} (backend/scripts/eval/mapCatalogueLandsca", "shortDescription": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${id} (backend/scripts/eval/mapCatalogueLandscape.js:21)"}, "fullDescription": {"text": "`backend/scripts/eval/mapCatalogueLandscape.js:21` calls `GET https://embed.salefinder.com.au/productlist/category/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/embed.salefinder.com.au/productlist/category/<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-fc5ef53918d5bddb", "name": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${id} (backend/scripts/eval/testLocationParam.j", "shortDescription": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${id} (backend/scripts/eval/testLocationParam.js:16)"}, "fullDescription": {"text": "`backend/scripts/eval/testLocationParam.js:16` calls `GET https://embed.salefinder.com.au/productlist/category/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/embed.salefinder.com.au/productlist/category/<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-2a5f7a4f48686d96", "name": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${id} (backend/scripts/eval/probeCatalogueTitle", "shortDescription": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${id} (backend/scripts/eval/probeCatalogueTitle.js:21)"}, "fullDescription": {"text": "`backend/scripts/eval/probeCatalogueTitle.js:21` calls `GET https://embed.salefinder.com.au/productlist/category/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/embed.salefinder.com.au/productlist/category/<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-d0d0f02582161869", "name": "Dangling fetch: GET https://embed.salefinder.com.au/catalogue/getNavbar/${id} (backend/scripts/eval/probeCatalogueTitle.", "shortDescription": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/catalogue/getNavbar/${id} (backend/scripts/eval/probeCatalogueTitle.js:41)"}, "fullDescription": {"text": "`backend/scripts/eval/probeCatalogueTitle.js:41` calls `GET https://embed.salefinder.com.au/catalogue/getNavbar/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/embed.salefinder.com.au/catalogue/getnavbar/<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-c563060cab520176", "name": "Dangling fetch: GET https://www.salefinder.com.au/catalogues/view/${id}/ (backend/scripts/eval/probeCatalogueTitle.js:56", "shortDescription": {"text": "Dangling fetch: GET https://www.salefinder.com.au/catalogues/view/${id}/ (backend/scripts/eval/probeCatalogueTitle.js:56)"}, "fullDescription": {"text": "`backend/scripts/eval/probeCatalogueTitle.js:56` calls `GET https://www.salefinder.com.au/catalogues/view/${id}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.salefinder.com.au/catalogues/view/<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-2d3d1d428ced726d", "name": "Dangling fetch: GET https://www.salefinder.com.au/woolworths-catalogue (backend/routes/diagnostics.js:53)", "shortDescription": {"text": "Dangling fetch: GET https://www.salefinder.com.au/woolworths-catalogue (backend/routes/diagnostics.js:53)"}, "fullDescription": {"text": "`backend/routes/diagnostics.js:53` calls `GET https://www.salefinder.com.au/woolworths-catalogue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.salefinder.com.au/woolworths-catalogue`\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-9e8c4ef395809c83", "name": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${catId} (backend/routes/diagnostics.js:118)", "shortDescription": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${catId} (backend/routes/diagnostics.js:118)"}, "fullDescription": {"text": "`backend/routes/diagnostics.js:118` calls `GET https://embed.salefinder.com.au/productlist/category/${catId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/embed.salefinder.com.au/productlist/category/<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-9277484a9dc5824f", "name": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${stateId} (backend/routes/diagnostics.js:136)", "shortDescription": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${stateId} (backend/routes/diagnostics.js:136)"}, "fullDescription": {"text": "`backend/routes/diagnostics.js:136` calls `GET https://embed.salefinder.com.au/productlist/category/${stateId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/embed.salefinder.com.au/productlist/category/<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-a7779944008e16d3", "name": "Dangling fetch: GET https://www.salefinder.com.au/woolworths-catalogue (backend/routes/diagnostics.js:192)", "shortDescription": {"text": "Dangling fetch: GET https://www.salefinder.com.au/woolworths-catalogue (backend/routes/diagnostics.js:192)"}, "fullDescription": {"text": "`backend/routes/diagnostics.js:192` calls `GET https://www.salefinder.com.au/woolworths-catalogue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.salefinder.com.au/woolworths-catalogue`\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-629766a8e266498d", "name": "Unused endpoint: GET /api/deals/current", "shortDescription": {"text": "Unused endpoint: GET /api/deals/current"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/deals/current` 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-f6161bce6202a299", "name": "Unused endpoint: POST /api/deals/refresh", "shortDescription": {"text": "Unused endpoint: POST /api/deals/refresh"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/deals/refresh` 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-fae25adf1a39e96e", "name": "Unused endpoint: POST /api/recipes/suggestions", "shortDescription": {"text": "Unused endpoint: POST /api/recipes/suggestions"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/recipes/suggestions` 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-ece8bc5b01c36fef", "name": "Unused endpoint: POST /api/recipes/outbound-click", "shortDescription": {"text": "Unused endpoint: POST /api/recipes/outbound-click"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/recipes/outbound-click` 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-2e0b94ae4c8a8543", "name": "Unused endpoint: GET /api/recipes/search", "shortDescription": {"text": "Unused endpoint: GET /api/recipes/search"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/recipes/search` 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-5a33edb106a9a766", "name": "Unused endpoint: POST /api/recipes/generate-weekly", "shortDescription": {"text": "Unused endpoint: POST /api/recipes/generate-weekly"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/recipes/generate-weekly` 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-e6678b64c64fcfe1", "name": "Unused endpoint: GET /api/users/profile", "shortDescription": {"text": "Unused endpoint: GET /api/users/profile"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/users/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-739b4948847f1b39", "name": "Unused endpoint: PUT /api/users/preferences", "shortDescription": {"text": "Unused endpoint: PUT /api/users/preferences"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `PUT /api/users/preferences` 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-470464e570dc1111", "name": "Unused endpoint: POST /api/users/state", "shortDescription": {"text": "Unused endpoint: POST /api/users/state"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/users/state` 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-7765aa67683000dc", "name": "Unused endpoint: GET /api/premium/status", "shortDescription": {"text": "Unused endpoint: GET /api/premium/status"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/premium/status` 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-2c5499291c189312", "name": "Unused endpoint: GET /api/premium/favorites", "shortDescription": {"text": "Unused endpoint: GET /api/premium/favorites"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/premium/favorites` 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-19534bbcb7317f07", "name": "Unused endpoint: GET /api/premium/meal-plan", "shortDescription": {"text": "Unused endpoint: GET /api/premium/meal-plan"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/premium/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-471d1f80fdd0a7b6", "name": "Unused endpoint: POST /api/premium/meal-plan", "shortDescription": {"text": "Unused endpoint: POST /api/premium/meal-plan"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/premium/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-98484ddd1a0db753", "name": "Unused endpoint: GET /api/premium/shopping-lists", "shortDescription": {"text": "Unused endpoint: GET /api/premium/shopping-lists"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/premium/shopping-lists` 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-4e21acd21e80efc6", "name": "Unused endpoint: POST /api/premium/shopping-lists", "shortDescription": {"text": "Unused endpoint: POST /api/premium/shopping-lists"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/premium/shopping-lists` 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-5698a83ed957fd2e", "name": "Unused endpoint: GET /api/premium/price-alerts", "shortDescription": {"text": "Unused endpoint: GET /api/premium/price-alerts"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/premium/price-alerts` 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-5422b0d4095799d7", "name": "Unused endpoint: POST /api/premium/price-alerts", "shortDescription": {"text": "Unused endpoint: POST /api/premium/price-alerts"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/premium/price-alerts` 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-aed11499e7535198", "name": "Unused endpoint: GET /api/pantry", "shortDescription": {"text": "Unused endpoint: GET /api/pantry"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/pantry` 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-d7731b73e3aaadd7", "name": "Unused endpoint: POST /api/pantry", "shortDescription": {"text": "Unused endpoint: POST /api/pantry"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/pantry` 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-d7eb82d15f651efc", "name": "Unused endpoint: DELETE /api/pantry", "shortDescription": {"text": "Unused endpoint: DELETE /api/pantry"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `DELETE /api/pantry` 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-e01ea0f562f5c24c", "name": "Unused endpoint: POST /api/pantry/match", "shortDescription": {"text": "Unused endpoint: POST /api/pantry/match"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/pantry/match` 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-d54a83ce56c8e130", "name": "Unused endpoint: POST /api/feedback/match", "shortDescription": {"text": "Unused endpoint: POST /api/feedback/match"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/feedback/match` 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-b4d87f54d62a1386", "name": "Unused endpoint: GET /api/admin/users", "shortDescription": {"text": "Unused endpoint: GET /api/admin/users"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/admin/users` 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-e72f5078c4b282de", "name": "Unused endpoint: GET /api/admin/stats", "shortDescription": {"text": "Unused endpoint: GET /api/admin/stats"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/admin/stats` 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-c57c618b4e195acb", "name": "Unused endpoint: GET /api/admin/recipes", "shortDescription": {"text": "Unused endpoint: GET /api/admin/recipes"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/admin/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-76a0e041badbbdfb", "name": "Unused endpoint: GET /api/admin/blocklist", "shortDescription": {"text": "Unused endpoint: GET /api/admin/blocklist"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/admin/blocklist` 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-3f2a9b5968127e63", "name": "Unused endpoint: POST /api/admin/blocklist", "shortDescription": {"text": "Unused endpoint: POST /api/admin/blocklist"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/admin/blocklist` 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-61f427f5f727ef8a", "name": "Unused endpoint: GET /api/admin/feedback", "shortDescription": {"text": "Unused endpoint: GET /api/admin/feedback"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `GET /api/admin/feedback` 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-bcd2896ac3364f29", "name": "Unused endpoint: POST /api/admin/feedback/process", "shortDescription": {"text": "Unused endpoint: POST /api/admin/feedback/process"}, "fullDescription": {"text": "`frontend/src/services/api.js` declares `POST /api/admin/feedback/process` 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-855519eae33c45f8", "name": "Unused endpoint: USE /api/recipes/generate-weekly", "shortDescription": {"text": "Unused endpoint: USE /api/recipes/generate-weekly"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/recipes/generate-weekly` 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-8212aa6ad37f3675", "name": "Unused endpoint: USE /api/deals/refresh", "shortDescription": {"text": "Unused endpoint: USE /api/deals/refresh"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/deals/refresh` 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-8539185dda8daa50", "name": "Unused endpoint: USE /api/admin/refresh-deals", "shortDescription": {"text": "Unused endpoint: USE /api/admin/refresh-deals"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/admin/refresh-deals` 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-df42e754dfdb0e94", "name": "Unused endpoint: USE /api/recipes/suggestions", "shortDescription": {"text": "Unused endpoint: USE /api/recipes/suggestions"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/recipes/suggestions` 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-86ffc2950b006e2a", "name": "Unused endpoint: USE /api/pantry/match", "shortDescription": {"text": "Unused endpoint: USE /api/pantry/match"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/pantry/match` 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-d93a530ce10d47d9", "name": "Unused endpoint: USE /api/admin", "shortDescription": {"text": "Unused endpoint: USE /api/admin"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/admin` 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-cf8462e4d7ea4f78", "name": "Unused endpoint: USE /api/deals", "shortDescription": {"text": "Unused endpoint: USE /api/deals"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/deals` 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-04ac2dcaa17a1829", "name": "Unused endpoint: USE /api/recipes", "shortDescription": {"text": "Unused endpoint: USE /api/recipes"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/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-4ff40cb10f7c8519", "name": "Unused endpoint: USE /api/users", "shortDescription": {"text": "Unused endpoint: USE /api/users"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/users` 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-54562dbdbbb0b43a", "name": "Unused endpoint: USE /api/premium", "shortDescription": {"text": "Unused endpoint: USE /api/premium"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/premium` 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-4cb9526efb3a2abd", "name": "Unused endpoint: USE /api/pantry", "shortDescription": {"text": "Unused endpoint: USE /api/pantry"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/pantry` 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-e6c42c2627e519e8", "name": "Unused endpoint: USE /api/feedback", "shortDescription": {"text": "Unused endpoint: USE /api/feedback"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/feedback` 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-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/auth` 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-f889888985c458cf", "name": "Unused endpoint: POST /api/admin/refresh-deals", "shortDescription": {"text": "Unused endpoint: POST /api/admin/refresh-deals"}, "fullDescription": {"text": "`backend/server.js` declares `POST /api/admin/refresh-deals` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/server.js` declares `GET /` 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-841e50bf821e4158", "name": "Unused endpoint: GET /users", "shortDescription": {"text": "Unused endpoint: GET /users"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `GET /users` 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-633ac15ec7c862f5", "name": "Unused endpoint: POST /users/:userId/toggle-premium", "shortDescription": {"text": "Unused endpoint: POST /users/:userId/toggle-premium"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `POST /users/:userId/toggle-premium` 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-cd8dc4599ec52a08", "name": "Unused endpoint: GET /stats", "shortDescription": {"text": "Unused endpoint: GET /stats"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `GET /stats` 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-b594445b9a08cb3c", "name": "Unused endpoint: GET /recipes", "shortDescription": {"text": "Unused endpoint: GET /recipes"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `GET /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-fb36188f3771485b", "name": "Unused endpoint: GET /recipes/:id", "shortDescription": {"text": "Unused endpoint: GET /recipes/:id"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `GET /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-2e3d18b7197f6708", "name": "Unused endpoint: PUT /recipes/:id", "shortDescription": {"text": "Unused endpoint: PUT /recipes/:id"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `PUT /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}}]}}, "automationDetails": {"id": "repobility/21498"}, "properties": {"repository": "TomWall1/smartplate", "repoUrl": "https://github.com/TomWall1/smartplate", "branch": "main"}, "results": [{"ruleId": "scanner-9e7ca3e5ed8dee55", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/RecipeViewer.jsx:36"}, "properties": {"repobilityId": "d000a2d3a328563e", "scanner": "scanner-primary", "fingerprint": "9e7ca3e5ed8dee55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e607961adbf4f937", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SavingsBreakdown.jsx:118"}, "properties": {"repobilityId": "c2a91ad79b2bcbac", "scanner": "scanner-primary", "fingerprint": "e607961adbf4f937", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f1f6a9911c57f5f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RecipeDetail.jsx:456"}, "properties": {"repobilityId": "31598578e2ad83ea", "scanner": "scanner-primary", "fingerprint": "f1f6a9911c57f5f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01b2c40f7a0ea8e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Admin.jsx:279"}, "properties": {"repobilityId": "dbb741c8cc792045", "scanner": "scanner-primary", "fingerprint": "01b2c40f7a0ea8e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3996af1a989eb4b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AdminFeedbackDashboard.jsx:177"}, "properties": {"repobilityId": "02fe5ee17262e237", "scanner": "scanner-primary", "fingerprint": "d3996af1a989eb4b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f36b373cbabd706e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/AdminRecipes.jsx:700"}, "properties": {"repobilityId": "43f1ff74648bfc7c", "scanner": "scanner-primary", "fingerprint": "f36b373cbabd706e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0291789dc8c75b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PriceAlerts.jsx:43"}, "properties": {"repobilityId": "a88ccdb21c22c2d4", "scanner": "scanner-primary", "fingerprint": "c0291789dc8c75b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ebb17fc240a63e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/services/api.js:38"}, "properties": {"repobilityId": "695d98d98e8ce6f4", "scanner": "scanner-primary", "fingerprint": "1ebb17fc240a63e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7b4d9a2d1a6bc231", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/genMobileIcons.js:36"}, "properties": {"repobilityId": "2d5c086a013603e9", "scanner": "scanner-primary", "fingerprint": "7b4d9a2d1a6bc231", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78dcafd1250f234a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 mobile/src/api/nativeAuth.ts:23"}, "properties": {"repobilityId": "aab8ab13ce84815b", "scanner": "scanner-primary", "fingerprint": "78dcafd1250f234a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e7c13520176346cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/server.js:91"}, "properties": {"repobilityId": "ec6c625862fd9ddc", "scanner": "scanner-primary", "fingerprint": "e7c13520176346cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-86cc3a19d6b18514", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/checkDealsCache.js:12"}, "properties": {"repobilityId": "504633f0ddfcfb84", "scanner": "scanner-primary", "fingerprint": "86cc3a19d6b18514", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-295b555a83a7ea5f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeDonnaHay.js:128"}, "properties": {"repobilityId": "4d49a88f29fa712f", "scanner": "scanner-primary", "fingerprint": "295b555a83a7ea5f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-00b6c94eb380b4a2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testDonnaHayImage.js:9"}, "properties": {"repobilityId": "155d56654eda65d0", "scanner": "scanner-primary", "fingerprint": "00b6c94eb380b4a2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85f412bce953da11", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/createRecipeCacheTable.js:22"}, "properties": {"repobilityId": "e4eb043ab90ed4e7", "scanner": "scanner-primary", "fingerprint": "85f412bce953da11", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cb8b93ca2ede5f38", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeWomensWeekly.js:166"}, "properties": {"repobilityId": "571e4a598ba666be", "scanner": "scanner-primary", "fingerprint": "cb8b93ca2ede5f38", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09cce858b4856da4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testProteinFilter.js:11"}, "properties": {"repobilityId": "1664b8d1c6718baf", "scanner": "scanner-primary", "fingerprint": "09cce858b4856da4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c20e4595fc2ccdfd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testFormDisqualifiers.js:256"}, "properties": {"repobilityId": "e8779b75dcdb9778", "scanner": "scanner-primary", "fingerprint": "c20e4595fc2ccdfd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb5b1c24e62dad73", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testEndToEnd.js:28"}, "properties": {"repobilityId": "c5b1ea8bea61532f", "scanner": "scanner-primary", "fingerprint": "eb5b1c24e62dad73", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97b21be98be7eed1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testCategorization.js:46"}, "properties": {"repobilityId": "2c53eab641da098b", "scanner": "scanner-primary", "fingerprint": "97b21be98be7eed1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f3698628f6c8f6f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/dashboard.js:20"}, "properties": {"repobilityId": "96d30099d4ce092d", "scanner": "scanner-primary", "fingerprint": "3f3698628f6c8f6f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c0d8fc17a981a897", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeJulieGoodwin.js:313"}, "properties": {"repobilityId": "0a2fedb8c8fc3716", "scanner": "scanner-primary", "fingerprint": "c0d8fc17a981a897", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9cc3221ad189acff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/enrichRecipes.js:231"}, "properties": {"repobilityId": "f88ebff51973ed80", "scanner": "scanner-primary", "fingerprint": "9cc3221ad189acff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3cc490ea229050a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testNonFoodFilter.js:127"}, "properties": {"repobilityId": "0b0a4a6a37e5eec9", "scanner": "scanner-primary", "fingerprint": "e3cc490ea229050a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef66345104e7715a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrateToPostgres.js:18"}, "properties": {"repobilityId": "222acb8df01a8bb7", "scanner": "scanner-primary", "fingerprint": "ef66345104e7715a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e99ca90769a107d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/fixProductCategories.js:38"}, "properties": {"repobilityId": "a9e3894093d3c5be", "scanner": "scanner-primary", "fingerprint": "7e99ca90769a107d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5cb52f4b63d5fc1a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/fixHtmlEntities.js:32"}, "properties": {"repobilityId": "f87e84b8d7670eba", "scanner": "scanner-primary", "fingerprint": "5cb52f4b63d5fc1a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ff6735e80a1b986f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/checkDatabase.js:16"}, "properties": {"repobilityId": "eab6d3f46dc2019b", "scanner": "scanner-primary", "fingerprint": "ff6735e80a1b986f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-531ceb86a9752132", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/retryEnrichment.js:119"}, "properties": {"repobilityId": "66d191443353717d", "scanner": "scanner-primary", "fingerprint": "531ceb86a9752132", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-36eabe13a9430f17", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testWoolworthsAPI.js:28"}, "properties": {"repobilityId": "fa790629e3afb2e9", "scanner": "scanner-primary", "fingerprint": "36eabe13a9430f17", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4435b67b2baaf0bb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/auditMatching.js:17"}, "properties": {"repobilityId": "ddc9b96198d7ef06", "scanner": "scanner-primary", "fingerprint": "4435b67b2baaf0bb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-17f8279c0c3a980a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/fixDonnaHayImages.js:20"}, "properties": {"repobilityId": "9483393987e03cac", "scanner": "scanner-primary", "fingerprint": "17f8279c0c3a980a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-881c683731078d0f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeJamieOliver.js:408"}, "properties": {"repobilityId": "b78b8f379f717541", "scanner": "scanner-primary", "fingerprint": "881c683731078d0f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-762e1fec957ca851", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/discoverStateCatalogues.js:23"}, "properties": {"repobilityId": "8c4f089dc0199ccb", "scanner": "scanner-primary", "fingerprint": "762e1fec957ca851", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-88b4e1bb7b7eb423", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/compareMatching.js:167"}, "properties": {"repobilityId": "16008a2104234b03", "scanner": "scanner-primary", "fingerprint": "88b4e1bb7b7eb423", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5601e1451d431001", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/scrapeRecipes.js:63"}, "properties": {"repobilityId": "2620cde14be29076", "scanner": "scanner-primary", "fingerprint": "5601e1451d431001", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5028ba032e447e29", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testColesEnrich.js:23"}, "properties": {"repobilityId": "dcc544f14a4e1081", "scanner": "scanner-primary", "fingerprint": "5028ba032e447e29", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1d0baf2af412302e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/reviewMatches.js:32"}, "properties": {"repobilityId": "2216545b4d2256e6", "scanner": "scanner-primary", "fingerprint": "1d0baf2af412302e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1ee424a59844c99d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/verifyDatabase.js:22"}, "properties": {"repobilityId": "fef5f1b8060265c7", "scanner": "scanner-primary", "fingerprint": "1ee424a59844c99d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83e185995fc4156e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/reproGenerateWeekly.js:22"}, "properties": {"repobilityId": "6d95a3ca76950565", "scanner": "scanner-primary", "fingerprint": "83e185995fc4156e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97d71d53cae57529", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/testProductLookup.js:34"}, "properties": {"repobilityId": "38354a32fd9760ad", "scanner": "scanner-primary", "fingerprint": "97d71d53cae57529", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f4453bfab2222e15", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seedDatabase/seedWoolworths.js:208"}, "properties": {"repobilityId": "5cac4c995a71ae42", "scanner": "scanner-primary", "fingerprint": "f4453bfab2222e15", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a6d9a6416c8e2e9f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seedDatabase/seedColes.js:192"}, "properties": {"repobilityId": "d2f66e7acffb6701", "scanner": "scanner-primary", "fingerprint": "a6d9a6416c8e2e9f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-027a09023d3ae5d7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seedDatabase/seedOpenFoodFacts.js:102"}, "properties": {"repobilityId": "4360683b39b0b44c", "scanner": "scanner-primary", "fingerprint": "027a09023d3ae5d7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e0c9489b67a4a00d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/dumpCandidatePairs.js:20"}, "properties": {"repobilityId": "cabf00ec077b1d2a", "scanner": "scanner-primary", "fingerprint": "e0c9489b67a4a00d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6b6d5e86ab559c07", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/analyzeVariety.js:20"}, "properties": {"repobilityId": "bc6d17b7d264e8fa", "scanner": "scanner-primary", "fingerprint": "6b6d5e86ab559c07", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d47b9ed17446370e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/regenRecipesOnly.js:18"}, "properties": {"repobilityId": "d8265b437a1a84a9", "scanner": "scanner-primary", "fingerprint": "d47b9ed17446370e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e123c411baede557", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/debugCatalogueFetch.js:23"}, "properties": {"repobilityId": "e2172d645ddffd85", "scanner": "scanner-primary", "fingerprint": "e123c411baede557", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5c9544dd984149d5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkFrameHeaders.js:28"}, "properties": {"repobilityId": "ba60f5fa19e0f1ad", "scanner": "scanner-primary", "fingerprint": "5c9544dd984149d5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f362086e03bc6562", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testStatePipeline.js:25"}, "properties": {"repobilityId": "889fdba1e0f58f57", "scanner": "scanner-primary", "fingerprint": "f362086e03bc6562", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d0480cd9b91ed1b2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testEdgeCache.js:21"}, "properties": {"repobilityId": "4789add2fce7afc9", "scanner": "scanner-primary", "fingerprint": "d0480cd9b91ed1b2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19125dc44ac51163", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/mapCatalogueLandscape.js:49"}, "properties": {"repobilityId": "e31d4ac3351add09", "scanner": "scanner-primary", "fingerprint": "19125dc44ac51163", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1423791bae07d9c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkBarcodeIndex.js:11"}, "properties": {"repobilityId": "023b1f224c191180", "scanner": "scanner-primary", "fingerprint": "1423791bae07d9c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4542691162e91d12", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkDigitIngredients.js:11"}, "properties": {"repobilityId": "e778835896b7d3d5", "scanner": "scanner-primary", "fingerprint": "4542691162e91d12", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2fd401bdcd0c0a41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkContentBoundary.js:10"}, "properties": {"repobilityId": "be6dacf9f20d37d4", "scanner": "scanner-primary", "fingerprint": "2fd401bdcd0c0a41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7a425b81b2c09c87", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkStateArtifacts.js:11"}, "properties": {"repobilityId": "86d904a9fbc418d1", "scanner": "scanner-primary", "fingerprint": "7a425b81b2c09c87", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a893afc41ef7d50", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/evalMatchModels.js:67"}, "properties": {"repobilityId": "50dbe3c4f3464af7", "scanner": "scanner-primary", "fingerprint": "0a893afc41ef7d50", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25e2a662ffbc63e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/storeSpread.js:29"}, "properties": {"repobilityId": "1ac6103c56630837", "scanner": "scanner-primary", "fingerprint": "25e2a662ffbc63e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c300144168d71ed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/analyzeHeroCoverage.js:41"}, "properties": {"repobilityId": "f8268098250ace77", "scanner": "scanner-primary", "fingerprint": "9c300144168d71ed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-32ff3369853e35df", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/buildIngredientVocab.js:93"}, "properties": {"repobilityId": "15a3e91c25b8fbb3", "scanner": "scanner-primary", "fingerprint": "32ff3369853e35df", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3bc7d8ea00013cd8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testStateDeals.js:21"}, "properties": {"repobilityId": "8706da0987b86a8b", "scanner": "scanner-primary", "fingerprint": "3bc7d8ea00013cd8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-34cabd359032eec5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testLocationParam.js:35"}, "properties": {"repobilityId": "d28d8c12aa32cc90", "scanner": "scanner-primary", "fingerprint": "34cabd359032eec5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c11baee1e0738fd5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkEdgeStore.js:12"}, "properties": {"repobilityId": "222df5898005db82", "scanner": "scanner-primary", "fingerprint": "c11baee1e0738fd5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ccff8c12a14493e9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testLocZeroFetch.js:12"}, "properties": {"repobilityId": "691b97091d0a54ef", "scanner": "scanner-primary", "fingerprint": "ccff8c12a14493e9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f213c1353e358bf5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testStableIds.js:11"}, "properties": {"repobilityId": "ac24e2b6d3b88167", "scanner": "scanner-primary", "fingerprint": "f213c1353e358bf5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3204652b68f14c35", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/probeCatalogueTitle.js:18"}, "properties": {"repobilityId": "8a60bdb8c09436f2", "scanner": "scanner-primary", "fingerprint": "3204652b68f14c35", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-422bfebc2d828d41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/testHeroSelection.js:13"}, "properties": {"repobilityId": "02115369570084b8", "scanner": "scanner-primary", "fingerprint": "422bfebc2d828d41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-db7a27af13fd9069", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/eval/checkUsersColumns.js:11"}, "properties": {"repobilityId": "d7a30e28c9b404b1", "scanner": "scanner-primary", "fingerprint": "db7a27af13fd9069", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8f34b8e7b3005e45", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/diagnostics/inspectBadMatches.js:9"}, "properties": {"repobilityId": "8eb10ec9663d27ce", "scanner": "scanner-primary", "fingerprint": "8f34b8e7b3005e45", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5bd4cfc79b059d8c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/diagnostics/productionDiagnostics.js:123"}, "properties": {"repobilityId": "a3169e7047401087", "scanner": "scanner-primary", "fingerprint": "5bd4cfc79b059d8c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-823da86973273067", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/consolidate/exportFromOldDb.js:19"}, "properties": {"repobilityId": "403fdc0db104897b", "scanner": "scanner-primary", "fingerprint": "823da86973273067", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ffd4f63b26be05ca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/consolidate/importToNewDb.js:17"}, "properties": {"repobilityId": "8232052b216599fd", "scanner": "scanner-primary", "fingerprint": "ffd4f63b26be05ca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-931266e48ae70201", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/renormalizeNames.js:44"}, "properties": {"repobilityId": "5b8cd438bf6f6ce2", "scanner": "scanner-primary", "fingerprint": "931266e48ae70201", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-351cb92c52f901a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addMatchFeedback.js:40"}, "properties": {"repobilityId": "df7414d765024465", "scanner": "scanner-primary", "fingerprint": "351cb92c52f901a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5eb37ec91f0894b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addIngredientBlocklist.js:34"}, "properties": {"repobilityId": "ac9caf2e5496ab77", "scanner": "scanner-primary", "fingerprint": "5eb37ec91f0894b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-039fc5afeca61023", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addRecipesTable.js:82"}, "properties": {"repobilityId": "7d2a31433a0500cb", "scanner": "scanner-primary", "fingerprint": "039fc5afeca61023", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e66d61448ffabbdb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addPremiumTables.js:96"}, "properties": {"repobilityId": "4be9cef42bc3051f", "scanner": "scanner-primary", "fingerprint": "e66d61448ffabbdb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-088fbf57e1a8b8ec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addRecipeControlFlags.js:27"}, "properties": {"repobilityId": "fe2a96e90f54866c", "scanner": "scanner-primary", "fingerprint": "088fbf57e1a8b8ec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f2b357b6fb4015ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addUserPantriesTable.js:37"}, "properties": {"repobilityId": "449ea0b3edd6c05a", "scanner": "scanner-primary", "fingerprint": "f2b357b6fb4015ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-13c577f4ff4abcfc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/migrations/addStateColumn.js:27"}, "properties": {"repobilityId": "53878a968ed7bb5c", "scanner": "scanner-primary", "fingerprint": "13c577f4ff4abcfc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e44f0b6f9512ef8d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/database/pg.js:123"}, "properties": {"repobilityId": "4b43fb0c3ecd1686", "scanner": "scanner-primary", "fingerprint": "e44f0b6f9512ef8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e2fdcbd70992925c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/database/sqlite.js:30"}, "properties": {"repobilityId": "9a3969038a58a490", "scanner": "scanner-primary", "fingerprint": "e2fdcbd70992925c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a94aa1510981d5e3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/routes/recipes.js:20"}, "properties": {"repobilityId": "45c02546ba26b75c", "scanner": "scanner-primary", "fingerprint": "a94aa1510981d5e3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ca3b1ff0d10aea6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/routes/deals.js:33"}, "properties": {"repobilityId": "1655c466e5e0c1af", "scanner": "scanner-primary", "fingerprint": "8ca3b1ff0d10aea6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-53cefe664403db2d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/woolworthsEnrich.js:51"}, "properties": {"repobilityId": "7c837b32bfcfa482", "scanner": "scanner-primary", "fingerprint": "53cefe664403db2d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-af432617e00b79f1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/woolworths.js:15"}, "properties": {"repobilityId": "ee2070e030de19b6", "scanner": "scanner-primary", "fingerprint": "af432617e00b79f1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d9af75be918ee1b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/recipeCostService.js:101"}, "properties": {"repobilityId": "1078aad8d69ba998", "scanner": "scanner-primary", "fingerprint": "9d9af75be918ee1b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a9c3306de90b2ec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/recipeMatcher.js:137"}, "properties": {"repobilityId": "47658136473464b2", "scanner": "scanner-primary", "fingerprint": "5a9c3306de90b2ec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ee1a934ed8ab4833", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/salefinder.js:48"}, "properties": {"repobilityId": "9b3e9a36a1d1d03a", "scanner": "scanner-primary", "fingerprint": "ee1a934ed8ab4833", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c9c390ec33f549c4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/publisherEmbedService.js:50"}, "properties": {"repobilityId": "28d658302aee4a23", "scanner": "scanner-primary", "fingerprint": "c9c390ec33f549c4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d9f756cf318d1aa2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/coles.js:15"}, "properties": {"repobilityId": "5c037dd77c41b52c", "scanner": "scanner-primary", "fingerprint": "d9f756cf318d1aa2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f240c6b9c593c324", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/aiMatcher.js:304"}, "properties": {"repobilityId": "4f5faca58f7059f0", "scanner": "scanner-primary", "fingerprint": "f240c6b9c593c324", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bbd772d4caf7f98e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/productCategorizer.js:162"}, "properties": {"repobilityId": "84f91ba5a61d9268", "scanner": "scanner-primary", "fingerprint": "bbd772d4caf7f98e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-535d0d987a6c106d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/recipeService.js:80"}, "properties": {"repobilityId": "064439d787a8eb30", "scanner": "scanner-primary", "fingerprint": "535d0d987a6c106d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9cc12a8c762b4b55", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/matchEdgeService.js:230"}, "properties": {"repobilityId": "8452501b22dcebb5", "scanner": "scanner-primary", "fingerprint": "9cc12a8c762b4b55", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-94a24b46851e56ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/dealService.js:14"}, "properties": {"repobilityId": "9fa625535f70da21", "scanner": "scanner-primary", "fingerprint": "94a24b46851e56ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9fb571826ae834d2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/colesEnrich.js:90"}, "properties": {"repobilityId": "f01fcd9e000c4eba", "scanner": "scanner-primary", "fingerprint": "9fb571826ae834d2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-15e62b10a65dee99", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/services/iga.js:16"}, "properties": {"repobilityId": "e205b0ea2a67d0f0", "scanner": "scanner-primary", "fingerprint": "15e62b10a65dee99", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f33e8b19011e686", "level": "warning", "message": {"text": "Privileged port 17 in use"}, "properties": {"repobilityId": "0bf38fb8f89ec589", "scanner": "scanner-primary", "fingerprint": "5f33e8b19011e686", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/weekly-refresh.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a399389f5f17b106", "level": "error", "message": {"text": "Runtime dotenv file present in repo: frontend/.env.production"}, "properties": {"repobilityId": "f727d22a89e309c5", "scanner": "scanner-primary", "fingerprint": "a399389f5f17b106", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/.env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "dc43b083bf5d9f41", "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": "c5f073c2ef78a4a9", "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": "17a8bbd6e1b6cfe2", "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": "6b190fb1bc892297", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "059d21f76304038d", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "70b64f0e1f49cadc", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "ee1add1534ac8c42", "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": "c448120d3816e2aa", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-785916274910fcbd", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/App.jsx:138"}, "properties": {"repobilityId": "8cebbccd21f5544d", "scanner": "scanner-primary", "fingerprint": "785916274910fcbd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee1c91497fff8265", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/server.js:77"}, "properties": {"repobilityId": "05401f3855151a27", "scanner": "scanner-primary", "fingerprint": "ee1c91497fff8265", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fab7b4c8bac8e7a6", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/config/matching.js:197"}, "properties": {"repobilityId": "bece7de9981a5506", "scanner": "scanner-primary", "fingerprint": "fab7b4c8bac8e7a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-290d1143793a6b8f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/scripts/testEndToEnd.js:11"}, "properties": {"repobilityId": "f80403b82636fa7e", "scanner": "scanner-primary", "fingerprint": "290d1143793a6b8f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-25b0004e9904e007", "level": "note", "message": {"text": "Legacy-named symbol `passOld` in backend/scripts/testNonFoodFilter.js:194"}, "properties": {"repobilityId": "cb0acbfba47bfb22", "scanner": "scanner-primary", "fingerprint": "25b0004e9904e007", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7cd6a680a96dd261", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/database/pg.js:102"}, "properties": {"repobilityId": "59edf0b85341e603", "scanner": "scanner-primary", "fingerprint": "7cd6a680a96dd261", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3a1bdd418bbf7bb", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/services/recipeMatcher.js:530"}, "properties": {"repobilityId": "908ac9141e017666", "scanner": "scanner-primary", "fingerprint": "f3a1bdd418bbf7bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5439d6b05e86a0d4", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/services/salefinder.js:441"}, "properties": {"repobilityId": "8c8e734502c1617d", "scanner": "scanner-primary", "fingerprint": "5439d6b05e86a0d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c24e1540705707da", "level": "none", "message": {"text": "Commented-code block (10 lines) in backend/services/recipeService.js:102"}, "properties": {"repobilityId": "e8698e42a7d79c1f", "scanner": "scanner-primary", "fingerprint": "c24e1540705707da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d928ee69bd838b4", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/dealService.js:468"}, "properties": {"repobilityId": "459b6e6159e2ff91", "scanner": "scanner-primary", "fingerprint": "2d928ee69bd838b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec216b26866a8934", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/services/dealService.js:436"}, "properties": {"repobilityId": "a6760a364c0c6ed2", "scanner": "scanner-primary", "fingerprint": "ec216b26866a8934", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-233b0bd9f081439e", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/services/colesEnrich.js:36"}, "properties": {"repobilityId": "a9d89c34ec9d2107", "scanner": "scanner-primary", "fingerprint": "233b0bd9f081439e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc0f9d8e41b33b0e", "level": "note", "message": {"text": "11 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "c82cd8cd626c3599", "scanner": "scanner-primary", "fingerprint": "cc0f9d8e41b33b0e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-82e5b564ff0e5720", "level": "warning", "message": {"text": "Frontend route `/store/:store` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "0998888691f143ca", "scanner": "scanner-primary", "fingerprint": "82e5b564ff0e5720", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9ffc8576fb44b4f1", "level": "warning", "message": {"text": "Frontend route `/store/:store/deal/:dealName` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "d4d2058ccc7dbce4", "scanner": "scanner-primary", "fingerprint": "9ffc8576fb44b4f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-35d609b5f45bc79b", "level": "warning", "message": {"text": "Frontend route `/recipes/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "cd9c75c9aa6cfc53", "scanner": "scanner-primary", "fingerprint": "35d609b5f45bc79b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-67e33b9240639146", "level": "error", "message": {"text": "Dangling fetch: GET https://www.donnahay.com.au/recipes/dinner/agadashi-tofu-dumplings (backend/scripts/testDonnaHayImage.js:4)"}, "properties": {"repobilityId": "f2a0a399f37bb569", "scanner": "scanner-primary", "fingerprint": "67e33b9240639146", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-a8ed3a02729c2519", "level": "error", "message": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${c.id} (backend/scripts/eval/debugCatalogueFetch.js:33)"}, "properties": {"repobilityId": "c3e86cf2fcfe2d5f", "scanner": "scanner-primary", "fingerprint": "a8ed3a02729c2519", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-5efc7fa9c595f0ea", "level": "error", "message": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${id} (backend/scripts/eval/mapCatalogueLandscape.js:21)"}, "properties": {"repobilityId": "25ea7ca4d3dd1899", "scanner": "scanner-primary", "fingerprint": "5efc7fa9c595f0ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-fc5ef53918d5bddb", "level": "error", "message": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${id} (backend/scripts/eval/testLocationParam.js:16)"}, "properties": {"repobilityId": "f6ab5c94be1b362d", "scanner": "scanner-primary", "fingerprint": "fc5ef53918d5bddb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-2a5f7a4f48686d96", "level": "error", "message": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${id} (backend/scripts/eval/probeCatalogueTitle.js:21)"}, "properties": {"repobilityId": "f6cdbee51444e1e8", "scanner": "scanner-primary", "fingerprint": "2a5f7a4f48686d96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-d0d0f02582161869", "level": "error", "message": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/catalogue/getNavbar/${id} (backend/scripts/eval/probeCatalogueTitle.js:41)"}, "properties": {"repobilityId": "32131c952f1f242d", "scanner": "scanner-primary", "fingerprint": "d0d0f02582161869", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-c563060cab520176", "level": "error", "message": {"text": "Dangling fetch: GET https://www.salefinder.com.au/catalogues/view/${id}/ (backend/scripts/eval/probeCatalogueTitle.js:56)"}, "properties": {"repobilityId": "ced696b5a77e494b", "scanner": "scanner-primary", "fingerprint": "c563060cab520176", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-2d3d1d428ced726d", "level": "error", "message": {"text": "Dangling fetch: GET https://www.salefinder.com.au/woolworths-catalogue (backend/routes/diagnostics.js:53)"}, "properties": {"repobilityId": "6ca539f1e69aacf8", "scanner": "scanner-primary", "fingerprint": "2d3d1d428ced726d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-9e8c4ef395809c83", "level": "error", "message": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${catId} (backend/routes/diagnostics.js:118)"}, "properties": {"repobilityId": "6aea21d5c1bab70c", "scanner": "scanner-primary", "fingerprint": "9e8c4ef395809c83", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-9277484a9dc5824f", "level": "error", "message": {"text": "Dangling fetch: GET https://embed.salefinder.com.au/productlist/category/${stateId} (backend/routes/diagnostics.js:136)"}, "properties": {"repobilityId": "00a24d0ed3b0c551", "scanner": "scanner-primary", "fingerprint": "9277484a9dc5824f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-a7779944008e16d3", "level": "error", "message": {"text": "Dangling fetch: GET https://www.salefinder.com.au/woolworths-catalogue (backend/routes/diagnostics.js:192)"}, "properties": {"repobilityId": "b386c92329e25aea", "scanner": "scanner-primary", "fingerprint": "a7779944008e16d3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-629766a8e266498d", "level": "note", "message": {"text": "Unused endpoint: GET /api/deals/current"}, "properties": {"repobilityId": "d9680d9e225cbd63", "scanner": "scanner-primary", "fingerprint": "629766a8e266498d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f6161bce6202a299", "level": "note", "message": {"text": "Unused endpoint: POST /api/deals/refresh"}, "properties": {"repobilityId": "2f2e54615c94475d", "scanner": "scanner-primary", "fingerprint": "f6161bce6202a299", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fae25adf1a39e96e", "level": "note", "message": {"text": "Unused endpoint: POST /api/recipes/suggestions"}, "properties": {"repobilityId": "13b58e7056c62fe6", "scanner": "scanner-primary", "fingerprint": "fae25adf1a39e96e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ece8bc5b01c36fef", "level": "note", "message": {"text": "Unused endpoint: POST /api/recipes/outbound-click"}, "properties": {"repobilityId": "853f1329fc2041b4", "scanner": "scanner-primary", "fingerprint": "ece8bc5b01c36fef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e0b94ae4c8a8543", "level": "note", "message": {"text": "Unused endpoint: GET /api/recipes/search"}, "properties": {"repobilityId": "594a80a0aa3102c5", "scanner": "scanner-primary", "fingerprint": "2e0b94ae4c8a8543", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a33edb106a9a766", "level": "note", "message": {"text": "Unused endpoint: POST /api/recipes/generate-weekly"}, "properties": {"repobilityId": "6c6b7a37673be01d", "scanner": "scanner-primary", "fingerprint": "5a33edb106a9a766", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e6678b64c64fcfe1", "level": "note", "message": {"text": "Unused endpoint: GET /api/users/profile"}, "properties": {"repobilityId": "a8ab70a142620861", "scanner": "scanner-primary", "fingerprint": "e6678b64c64fcfe1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-739b4948847f1b39", "level": "note", "message": {"text": "Unused endpoint: PUT /api/users/preferences"}, "properties": {"repobilityId": "e8e6ac919450cfe4", "scanner": "scanner-primary", "fingerprint": "739b4948847f1b39", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-470464e570dc1111", "level": "note", "message": {"text": "Unused endpoint: POST /api/users/state"}, "properties": {"repobilityId": "c9f32543e7a74142", "scanner": "scanner-primary", "fingerprint": "470464e570dc1111", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7765aa67683000dc", "level": "note", "message": {"text": "Unused endpoint: GET /api/premium/status"}, "properties": {"repobilityId": "bfc6ab971d736bc0", "scanner": "scanner-primary", "fingerprint": "7765aa67683000dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c5499291c189312", "level": "note", "message": {"text": "Unused endpoint: GET /api/premium/favorites"}, "properties": {"repobilityId": "a355033a0777dd54", "scanner": "scanner-primary", "fingerprint": "2c5499291c189312", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-19534bbcb7317f07", "level": "note", "message": {"text": "Unused endpoint: GET /api/premium/meal-plan"}, "properties": {"repobilityId": "dae1b7617b9a1666", "scanner": "scanner-primary", "fingerprint": "19534bbcb7317f07", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-471d1f80fdd0a7b6", "level": "note", "message": {"text": "Unused endpoint: POST /api/premium/meal-plan"}, "properties": {"repobilityId": "152fd1870824530f", "scanner": "scanner-primary", "fingerprint": "471d1f80fdd0a7b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98484ddd1a0db753", "level": "note", "message": {"text": "Unused endpoint: GET /api/premium/shopping-lists"}, "properties": {"repobilityId": "bef8f5a52307f48c", "scanner": "scanner-primary", "fingerprint": "98484ddd1a0db753", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e21acd21e80efc6", "level": "note", "message": {"text": "Unused endpoint: POST /api/premium/shopping-lists"}, "properties": {"repobilityId": "63a3bc35c7af8ba8", "scanner": "scanner-primary", "fingerprint": "4e21acd21e80efc6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5698a83ed957fd2e", "level": "note", "message": {"text": "Unused endpoint: GET /api/premium/price-alerts"}, "properties": {"repobilityId": "cae7f69845f1ca62", "scanner": "scanner-primary", "fingerprint": "5698a83ed957fd2e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5422b0d4095799d7", "level": "note", "message": {"text": "Unused endpoint: POST /api/premium/price-alerts"}, "properties": {"repobilityId": "6fb470ac8aaf584e", "scanner": "scanner-primary", "fingerprint": "5422b0d4095799d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aed11499e7535198", "level": "note", "message": {"text": "Unused endpoint: GET /api/pantry"}, "properties": {"repobilityId": "4989bad35185032a", "scanner": "scanner-primary", "fingerprint": "aed11499e7535198", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d7731b73e3aaadd7", "level": "note", "message": {"text": "Unused endpoint: POST /api/pantry"}, "properties": {"repobilityId": "dcb4f72a9dffccc9", "scanner": "scanner-primary", "fingerprint": "d7731b73e3aaadd7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d7eb82d15f651efc", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/pantry"}, "properties": {"repobilityId": "0c70a85e81d416ee", "scanner": "scanner-primary", "fingerprint": "d7eb82d15f651efc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e01ea0f562f5c24c", "level": "note", "message": {"text": "Unused endpoint: POST /api/pantry/match"}, "properties": {"repobilityId": "9222f72db1dcf994", "scanner": "scanner-primary", "fingerprint": "e01ea0f562f5c24c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d54a83ce56c8e130", "level": "note", "message": {"text": "Unused endpoint: POST /api/feedback/match"}, "properties": {"repobilityId": "3073ede4147b94d4", "scanner": "scanner-primary", "fingerprint": "d54a83ce56c8e130", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4d87f54d62a1386", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/users"}, "properties": {"repobilityId": "a0937b9d5e319daf", "scanner": "scanner-primary", "fingerprint": "b4d87f54d62a1386", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e72f5078c4b282de", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/stats"}, "properties": {"repobilityId": "96a41d1077355cd7", "scanner": "scanner-primary", "fingerprint": "e72f5078c4b282de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c57c618b4e195acb", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/recipes"}, "properties": {"repobilityId": "33e7a0891f75fcd5", "scanner": "scanner-primary", "fingerprint": "c57c618b4e195acb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-76a0e041badbbdfb", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/blocklist"}, "properties": {"repobilityId": "3829956d69567d62", "scanner": "scanner-primary", "fingerprint": "76a0e041badbbdfb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f2a9b5968127e63", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/blocklist"}, "properties": {"repobilityId": "6b1c9c20e110108e", "scanner": "scanner-primary", "fingerprint": "3f2a9b5968127e63", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-61f427f5f727ef8a", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/feedback"}, "properties": {"repobilityId": "e3476377a5a3cc8a", "scanner": "scanner-primary", "fingerprint": "61f427f5f727ef8a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bcd2896ac3364f29", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/feedback/process"}, "properties": {"repobilityId": "c2cb15536b7157cf", "scanner": "scanner-primary", "fingerprint": "bcd2896ac3364f29", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-855519eae33c45f8", "level": "note", "message": {"text": "Unused endpoint: USE /api/recipes/generate-weekly"}, "properties": {"repobilityId": "84e2f24fa15da36e", "scanner": "scanner-primary", "fingerprint": "855519eae33c45f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8212aa6ad37f3675", "level": "note", "message": {"text": "Unused endpoint: USE /api/deals/refresh"}, "properties": {"repobilityId": "b914aaf7740e668e", "scanner": "scanner-primary", "fingerprint": "8212aa6ad37f3675", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8539185dda8daa50", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/refresh-deals"}, "properties": {"repobilityId": "ac1d57908c92c7af", "scanner": "scanner-primary", "fingerprint": "8539185dda8daa50", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-df42e754dfdb0e94", "level": "note", "message": {"text": "Unused endpoint: USE /api/recipes/suggestions"}, "properties": {"repobilityId": "568486dd09c1f6c0", "scanner": "scanner-primary", "fingerprint": "df42e754dfdb0e94", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86ffc2950b006e2a", "level": "note", "message": {"text": "Unused endpoint: USE /api/pantry/match"}, "properties": {"repobilityId": "738261a70e403956", "scanner": "scanner-primary", "fingerprint": "86ffc2950b006e2a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d93a530ce10d47d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin"}, "properties": {"repobilityId": "a46d89dae1e3a2d4", "scanner": "scanner-primary", "fingerprint": "d93a530ce10d47d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cf8462e4d7ea4f78", "level": "note", "message": {"text": "Unused endpoint: USE /api/deals"}, "properties": {"repobilityId": "fcf952de103591e1", "scanner": "scanner-primary", "fingerprint": "cf8462e4d7ea4f78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-04ac2dcaa17a1829", "level": "note", "message": {"text": "Unused endpoint: USE /api/recipes"}, "properties": {"repobilityId": "b958964c69de2186", "scanner": "scanner-primary", "fingerprint": "04ac2dcaa17a1829", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4ff40cb10f7c8519", "level": "note", "message": {"text": "Unused endpoint: USE /api/users"}, "properties": {"repobilityId": "1e0c310b0a343b69", "scanner": "scanner-primary", "fingerprint": "4ff40cb10f7c8519", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-54562dbdbbb0b43a", "level": "note", "message": {"text": "Unused endpoint: USE /api/premium"}, "properties": {"repobilityId": "90a51e73b863c1e4", "scanner": "scanner-primary", "fingerprint": "54562dbdbbb0b43a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4cb9526efb3a2abd", "level": "note", "message": {"text": "Unused endpoint: USE /api/pantry"}, "properties": {"repobilityId": "b3dbe2999635fddf", "scanner": "scanner-primary", "fingerprint": "4cb9526efb3a2abd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e6c42c2627e519e8", "level": "note", "message": {"text": "Unused endpoint: USE /api/feedback"}, "properties": {"repobilityId": "ae58a27d9b972cb2", "scanner": "scanner-primary", "fingerprint": "e6c42c2627e519e8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "0a5793afc5ea0a13", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f889888985c458cf", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/refresh-deals"}, "properties": {"repobilityId": "7d26de346a149d9e", "scanner": "scanner-primary", "fingerprint": "f889888985c458cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "7d4772f7c52bce64", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-841e50bf821e4158", "level": "note", "message": {"text": "Unused endpoint: GET /users"}, "properties": {"repobilityId": "4d27583dd175020d", "scanner": "scanner-primary", "fingerprint": "841e50bf821e4158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-633ac15ec7c862f5", "level": "note", "message": {"text": "Unused endpoint: POST /users/:userId/toggle-premium"}, "properties": {"repobilityId": "273923caf11b35b5", "scanner": "scanner-primary", "fingerprint": "633ac15ec7c862f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd8dc4599ec52a08", "level": "note", "message": {"text": "Unused endpoint: GET /stats"}, "properties": {"repobilityId": "741214f3a034df5c", "scanner": "scanner-primary", "fingerprint": "cd8dc4599ec52a08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b594445b9a08cb3c", "level": "note", "message": {"text": "Unused endpoint: GET /recipes"}, "properties": {"repobilityId": "b9c234ba8140d8c2", "scanner": "scanner-primary", "fingerprint": "b594445b9a08cb3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb36188f3771485b", "level": "note", "message": {"text": "Unused endpoint: GET /recipes/:id"}, "properties": {"repobilityId": "2c08cb27bdc2fc75", "scanner": "scanner-primary", "fingerprint": "fb36188f3771485b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e3d18b7197f6708", "level": "note", "message": {"text": "Unused endpoint: PUT /recipes/:id"}, "properties": {"repobilityId": "05916728c2d883a6", "scanner": "scanner-primary", "fingerprint": "2e3d18b7197f6708", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}