{"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-f74446c2b6e7e6a9", "name": "Stray `console.log` in TS/JS \u2014 archive/frontend-legacy/src/App.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 archive/frontend-legacy/src/App.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-85ca065c428cae31", "name": "Stray `console.log` in TS/JS \u2014 archive/frontend-legacy/plugins/health-check/health-endpoints.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 archive/frontend-legacy/plugins/health-check/health-endpoints.js:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b5d85d181f40d8f2", "name": "Stray `console.log` in TS/JS \u2014 archive/frontend-legacy/plugins/visual-edits/dev-server-setup.js:266", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 archive/frontend-legacy/plugins/visual-edits/dev-server-setup.js:266"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9861b64b5ced19a9", "name": "Stray `console.log` in TS/JS \u2014 src/main.tsx:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/main.tsx: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-6a9b8e8ccb8863e2", "name": "Stray `console.log` in TS/JS \u2014 src/utils/circuitBreaker.ts:273", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/circuitBreaker.ts:273"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5750b13a6057c03f", "name": "Stray `console.log` in TS/JS \u2014 src/utils/dataMigration.ts:351", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/dataMigration.ts:351"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8db4bc7adaf95dc7", "name": "Stray `console.log` in TS/JS \u2014 src/utils/envSetup.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/envSetup.ts:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7f389868dc4ff30e", "name": "Stray `console.log` in TS/JS \u2014 src/utils/monitoring.ts:183", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/monitoring.ts:183"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7d617e2a9703a698", "name": "Stray `console.log` in TS/JS \u2014 src/utils/supabaseClient.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/supabaseClient.ts:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2381c1338ded0ba0", "name": "Stray `console.log` in TS/JS \u2014 src/utils/globalErrorHandlers.ts:150", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/globalErrorHandlers.ts:150"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6d41b23c41edf546", "name": "Stray `console.log` in TS/JS \u2014 src/utils/errorRecovery.ts:275", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/errorRecovery.ts:275"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d6fdf05e28f06973", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/MonitoringDebugPanel.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MonitoringDebugPanel.tsx:107"}, "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-fc2f44eb0e0778d9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/EditableFoodItem.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/EditableFoodItem.tsx:61"}, "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-a315e644227a88d0", "name": "Stray `console.log` in TS/JS \u2014 src/components/ErrorBoundary.tsx:631", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ErrorBoundary.tsx:631"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-479f182e4f1c6221", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/PantryInput.tsx:346", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PantryInput.tsx:346"}, "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-25a3f389b84613dc", "name": "Stray `console.log` in TS/JS \u2014 src/components/MealPlanGenerator.tsx:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/MealPlanGenerator.tsx:78"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-25d8863b69d14953", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai/NutriBotModal.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai/NutriBotModal.tsx:101"}, "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-b40bfd970a08021d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai/AutoLookupFoodCard.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai/AutoLookupFoodCard.tsx:176"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f83b9a4a5bcd1304", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tracker/ProgressBreakdownCard.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tracker/ProgressBreakdownCard.tsx:192"}, "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-f37f8fefa7f17d3d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/dropdown-date-picker.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/dropdown-date-picker.tsx:126"}, "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-6086ce6e7bfd4ded", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/user-menu.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/user-menu.tsx:165"}, "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-909269b6e0aff0ef", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/language-selector.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/language-selector.tsx:56"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7211ba515ab9b6a8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/donut-chart-demo.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/donut-chart-demo.tsx:59"}, "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-a1dee77e53333f30", "name": "Stray `console.log` in TS/JS \u2014 src/components/shopping/ShoppingListView.tsx:179", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/shopping/ShoppingListView.tsx:179"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32d817adec5bd7ea", "name": "Stray `console.log` in TS/JS \u2014 src/components/recipes/RecipeDetailModal.tsx:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/recipes/RecipeDetailModal.tsx: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-f100061afe12f43f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/coffee/CoffeeReceiptCard.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/coffee/CoffeeReceiptCard.tsx:101"}, "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-94990716714e61a1", "name": "Stray `console.log` in TS/JS \u2014 src/components/onboarding/steps/TargetDateStep.tsx:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/onboarding/steps/TargetDateStep.tsx: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-385b2bb8f3692313", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mealprep/LogMealPrepSheet.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mealprep/LogMealPrepSheet.tsx:87"}, "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-83d4902a3e64a7ff", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mealprep/MealPrepFlow.tsx:745", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mealprep/MealPrepFlow.tsx:745"}, "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-84daffb17141f4cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/InsightsDashboard.tsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/InsightsDashboard.tsx:214"}, "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-9994176c208e2ca0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/quick-add/QuickAddRecentList.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/quick-add/QuickAddRecentList.tsx:51"}, "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-7a21ef7422d8fdc8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/quick-add/QuickAddSuccessState.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/quick-add/QuickAddSuccessState.tsx:35"}, "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-3a3b2ad41004c01c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/quick-add/QuickAddTextTab.tsx:302", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/quick-add/QuickAddTextTab.tsx:302"}, "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-afdfba953a2bbbac", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useApiCall.ts:303", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useApiCall.ts:303"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-09a112e12a97a70d", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useMealPlanner.ts:457", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useMealPlanner.ts:457"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83a98a877607bf5a", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useVoiceScanner.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useVoiceScanner.ts:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-befe77c7d9ab2e6c", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useNutritionAI.ts:216", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useNutritionAI.ts:216"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ed6efb68e932726", "name": "Stray `console.log` in TS/JS \u2014 src/context/AuthContext.tsx:289", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/context/AuthContext.tsx:289"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-21630e840e7acefe", "name": "Stray `console.log` in TS/JS \u2014 src/context/SyncContext.tsx:293", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/context/SyncContext.tsx:293"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c6662c9c06ab5541", "name": "Stray `console.log` in TS/JS \u2014 src/context/UserContext.tsx:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/context/UserContext.tsx:83"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f1c8647243f449bc", "name": "Stray `console.log` in TS/JS \u2014 src/context/MealContext.tsx:184", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/context/MealContext.tsx:184"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1517d0c856a2ee0b", "name": "Stray `console.log` in TS/JS \u2014 e2e/serving-size-rescale.spec.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/serving-size-rescale.spec.ts:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b6be3ff24517b3c0", "name": "Stray `console.log` in TS/JS \u2014 e2e/meal-prep-integration.spec.ts:194", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/meal-prep-integration.spec.ts:194"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8987d6d1c30c7202", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-317932093ccf0181", "name": "Docker base image is tag-pinned but not digest-pinned: nginx:1.27-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:1.27-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ce6b31a25286299", "name": "Insecure pattern 'node_child_process' in archive/frontend-legacy/plugins/visual-edits/dev-server-setup.js:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in archive/frontend-legacy/plugins/visual-edits/dev-server-setup.js:6"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-79a16fbc68da0f5d", "name": "Insecure pattern 'node_child_process' in scripts/with-env.mjs:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/with-env.mjs:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43b57974d93a7a4d", "name": "Insecure pattern 'node_child_process' in scripts/repo-rehydrate-from-head.mjs:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/repo-rehydrate-from-head.mjs:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-665fea482183ebaf", "name": "Insecure pattern 'node_child_process' in scripts/build.mjs:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/build.mjs:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5ba5a9097fcd2be0", "name": "Insecure pattern 'node_child_process' in scripts/obsidian-verify-no-secrets.mjs:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/obsidian-verify-no-secrets.mjs:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-600e1edb9194a069", "name": "Insecure pattern 'node_child_process' in scripts/generate-supabase-types.mjs:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/generate-supabase-types.mjs:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4645dd529e4ee83d", "name": "Insecure pattern 'node_child_process' in scripts/repo-integrity-check.mjs:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/repo-integrity-check.mjs:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-99e708b00ce1325a", "name": "Insecure pattern 'node_child_process' in scripts/verify-legal-policy-config.test.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/verify-legal-policy-config.test.mjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad6d66f4621f7e42", "name": "Possible secret in src/i18n/locales/te.ts", "shortDescription": {"text": "Possible secret in src/i18n/locales/te.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-191b838d20a45d0e", "name": "Possible secret in src/i18n/locales/fr.ts", "shortDescription": {"text": "Possible secret in src/i18n/locales/fr.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-e0d54a7db7e15401", "name": "Possible secret in src/i18n/locales/en.ts", "shortDescription": {"text": "Possible secret in src/i18n/locales/en.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-08e7e51acb67f8ef", "name": "Possible secret in src/i18n/locales/de.ts", "shortDescription": {"text": "Possible secret in src/i18n/locales/de.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-247ea6650a0a9978", "name": "Possible secret in src/i18n/locales/es.ts", "shortDescription": {"text": "Possible secret in src/i18n/locales/es.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-d394c384547b9988", "name": "Possible secret in src/i18n/locales/hi.ts", "shortDescription": {"text": "Possible secret in src/i18n/locales/hi.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-848409ff5bfec7a8", "name": "Insecure pattern 'document_write' in src/components/mealprep/MealPrepFlow.tsx:703", "shortDescription": {"text": "Insecure pattern 'document_write' in src/components/mealprep/MealPrepFlow.tsx:703"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3161d70f779abcd9", "name": "Insecure pattern 'cors_wildcard' in e2e/meal-prep-integration.spec.ts:141", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in e2e/meal-prep-integration.spec.ts:141"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-792ecefef9b839f8", "name": "Possible secret in e2e/helpers/nutriai.ts", "shortDescription": {"text": "Possible secret in e2e/helpers/nutriai.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-42d2d2028449c88f", "name": "Insecure pattern 'cors_wildcard' in e2e/helpers/nutriai.ts:11", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in e2e/helpers/nutriai.ts:11"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b4bd4fe7d3131c1b", "name": "Very large file: api/_lib/food-intelligence.js (1539 lines)", "shortDescription": {"text": "Very large file: api/_lib/food-intelligence.js (1539 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a278d34912c2d5fe", "name": "Very large file: src/types/supabase.generated.ts (2216 lines)", "shortDescription": {"text": "Very large file: src/types/supabase.generated.ts (2216 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-10e71e01b0bb02a0", "name": "Very large file: src/i18n/locales/te.ts (935 lines)", "shortDescription": {"text": "Very large file: src/i18n/locales/te.ts (935 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e5cdae3dda62d60", "name": "Very large file: src/i18n/locales/fr.ts (922 lines)", "shortDescription": {"text": "Very large file: src/i18n/locales/fr.ts (922 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af37ce7bba2ed2bb", "name": "Very large file: src/i18n/locales/en.ts (898 lines)", "shortDescription": {"text": "Very large file: src/i18n/locales/en.ts (898 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d2fcd9c632e908a5", "name": "Very large file: src/i18n/locales/de.ts (929 lines)", "shortDescription": {"text": "Very large file: src/i18n/locales/de.ts (929 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1de814541a4a3b55", "name": "Very large file: src/i18n/locales/es.ts (917 lines)", "shortDescription": {"text": "Very large file: src/i18n/locales/es.ts (917 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-304393827e9aa740", "name": "Very large file: src/i18n/locales/hi.ts (911 lines)", "shortDescription": {"text": "Very large file: src/i18n/locales/hi.ts (911 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6dab66f042ab027", "name": "Very large file: src/i18n/locales/zh.ts (898 lines)", "shortDescription": {"text": "Very large file: src/i18n/locales/zh.ts (898 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5daa4aef84dd6331", "name": "Node manifest has dependencies but no lockfile: archive/frontend-legacy/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: archive/frontend-legacy/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 142 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 94 placeholder/mock markers across 38 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc55229a7a3c078d", "name": "Agent authority lacks a verifier contract: .mcp.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-24f2ea4bd14badc1", "name": "Agent instruction contains unpinned remote install: CLAUDE.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: CLAUDE.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3de6a808d178ed75", "name": "Agent authority lacks a verifier contract: .claude/agents/data-analyst.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/data-analyst.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-084f52e690bc30b0", "name": "Agent authority lacks a verifier contract: .claude/agents/ux-architect.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/ux-architect.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1771bd964e01f220", "name": "Agent authority lacks a verifier contract: .claude/skills/council/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/council/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-250106da925d01d9", "name": "Agent instruction contains unpinned remote install: .github/instructions/dev_workflow.instructions.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: .github/instructions/dev_workflow.instructions.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a40e5b458ed97bfd", "name": "Agent instruction/config may expose a secret: .github/instructions/taskmaster.instructions.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .github/instructions/taskmaster.instructions.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2803b8ee0d3abddb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/csp-report.js:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/csp-report.js:48"}, "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-6a517c1c773f437d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/monitoring.js:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/monitoring.js:34"}, "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-a0fc374d58683634", "name": "Legacy-named symbol `sub_old` in api/_billing/checkout.test.js:234", "shortDescription": {"text": "Legacy-named symbol `sub_old` in api/_billing/checkout.test.js:234"}, "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-2e52ba0f29e6dae7", "name": "Commented-code block (5 lines) in api/_billing/webhook.js:267", "shortDescription": {"text": "Commented-code block (5 lines) in api/_billing/webhook.js:267"}, "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-1e833d9cc2841fd9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_cron/synthesize-user-preferences.js:317", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_cron/synthesize-user-preferences.js:317"}, "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-acdd56e079dcd897", "name": "Commented-code block (6 lines) in api/_lib/food-intelligence.js:192", "shortDescription": {"text": "Commented-code block (6 lines) in api/_lib/food-intelligence.js:192"}, "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-24f60b680197d9c5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/food-intelligence.js:761", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/food-intelligence.js:761"}, "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-d978ee85dd058291", "name": "Commented-code block (5 lines) in api/_lib/notification-pipeline.js:12", "shortDescription": {"text": "Commented-code block (5 lines) in api/_lib/notification-pipeline.js:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e4094ce8a55826c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/notification-pipeline.js:364", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/notification-pipeline.js:364"}, "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-26fdc7afd6074703", "name": "Commented-code block (5 lines) in api/_lib/adaptive-fractions.js:104", "shortDescription": {"text": "Commented-code block (5 lines) in api/_lib/adaptive-fractions.js:104"}, "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-754a4114efef60af", "name": "Commented-code block (7 lines) in api/_lib/ingredient-aliases.js:2", "shortDescription": {"text": "Commented-code block (7 lines) in api/_lib/ingredient-aliases.js:2"}, "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-397d98e3e1e5eba4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/recipe-vault.js:174", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/recipe-vault.js:174"}, "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-ffa25ae1891855bb", "name": "Commented-code block (5 lines) in api/_lib/recipes/candidate-search.js:410", "shortDescription": {"text": "Commented-code block (5 lines) in api/_lib/recipes/candidate-search.js:410"}, "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-21cd72d802051b15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/kroger/callback.js:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/kroger/callback.js:55"}, "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-f33c7bafb26562fb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/kroger/cart.js:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/kroger/cart.js:72"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d970566ac677d45", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/kroger/stores.js:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/kroger/stores.js:21"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dd88f0fc7a47d443", "name": "Commented-code block (5 lines) in api/_meals/create-from-recognition.js:89", "shortDescription": {"text": "Commented-code block (5 lines) in api/_meals/create-from-recognition.js:89"}, "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-11f6b7340a2b8f96", "name": "Commented-code block (5 lines) in api/_meals/create-from-recognition.test.js:96", "shortDescription": {"text": "Commented-code block (5 lines) in api/_meals/create-from-recognition.test.js:96"}, "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-113962e9254e6e7f", "name": "Commented-code block (6 lines) in api/_food/coffee-build.js:63", "shortDescription": {"text": "Commented-code block (6 lines) in api/_food/coffee-build.js:63"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c73657d7c0259e2a", "name": "Commented-code block (6 lines) in api/_food/coffee-build.test.js:4", "shortDescription": {"text": "Commented-code block (6 lines) in api/_food/coffee-build.test.js:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a544940e9243c0c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_food/vision/analyze.js:272", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_food/vision/analyze.js:272"}, "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-7e09bbc6adc24079", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/fitbit/exchange.js:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/fitbit/exchange.js:89"}, "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-489344487d29f9b4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/fitbit/data.js:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/fitbit/data.js:40"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ea03b2e5fa0c407", "name": "Commented-code block (5 lines) in api/_integrations/google-fit/exchange.js:52", "shortDescription": {"text": "Commented-code block (5 lines) in api/_integrations/google-fit/exchange.js:52"}, "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-c2568d6f65ca4635", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/google-fit/exchange.js:91", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/google-fit/exchange.js:91"}, "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-4035154762127d9c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/google-fit/data.js:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/google-fit/data.js:37"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-10cde3cf757d19fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/list-sentry-issues.mjs:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/list-sentry-issues.mjs:16"}, "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-31f378073ae9e029", "name": "Legacy-named symbol `nutriai_settings_v2` in scripts/migrate-local-export.mjs:6", "shortDescription": {"text": "Legacy-named symbol `nutriai_settings_v2` in scripts/migrate-local-export.mjs:6"}, "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-b50c96c55346743e", "name": "Commented-code block (6 lines) in scripts/reconcile-macros.mjs:2", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/reconcile-macros.mjs:2"}, "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-ed3375ef1178937f", "name": "Commented-code block (5 lines) in src/test/nutritionScaling.test.ts:62", "shortDescription": {"text": "Commented-code block (5 lines) in src/test/nutritionScaling.test.ts:62"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21d885cb743587ef", "name": "Legacy-named symbol `nutriai_settings_v2` in src/constants/index.ts:83", "shortDescription": {"text": "Legacy-named symbol `nutriai_settings_v2` in src/constants/index.ts:83"}, "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-62c1751e13dc3018", "name": "Commented-code block (9 lines) in src/utils/groceryNormalizer.ts:15", "shortDescription": {"text": "Commented-code block (9 lines) in src/utils/groceryNormalizer.ts:15"}, "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-b31e77b450379944", "name": "Legacy-named symbol `nutriai_food_actor_id_v1` in src/utils/privacyData.ts:13", "shortDescription": {"text": "Legacy-named symbol `nutriai_food_actor_id_v1` in src/utils/privacyData.ts:13"}, "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-cb7c54a00f2a6566", "name": "Legacy-named symbol `nutriai_food_actor_id_v1` in src/utils/foodIntelligenceClient.ts:12", "shortDescription": {"text": "Legacy-named symbol `nutriai_food_actor_id_v1` in src/utils/foodIntelligenceClient.ts:12"}, "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-d027225812823706", "name": "Legacy-named symbol `nutriai_settings_v2` in src/utils/privacyData.test.ts:10", "shortDescription": {"text": "Legacy-named symbol `nutriai_settings_v2` in src/utils/privacyData.test.ts:10"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2daeb9783e88633d", "name": "Legacy-named symbol `nutriai_guest_merge_state_v1` in src/utils/mergeGuestData.ts:60", "shortDescription": {"text": "Legacy-named symbol `nutriai_guest_merge_state_v1` in src/utils/mergeGuestData.ts:60"}, "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-4664f24f6f7dcfcf", "name": "Commented-code block (5 lines) in src/components/shopping/ShoppingListView.tsx:112", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/shopping/ShoppingListView.tsx:112"}, "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-485423914c1182b2", "name": "Commented-code block (5 lines) in src/components/coffee/CoffeeReceiptCard.tsx:42", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/coffee/CoffeeReceiptCard.tsx:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-961015d88de9375f", "name": "Legacy-named symbol `nutriai_onboarding_rollout_events_v1` in src/components/onboarding/rollout.ts:16", "shortDescription": {"text": "Legacy-named symbol `nutriai_onboarding_rollout_events_v1` in src/components/onboarding/rollout.ts:16"}, "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-c28bd73222f1e5fa", "name": "Commented-code block (6 lines) in src/components/onboarding/steps/HealthConcernsStep.tsx:14", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/onboarding/steps/HealthConcernsStep.tsx:14"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1afc17ba57738dde", "name": "Commented-code block (5 lines) in src/components/features/quick-add/QuickAddSheet.test.tsx:84", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/features/quick-add/QuickAddSheet.test.tsx:84"}, "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-0969c981554e3502", "name": "Legacy-named symbol `nutriai_data_sync_v1` in src/lib/dataSync.ts:8", "shortDescription": {"text": "Legacy-named symbol `nutriai_data_sync_v1` in src/lib/dataSync.ts:8"}, "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-37de178751683e5a", "name": "Commented-code block (9 lines) in src/lib/receiptImage.ts:3", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/receiptImage.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e132a56d53a8c6b", "name": "Commented-code block (5 lines) in src/pages/CoffeeBuilderPage.test.tsx:61", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/CoffeeBuilderPage.test.tsx:61"}, "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-7e404ae2c72c060c", "name": "Legacy-named symbol `act_mealprep_plans_v1` in src/hooks/useMealPrepPlans.ts:15", "shortDescription": {"text": "Legacy-named symbol `act_mealprep_plans_v1` in src/hooks/useMealPrepPlans.ts:15"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-844b03bfe9d76c09", "name": "Legacy-named symbol `nutriai_pending_auth_source_v1` in src/context/AuthContext.tsx:67", "shortDescription": {"text": "Legacy-named symbol `nutriai_pending_auth_source_v1` in src/context/AuthContext.tsx:67"}, "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-af5c161d2c0afa31", "name": "Commented-code block (7 lines) in src/context/AuthContext.tsx:504", "shortDescription": {"text": "Commented-code block (7 lines) in src/context/AuthContext.tsx:504"}, "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-bf2ec78ed9ae9644", "name": "Legacy-named symbol `local_backup` in src/context/SyncContext.tsx:58", "shortDescription": {"text": "Legacy-named symbol `local_backup` in src/context/SyncContext.tsx:58"}, "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-a4ce1b261d8b22a5", "name": "Legacy-named symbol `nutriai_meals_v2` in e2e/tanstack-query-stabilization.spec.ts:175", "shortDescription": {"text": "Legacy-named symbol `nutriai_meals_v2` in e2e/tanstack-query-stabilization.spec.ts:175"}, "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-22126f8fbb47a1f2", "name": "Legacy-named symbol `nutriai_meals_v2` in e2e/serving-size-rescale.spec.ts:97", "shortDescription": {"text": "Legacy-named symbol `nutriai_meals_v2` in e2e/serving-size-rescale.spec.ts:97"}, "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-fe57090d64455e1c", "name": "Legacy-named symbol `nutriai_meal_plans_v1` in e2e/meal-prep-integration.spec.ts:128", "shortDescription": {"text": "Legacy-named symbol `nutriai_meal_plans_v1` in e2e/meal-prep-integration.spec.ts:128"}, "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-1952aa97869ffffa", "name": "Legacy-named symbol `nutriai_settings_v2` in e2e/helpers/nutriai.ts:4", "shortDescription": {"text": "Legacy-named symbol `nutriai_settings_v2` in e2e/helpers/nutriai.ts:4"}, "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-0170d0d9dc6c5bef", "name": "123 env vars used in code but missing from .env.example", "shortDescription": {"text": "123 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AI_HARD_FAIL_MODE`, `AI_PROXY_ALLOWED_MODELS`, `AI_PROXY_ALLOWED_ORIGINS`, `AI_PROXY_AUTH_REQUIRED`, `AI_PROXY_AUTH_TOKEN`, `AI_PROXY_MAX_BODY_BYTES`, `AI_PROXY_MAX_COMPLETION_TOKENS`, `AI_PROXY_MODEL` + 115 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-bcbcceb55cf79771", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_cron/synthesize-user-preferences.js:317)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_cron/synthesize-user-preferences.js:317)"}, "fullDescription": {"text": "`api/_cron/synthesize-user-preferences.js:317` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-feb1f96107e07f20", "name": "Dangling fetch: POST https://api.github.com/repos/${repository}/dispatches (api/_agents/ingest.js:27)", "shortDescription": {"text": "Dangling fetch: POST https://api.github.com/repos/${repository}/dispatches (api/_agents/ingest.js:27)"}, "fullDescription": {"text": "`api/_agents/ingest.js:27` calls `POST https://api.github.com/repos/${repository}/dispatches` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/repos/<p>/dispatches`\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-9d758a1f5913f415", "name": "Dangling fetch: POST https://api.nal.usda.gov/fdc/v1/foods/search (api/_lib/food-intelligence.js:761)", "shortDescription": {"text": "Dangling fetch: POST https://api.nal.usda.gov/fdc/v1/foods/search (api/_lib/food-intelligence.js:761)"}, "fullDescription": {"text": "`api/_lib/food-intelligence.js:761` calls `POST https://api.nal.usda.gov/fdc/v1/foods/search` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.nal.usda.gov/fdc/v1/foods/search`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5c30f8b033e8583f", "name": "Dangling fetch: GET https://world.openfoodfacts.org/api/v2/product/${encodeURIComponent(normalizedBarcode)}.json (api/_l", "shortDescription": {"text": "Dangling fetch: GET https://world.openfoodfacts.org/api/v2/product/${encodeURIComponent(normalizedBarcode)}.json (api/_lib/food-intelligence.js:899)"}, "fullDescription": {"text": "`api/_lib/food-intelligence.js:899` calls `GET https://world.openfoodfacts.org/api/v2/product/${encodeURIComponent(normalizedBarcode)}.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/world.openfoodfacts.org/api/v2/product/<p>.json`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d775df2187829819", "name": "Dangling fetch: GET https://trackapi.nutritionix.com/v2/search/instant?query=${encodeURIComponent(query)} (api/_lib/food", "shortDescription": {"text": "Dangling fetch: GET https://trackapi.nutritionix.com/v2/search/instant?query=${encodeURIComponent(query)} (api/_lib/food-intelligence.js:957)"}, "fullDescription": {"text": "`api/_lib/food-intelligence.js:957` calls `GET https://trackapi.nutritionix.com/v2/search/instant?query=${encodeURIComponent(query)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/trackapi.nutritionix.com/v2/search/instant`\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-b72c3c4b64cd3ead", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_lib/ai-meal-generator.js:36)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_lib/ai-meal-generator.js:36)"}, "fullDescription": {"text": "`api/_lib/ai-meal-generator.js:36` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-070ec21cb6f850d1", "name": "Dangling fetch: POST https://api.resend.com/emails (api/_lib/notification-pipeline.js:364)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (api/_lib/notification-pipeline.js:364)"}, "fullDescription": {"text": "`api/_lib/notification-pipeline.js:364` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\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-c367c6d887902113", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_lib/ai-concept-generator.js:381)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_lib/ai-concept-generator.js:381)"}, "fullDescription": {"text": "`api/_lib/ai-concept-generator.js:381` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-5f88ab1c24b6a88e", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_lib/ai-concept-generator.js:446)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_lib/ai-concept-generator.js:446)"}, "fullDescription": {"text": "`api/_lib/ai-concept-generator.js:446` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-756bc5229c7efa96", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_food/log.js:75)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_food/log.js:75)"}, "fullDescription": {"text": "`api/_food/log.js:75` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-4e19bce93dce400a", "name": "Dangling fetch: GET https://world.openfoodfacts.org/api/v2/product/${encodeURIComponent(clean)}.json?fields=${fields} (a", "shortDescription": {"text": "Dangling fetch: GET https://world.openfoodfacts.org/api/v2/product/${encodeURIComponent(clean)}.json?fields=${fields} (api/_food/barcode.js:70)"}, "fullDescription": {"text": "`api/_food/barcode.js:70` calls `GET https://world.openfoodfacts.org/api/v2/product/${encodeURIComponent(clean)}.json?fields=${fields}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/world.openfoodfacts.org/api/v2/product/<p>.json`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0a2aa7f82a7672af", "name": "Dangling fetch: POST https://api.fitbit.com/oauth2/token (api/_integrations/fitbit/exchange.js:89)", "shortDescription": {"text": "Dangling fetch: POST https://api.fitbit.com/oauth2/token (api/_integrations/fitbit/exchange.js:89)"}, "fullDescription": {"text": "`api/_integrations/fitbit/exchange.js:89` calls `POST https://api.fitbit.com/oauth2/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.fitbit.com/oauth2/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e02aef71943fc574", "name": "Dangling fetch: POST https://api.fitbit.com/oauth2/token (api/_integrations/fitbit/data.js:40)", "shortDescription": {"text": "Dangling fetch: POST https://api.fitbit.com/oauth2/token (api/_integrations/fitbit/data.js:40)"}, "fullDescription": {"text": "`api/_integrations/fitbit/data.js:40` calls `POST https://api.fitbit.com/oauth2/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.fitbit.com/oauth2/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-687fde95e78ee8d0", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (api/_integrations/google-fit/exchange.js:91)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (api/_integrations/google-fit/exchange.js:91)"}, "fullDescription": {"text": "`api/_integrations/google-fit/exchange.js:91` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cfd7c96907d528e2", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (api/_integrations/google-fit/data.js:37)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (api/_integrations/google-fit/data.js:37)"}, "fullDescription": {"text": "`api/_integrations/google-fit/data.js:37` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-af7f71403ebc4583", "name": "Dangling fetch: POST /api/integrations/google-fit/exchange (src/hooks/useHealthSync.ts:17)", "shortDescription": {"text": "Dangling fetch: POST /api/integrations/google-fit/exchange (src/hooks/useHealthSync.ts:17)"}, "fullDescription": {"text": "`src/hooks/useHealthSync.ts:17` calls `POST /api/integrations/google-fit/exchange` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/integrations/google-fit/exchange`\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-b6111da3fb80e694", "name": "Dangling fetch: POST /api/integrations/fitbit/exchange (src/hooks/useHealthSync.ts:43)", "shortDescription": {"text": "Dangling fetch: POST /api/integrations/fitbit/exchange (src/hooks/useHealthSync.ts:43)"}, "fullDescription": {"text": "`src/hooks/useHealthSync.ts:43` calls `POST /api/integrations/fitbit/exchange` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/integrations/fitbit/exchange`\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-f1ab6b0aa0d74c5b", "name": "Dangling fetch: GET /api/integrations/google-fit/data?${params} (src/services/healthService.ts:248)", "shortDescription": {"text": "Dangling fetch: GET /api/integrations/google-fit/data?${params} (src/services/healthService.ts:248)"}, "fullDescription": {"text": "`src/services/healthService.ts:248` calls `GET /api/integrations/google-fit/data?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/integrations/google-fit/data`\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-a91ef07159bc15b9", "name": "Dangling fetch: GET /api/integrations/fitbit/data?${params} (src/services/healthService.ts:339)", "shortDescription": {"text": "Dangling fetch: GET /api/integrations/fitbit/data?${params} (src/services/healthService.ts:339)"}, "fullDescription": {"text": "`src/services/healthService.ts:339` calls `GET /api/integrations/fitbit/data?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/integrations/fitbit/data`\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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`archive/backend-legacy/server.py` 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-ee07d6cd4eca0396", "name": "Unused endpoint: POST /edit-file", "shortDescription": {"text": "Unused endpoint: POST /edit-file"}, "fullDescription": {"text": "`archive/frontend-legacy/plugins/visual-edits/dev-server-setup.js` declares `POST /edit-file` 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-0d63ec445402501a", "name": "Unused endpoint: OPTIONS /edit-file", "shortDescription": {"text": "Unused endpoint: OPTIONS /edit-file"}, "fullDescription": {"text": "`archive/frontend-legacy/plugins/visual-edits/dev-server-setup.js` declares `OPTIONS /edit-file` 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/17759"}, "properties": {"repository": "Rahulsanecdote/AICalorietrackermain", "repoUrl": "https://github.com/Rahulsanecdote/AICalorietrackermain", "branch": "main"}, "results": [{"ruleId": "scanner-f74446c2b6e7e6a9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 archive/frontend-legacy/src/App.js:13"}, "properties": {"repobilityId": "6f3b40262ecc11d2", "scanner": "scanner-primary", "fingerprint": "f74446c2b6e7e6a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85ca065c428cae31", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 archive/frontend-legacy/plugins/health-check/health-endpoints.js:24"}, "properties": {"repobilityId": "70c3fb60ec1d392e", "scanner": "scanner-primary", "fingerprint": "85ca065c428cae31", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5d85d181f40d8f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 archive/frontend-legacy/plugins/visual-edits/dev-server-setup.js:266"}, "properties": {"repobilityId": "f17c84de34519f02", "scanner": "scanner-primary", "fingerprint": "b5d85d181f40d8f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9861b64b5ced19a9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/main.tsx:22"}, "properties": {"repobilityId": "4879059f78ef8e58", "scanner": "scanner-primary", "fingerprint": "9861b64b5ced19a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a9b8e8ccb8863e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/circuitBreaker.ts:273"}, "properties": {"repobilityId": "4ed289c911a3b8b7", "scanner": "scanner-primary", "fingerprint": "6a9b8e8ccb8863e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5750b13a6057c03f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/dataMigration.ts:351"}, "properties": {"repobilityId": "a3e5e7514f038e86", "scanner": "scanner-primary", "fingerprint": "5750b13a6057c03f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8db4bc7adaf95dc7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/envSetup.ts:19"}, "properties": {"repobilityId": "d7623ed9aaec8cfa", "scanner": "scanner-primary", "fingerprint": "8db4bc7adaf95dc7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f389868dc4ff30e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/monitoring.ts:183"}, "properties": {"repobilityId": "d05f944591c8a45f", "scanner": "scanner-primary", "fingerprint": "7f389868dc4ff30e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d617e2a9703a698", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/supabaseClient.ts:11"}, "properties": {"repobilityId": "2236a9364c954f9a", "scanner": "scanner-primary", "fingerprint": "7d617e2a9703a698", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2381c1338ded0ba0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/globalErrorHandlers.ts:150"}, "properties": {"repobilityId": "2fe28726ce15906e", "scanner": "scanner-primary", "fingerprint": "2381c1338ded0ba0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6d41b23c41edf546", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/errorRecovery.ts:275"}, "properties": {"repobilityId": "cd1709350a4ee4e1", "scanner": "scanner-primary", "fingerprint": "6d41b23c41edf546", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d6fdf05e28f06973", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MonitoringDebugPanel.tsx:107"}, "properties": {"repobilityId": "68c1c5e06c78dd2f", "scanner": "scanner-primary", "fingerprint": "d6fdf05e28f06973", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc2f44eb0e0778d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/EditableFoodItem.tsx:61"}, "properties": {"repobilityId": "10d851877e2ab401", "scanner": "scanner-primary", "fingerprint": "fc2f44eb0e0778d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a315e644227a88d0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ErrorBoundary.tsx:631"}, "properties": {"repobilityId": "03ab797b41b809db", "scanner": "scanner-primary", "fingerprint": "a315e644227a88d0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-479f182e4f1c6221", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PantryInput.tsx:346"}, "properties": {"repobilityId": "e689269b98648a69", "scanner": "scanner-primary", "fingerprint": "479f182e4f1c6221", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25a3f389b84613dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/MealPlanGenerator.tsx:78"}, "properties": {"repobilityId": "6f7debce8023657b", "scanner": "scanner-primary", "fingerprint": "25a3f389b84613dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25d8863b69d14953", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai/NutriBotModal.tsx:101"}, "properties": {"repobilityId": "3aed3364b5287c8e", "scanner": "scanner-primary", "fingerprint": "25d8863b69d14953", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b40bfd970a08021d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai/AutoLookupFoodCard.tsx:176"}, "properties": {"repobilityId": "973622fde64071b5", "scanner": "scanner-primary", "fingerprint": "b40bfd970a08021d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f83b9a4a5bcd1304", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tracker/ProgressBreakdownCard.tsx:192"}, "properties": {"repobilityId": "3e35950d1729a832", "scanner": "scanner-primary", "fingerprint": "f83b9a4a5bcd1304", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f37f8fefa7f17d3d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/dropdown-date-picker.tsx:126"}, "properties": {"repobilityId": "b572195a56f5adf9", "scanner": "scanner-primary", "fingerprint": "f37f8fefa7f17d3d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6086ce6e7bfd4ded", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/user-menu.tsx:165"}, "properties": {"repobilityId": "86219b452f1f5cac", "scanner": "scanner-primary", "fingerprint": "6086ce6e7bfd4ded", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-909269b6e0aff0ef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/language-selector.tsx:56"}, "properties": {"repobilityId": "f3b63f52b5dfd360", "scanner": "scanner-primary", "fingerprint": "909269b6e0aff0ef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7211ba515ab9b6a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/donut-chart-demo.tsx:59"}, "properties": {"repobilityId": "d0a2920b1a1ac961", "scanner": "scanner-primary", "fingerprint": "7211ba515ab9b6a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1dee77e53333f30", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/shopping/ShoppingListView.tsx:179"}, "properties": {"repobilityId": "8556b9bb8c688be6", "scanner": "scanner-primary", "fingerprint": "a1dee77e53333f30", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-32d817adec5bd7ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/recipes/RecipeDetailModal.tsx:101"}, "properties": {"repobilityId": "5256182b87595ce4", "scanner": "scanner-primary", "fingerprint": "32d817adec5bd7ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f100061afe12f43f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/coffee/CoffeeReceiptCard.tsx:101"}, "properties": {"repobilityId": "8a32399838524673", "scanner": "scanner-primary", "fingerprint": "f100061afe12f43f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94990716714e61a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/onboarding/steps/TargetDateStep.tsx:63"}, "properties": {"repobilityId": "9f0d664e12f42ca9", "scanner": "scanner-primary", "fingerprint": "94990716714e61a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-385b2bb8f3692313", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mealprep/LogMealPrepSheet.tsx:87"}, "properties": {"repobilityId": "bc9ac01860d08dfa", "scanner": "scanner-primary", "fingerprint": "385b2bb8f3692313", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-83d4902a3e64a7ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mealprep/MealPrepFlow.tsx:745"}, "properties": {"repobilityId": "89c612217809cacb", "scanner": "scanner-primary", "fingerprint": "83d4902a3e64a7ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84daffb17141f4cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/InsightsDashboard.tsx:214"}, "properties": {"repobilityId": "2916ec2b085f993b", "scanner": "scanner-primary", "fingerprint": "84daffb17141f4cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9994176c208e2ca0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/quick-add/QuickAddRecentList.tsx:51"}, "properties": {"repobilityId": "f58c7e76e41a687b", "scanner": "scanner-primary", "fingerprint": "9994176c208e2ca0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a21ef7422d8fdc8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/quick-add/QuickAddSuccessState.tsx:35"}, "properties": {"repobilityId": "35579f5ae3efd646", "scanner": "scanner-primary", "fingerprint": "7a21ef7422d8fdc8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a3b2ad41004c01c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/features/quick-add/QuickAddTextTab.tsx:302"}, "properties": {"repobilityId": "beb901c086089364", "scanner": "scanner-primary", "fingerprint": "3a3b2ad41004c01c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-afdfba953a2bbbac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useApiCall.ts:303"}, "properties": {"repobilityId": "d578a47c6ed8a326", "scanner": "scanner-primary", "fingerprint": "afdfba953a2bbbac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09a112e12a97a70d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useMealPlanner.ts:457"}, "properties": {"repobilityId": "e35349f4f95f1b5d", "scanner": "scanner-primary", "fingerprint": "09a112e12a97a70d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83a98a877607bf5a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useVoiceScanner.ts:12"}, "properties": {"repobilityId": "75346c9f7713af6a", "scanner": "scanner-primary", "fingerprint": "83a98a877607bf5a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-befe77c7d9ab2e6c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useNutritionAI.ts:216"}, "properties": {"repobilityId": "49da38b4a2ff4911", "scanner": "scanner-primary", "fingerprint": "befe77c7d9ab2e6c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4ed6efb68e932726", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/context/AuthContext.tsx:289"}, "properties": {"repobilityId": "a95ace208ddebd07", "scanner": "scanner-primary", "fingerprint": "4ed6efb68e932726", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-21630e840e7acefe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/context/SyncContext.tsx:293"}, "properties": {"repobilityId": "296dd3be46c323de", "scanner": "scanner-primary", "fingerprint": "21630e840e7acefe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6662c9c06ab5541", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/context/UserContext.tsx:83"}, "properties": {"repobilityId": "f34a2fbd026528b2", "scanner": "scanner-primary", "fingerprint": "c6662c9c06ab5541", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f1c8647243f449bc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/context/MealContext.tsx:184"}, "properties": {"repobilityId": "1c5555b189d2ee1d", "scanner": "scanner-primary", "fingerprint": "f1c8647243f449bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1517d0c856a2ee0b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/serving-size-rescale.spec.ts:53"}, "properties": {"repobilityId": "008ba75e61b5584c", "scanner": "scanner-primary", "fingerprint": "1517d0c856a2ee0b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b6be3ff24517b3c0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/meal-prep-integration.spec.ts:194"}, "properties": {"repobilityId": "563f4a3502e5ee89", "scanner": "scanner-primary", "fingerprint": "b6be3ff24517b3c0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-8987d6d1c30c7202", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "068fbf45727eac17", "scanner": "scanner-primary", "fingerprint": "8987d6d1c30c7202", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-317932093ccf0181", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:1.27-alpine"}, "properties": {"repobilityId": "f3d2923d20164c8c", "scanner": "scanner-primary", "fingerprint": "317932093ccf0181", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-0ce6b31a25286299", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in archive/frontend-legacy/plugins/visual-edits/dev-server-setup.js:6"}, "properties": {"repobilityId": "25365d29a5d7ebea", "scanner": "scanner-primary", "fingerprint": "0ce6b31a25286299", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/frontend-legacy/plugins/visual-edits/dev-server-setup.js"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-79a16fbc68da0f5d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/with-env.mjs:3"}, "properties": {"repobilityId": "89a05b9204d3434f", "scanner": "scanner-primary", "fingerprint": "79a16fbc68da0f5d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/with-env.mjs"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-43b57974d93a7a4d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/repo-rehydrate-from-head.mjs:3"}, "properties": {"repobilityId": "db1c97d0edd21dc1", "scanner": "scanner-primary", "fingerprint": "43b57974d93a7a4d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/repo-rehydrate-from-head.mjs"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-665fea482183ebaf", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/build.mjs:3"}, "properties": {"repobilityId": "a7d0f47b903899f9", "scanner": "scanner-primary", "fingerprint": "665fea482183ebaf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build.mjs"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-5ba5a9097fcd2be0", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/obsidian-verify-no-secrets.mjs:3"}, "properties": {"repobilityId": "aefa8f0074a43375", "scanner": "scanner-primary", "fingerprint": "5ba5a9097fcd2be0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/obsidian-verify-no-secrets.mjs"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-600e1edb9194a069", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/generate-supabase-types.mjs:1"}, "properties": {"repobilityId": "a7db99882f30ea57", "scanner": "scanner-primary", "fingerprint": "600e1edb9194a069", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate-supabase-types.mjs"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4645dd529e4ee83d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/repo-integrity-check.mjs:3"}, "properties": {"repobilityId": "b1c2aca6cabbca48", "scanner": "scanner-primary", "fingerprint": "4645dd529e4ee83d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/repo-integrity-check.mjs"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-99e708b00ce1325a", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/verify-legal-policy-config.test.mjs:2"}, "properties": {"repobilityId": "41ceca0edbad16d2", "scanner": "scanner-primary", "fingerprint": "99e708b00ce1325a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify-legal-policy-config.test.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-ad6d66f4621f7e42", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/te.ts"}, "properties": {"repobilityId": "eb9ad28311cb373e", "scanner": "scanner-primary", "fingerprint": "ad6d66f4621f7e42", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/te.ts"}, "region": {"startLine": 691}}}]}, {"ruleId": "scanner-ad6d66f4621f7e42", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/te.ts"}, "properties": {"repobilityId": "eb9ad28311cb373e", "scanner": "scanner-primary", "fingerprint": "ad6d66f4621f7e42", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/te.ts"}, "region": {"startLine": 692}}}]}, {"ruleId": "scanner-ad6d66f4621f7e42", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/te.ts"}, "properties": {"repobilityId": "eb9ad28311cb373e", "scanner": "scanner-primary", "fingerprint": "ad6d66f4621f7e42", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/te.ts"}, "region": {"startLine": 698}}}]}, {"ruleId": "scanner-191b838d20a45d0e", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/fr.ts"}, "properties": {"repobilityId": "26da735c720da20c", "scanner": "scanner-primary", "fingerprint": "191b838d20a45d0e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/fr.ts"}, "region": {"startLine": 678}}}]}, {"ruleId": "scanner-191b838d20a45d0e", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/fr.ts"}, "properties": {"repobilityId": "26da735c720da20c", "scanner": "scanner-primary", "fingerprint": "191b838d20a45d0e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/fr.ts"}, "region": {"startLine": 679}}}]}, {"ruleId": "scanner-191b838d20a45d0e", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/fr.ts"}, "properties": {"repobilityId": "26da735c720da20c", "scanner": "scanner-primary", "fingerprint": "191b838d20a45d0e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/fr.ts"}, "region": {"startLine": 685}}}]}, {"ruleId": "scanner-e0d54a7db7e15401", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/en.ts"}, "properties": {"repobilityId": "7354ace799c2b0c5", "scanner": "scanner-primary", "fingerprint": "e0d54a7db7e15401", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/en.ts"}, "region": {"startLine": 685}}}]}, {"ruleId": "scanner-e0d54a7db7e15401", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/en.ts"}, "properties": {"repobilityId": "7354ace799c2b0c5", "scanner": "scanner-primary", "fingerprint": "e0d54a7db7e15401", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/en.ts"}, "region": {"startLine": 685}}}]}, {"ruleId": "scanner-e0d54a7db7e15401", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/en.ts"}, "properties": {"repobilityId": "7354ace799c2b0c5", "scanner": "scanner-primary", "fingerprint": "e0d54a7db7e15401", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/en.ts"}, "region": {"startLine": 688}}}]}, {"ruleId": "scanner-08e7e51acb67f8ef", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/de.ts"}, "properties": {"repobilityId": "37a49a8e1f5ce676", "scanner": "scanner-primary", "fingerprint": "08e7e51acb67f8ef", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/de.ts"}, "region": {"startLine": 685}}}]}, {"ruleId": "scanner-08e7e51acb67f8ef", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/de.ts"}, "properties": {"repobilityId": "37a49a8e1f5ce676", "scanner": "scanner-primary", "fingerprint": "08e7e51acb67f8ef", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/de.ts"}, "region": {"startLine": 686}}}]}, {"ruleId": "scanner-08e7e51acb67f8ef", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/de.ts"}, "properties": {"repobilityId": "37a49a8e1f5ce676", "scanner": "scanner-primary", "fingerprint": "08e7e51acb67f8ef", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/de.ts"}, "region": {"startLine": 692}}}]}, {"ruleId": "scanner-247ea6650a0a9978", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/es.ts"}, "properties": {"repobilityId": "3743e76946c4cbcb", "scanner": "scanner-primary", "fingerprint": "247ea6650a0a9978", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/es.ts"}, "region": {"startLine": 673}}}]}, {"ruleId": "scanner-247ea6650a0a9978", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/es.ts"}, "properties": {"repobilityId": "3743e76946c4cbcb", "scanner": "scanner-primary", "fingerprint": "247ea6650a0a9978", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/es.ts"}, "region": {"startLine": 674}}}]}, {"ruleId": "scanner-247ea6650a0a9978", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/es.ts"}, "properties": {"repobilityId": "3743e76946c4cbcb", "scanner": "scanner-primary", "fingerprint": "247ea6650a0a9978", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/es.ts"}, "region": {"startLine": 680}}}]}, {"ruleId": "scanner-d394c384547b9988", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/hi.ts"}, "properties": {"repobilityId": "a0b099adbca9f48c", "scanner": "scanner-primary", "fingerprint": "d394c384547b9988", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/hi.ts"}, "region": {"startLine": 667}}}]}, {"ruleId": "scanner-d394c384547b9988", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/hi.ts"}, "properties": {"repobilityId": "a0b099adbca9f48c", "scanner": "scanner-primary", "fingerprint": "d394c384547b9988", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/hi.ts"}, "region": {"startLine": 668}}}]}, {"ruleId": "scanner-d394c384547b9988", "level": "error", "message": {"text": "Possible secret in src/i18n/locales/hi.ts"}, "properties": {"repobilityId": "a0b099adbca9f48c", "scanner": "scanner-primary", "fingerprint": "d394c384547b9988", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/locales/hi.ts"}, "region": {"startLine": 674}}}]}, {"ruleId": "scanner-848409ff5bfec7a8", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/components/mealprep/MealPrepFlow.tsx:703"}, "properties": {"repobilityId": "fb95639f14c41308", "scanner": "scanner-primary", "fingerprint": "848409ff5bfec7a8", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/mealprep/MealPrepFlow.tsx"}, "region": {"startLine": 703}}}]}, {"ruleId": "scanner-3161d70f779abcd9", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in e2e/meal-prep-integration.spec.ts:141"}, "properties": {"repobilityId": "f699f201753ff9be", "scanner": "scanner-primary", "fingerprint": "3161d70f779abcd9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/meal-prep-integration.spec.ts"}, "region": {"startLine": 141}}}]}, {"ruleId": "scanner-792ecefef9b839f8", "level": "error", "message": {"text": "Possible secret in e2e/helpers/nutriai.ts"}, "properties": {"repobilityId": "79450af8b55e6287", "scanner": "scanner-primary", "fingerprint": "792ecefef9b839f8", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/helpers/nutriai.ts"}, "region": {"startLine": 544}}}]}, {"ruleId": "scanner-42d2d2028449c88f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in e2e/helpers/nutriai.ts:11"}, "properties": {"repobilityId": "e1b93b8eb032c1ab", "scanner": "scanner-primary", "fingerprint": "42d2d2028449c88f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/helpers/nutriai.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b4bd4fe7d3131c1b", "level": "note", "message": {"text": "Very large file: api/_lib/food-intelligence.js (1539 lines)"}, "properties": {"repobilityId": "ac47bf6b19f9ae6a", "scanner": "scanner-primary", "fingerprint": "b4bd4fe7d3131c1b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a278d34912c2d5fe", "level": "note", "message": {"text": "Very large file: src/types/supabase.generated.ts (2216 lines)"}, "properties": {"repobilityId": "6052eb43ea47cfed", "scanner": "scanner-primary", "fingerprint": "a278d34912c2d5fe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-10e71e01b0bb02a0", "level": "note", "message": {"text": "Very large file: src/i18n/locales/te.ts (935 lines)"}, "properties": {"repobilityId": "c6e7160c49936bb8", "scanner": "scanner-primary", "fingerprint": "10e71e01b0bb02a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3e5cdae3dda62d60", "level": "note", "message": {"text": "Very large file: src/i18n/locales/fr.ts (922 lines)"}, "properties": {"repobilityId": "6de851608c188184", "scanner": "scanner-primary", "fingerprint": "3e5cdae3dda62d60", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-af37ce7bba2ed2bb", "level": "note", "message": {"text": "Very large file: src/i18n/locales/en.ts (898 lines)"}, "properties": {"repobilityId": "d5233f5b29e15882", "scanner": "scanner-primary", "fingerprint": "af37ce7bba2ed2bb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d2fcd9c632e908a5", "level": "note", "message": {"text": "Very large file: src/i18n/locales/de.ts (929 lines)"}, "properties": {"repobilityId": "8ec0eb7599240be7", "scanner": "scanner-primary", "fingerprint": "d2fcd9c632e908a5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1de814541a4a3b55", "level": "note", "message": {"text": "Very large file: src/i18n/locales/es.ts (917 lines)"}, "properties": {"repobilityId": "aac1e1e298fc7ab1", "scanner": "scanner-primary", "fingerprint": "1de814541a4a3b55", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-304393827e9aa740", "level": "note", "message": {"text": "Very large file: src/i18n/locales/hi.ts (911 lines)"}, "properties": {"repobilityId": "66d445b2330ec13c", "scanner": "scanner-primary", "fingerprint": "304393827e9aa740", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a6dab66f042ab027", "level": "note", "message": {"text": "Very large file: src/i18n/locales/zh.ts (898 lines)"}, "properties": {"repobilityId": "af493853afa2bb20", "scanner": "scanner-primary", "fingerprint": "a6dab66f042ab027", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5daa4aef84dd6331", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: archive/frontend-legacy/package.json"}, "properties": {"repobilityId": "fd8a2d2f42747f04", "scanner": "scanner-primary", "fingerprint": "5daa4aef84dd6331", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/frontend-legacy/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "b998dd9d9e3ed452", "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": "cb1b5429dee34c64", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "4fc949b87bbb4595", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "76ab722348b66cf6", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "0f6cac4ddc1750f8", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "6a4164936159cc58", "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": "26ac3674863e8ad6", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-cc55229a7a3c078d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "properties": {"repobilityId": "51942fb3d5b8b5b4", "scanner": "scanner-primary", "fingerprint": "cc55229a7a3c078d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "mcp_config"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".mcp.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-24f2ea4bd14badc1", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: CLAUDE.md"}, "properties": {"repobilityId": "0f6049734704e537", "scanner": "scanner-primary", "fingerprint": "24f2ea4bd14badc1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 170}}}]}, {"ruleId": "scanner-3de6a808d178ed75", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/data-analyst.md"}, "properties": {"repobilityId": "fa706d0d511f3d12", "scanner": "scanner-primary", "fingerprint": "3de6a808d178ed75", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/data-analyst.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-084f52e690bc30b0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/ux-architect.md"}, "properties": {"repobilityId": "d4ae555997f69921", "scanner": "scanner-primary", "fingerprint": "084f52e690bc30b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/ux-architect.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1771bd964e01f220", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/council/SKILL.md"}, "properties": {"repobilityId": "9dfe75fe525ffec6", "scanner": "scanner-primary", "fingerprint": "1771bd964e01f220", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/council/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-250106da925d01d9", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: .github/instructions/dev_workflow.instructions.md"}, "properties": {"repobilityId": "ef1c3022ce77db0c", "scanner": "scanner-primary", "fingerprint": "250106da925d01d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "agent_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/instructions/dev_workflow.instructions.md"}, "region": {"startLine": 206}}}]}, {"ruleId": "scanner-a40e5b458ed97bfd", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .github/instructions/taskmaster.instructions.md"}, "properties": {"repobilityId": "b10c1a3b61cd08f3", "scanner": "scanner-primary", "fingerprint": "a40e5b458ed97bfd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "agent_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/instructions/taskmaster.instructions.md"}, "region": {"startLine": 377}}}]}, {"ruleId": "scanner-2803b8ee0d3abddb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/csp-report.js:48"}, "properties": {"repobilityId": "026a89bae5857630", "scanner": "scanner-primary", "fingerprint": "2803b8ee0d3abddb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6a517c1c773f437d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/monitoring.js:34"}, "properties": {"repobilityId": "91fb7689a243597b", "scanner": "scanner-primary", "fingerprint": "6a517c1c773f437d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0fc374d58683634", "level": "note", "message": {"text": "Legacy-named symbol `sub_old` in api/_billing/checkout.test.js:234"}, "properties": {"repobilityId": "2ba404f1f07b5e0c", "scanner": "scanner-primary", "fingerprint": "a0fc374d58683634", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2e52ba0f29e6dae7", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_billing/webhook.js:267"}, "properties": {"repobilityId": "d20fc12e922ecb2a", "scanner": "scanner-primary", "fingerprint": "2e52ba0f29e6dae7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e833d9cc2841fd9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_cron/synthesize-user-preferences.js:317"}, "properties": {"repobilityId": "0aaf4e5c3d0206c8", "scanner": "scanner-primary", "fingerprint": "1e833d9cc2841fd9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-acdd56e079dcd897", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_lib/food-intelligence.js:192"}, "properties": {"repobilityId": "0640a94e198eec60", "scanner": "scanner-primary", "fingerprint": "acdd56e079dcd897", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24f60b680197d9c5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/food-intelligence.js:761"}, "properties": {"repobilityId": "fe2e5207a67c786f", "scanner": "scanner-primary", "fingerprint": "24f60b680197d9c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d978ee85dd058291", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_lib/notification-pipeline.js:12"}, "properties": {"repobilityId": "5934f1391d4df1b3", "scanner": "scanner-primary", "fingerprint": "d978ee85dd058291", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e4094ce8a55826c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/notification-pipeline.js:364"}, "properties": {"repobilityId": "49ca6291a398aaec", "scanner": "scanner-primary", "fingerprint": "6e4094ce8a55826c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-26fdc7afd6074703", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_lib/adaptive-fractions.js:104"}, "properties": {"repobilityId": "869c03a452cdcb21", "scanner": "scanner-primary", "fingerprint": "26fdc7afd6074703", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-754a4114efef60af", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/_lib/ingredient-aliases.js:2"}, "properties": {"repobilityId": "07df58ca39685a23", "scanner": "scanner-primary", "fingerprint": "754a4114efef60af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-397d98e3e1e5eba4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/recipe-vault.js:174"}, "properties": {"repobilityId": "df70497ced87284d", "scanner": "scanner-primary", "fingerprint": "397d98e3e1e5eba4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ffa25ae1891855bb", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_lib/recipes/candidate-search.js:410"}, "properties": {"repobilityId": "5cfd4c216302f0d2", "scanner": "scanner-primary", "fingerprint": "ffa25ae1891855bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21cd72d802051b15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/kroger/callback.js:55"}, "properties": {"repobilityId": "17cca056007ee234", "scanner": "scanner-primary", "fingerprint": "21cd72d802051b15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f33c7bafb26562fb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/kroger/cart.js:72"}, "properties": {"repobilityId": "ec5538b8e4a7be22", "scanner": "scanner-primary", "fingerprint": "f33c7bafb26562fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d970566ac677d45", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/kroger/stores.js:21"}, "properties": {"repobilityId": "95bbc9721536cbee", "scanner": "scanner-primary", "fingerprint": "3d970566ac677d45", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dd88f0fc7a47d443", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_meals/create-from-recognition.js:89"}, "properties": {"repobilityId": "15c7ebffd3e63551", "scanner": "scanner-primary", "fingerprint": "dd88f0fc7a47d443", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11f6b7340a2b8f96", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_meals/create-from-recognition.test.js:96"}, "properties": {"repobilityId": "a12e8b31ad679b78", "scanner": "scanner-primary", "fingerprint": "11f6b7340a2b8f96", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-113962e9254e6e7f", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_food/coffee-build.js:63"}, "properties": {"repobilityId": "f9062ad190b0ea74", "scanner": "scanner-primary", "fingerprint": "113962e9254e6e7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c73657d7c0259e2a", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_food/coffee-build.test.js:4"}, "properties": {"repobilityId": "02d7b9e36fcabf44", "scanner": "scanner-primary", "fingerprint": "c73657d7c0259e2a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a544940e9243c0c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_food/vision/analyze.js:272"}, "properties": {"repobilityId": "62f319bd2f624ff3", "scanner": "scanner-primary", "fingerprint": "8a544940e9243c0c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e09bbc6adc24079", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/fitbit/exchange.js:89"}, "properties": {"repobilityId": "13fbdbc33d2753b0", "scanner": "scanner-primary", "fingerprint": "7e09bbc6adc24079", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-489344487d29f9b4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/fitbit/data.js:40"}, "properties": {"repobilityId": "a8560122bd7fe39e", "scanner": "scanner-primary", "fingerprint": "489344487d29f9b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8ea03b2e5fa0c407", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_integrations/google-fit/exchange.js:52"}, "properties": {"repobilityId": "9ca60f135ea2eeb5", "scanner": "scanner-primary", "fingerprint": "8ea03b2e5fa0c407", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2568d6f65ca4635", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/google-fit/exchange.js:91"}, "properties": {"repobilityId": "ff2c9537c36e0234", "scanner": "scanner-primary", "fingerprint": "c2568d6f65ca4635", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4035154762127d9c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_integrations/google-fit/data.js:37"}, "properties": {"repobilityId": "d81380c0c22aff47", "scanner": "scanner-primary", "fingerprint": "4035154762127d9c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-10cde3cf757d19fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/list-sentry-issues.mjs:16"}, "properties": {"repobilityId": "cfa5c54ea6cee01e", "scanner": "scanner-primary", "fingerprint": "10cde3cf757d19fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-31f378073ae9e029", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_settings_v2` in scripts/migrate-local-export.mjs:6"}, "properties": {"repobilityId": "2e952a029dd7adba", "scanner": "scanner-primary", "fingerprint": "31f378073ae9e029", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b50c96c55346743e", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/reconcile-macros.mjs:2"}, "properties": {"repobilityId": "5fca71eda32c03f4", "scanner": "scanner-primary", "fingerprint": "b50c96c55346743e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed3375ef1178937f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/test/nutritionScaling.test.ts:62"}, "properties": {"repobilityId": "65519ee87a2b533b", "scanner": "scanner-primary", "fingerprint": "ed3375ef1178937f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21d885cb743587ef", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_settings_v2` in src/constants/index.ts:83"}, "properties": {"repobilityId": "392609ce63a0c847", "scanner": "scanner-primary", "fingerprint": "21d885cb743587ef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-62c1751e13dc3018", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/utils/groceryNormalizer.ts:15"}, "properties": {"repobilityId": "26b02f42a1d1b612", "scanner": "scanner-primary", "fingerprint": "62c1751e13dc3018", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b31e77b450379944", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_food_actor_id_v1` in src/utils/privacyData.ts:13"}, "properties": {"repobilityId": "7888fe804b89f2aa", "scanner": "scanner-primary", "fingerprint": "b31e77b450379944", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cb7c54a00f2a6566", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_food_actor_id_v1` in src/utils/foodIntelligenceClient.ts:12"}, "properties": {"repobilityId": "0977177d8cc25ddc", "scanner": "scanner-primary", "fingerprint": "cb7c54a00f2a6566", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d027225812823706", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_settings_v2` in src/utils/privacyData.test.ts:10"}, "properties": {"repobilityId": "deb4024f458a6de0", "scanner": "scanner-primary", "fingerprint": "d027225812823706", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2daeb9783e88633d", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_guest_merge_state_v1` in src/utils/mergeGuestData.ts:60"}, "properties": {"repobilityId": "aadee5d473f0c29f", "scanner": "scanner-primary", "fingerprint": "2daeb9783e88633d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4664f24f6f7dcfcf", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/shopping/ShoppingListView.tsx:112"}, "properties": {"repobilityId": "6710799a9afe0f1c", "scanner": "scanner-primary", "fingerprint": "4664f24f6f7dcfcf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-485423914c1182b2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/coffee/CoffeeReceiptCard.tsx:42"}, "properties": {"repobilityId": "90f3163d16f4db1a", "scanner": "scanner-primary", "fingerprint": "485423914c1182b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-961015d88de9375f", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_onboarding_rollout_events_v1` in src/components/onboarding/rollout.ts:16"}, "properties": {"repobilityId": "c00033f62630f348", "scanner": "scanner-primary", "fingerprint": "961015d88de9375f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c28bd73222f1e5fa", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/onboarding/steps/HealthConcernsStep.tsx:14"}, "properties": {"repobilityId": "00593659e3d9b32c", "scanner": "scanner-primary", "fingerprint": "c28bd73222f1e5fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1afc17ba57738dde", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/features/quick-add/QuickAddSheet.test.tsx:84"}, "properties": {"repobilityId": "2c76ff1b0b52aef3", "scanner": "scanner-primary", "fingerprint": "1afc17ba57738dde", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0969c981554e3502", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_data_sync_v1` in src/lib/dataSync.ts:8"}, "properties": {"repobilityId": "9f77a1eec6ee5f17", "scanner": "scanner-primary", "fingerprint": "0969c981554e3502", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-37de178751683e5a", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/receiptImage.ts:3"}, "properties": {"repobilityId": "b4dc1009d5ce893a", "scanner": "scanner-primary", "fingerprint": "37de178751683e5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e132a56d53a8c6b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/CoffeeBuilderPage.test.tsx:61"}, "properties": {"repobilityId": "82d6ca09b5eca976", "scanner": "scanner-primary", "fingerprint": "7e132a56d53a8c6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e404ae2c72c060c", "level": "note", "message": {"text": "Legacy-named symbol `act_mealprep_plans_v1` in src/hooks/useMealPrepPlans.ts:15"}, "properties": {"repobilityId": "f3525251e0620852", "scanner": "scanner-primary", "fingerprint": "7e404ae2c72c060c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-844b03bfe9d76c09", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_pending_auth_source_v1` in src/context/AuthContext.tsx:67"}, "properties": {"repobilityId": "128f60bfcb1168a8", "scanner": "scanner-primary", "fingerprint": "844b03bfe9d76c09", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-af5c161d2c0afa31", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/context/AuthContext.tsx:504"}, "properties": {"repobilityId": "550e5bde722acf5b", "scanner": "scanner-primary", "fingerprint": "af5c161d2c0afa31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf2ec78ed9ae9644", "level": "note", "message": {"text": "Legacy-named symbol `local_backup` in src/context/SyncContext.tsx:58"}, "properties": {"repobilityId": "9e362fe0c96a9b20", "scanner": "scanner-primary", "fingerprint": "bf2ec78ed9ae9644", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a4ce1b261d8b22a5", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_meals_v2` in e2e/tanstack-query-stabilization.spec.ts:175"}, "properties": {"repobilityId": "8e7ab19ffd3b494c", "scanner": "scanner-primary", "fingerprint": "a4ce1b261d8b22a5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-22126f8fbb47a1f2", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_meals_v2` in e2e/serving-size-rescale.spec.ts:97"}, "properties": {"repobilityId": "72dcd3a3c5fb9e44", "scanner": "scanner-primary", "fingerprint": "22126f8fbb47a1f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fe57090d64455e1c", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_meal_plans_v1` in e2e/meal-prep-integration.spec.ts:128"}, "properties": {"repobilityId": "8dd500f43581ebaa", "scanner": "scanner-primary", "fingerprint": "fe57090d64455e1c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1952aa97869ffffa", "level": "note", "message": {"text": "Legacy-named symbol `nutriai_settings_v2` in e2e/helpers/nutriai.ts:4"}, "properties": {"repobilityId": "0329e433bdf6092f", "scanner": "scanner-primary", "fingerprint": "1952aa97869ffffa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0170d0d9dc6c5bef", "level": "note", "message": {"text": "123 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "8c92510c455d7e60", "scanner": "scanner-primary", "fingerprint": "0170d0d9dc6c5bef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-bcbcceb55cf79771", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_cron/synthesize-user-preferences.js:317)"}, "properties": {"repobilityId": "bc29093f6c6f982f", "scanner": "scanner-primary", "fingerprint": "bcbcceb55cf79771", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-feb1f96107e07f20", "level": "error", "message": {"text": "Dangling fetch: POST https://api.github.com/repos/${repository}/dispatches (api/_agents/ingest.js:27)"}, "properties": {"repobilityId": "8609e1f7d80874d4", "scanner": "scanner-primary", "fingerprint": "feb1f96107e07f20", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d758a1f5913f415", "level": "error", "message": {"text": "Dangling fetch: POST https://api.nal.usda.gov/fdc/v1/foods/search (api/_lib/food-intelligence.js:761)"}, "properties": {"repobilityId": "b064644dd5d8672a", "scanner": "scanner-primary", "fingerprint": "9d758a1f5913f415", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c30f8b033e8583f", "level": "error", "message": {"text": "Dangling fetch: GET https://world.openfoodfacts.org/api/v2/product/${encodeURIComponent(normalizedBarcode)}.json (api/_lib/food-intelligence.js:899)"}, "properties": {"repobilityId": "10c166617b75c1bc", "scanner": "scanner-primary", "fingerprint": "5c30f8b033e8583f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d775df2187829819", "level": "error", "message": {"text": "Dangling fetch: GET https://trackapi.nutritionix.com/v2/search/instant?query=${encodeURIComponent(query)} (api/_lib/food-intelligence.js:957)"}, "properties": {"repobilityId": "3e36cac0f3de8e7b", "scanner": "scanner-primary", "fingerprint": "d775df2187829819", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b72c3c4b64cd3ead", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_lib/ai-meal-generator.js:36)"}, "properties": {"repobilityId": "984b98e993214407", "scanner": "scanner-primary", "fingerprint": "b72c3c4b64cd3ead", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-070ec21cb6f850d1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (api/_lib/notification-pipeline.js:364)"}, "properties": {"repobilityId": "f9203c1ca631e9a5", "scanner": "scanner-primary", "fingerprint": "070ec21cb6f850d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c367c6d887902113", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_lib/ai-concept-generator.js:381)"}, "properties": {"repobilityId": "a71cf5520ad0ff1a", "scanner": "scanner-primary", "fingerprint": "c367c6d887902113", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5f88ab1c24b6a88e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_lib/ai-concept-generator.js:446)"}, "properties": {"repobilityId": "98447c5ac4d71d6f", "scanner": "scanner-primary", "fingerprint": "5f88ab1c24b6a88e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-756bc5229c7efa96", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (api/_food/log.js:75)"}, "properties": {"repobilityId": "aeb0424730d112f9", "scanner": "scanner-primary", "fingerprint": "756bc5229c7efa96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4e19bce93dce400a", "level": "error", "message": {"text": "Dangling fetch: GET https://world.openfoodfacts.org/api/v2/product/${encodeURIComponent(clean)}.json?fields=${fields} (api/_food/barcode.js:70)"}, "properties": {"repobilityId": "e621ee3deb4b48bb", "scanner": "scanner-primary", "fingerprint": "4e19bce93dce400a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0a2aa7f82a7672af", "level": "error", "message": {"text": "Dangling fetch: POST https://api.fitbit.com/oauth2/token (api/_integrations/fitbit/exchange.js:89)"}, "properties": {"repobilityId": "61e2b304f3bd5f66", "scanner": "scanner-primary", "fingerprint": "0a2aa7f82a7672af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e02aef71943fc574", "level": "error", "message": {"text": "Dangling fetch: POST https://api.fitbit.com/oauth2/token (api/_integrations/fitbit/data.js:40)"}, "properties": {"repobilityId": "e4e965345a909391", "scanner": "scanner-primary", "fingerprint": "e02aef71943fc574", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-687fde95e78ee8d0", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (api/_integrations/google-fit/exchange.js:91)"}, "properties": {"repobilityId": "4d4081a738396205", "scanner": "scanner-primary", "fingerprint": "687fde95e78ee8d0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cfd7c96907d528e2", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (api/_integrations/google-fit/data.js:37)"}, "properties": {"repobilityId": "135924583fb973da", "scanner": "scanner-primary", "fingerprint": "cfd7c96907d528e2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-af7f71403ebc4583", "level": "error", "message": {"text": "Dangling fetch: POST /api/integrations/google-fit/exchange (src/hooks/useHealthSync.ts:17)"}, "properties": {"repobilityId": "b783857acc95feeb", "scanner": "scanner-primary", "fingerprint": "af7f71403ebc4583", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b6111da3fb80e694", "level": "error", "message": {"text": "Dangling fetch: POST /api/integrations/fitbit/exchange (src/hooks/useHealthSync.ts:43)"}, "properties": {"repobilityId": "39b45c9b4fef31fa", "scanner": "scanner-primary", "fingerprint": "b6111da3fb80e694", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f1ab6b0aa0d74c5b", "level": "error", "message": {"text": "Dangling fetch: GET /api/integrations/google-fit/data?${params} (src/services/healthService.ts:248)"}, "properties": {"repobilityId": "05e7ec5fcc1fdc1e", "scanner": "scanner-primary", "fingerprint": "f1ab6b0aa0d74c5b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a91ef07159bc15b9", "level": "error", "message": {"text": "Dangling fetch: GET /api/integrations/fitbit/data?${params} (src/services/healthService.ts:339)"}, "properties": {"repobilityId": "f53d7ac1476db00a", "scanner": "scanner-primary", "fingerprint": "a91ef07159bc15b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "6b4039eaab9d3d7a", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee07d6cd4eca0396", "level": "note", "message": {"text": "Unused endpoint: POST /edit-file"}, "properties": {"repobilityId": "eeef9572fd68ad44", "scanner": "scanner-primary", "fingerprint": "ee07d6cd4eca0396", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0d63ec445402501a", "level": "note", "message": {"text": "Unused endpoint: OPTIONS /edit-file"}, "properties": {"repobilityId": "332f9b92f4c5cc8f", "scanner": "scanner-primary", "fingerprint": "0d63ec445402501a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}