{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c88e5c509c9db1d9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/plan/[city]/page.js:364", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/plan/[city]/page.js:364"}, "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-e41ff63b11f2e15e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/itineraries/[tripId]/concierge/_components/RhythmTimeline.j", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/itineraries/[tripId]/concierge/_components/RhythmTimeline.jsx: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-f3078e2116c6b983", "name": "\"active\" state uses light bg in a dark theme \u2014 src/app/itineraries/[tripId]/concierge/_components/RhythmTimeline.jsx:27", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/app/itineraries/[tripId]/concierge/_components/RhythmTimeline.jsx:27"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49372a306ee1d9c1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/city-guides/[city]/page.js:217", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/city-guides/[city]/page.js:217"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-75464aba8ee77c8b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/conversation/ParsedItineraryCard.jsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/conversation/ParsedItineraryCard.jsx:44"}, "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-b0c67a5adde3e1d8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/conversation/InputArea/CitySearchInput.jsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/conversation/InputArea/CitySearchInput.jsx:197"}, "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-985e9fe71a5e3763", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/CacheManager.js:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/CacheManager.js:99"}, "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-65c80fa980a05e27", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/RankedListPanel.js:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/RankedListPanel.js:108"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ad1754016fc24449", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/discover/ResultsFilterBar.jsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/discover/ResultsFilterBar.jsx:66"}, "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-49f77ba73141d2dd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/discover/CityListRow.jsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/discover/CityListRow.jsx:197"}, "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-5a9c42e7584c4dd7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/ScoringDemoSection.js:202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/ScoringDemoSection.js:202"}, "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-ec6414ebbb7caedb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/hero/SplitHero.jsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/hero/SplitHero.jsx:119"}, "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-a675b443387f5ff1", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/home/hero/SplitHero.jsx:133", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/home/hero/SplitHero.jsx:133"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-da4e5c4353efd340", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/auth/AuthButton.js:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/auth/AuthButton.js:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5e4a8c30baab2948", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/itinerary/EditPanel.js:317", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/itinerary/EditPanel.js:317"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b6bb1abb9ef9598f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/planner-v2/PlannerNextActionBar.jsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/planner-v2/PlannerNextActionBar.jsx:83"}, "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-68f198c6bfaec917", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/planner-v2/PlannerColumn.jsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/planner-v2/PlannerColumn.jsx: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-ea8ac316ceeac3ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/planner-v2/routeMapColumn/components/DetailCard.jsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/planner-v2/routeMapColumn/components/DetailCard.jsx:109"}, "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-519238379e343985", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/TransportOptionCard.js:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/TransportOptionCard.js:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9aa38a76ec593487", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/CityShortlistBar.jsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/CityShortlistBar.jsx:69"}, "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-c4a7c32aa3e27f6b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/unifiedFilter/components/CountryDropdown", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/unifiedFilter/components/CountryDropdown.jsx:30"}, "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-7197cfa5e503d09b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/unifiedFilter/components/SearchWithSugge", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/unifiedFilter/components/SearchWithSuggestions.jsx:128"}, "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-67ebb07772baf772", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/city-guides/overview/SeasonalProse.jsx:15", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/city-guides/overview/SeasonalProse.jsx:15"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aefaede8fee5c1a8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/DateRangePopover.jsx:403", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/DateRangePopover.jsx:403"}, "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-876af0b067531fd1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/Navbar.js:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/Navbar.js:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c5a2e7a27c9fbb9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/CommandBar.jsx:212", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/CommandBar.jsx:212"}, "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-ce9f0cdb2143ad89", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/TripDatesBanner.js:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/TripDatesBanner.js:36"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b1a1a3155b9575d", "name": "Stray `console.log` in TS/JS \u2014 src/lib/llm/usageLog.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/llm/usageLog.js:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec6a745d72745f23", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/scoring/cityScoreV2.js:284", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/scoring/cityScoreV2.js:284"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-351fa2ac81ed7017", "name": "Stray `console.log` in TS/JS \u2014 infra/handlers/briefingOrchestrator.js:148", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 infra/handlers/briefingOrchestrator.js:148"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a263dd34b43ed806", "name": "Insecure pattern 'node_child_process' in scripts/replaceThumbnails.mjs:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/replaceThumbnails.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-5a65a039b808e312", "name": "Insecure pattern 'node_child_process' in scripts/migrateCityImages.mjs:29", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/migrateCityImages.mjs:29"}, "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-c0d7feb3d71bd2cd", "name": "Insecure pattern 'node_child_process' in scripts/exportCityDataForKB.mjs:19", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/exportCityDataForKB.mjs:19"}, "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-8151e0aeceec22bb", "name": "Insecure pattern 'node_child_process' in scripts/convertPngToJpeg.mjs:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/convertPngToJpeg.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-d595617df561e277", "name": "Insecure pattern 'node_child_process' in scripts/refresh/index.mjs:32", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/refresh/index.mjs:32"}, "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-01aaddb5bc7db0cc", "name": "Insecure pattern 'node_child_process' in src/app/api/admin/refresh/route.js:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/app/api/admin/refresh/route.js:15"}, "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-d61310b5a363cf1f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/city-guides/[city]/page.js:217", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/city-guides/[city]/page.js:217"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12988c82d3af0827", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/map/mapService.js:133", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/map/mapService.js:133"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e696700b19fc0643", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/planner-v2/routeMapColumn/components/DynamicItineraryMa", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/planner-v2/routeMapColumn/components/DynamicItineraryMap.jsx:172"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e7cbb23e77afa623", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/AirportRouteMap.js:124", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/AirportRouteMap.js:124"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5f33113539521cc", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/CityMapWithMapbox.js:289", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/CityMapWithMapbox.js:289"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3344d604f575467", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/citymap/dom/popupContent.js:217", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/citymap/dom/popupContent.js:217"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a7f2b44a3ce06904", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/citymap/dom/markerFactory.js:39", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/citymap/dom/markerFactory.js:39"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ccaef511d7f46c5", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-38055ec33a22759c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9ea81e3a796779fb", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "69 tests / 573 src (ratio 0.12)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 307 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 103 placeholder/mock markers across 51 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 license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0e0df196cda9a619", "name": "Commented-code block (5 lines) in tests/plannerLoop.test.mjs:308", "shortDescription": {"text": "Commented-code block (5 lines) in tests/plannerLoop.test.mjs:308"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5774ec28cfb8b2b0", "name": "Commented-code block (8 lines) in tests/cityGuidesData.test.mjs:7", "shortDescription": {"text": "Commented-code block (8 lines) in tests/cityGuidesData.test.mjs:7"}, "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-d82daf8837d83cb4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetchHomeHeroPhotos.mjs:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetchHomeHeroPhotos.mjs:69"}, "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-00e89ea8c8dd96f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/email-setup-check.mjs:130", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/email-setup-check.mjs:130"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ce330654bfdbbd2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/telegram-setup.mjs:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/telegram-setup.mjs:23"}, "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-7ff9ac85279a7255", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/resolveGooglePlaceIds.mjs:142", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/resolveGooglePlaceIds.mjs:142"}, "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-ec5ec0050a1c0c82", "name": "Commented-code block (6 lines) in scripts/generateCityList.mjs:103", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/generateCityList.mjs:103"}, "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-29cb637fa35ce64c", "name": "Commented-code block (5 lines) in scripts/generateMonthlyScores.mjs:132", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/generateMonthlyScores.mjs:132"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-361915bf7fd0d169", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/resolveExperiencePlaceIds.mjs:234", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/resolveExperiencePlaceIds.mjs:234"}, "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-e688e5f8134ebb78", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-hero-photos.mjs:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-hero-photos.mjs: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-b907507788b3ed9f", "name": "Legacy-named symbol `data_copy` in scripts/enrich/utils/city_loader.py:194", "shortDescription": {"text": "Legacy-named symbol `data_copy` in scripts/enrich/utils/city_loader.py:194"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a7be510a4a573393", "name": "Commented-code block (5 lines) in scripts/content/migrate-to-content.mjs:172", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/content/migrate-to-content.mjs:172"}, "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-8af61deb1037c5e9", "name": "Commented-code block (5 lines) in scripts/content/stages/writeCanonical.mjs:48", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/content/stages/writeCanonical.mjs:48"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0b65867e7766347e", "name": "Commented-code block (5 lines) in src/app/page.js:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/page.js:7"}, "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-3d935f922c97e56d", "name": "Commented-code block (5 lines) in src/app/api/conversation/route.js:163", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/conversation/route.js:163"}, "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-81d80aeedef8ca95", "name": "Commented-code block (8 lines) in src/app/api/inngest/route.js:14", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/api/inngest/route.js: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-8aa43b856f737e8e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/cities/route.js:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/cities/route.js:18"}, "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-5752716e42c2f388", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/itineraries/[tripId]/concierge/ConciergeClient.jsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/itineraries/[tripId]/concierge/ConciergeClient.jsx:81"}, "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-61663ee5a69aec04", "name": "Commented-code block (7 lines) in src/app/city-guides/[city]/page.js:233", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/city-guides/[city]/page.js:233"}, "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-53c0c80a2a2e1fb3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/saved-trips/page.js:610", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/saved-trips/page.js:610"}, "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-2849b0753984e553", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/monthlyDataLoader.js:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/monthlyDataLoader.js:129"}, "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-6bc83302af572ad5", "name": "Commented-code block (6 lines) in src/inngest/functions/conciergeHoursWatch.js:7", "shortDescription": {"text": "Commented-code block (6 lines) in src/inngest/functions/conciergeHoursWatch.js:7"}, "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-6dcb245ed94ad6e9", "name": "Commented-code block (5 lines) in src/contexts/MapDataContext.js:239", "shortDescription": {"text": "Commented-code block (5 lines) in src/contexts/MapDataContext.js:239"}, "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-0fc7a9b239ab63f0", "name": "Commented-code block (5 lines) in src/contexts/AuthContext.js:63", "shortDescription": {"text": "Commented-code block (5 lines) in src/contexts/AuthContext.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-96eb6773addca944", "name": "Commented-code block (5 lines) in src/hooks/useTripPlannerAgent.js:363", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useTripPlannerAgent.js:363"}, "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-7246818d95eb3b05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useTripPlannerAgent.js:180", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useTripPlannerAgent.js:180"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5524b5b1b6849a4", "name": "Commented-code block (5 lines) in src/components/map/MapComponent.js:93", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/map/MapComponent.js:93"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5af444ed01629730", "name": "Commented-code block (5 lines) in src/components/home/hero/heroImages.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/home/hero/heroImages.js: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-f229d75e5b7e304e", "name": "Commented-code block (6 lines) in src/components/planner-v2/compactMessageList/lib/textFormatting.js:8", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/planner-v2/compactMessageList/lib/textFormatting.js:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e1fa27cf4c00a63", "name": "Commented-code block (5 lines) in src/components/planner-v2/routeMapColumn/components/DynamicItineraryMap.jsx:68", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/planner-v2/routeMapColumn/components/DynamicItineraryMap.jsx:68"}, "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-6a60cec3557a7502", "name": "Commented-code block (5 lines) in src/components/city-guides/CityPageClient.js:135", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/city-guides/CityPageClient.js:135"}, "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-042823f3cea48d7f", "name": "Commented-code block (5 lines) in src/components/city-guides/CityCard.js:48", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/city-guides/CityCard.js:48"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-67f1ef00e37a4a0a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/city-guides/attractions/hooks/useGoogleEnrichment.js:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/city-guides/attractions/hooks/useGoogleEnrichment.js:26"}, "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-e1c295973a56d34b", "name": "Commented-code block (5 lines) in src/lib/rateLimit.js:23", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rateLimit.js:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe4d72f3e4e60e9e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/google-routes/client.js:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/google-routes/client.js:49"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f4a0b8fd21240774", "name": "Commented-code block (5 lines) in src/lib/discovery/getRankedSuggestions.js:84", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/discovery/getRankedSuggestions.js: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-210d9fffba62b162", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/city-data/fetchers.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/city-data/fetchers.ts:11"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4fa182fc53aaba5a", "name": "Commented-code block (5 lines) in src/lib/city-data/loader.ts:19", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/city-data/loader.ts:19"}, "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-47547c1254a7fae2", "name": "Commented-code block (5 lines) in src/lib/concierge/proposalAction.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/concierge/proposalAction.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-548a35896354a6b6", "name": "Commented-code block (5 lines) in src/lib/concierge/hoursCheck.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/concierge/hoursCheck.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-72f336dcc48e8465", "name": "Commented-code block (6 lines) in src/lib/concierge/agentRuntime.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/concierge/agentRuntime.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df4d0fe7779c8359", "name": "Commented-code block (5 lines) in src/lib/concierge/mapsLink.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/concierge/mapsLink.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-912a64d5a6f3859e", "name": "Commented-code block (5 lines) in src/lib/concierge/generateBrief.js:15", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/concierge/generateBrief.js: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-1f3b98f508171cdc", "name": "Commented-code block (6 lines) in src/lib/concierge/nightlyRound.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/concierge/nightlyRound.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a6d01f80a6ac369c", "name": "Commented-code block (5 lines) in src/lib/concierge/briefStore.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/concierge/briefStore.js: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-dbdf0970fbe05d2f", "name": "Commented-code block (5 lines) in src/lib/concierge/tripActions.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/concierge/tripActions.js: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-7e0b354476dcc47a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/concierge/pushClient.js:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/concierge/pushClient.js:69"}, "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-d10cfa39bbfe6f02", "name": "Commented-code block (5 lines) in src/lib/concierge/weatherLive.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/concierge/weatherLive.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-02b532b76dddb428", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/google-places/client.js:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/google-places/client.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-f6689e7064550ba9", "name": "Commented-code block (5 lines) in src/lib/planning/buildMultiCityItinerary.js:379", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/planning/buildMultiCityItinerary.js:379"}, "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-cb8c6e65aace5b51", "name": "Commented-code block (5 lines) in src/lib/planning/buildItinerary.js:472", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/planning/buildItinerary.js:472"}, "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-455a67318d114c28", "name": "Commented-code block (5 lines) in src/lib/cache/suggestions.js:52", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/cache/suggestions.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-bf6d60b4118dd791", "name": "Commented-code block (5 lines) in src/lib/trips/tripsRepository.js:492", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/trips/tripsRepository.js:492"}, "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-5ae91b1e1da6e5d5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/briefingOrchestrator.js:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/briefingOrchestrator.js:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0e19235a475d768b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/itinerary.js:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/itinerary.js:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9979ed67333ef7d9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/googlePlaces.js:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/googlePlaces.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-8349e104dae02a87", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/weather.js:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/weather.js:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-030da566069872e9", "name": "15 env vars used in code but missing from .env.example", "shortDescription": {"text": "15 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANALYZE`, `AWS_REGION`, `BEDROCK_BRIEFING_AGENT_ALIAS_ID`, `BEDROCK_BRIEFING_AGENT_ID`, `CITY_DATA_BUCKET`, `CONCIERGE_INBOUND_EMAIL`, `DEBUG`, `EUROTRIP_INDEX_INCLUDE_MONTHLY` + 7 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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/enrich/utils/llm_client.py:generate_overview, scripts/enrich/utils/llm_client.py:generate_culinary_guide, scripts/enrich/utils/llm_client.py:generate_seasonal_activities\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24644"}, "properties": {"repository": "bme3412/eurotrip-planner", "repoUrl": "https://github.com/bme3412/eurotrip-planner", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-c88e5c509c9db1d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/plan/[city]/page.js:364"}, "properties": {"repobilityId": "e1cc58c3d2ba774b", "scanner": "scanner-primary", "fingerprint": "c88e5c509c9db1d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e41ff63b11f2e15e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/itineraries/[tripId]/concierge/_components/RhythmTimeline.jsx:35"}, "properties": {"repobilityId": "4733e1cc9ef93411", "scanner": "scanner-primary", "fingerprint": "e41ff63b11f2e15e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3078e2116c6b983", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/app/itineraries/[tripId]/concierge/_components/RhythmTimeline.jsx:27"}, "properties": {"repobilityId": "7d0099e10aed44a1", "scanner": "scanner-primary", "fingerprint": "f3078e2116c6b983", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-49372a306ee1d9c1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/city-guides/[city]/page.js:217"}, "properties": {"repobilityId": "1f65cdd19533d035", "scanner": "scanner-primary", "fingerprint": "49372a306ee1d9c1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-75464aba8ee77c8b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/conversation/ParsedItineraryCard.jsx:44"}, "properties": {"repobilityId": "82d9c5babc0a7a98", "scanner": "scanner-primary", "fingerprint": "75464aba8ee77c8b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0c67a5adde3e1d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/conversation/InputArea/CitySearchInput.jsx:197"}, "properties": {"repobilityId": "70b8f352ccfa19ca", "scanner": "scanner-primary", "fingerprint": "b0c67a5adde3e1d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-985e9fe71a5e3763", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/CacheManager.js:99"}, "properties": {"repobilityId": "e21d6ec36748c675", "scanner": "scanner-primary", "fingerprint": "985e9fe71a5e3763", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65c80fa980a05e27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/map/RankedListPanel.js:108"}, "properties": {"repobilityId": "72e0ce9442042ef6", "scanner": "scanner-primary", "fingerprint": "65c80fa980a05e27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad1754016fc24449", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/discover/ResultsFilterBar.jsx:66"}, "properties": {"repobilityId": "76aee90a7083b9b4", "scanner": "scanner-primary", "fingerprint": "ad1754016fc24449", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49f77ba73141d2dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/discover/CityListRow.jsx:197"}, "properties": {"repobilityId": "b6c6caf205d1f313", "scanner": "scanner-primary", "fingerprint": "49f77ba73141d2dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5a9c42e7584c4dd7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/ScoringDemoSection.js:202"}, "properties": {"repobilityId": "e410333b7c3e6153", "scanner": "scanner-primary", "fingerprint": "5a9c42e7584c4dd7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec6414ebbb7caedb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/hero/SplitHero.jsx:119"}, "properties": {"repobilityId": "aa648b21c826bce4", "scanner": "scanner-primary", "fingerprint": "ec6414ebbb7caedb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a675b443387f5ff1", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/home/hero/SplitHero.jsx:133"}, "properties": {"repobilityId": "57d3560a07b09ac8", "scanner": "scanner-primary", "fingerprint": "a675b443387f5ff1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-da4e5c4353efd340", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/auth/AuthButton.js:94"}, "properties": {"repobilityId": "4546504050b0deaa", "scanner": "scanner-primary", "fingerprint": "da4e5c4353efd340", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e4a8c30baab2948", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/itinerary/EditPanel.js:317"}, "properties": {"repobilityId": "4534fb3e480b1d42", "scanner": "scanner-primary", "fingerprint": "5e4a8c30baab2948", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6bb1abb9ef9598f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/planner-v2/PlannerNextActionBar.jsx:83"}, "properties": {"repobilityId": "89b38b92b081a989", "scanner": "scanner-primary", "fingerprint": "b6bb1abb9ef9598f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68f198c6bfaec917", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/planner-v2/PlannerColumn.jsx:87"}, "properties": {"repobilityId": "1c96d3be47291ed1", "scanner": "scanner-primary", "fingerprint": "68f198c6bfaec917", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea8ac316ceeac3ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/planner-v2/routeMapColumn/components/DetailCard.jsx:109"}, "properties": {"repobilityId": "94b37ad13d06a1cf", "scanner": "scanner-primary", "fingerprint": "ea8ac316ceeac3ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-519238379e343985", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/TransportOptionCard.js:80"}, "properties": {"repobilityId": "c76e4b3482560420", "scanner": "scanner-primary", "fingerprint": "519238379e343985", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9aa38a76ec593487", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/CityShortlistBar.jsx:69"}, "properties": {"repobilityId": "102a95a506d76786", "scanner": "scanner-primary", "fingerprint": "9aa38a76ec593487", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c4a7c32aa3e27f6b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/unifiedFilter/components/CountryDropdown.jsx:30"}, "properties": {"repobilityId": "79a2df11936f6267", "scanner": "scanner-primary", "fingerprint": "c4a7c32aa3e27f6b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7197cfa5e503d09b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/city-guides/unifiedFilter/components/SearchWithSuggestions.jsx:128"}, "properties": {"repobilityId": "0f3be1c83f40cbdd", "scanner": "scanner-primary", "fingerprint": "7197cfa5e503d09b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-67ebb07772baf772", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/city-guides/overview/SeasonalProse.jsx:15"}, "properties": {"repobilityId": "2bf0bb4bda6ac988", "scanner": "scanner-primary", "fingerprint": "67ebb07772baf772", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-aefaede8fee5c1a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/DateRangePopover.jsx:403"}, "properties": {"repobilityId": "9b4501254b708be0", "scanner": "scanner-primary", "fingerprint": "aefaede8fee5c1a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-876af0b067531fd1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/Navbar.js:94"}, "properties": {"repobilityId": "3131dcc47cb36525", "scanner": "scanner-primary", "fingerprint": "876af0b067531fd1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c5a2e7a27c9fbb9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/CommandBar.jsx:212"}, "properties": {"repobilityId": "78faa7c9dacf8578", "scanner": "scanner-primary", "fingerprint": "2c5a2e7a27c9fbb9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce9f0cdb2143ad89", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/TripDatesBanner.js:36"}, "properties": {"repobilityId": "2df8d14c58d19703", "scanner": "scanner-primary", "fingerprint": "ce9f0cdb2143ad89", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b1a1a3155b9575d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/llm/usageLog.js:15"}, "properties": {"repobilityId": "cf77644f92b61bbf", "scanner": "scanner-primary", "fingerprint": "1b1a1a3155b9575d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ec6a745d72745f23", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/scoring/cityScoreV2.js:284"}, "properties": {"repobilityId": "2fd85820eaee0ab9", "scanner": "scanner-primary", "fingerprint": "ec6a745d72745f23", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-351fa2ac81ed7017", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 infra/handlers/briefingOrchestrator.js:148"}, "properties": {"repobilityId": "5357e60e22540766", "scanner": "scanner-primary", "fingerprint": "351fa2ac81ed7017", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a263dd34b43ed806", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/replaceThumbnails.mjs:3"}, "properties": {"repobilityId": "1abc432ed451cf7f", "scanner": "scanner-primary", "fingerprint": "a263dd34b43ed806", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/replaceThumbnails.mjs"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-5a65a039b808e312", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/migrateCityImages.mjs:29"}, "properties": {"repobilityId": "ada32f8af58edd5a", "scanner": "scanner-primary", "fingerprint": "5a65a039b808e312", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/migrateCityImages.mjs"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-c0d7feb3d71bd2cd", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/exportCityDataForKB.mjs:19"}, "properties": {"repobilityId": "a60f218735a036d0", "scanner": "scanner-primary", "fingerprint": "c0d7feb3d71bd2cd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/exportCityDataForKB.mjs"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-8151e0aeceec22bb", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/convertPngToJpeg.mjs:3"}, "properties": {"repobilityId": "9aa39cf1fda3b667", "scanner": "scanner-primary", "fingerprint": "8151e0aeceec22bb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/convertPngToJpeg.mjs"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-d595617df561e277", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/refresh/index.mjs:32"}, "properties": {"repobilityId": "b819509b7fb6b96f", "scanner": "scanner-primary", "fingerprint": "d595617df561e277", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/refresh/index.mjs"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-01aaddb5bc7db0cc", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/app/api/admin/refresh/route.js:15"}, "properties": {"repobilityId": "052448c7bc415b9f", "scanner": "scanner-primary", "fingerprint": "01aaddb5bc7db0cc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/admin/refresh/route.js"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-d61310b5a363cf1f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/city-guides/[city]/page.js:217"}, "properties": {"repobilityId": "2abbb9bc45bdf0fc", "scanner": "scanner-primary", "fingerprint": "d61310b5a363cf1f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/city-guides/[city]/page.js"}, "region": {"startLine": 217}}}]}, {"ruleId": "scanner-12988c82d3af0827", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/map/mapService.js:133"}, "properties": {"repobilityId": "6d6627ee342b2d97", "scanner": "scanner-primary", "fingerprint": "12988c82d3af0827", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/map/mapService.js"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-e696700b19fc0643", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/planner-v2/routeMapColumn/components/DynamicItineraryMap.jsx:172"}, "properties": {"repobilityId": "b598f78e8ed992dc", "scanner": "scanner-primary", "fingerprint": "e696700b19fc0643", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/planner-v2/routeMapColumn/components/DynamicItineraryMap.jsx"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-e7cbb23e77afa623", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/AirportRouteMap.js:124"}, "properties": {"repobilityId": "cf9c374ca1267dd8", "scanner": "scanner-primary", "fingerprint": "e7cbb23e77afa623", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/city-guides/AirportRouteMap.js"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-d5f33113539521cc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/CityMapWithMapbox.js:289"}, "properties": {"repobilityId": "d1c035e352c02c84", "scanner": "scanner-primary", "fingerprint": "d5f33113539521cc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/city-guides/CityMapWithMapbox.js"}, "region": {"startLine": 289}}}]}, {"ruleId": "scanner-a3344d604f575467", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/citymap/dom/popupContent.js:217"}, "properties": {"repobilityId": "8858cc3cc83caf17", "scanner": "scanner-primary", "fingerprint": "a3344d604f575467", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/city-guides/citymap/dom/popupContent.js"}, "region": {"startLine": 217}}}]}, {"ruleId": "scanner-a7f2b44a3ce06904", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/city-guides/citymap/dom/markerFactory.js:39"}, "properties": {"repobilityId": "6159ce1e299af69a", "scanner": "scanner-primary", "fingerprint": "a7f2b44a3ce06904", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/city-guides/citymap/dom/markerFactory.js"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "643604c1790714fc", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "64e9ea21b966475c", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "643604c1790714fc", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "64e9ea21b966475c", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ac140247c11477e6", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "643604c1790714fc", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "64e9ea21b966475c", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ac140247c11477e6", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 100}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "643604c1790714fc", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "64e9ea21b966475c", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d6f8ff6a8f1e50ea", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 123}}}]}, {"ruleId": "scanner-8ccaef511d7f46c5", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ad9aa5d16eede93d", "scanner": "scanner-primary", "fingerprint": "8ccaef511d7f46c5", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 135}}}]}, {"ruleId": "scanner-38055ec33a22759c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "119204916eab2690", "scanner": "scanner-primary", "fingerprint": "38055ec33a22759c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9ea81e3a796779fb", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "64ee7ece13bb39f8", "scanner": "scanner-primary", "fingerprint": "9ea81e3a796779fb", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-validate.yml"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-9ea81e3a796779fb", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a0f09c5d40b4c772", "scanner": "scanner-primary", "fingerprint": "9ea81e3a796779fb", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-validate.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-9ea81e3a796779fb", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "64ee7ece13bb39f8", "scanner": "scanner-primary", "fingerprint": "9ea81e3a796779fb", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-validate.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-9ea81e3a796779fb", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a0f09c5d40b4c772", "scanner": "scanner-primary", "fingerprint": "9ea81e3a796779fb", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-validate.yml"}, "region": {"startLine": 42}}}]}, {"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-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "f7fb2c6ca57182d6", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "62ae274412f991d5", "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": "4c8c076880867922", "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": "48352c9b381d7b9e", "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": "a77339dae6f1f80d", "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": "907bfbf652380af9", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-0e0df196cda9a619", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/plannerLoop.test.mjs:308"}, "properties": {"repobilityId": "3025aa22c8909337", "scanner": "scanner-primary", "fingerprint": "0e0df196cda9a619", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5774ec28cfb8b2b0", "level": "none", "message": {"text": "Commented-code block (8 lines) in tests/cityGuidesData.test.mjs:7"}, "properties": {"repobilityId": "981273f4d2070e35", "scanner": "scanner-primary", "fingerprint": "5774ec28cfb8b2b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d82daf8837d83cb4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetchHomeHeroPhotos.mjs:69"}, "properties": {"repobilityId": "89572eac6f3e0c5b", "scanner": "scanner-primary", "fingerprint": "d82daf8837d83cb4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-00e89ea8c8dd96f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/email-setup-check.mjs:130"}, "properties": {"repobilityId": "3ca7d06b84426997", "scanner": "scanner-primary", "fingerprint": "00e89ea8c8dd96f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8ce330654bfdbbd2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/telegram-setup.mjs:23"}, "properties": {"repobilityId": "97281700ed091a15", "scanner": "scanner-primary", "fingerprint": "8ce330654bfdbbd2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7ff9ac85279a7255", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/resolveGooglePlaceIds.mjs:142"}, "properties": {"repobilityId": "4cf470b2a0c50af1", "scanner": "scanner-primary", "fingerprint": "7ff9ac85279a7255", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ec5ec0050a1c0c82", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/generateCityList.mjs:103"}, "properties": {"repobilityId": "3afd93a99eaf259c", "scanner": "scanner-primary", "fingerprint": "ec5ec0050a1c0c82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29cb637fa35ce64c", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/generateMonthlyScores.mjs:132"}, "properties": {"repobilityId": "050ead3b5a8e96ca", "scanner": "scanner-primary", "fingerprint": "29cb637fa35ce64c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-361915bf7fd0d169", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/resolveExperiencePlaceIds.mjs:234"}, "properties": {"repobilityId": "f802d4bedfddbab3", "scanner": "scanner-primary", "fingerprint": "361915bf7fd0d169", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e688e5f8134ebb78", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-hero-photos.mjs:37"}, "properties": {"repobilityId": "28935ca15c9b1171", "scanner": "scanner-primary", "fingerprint": "e688e5f8134ebb78", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b907507788b3ed9f", "level": "note", "message": {"text": "Legacy-named symbol `data_copy` in scripts/enrich/utils/city_loader.py:194"}, "properties": {"repobilityId": "83c47a03502672f3", "scanner": "scanner-primary", "fingerprint": "b907507788b3ed9f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a7be510a4a573393", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/content/migrate-to-content.mjs:172"}, "properties": {"repobilityId": "805600192fc0e6e3", "scanner": "scanner-primary", "fingerprint": "a7be510a4a573393", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8af61deb1037c5e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/content/stages/writeCanonical.mjs:48"}, "properties": {"repobilityId": "afcb394f29457139", "scanner": "scanner-primary", "fingerprint": "8af61deb1037c5e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b65867e7766347e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/page.js:7"}, "properties": {"repobilityId": "772c6f6d533de353", "scanner": "scanner-primary", "fingerprint": "0b65867e7766347e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d935f922c97e56d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/conversation/route.js:163"}, "properties": {"repobilityId": "e72728d25cd89e65", "scanner": "scanner-primary", "fingerprint": "3d935f922c97e56d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81d80aeedef8ca95", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/api/inngest/route.js:14"}, "properties": {"repobilityId": "c2e2f767e7cef5da", "scanner": "scanner-primary", "fingerprint": "81d80aeedef8ca95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8aa43b856f737e8e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/cities/route.js:18"}, "properties": {"repobilityId": "66bba34ccec32d4f", "scanner": "scanner-primary", "fingerprint": "8aa43b856f737e8e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5752716e42c2f388", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/itineraries/[tripId]/concierge/ConciergeClient.jsx:81"}, "properties": {"repobilityId": "4d53000242fd39b5", "scanner": "scanner-primary", "fingerprint": "5752716e42c2f388", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-61663ee5a69aec04", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/city-guides/[city]/page.js:233"}, "properties": {"repobilityId": "40e01c7bb3fc621e", "scanner": "scanner-primary", "fingerprint": "61663ee5a69aec04", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53c0c80a2a2e1fb3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/saved-trips/page.js:610"}, "properties": {"repobilityId": "19c8b62c82c39efc", "scanner": "scanner-primary", "fingerprint": "53c0c80a2a2e1fb3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2849b0753984e553", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/monthlyDataLoader.js:129"}, "properties": {"repobilityId": "b03f6f9246834e3f", "scanner": "scanner-primary", "fingerprint": "2849b0753984e553", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6bc83302af572ad5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/inngest/functions/conciergeHoursWatch.js:7"}, "properties": {"repobilityId": "4c8015c5de82d528", "scanner": "scanner-primary", "fingerprint": "6bc83302af572ad5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6dcb245ed94ad6e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/contexts/MapDataContext.js:239"}, "properties": {"repobilityId": "d9407474b283cad0", "scanner": "scanner-primary", "fingerprint": "6dcb245ed94ad6e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fc7a9b239ab63f0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/contexts/AuthContext.js:63"}, "properties": {"repobilityId": "0318de459eee9e90", "scanner": "scanner-primary", "fingerprint": "0fc7a9b239ab63f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96eb6773addca944", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useTripPlannerAgent.js:363"}, "properties": {"repobilityId": "539c2ce17f92c15c", "scanner": "scanner-primary", "fingerprint": "96eb6773addca944", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7246818d95eb3b05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useTripPlannerAgent.js:180"}, "properties": {"repobilityId": "3d8f7a2402eeafb0", "scanner": "scanner-primary", "fingerprint": "7246818d95eb3b05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5524b5b1b6849a4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/map/MapComponent.js:93"}, "properties": {"repobilityId": "f9e87b8abdc693d9", "scanner": "scanner-primary", "fingerprint": "d5524b5b1b6849a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5af444ed01629730", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/home/hero/heroImages.js:3"}, "properties": {"repobilityId": "151a677e8534fdec", "scanner": "scanner-primary", "fingerprint": "5af444ed01629730", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f229d75e5b7e304e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/planner-v2/compactMessageList/lib/textFormatting.js:8"}, "properties": {"repobilityId": "7eb991c9a70d3802", "scanner": "scanner-primary", "fingerprint": "f229d75e5b7e304e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e1fa27cf4c00a63", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/planner-v2/routeMapColumn/components/DynamicItineraryMap.jsx:68"}, "properties": {"repobilityId": "5ede0c5ee47220fa", "scanner": "scanner-primary", "fingerprint": "9e1fa27cf4c00a63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a60cec3557a7502", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/city-guides/CityPageClient.js:135"}, "properties": {"repobilityId": "ee207278662e7e95", "scanner": "scanner-primary", "fingerprint": "6a60cec3557a7502", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-042823f3cea48d7f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/city-guides/CityCard.js:48"}, "properties": {"repobilityId": "ba4957df978836dc", "scanner": "scanner-primary", "fingerprint": "042823f3cea48d7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67f1ef00e37a4a0a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/city-guides/attractions/hooks/useGoogleEnrichment.js:26"}, "properties": {"repobilityId": "784e0b6dcc169b04", "scanner": "scanner-primary", "fingerprint": "67f1ef00e37a4a0a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e1c295973a56d34b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rateLimit.js:23"}, "properties": {"repobilityId": "2dc637bc93e10c79", "scanner": "scanner-primary", "fingerprint": "e1c295973a56d34b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe4d72f3e4e60e9e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/google-routes/client.js:49"}, "properties": {"repobilityId": "113dad07d748d8cc", "scanner": "scanner-primary", "fingerprint": "fe4d72f3e4e60e9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f4a0b8fd21240774", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/discovery/getRankedSuggestions.js:84"}, "properties": {"repobilityId": "db41356da4fa5bbd", "scanner": "scanner-primary", "fingerprint": "f4a0b8fd21240774", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-210d9fffba62b162", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/city-data/fetchers.ts:11"}, "properties": {"repobilityId": "a3bda2af29919f8a", "scanner": "scanner-primary", "fingerprint": "210d9fffba62b162", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4fa182fc53aaba5a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/city-data/loader.ts:19"}, "properties": {"repobilityId": "19164dcc94062e04", "scanner": "scanner-primary", "fingerprint": "4fa182fc53aaba5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47547c1254a7fae2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/concierge/proposalAction.js:1"}, "properties": {"repobilityId": "b80bd96eaa15ec1a", "scanner": "scanner-primary", "fingerprint": "47547c1254a7fae2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-548a35896354a6b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/concierge/hoursCheck.js:1"}, "properties": {"repobilityId": "c9b6fcb7895cd49b", "scanner": "scanner-primary", "fingerprint": "548a35896354a6b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72f336dcc48e8465", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/concierge/agentRuntime.js:1"}, "properties": {"repobilityId": "51cb9f0199687032", "scanner": "scanner-primary", "fingerprint": "72f336dcc48e8465", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df4d0fe7779c8359", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/concierge/mapsLink.js:1"}, "properties": {"repobilityId": "a0a30cb2b93be70e", "scanner": "scanner-primary", "fingerprint": "df4d0fe7779c8359", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-912a64d5a6f3859e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/concierge/generateBrief.js:15"}, "properties": {"repobilityId": "139bd738c480e65c", "scanner": "scanner-primary", "fingerprint": "912a64d5a6f3859e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f3b98f508171cdc", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/concierge/nightlyRound.js:1"}, "properties": {"repobilityId": "93f4ef669efcd80a", "scanner": "scanner-primary", "fingerprint": "1f3b98f508171cdc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6d01f80a6ac369c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/concierge/briefStore.js:3"}, "properties": {"repobilityId": "fff9adcb8ace2621", "scanner": "scanner-primary", "fingerprint": "a6d01f80a6ac369c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbdf0970fbe05d2f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/concierge/tripActions.js:3"}, "properties": {"repobilityId": "7bc287a1357cf58e", "scanner": "scanner-primary", "fingerprint": "dbdf0970fbe05d2f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e0b354476dcc47a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/concierge/pushClient.js:69"}, "properties": {"repobilityId": "288dced9d5d254a8", "scanner": "scanner-primary", "fingerprint": "7e0b354476dcc47a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d10cfa39bbfe6f02", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/concierge/weatherLive.js:1"}, "properties": {"repobilityId": "755fd9796d088f6b", "scanner": "scanner-primary", "fingerprint": "d10cfa39bbfe6f02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02b532b76dddb428", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/google-places/client.js:55"}, "properties": {"repobilityId": "7da13e3b8b151087", "scanner": "scanner-primary", "fingerprint": "02b532b76dddb428", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f6689e7064550ba9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/planning/buildMultiCityItinerary.js:379"}, "properties": {"repobilityId": "5e3567b0bfe7332d", "scanner": "scanner-primary", "fingerprint": "f6689e7064550ba9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb8c6e65aace5b51", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/planning/buildItinerary.js:472"}, "properties": {"repobilityId": "f4f23b980b100786", "scanner": "scanner-primary", "fingerprint": "cb8c6e65aace5b51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-455a67318d114c28", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/cache/suggestions.js:52"}, "properties": {"repobilityId": "8bddb7410cfed6c2", "scanner": "scanner-primary", "fingerprint": "455a67318d114c28", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf6d60b4118dd791", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/trips/tripsRepository.js:492"}, "properties": {"repobilityId": "e5ce7e49fe47281b", "scanner": "scanner-primary", "fingerprint": "bf6d60b4118dd791", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ae91b1e1da6e5d5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/briefingOrchestrator.js:35"}, "properties": {"repobilityId": "66b837f6ff7085c9", "scanner": "scanner-primary", "fingerprint": "5ae91b1e1da6e5d5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e19235a475d768b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/itinerary.js:28"}, "properties": {"repobilityId": "4df14f35cce13d8e", "scanner": "scanner-primary", "fingerprint": "0e19235a475d768b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9979ed67333ef7d9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/googlePlaces.js:34"}, "properties": {"repobilityId": "62e9804bf06def43", "scanner": "scanner-primary", "fingerprint": "9979ed67333ef7d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8349e104dae02a87", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/handlers/weather.js:28"}, "properties": {"repobilityId": "110c5594f56e79e8", "scanner": "scanner-primary", "fingerprint": "8349e104dae02a87", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-030da566069872e9", "level": "note", "message": {"text": "15 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "0519c1c0e8c1f8e4", "scanner": "scanner-primary", "fingerprint": "030da566069872e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "66ca5fe6475000ca", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}