{"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-64495d8aaa7bc0ef", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/breadcrumbs.tsx:67", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/breadcrumbs.tsx:67"}, "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-d4b703af66f28579", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/affiliate/travel-companions.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/affiliate/travel-companions.tsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a70c65fe74cbf15b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/hotels/compact-hotels-recommendation.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/hotels/compact-hotels-recommendation.tsx:183"}, "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-f8b1026745b4922c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/search/global-search.tsx:656", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/search/global-search.tsx:656"}, "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-295368fd15bafd35", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/popular-routes-section.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/popular-routes-section.tsx:105"}, "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-9f98a36f4a0bea39", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/recently-viewed/recently-viewed-drawer.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/recently-viewed/recently-viewed-drawer.tsx:130"}, "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-c51a8c5f1d7c1328", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/airlines/sale-detail-card.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/airlines/sale-detail-card.tsx: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-fa24923494530944", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/airlines/airline-card.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/airlines/airline-card.tsx:111"}, "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-8a501fa27d9cc69b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sticky-cta/mobile-sticky-cta.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sticky-cta/mobile-sticky-cta.tsx:186"}, "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-1a136227a147489a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/conversion/exit-intent-modal.tsx:348", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/conversion/exit-intent-modal.tsx:348"}, "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-7d0966dfd88bcfe6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/related-deals.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/related-deals.tsx:74"}, "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-5e580b3f735bc458", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/hero-deal.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/hero-deal.tsx: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-2869c2f3793ac393", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/upcoming-deal-card.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/upcoming-deal-card.tsx:102"}, "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-a669f81df1015a37", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/deal-carousel.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/deal-carousel.tsx:71"}, "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-d2ff880c333092c2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/deal-card.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/deal-card.tsx:103"}, "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-4a364aecf96440ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/deal-hotel-highlights.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/deal-hotel-highlights.tsx:149"}, "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-5f3e8147bdadc339", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/recommended-banner.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/recommended-banner.tsx:65"}, "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-0774b3b815d024d2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/price-alert-form.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/price-alert-form.tsx:130"}, "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-f89e6c5e2f57b2a9", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/alerts/dispatch/route.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/alerts/dispatch/route.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-40a8feeffaae0f68", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/scrape/route.ts:235", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/scrape/route.ts:235"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-14e1bc414590e825", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/not-found.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/not-found.tsx:134"}, "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-d6421b1215e11642", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/not-found.tsx:67", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/not-found.tsx:67"}, "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-a7ed3fe6e267e16f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/page.tsx:198", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/page.tsx:198"}, "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-e5bdcb4872c874cc", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/layout.tsx:148", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/layout.tsx:148"}, "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-7af9fa2edd3371a5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/esim/page.tsx:163", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/esim/page.tsx:163"}, "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-791ef4d30ec9e053", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hawaii/page.tsx:146", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hawaii/page.tsx:146"}, "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-33a2bcdb9535b27c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/credit-cards/page.tsx:287", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/credit-cards/page.tsx:287"}, "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-92d16049263e1aee", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/cruise/page.tsx:128", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/cruise/page.tsx:128"}, "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-b3f11acff3ae36fa", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/page.tsx:71", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/page.tsx:71"}, "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-32ce2c405ac83c56", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/hotels/[city]/page.tsx:845", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/hotels/[city]/page.tsx:845"}, "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-63661304a92e09f6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/page.tsx:254", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/page.tsx:254"}, "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-5fc01b7a06dfeaee", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/esim/page.tsx:144", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/esim/page.tsx:144"}, "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-f59aa3462b0aeb3a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/best-season/page.tsx:198", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/best-season/page.tsx:198"}, "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-7609af801eea02eb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/activities/page.tsx:167", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/activities/page.tsx:167"}, "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-de3981a8b81c9e47", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/okinawa/page.tsx:173", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/okinawa/page.tsx:173"}, "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-545818f2824735b0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/seasons/summer/page.tsx:158", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/seasons/summer/page.tsx:158"}, "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-9c51d1c5304f2299", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/seasons/golden-week/page.tsx:159", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/seasons/golden-week/page.tsx:159"}, "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-4cbb72473f50bb45", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/seasons/year-end/page.tsx:158", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/seasons/year-end/page.tsx:158"}, "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-1e582c50bae42294", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/insurance/page.tsx:234", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/insurance/page.tsx:234"}, "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-8969683af179b3fe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airports/page.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airports/page.tsx:155"}, "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-74a1a053281675bb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airports/page.tsx:87", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airports/page.tsx:87"}, "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-9eaf76279fff751e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airports/[code]/page.tsx:288", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airports/[code]/page.tsx:288"}, "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-8451704381fa8475", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airports/[code]/page.tsx:210", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airports/[code]/page.tsx:210"}, "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-0565a9bf632caf9b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/routes/[route]/page.tsx:394", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/routes/[route]/page.tsx:394"}, "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-0ecbaaeda9e96db0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/ota-sales/page.tsx:397", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/ota-sales/page.tsx:397"}, "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-9d86cd9fd5d93b0e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/glossary/page.tsx:354", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/glossary/page.tsx:354"}, "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-c0ac8fac8b1a14b6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/local-flights/page.tsx:211", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/local-flights/page.tsx:211"}, "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-df47c3e50a1cd1dc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/local-flights/[region]/page.tsx:356", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/local-flights/[region]/page.tsx:356"}, "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-8fc100e96732ae6a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/local-flights/[region]/page.tsx:278", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/local-flights/[region]/page.tsx:278"}, "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-e74299558cb8dac1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/page.tsx:94", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/page.tsx:94"}, "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-72850a500b573cf4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/miles-booking-guide/page.tsx:187", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/miles-booking-guide/page.tsx:187"}, "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-51ee4418fdac2671", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/sale-prediction-2027/page.tsx:195", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/sale-prediction-2027/page.tsx:195"}, "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-ea5cef9427bb5660", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/seasonal/autumn-2026/page.tsx:167", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/seasonal/autumn-2026/page.tsx:167"}, "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-610bc8e77ffbabaf", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/seasonal/winter-2026/page.tsx:167", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/seasonal/winter-2026/page.tsx:167"}, "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-20e98dfddc6725b6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/articles/[slug]/page.tsx:316", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/articles/[slug]/page.tsx:316"}, "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-89947f688b19dc78", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/[slug]/page.tsx:167", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/[slug]/page.tsx:167"}, "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-1a1e4110f6241c53", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/page.tsx:105", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/page.tsx:105"}, "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-169f006499d8f483", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airlines/[code]/page.tsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airlines/[code]/page.tsx:304"}, "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-e87f0c8d257183a7", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/[code]/page.tsx:138", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/[code]/page.tsx:138"}, "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-f6a35c909d912b9c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airlines/[code]/airports/[iata]/page.tsx:379", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airlines/[code]/airports/[iata]/page.tsx:379"}, "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-a950afbe86bbdfcc", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/[code]/airports/[iata]/page.tsx:272", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/[code]/airports/[iata]/page.tsx:272"}, "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-95a1f5ccfd0a419b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/[code]/sales/page.tsx:224", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/[code]/sales/page.tsx:224"}, "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-8785e93d4dc8fc8b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/package-tour/page.tsx:204", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/package-tour/page.tsx:204"}, "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-5dc8b1492fa27b2e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/deals/page.tsx:75", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/deals/page.tsx:75"}, "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-bb6a3d3420f4571c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/deals/[id]/page.tsx:632", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/deals/[id]/page.tsx:632"}, "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-6635cad3b2cea974", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/deals/[id]/page.tsx:211", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/deals/[id]/page.tsx:211"}, "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-6ed43ece867d9dc4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/faq/page.tsx:58", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/faq/page.tsx:58"}, "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-8c87eef70f2543c2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/articles/ranking-template.tsx:173", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/articles/ranking-template.tsx:173"}, "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-dfb902fdc9c88c31", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/articles/ota-compare-template.tsx:283", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/articles/ota-compare-template.tsx:283"}, "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-72064a6ba70b65d7", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/articles/guide-template.tsx:117", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/articles/guide-template.tsx:117"}, "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-58197f39e8242dfc", "name": "Stray `console.log` in TS/JS \u2014 src/lib/deals/deal-service.ts:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/deals/deal-service.ts:98"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-273363a41f170610", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/breadcrumbs.tsx:67", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/breadcrumbs.tsx:67"}, "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-32206ab09020539f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/not-found.tsx:67", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/not-found.tsx:67"}, "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-396346b0f6f2c3c9", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/page.tsx:198", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/page.tsx:198"}, "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-1572f5b2ed6bd90a", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/layout.tsx:148", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/layout.tsx:148"}, "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-a544ab29b836eb74", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/esim/page.tsx:163", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/esim/page.tsx:163"}, "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-d47139d58fb6c19d", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hawaii/page.tsx:146", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hawaii/page.tsx:146"}, "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-3b3522d75fce3419", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/credit-cards/page.tsx:287", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/credit-cards/page.tsx:287"}, "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-6d8670b3488f1056", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/cruise/page.tsx:128", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/cruise/page.tsx:128"}, "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-035900d2cc632223", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/page.tsx:71", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/page.tsx:71"}, "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-d0bcd272eaeb66d6", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/page.tsx:254", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/page.tsx:254"}, "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-66007950cc65d9e1", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/esim/page.tsx:144", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/esim/page.tsx:144"}, "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-719df1118052dda7", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/best-season/page.tsx:198", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/best-season/page.tsx:198"}, "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-64026d1a8f2ec91e", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/activities/page.tsx:167", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/activities/page.tsx:167"}, "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-a5b51290f21546e4", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/okinawa/page.tsx:173", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/okinawa/page.tsx:173"}, "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-bfac0d4e5e87e1af", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/seasons/summer/page.tsx:158", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/seasons/summer/page.tsx:158"}, "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-1349cf909cb1338c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/seasons/golden-week/page.tsx:159", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/seasons/golden-week/page.tsx:159"}, "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-57dfc4a0c7fcd60d", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/seasons/year-end/page.tsx:158", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/seasons/year-end/page.tsx:158"}, "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-3a68f4f9232da21f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/insurance/page.tsx:234", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/insurance/page.tsx:234"}, "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-383150b30c09d236", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airports/page.tsx:87", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airports/page.tsx:87"}, "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-fa48d50e9cf0b187", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airports/[code]/page.tsx:210", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airports/[code]/page.tsx:210"}, "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-f035597cd76a7d0f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/routes/[route]/page.tsx:394", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/routes/[route]/page.tsx:394"}, "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-64f01a4c7c85cd98", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/ota-sales/page.tsx:397", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/ota-sales/page.tsx:397"}, "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-4d7aa2e5d62e668a", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/glossary/page.tsx:354", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/glossary/page.tsx:354"}, "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-a9c5cf15f587d1e7", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/local-flights/page.tsx:211", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/local-flights/page.tsx:211"}, "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-c3619f4f3df719a7", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/local-flights/[region]/page.tsx:278", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/local-flights/[region]/page.tsx:278"}, "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-f964444adfa35a02", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/page.tsx:94", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/page.tsx:94"}, "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-c316f84cebb8ff94", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/miles-booking-guide/page.tsx:187", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/miles-booking-guide/page.tsx:187"}, "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-9a3aad18834bb1d1", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/sale-prediction-2027/page.tsx:195", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/sale-prediction-2027/page.tsx:195"}, "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-c05adad42d9563c9", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/seasonal/autumn-2026/page.tsx:167", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/seasonal/autumn-2026/page.tsx:167"}, "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-a30a42363d4b1a36", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/seasonal/winter-2026/page.tsx:167", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/seasonal/winter-2026/page.tsx:167"}, "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-57466062c8f61946", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/[slug]/page.tsx:167", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/[slug]/page.tsx:167"}, "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-ee5da09293b0fc98", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/page.tsx:105", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/page.tsx:105"}, "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-51e8cf3332995065", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/[code]/page.tsx:138", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/[code]/page.tsx:138"}, "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-84851a1288931f33", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/[code]/airports/[iata]/page.tsx:272", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/[code]/airports/[iata]/page.tsx:272"}, "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-c955428548c53874", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/[code]/sales/page.tsx:224", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/[code]/sales/page.tsx:224"}, "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-68365644a9dc6664", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/package-tour/page.tsx:204", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/package-tour/page.tsx:204"}, "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-e8cda3725fd88a89", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/deals/page.tsx:75", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/deals/page.tsx:75"}, "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-0f9a4a68dda9606c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/deals/[id]/page.tsx:211", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/deals/[id]/page.tsx:211"}, "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-2be4f406df5bc1c8", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/faq/page.tsx:58", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/faq/page.tsx:58"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "2 test file(s) for 271 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 95 placeholder/mock markers across 55 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f8869eb359195598", "name": "Commented-code block (5 lines) in next.config.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in next.config.ts:2"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-659f05c5db243b9b", "name": "Commented-code block (6 lines) in src/components/site-footer.tsx:26", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/site-footer.tsx:26"}, "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-57c83c5a80b18132", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/notifications/notification-panel.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/notifications/notification-panel.tsx:56"}, "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-89415041770297a6", "name": "Commented-code block (5 lines) in src/components/affiliate/japanese-partners-panel.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/affiliate/japanese-partners-panel.tsx: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-edc75bae7adeb640", "name": "Commented-code block (5 lines) in src/components/sticky-cta/mobile-sticky-cta.tsx:126", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sticky-cta/mobile-sticky-cta.tsx:126"}, "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-7b5b4b44508af045", "name": "Commented-code block (12 lines) in src/app/sitemap.ts:119", "shortDescription": {"text": "Commented-code block (12 lines) in src/app/sitemap.ts:119"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8163104459325c13", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/line/webhook/route.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/line/webhook/route.ts:27"}, "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-487f1dffd37aef9b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/alerts/dispatch/route.ts:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/alerts/dispatch/route.ts:80"}, "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-56c0e420923b4de2", "name": "Commented-code block (5 lines) in src/app/[lang]/layout.tsx:112", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/[lang]/layout.tsx:112"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-726ed2169159915b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/google/places-client.ts:144", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/google/places-client.ts:144"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d021c6f357c7a262", "name": "Commented-code block (6 lines) in src/lib/affiliate/url-builder.ts:39", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/affiliate/url-builder.ts:39"}, "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-5336772dda3772c5", "name": "Commented-code block (11 lines) in src/lib/affiliate/asp-partners.ts:600", "shortDescription": {"text": "Commented-code block (11 lines) in src/lib/affiliate/asp-partners.ts:600"}, "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-b529e0c27d384893", "name": "Commented-code block (6 lines) in src/lib/deals/deal-service.ts:77", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/deals/deal-service.ts:77"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-70fcae2d13c708b6", "name": "17 env vars used in code but missing from .env.example", "shortDescription": {"text": "17 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_TOTP_SECRET`, `ALLOWED_PREVIEW_HOST`, `ANALYZE`, `KV_REST_API_TOKEN`, `KV_REST_API_URL`, `LINE_CHANNEL_SECRET`, `NEWSLETTER_MIN_DAYS_BETWEEN`, `NEXT_PUBLIC_GA_ID` + 9 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}}]}}, "automationDetails": {"id": "repobility/20924"}, "properties": {"repository": "TechnoJapan-LP/BEATRIP", "repoUrl": "https://github.com/TechnoJapan-LP/BEATRIP", "branch": "main"}, "results": [{"ruleId": "scanner-64495d8aaa7bc0ef", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/breadcrumbs.tsx:67"}, "properties": {"repobilityId": "625e38756275bbed", "scanner": "scanner-primary", "fingerprint": "64495d8aaa7bc0ef", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d4b703af66f28579", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/affiliate/travel-companions.tsx:107"}, "properties": {"repobilityId": "769ce45f9bdd8715", "scanner": "scanner-primary", "fingerprint": "d4b703af66f28579", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a70c65fe74cbf15b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/hotels/compact-hotels-recommendation.tsx:183"}, "properties": {"repobilityId": "511fc1a920f26634", "scanner": "scanner-primary", "fingerprint": "a70c65fe74cbf15b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8b1026745b4922c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/search/global-search.tsx:656"}, "properties": {"repobilityId": "ca8c1a53f5553147", "scanner": "scanner-primary", "fingerprint": "f8b1026745b4922c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-295368fd15bafd35", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/popular-routes-section.tsx:105"}, "properties": {"repobilityId": "6795ca043a2f0427", "scanner": "scanner-primary", "fingerprint": "295368fd15bafd35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f98a36f4a0bea39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/recently-viewed/recently-viewed-drawer.tsx:130"}, "properties": {"repobilityId": "e93fb4b1e4fc34cc", "scanner": "scanner-primary", "fingerprint": "9f98a36f4a0bea39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c51a8c5f1d7c1328", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/airlines/sale-detail-card.tsx:128"}, "properties": {"repobilityId": "d33904943649ee04", "scanner": "scanner-primary", "fingerprint": "c51a8c5f1d7c1328", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa24923494530944", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/airlines/airline-card.tsx:111"}, "properties": {"repobilityId": "4a21c58338c6ebe0", "scanner": "scanner-primary", "fingerprint": "fa24923494530944", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a501fa27d9cc69b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sticky-cta/mobile-sticky-cta.tsx:186"}, "properties": {"repobilityId": "22403406b9044f64", "scanner": "scanner-primary", "fingerprint": "8a501fa27d9cc69b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a136227a147489a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/conversion/exit-intent-modal.tsx:348"}, "properties": {"repobilityId": "d496addfbe7acecc", "scanner": "scanner-primary", "fingerprint": "1a136227a147489a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d0966dfd88bcfe6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/related-deals.tsx:74"}, "properties": {"repobilityId": "bba8d85d8013d193", "scanner": "scanner-primary", "fingerprint": "7d0966dfd88bcfe6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e580b3f735bc458", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/hero-deal.tsx:80"}, "properties": {"repobilityId": "6cf1bd3271caf16a", "scanner": "scanner-primary", "fingerprint": "5e580b3f735bc458", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2869c2f3793ac393", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/upcoming-deal-card.tsx:102"}, "properties": {"repobilityId": "1a09ef8e815d732c", "scanner": "scanner-primary", "fingerprint": "2869c2f3793ac393", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a669f81df1015a37", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/deal-carousel.tsx:71"}, "properties": {"repobilityId": "e8de4852c52dea05", "scanner": "scanner-primary", "fingerprint": "a669f81df1015a37", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2ff880c333092c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/deal-card.tsx:103"}, "properties": {"repobilityId": "2993fba79a51986a", "scanner": "scanner-primary", "fingerprint": "d2ff880c333092c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4a364aecf96440ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/deal-hotel-highlights.tsx:149"}, "properties": {"repobilityId": "c97b74618b3db1f0", "scanner": "scanner-primary", "fingerprint": "4a364aecf96440ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5f3e8147bdadc339", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/recommended-banner.tsx:65"}, "properties": {"repobilityId": "050e1b878dbeee09", "scanner": "scanner-primary", "fingerprint": "5f3e8147bdadc339", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0774b3b815d024d2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/deals/price-alert-form.tsx:130"}, "properties": {"repobilityId": "30078051f6b584ff", "scanner": "scanner-primary", "fingerprint": "0774b3b815d024d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f89e6c5e2f57b2a9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/alerts/dispatch/route.ts:20"}, "properties": {"repobilityId": "be9eff399d453171", "scanner": "scanner-primary", "fingerprint": "f89e6c5e2f57b2a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-40a8feeffaae0f68", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/scrape/route.ts:235"}, "properties": {"repobilityId": "0919dc3b0950dad8", "scanner": "scanner-primary", "fingerprint": "40a8feeffaae0f68", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14e1bc414590e825", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/not-found.tsx:134"}, "properties": {"repobilityId": "226aba34be7e6f1b", "scanner": "scanner-primary", "fingerprint": "14e1bc414590e825", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6421b1215e11642", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/not-found.tsx:67"}, "properties": {"repobilityId": "d391c51513d19531", "scanner": "scanner-primary", "fingerprint": "d6421b1215e11642", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a7ed3fe6e267e16f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/page.tsx:198"}, "properties": {"repobilityId": "2adb813ac6fba69b", "scanner": "scanner-primary", "fingerprint": "a7ed3fe6e267e16f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e5bdcb4872c874cc", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/layout.tsx:148"}, "properties": {"repobilityId": "f99e082f4c0fe4ba", "scanner": "scanner-primary", "fingerprint": "e5bdcb4872c874cc", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7af9fa2edd3371a5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/esim/page.tsx:163"}, "properties": {"repobilityId": "575a3321c3019a99", "scanner": "scanner-primary", "fingerprint": "7af9fa2edd3371a5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-791ef4d30ec9e053", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hawaii/page.tsx:146"}, "properties": {"repobilityId": "10492469af8bbfa5", "scanner": "scanner-primary", "fingerprint": "791ef4d30ec9e053", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-33a2bcdb9535b27c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/credit-cards/page.tsx:287"}, "properties": {"repobilityId": "20c2a180dce5471a", "scanner": "scanner-primary", "fingerprint": "33a2bcdb9535b27c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-92d16049263e1aee", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/cruise/page.tsx:128"}, "properties": {"repobilityId": "1b674003768fb61e", "scanner": "scanner-primary", "fingerprint": "92d16049263e1aee", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b3f11acff3ae36fa", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/page.tsx:71"}, "properties": {"repobilityId": "e89c4c5d810a1662", "scanner": "scanner-primary", "fingerprint": "b3f11acff3ae36fa", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-32ce2c405ac83c56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/hotels/[city]/page.tsx:845"}, "properties": {"repobilityId": "5be357cb90cd371f", "scanner": "scanner-primary", "fingerprint": "32ce2c405ac83c56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-63661304a92e09f6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/page.tsx:254"}, "properties": {"repobilityId": "1650e2418105d5b5", "scanner": "scanner-primary", "fingerprint": "63661304a92e09f6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5fc01b7a06dfeaee", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/esim/page.tsx:144"}, "properties": {"repobilityId": "c6f2c4846b931365", "scanner": "scanner-primary", "fingerprint": "5fc01b7a06dfeaee", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f59aa3462b0aeb3a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/best-season/page.tsx:198"}, "properties": {"repobilityId": "401daf939b14b94c", "scanner": "scanner-primary", "fingerprint": "f59aa3462b0aeb3a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7609af801eea02eb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/hotels/[city]/activities/page.tsx:167"}, "properties": {"repobilityId": "5fedf60fa1582880", "scanner": "scanner-primary", "fingerprint": "7609af801eea02eb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-de3981a8b81c9e47", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/okinawa/page.tsx:173"}, "properties": {"repobilityId": "a570eed91fb9b418", "scanner": "scanner-primary", "fingerprint": "de3981a8b81c9e47", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-545818f2824735b0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/seasons/summer/page.tsx:158"}, "properties": {"repobilityId": "67b2c96b663849b8", "scanner": "scanner-primary", "fingerprint": "545818f2824735b0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9c51d1c5304f2299", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/seasons/golden-week/page.tsx:159"}, "properties": {"repobilityId": "2da3a6a53b19eec9", "scanner": "scanner-primary", "fingerprint": "9c51d1c5304f2299", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4cbb72473f50bb45", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/seasons/year-end/page.tsx:158"}, "properties": {"repobilityId": "a1408266908a1b3d", "scanner": "scanner-primary", "fingerprint": "4cbb72473f50bb45", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1e582c50bae42294", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/insurance/page.tsx:234"}, "properties": {"repobilityId": "e46ef37d8c7ab541", "scanner": "scanner-primary", "fingerprint": "1e582c50bae42294", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8969683af179b3fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airports/page.tsx:155"}, "properties": {"repobilityId": "401ddf3450bc2e5b", "scanner": "scanner-primary", "fingerprint": "8969683af179b3fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-74a1a053281675bb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airports/page.tsx:87"}, "properties": {"repobilityId": "19fcbacbb418e3c1", "scanner": "scanner-primary", "fingerprint": "74a1a053281675bb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9eaf76279fff751e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airports/[code]/page.tsx:288"}, "properties": {"repobilityId": "d1a69ebe054d8e00", "scanner": "scanner-primary", "fingerprint": "9eaf76279fff751e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8451704381fa8475", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airports/[code]/page.tsx:210"}, "properties": {"repobilityId": "8bf2f926d82ba984", "scanner": "scanner-primary", "fingerprint": "8451704381fa8475", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0565a9bf632caf9b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/routes/[route]/page.tsx:394"}, "properties": {"repobilityId": "c58ce51f0f1ac11c", "scanner": "scanner-primary", "fingerprint": "0565a9bf632caf9b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0ecbaaeda9e96db0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/ota-sales/page.tsx:397"}, "properties": {"repobilityId": "e52de2e93d6de333", "scanner": "scanner-primary", "fingerprint": "0ecbaaeda9e96db0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9d86cd9fd5d93b0e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/glossary/page.tsx:354"}, "properties": {"repobilityId": "e047c10a93eeb4dc", "scanner": "scanner-primary", "fingerprint": "9d86cd9fd5d93b0e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c0ac8fac8b1a14b6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/local-flights/page.tsx:211"}, "properties": {"repobilityId": "1ec292f16710985c", "scanner": "scanner-primary", "fingerprint": "c0ac8fac8b1a14b6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-df47c3e50a1cd1dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/local-flights/[region]/page.tsx:356"}, "properties": {"repobilityId": "173dfa18dc9d47de", "scanner": "scanner-primary", "fingerprint": "df47c3e50a1cd1dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8fc100e96732ae6a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/local-flights/[region]/page.tsx:278"}, "properties": {"repobilityId": "8207bb8817ecf0b8", "scanner": "scanner-primary", "fingerprint": "8fc100e96732ae6a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e74299558cb8dac1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/page.tsx:94"}, "properties": {"repobilityId": "c39fef72e7a97ea9", "scanner": "scanner-primary", "fingerprint": "e74299558cb8dac1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-72850a500b573cf4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/miles-booking-guide/page.tsx:187"}, "properties": {"repobilityId": "6ec6674db590036b", "scanner": "scanner-primary", "fingerprint": "72850a500b573cf4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-51ee4418fdac2671", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/sale-prediction-2027/page.tsx:195"}, "properties": {"repobilityId": "a10a18fa612c8838", "scanner": "scanner-primary", "fingerprint": "51ee4418fdac2671", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ea5cef9427bb5660", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/seasonal/autumn-2026/page.tsx:167"}, "properties": {"repobilityId": "254977b427d2f848", "scanner": "scanner-primary", "fingerprint": "ea5cef9427bb5660", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-610bc8e77ffbabaf", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/seasonal/winter-2026/page.tsx:167"}, "properties": {"repobilityId": "01ac6e095cd8f893", "scanner": "scanner-primary", "fingerprint": "610bc8e77ffbabaf", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-20e98dfddc6725b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/articles/[slug]/page.tsx:316"}, "properties": {"repobilityId": "c1e384dbc07fdeb5", "scanner": "scanner-primary", "fingerprint": "20e98dfddc6725b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89947f688b19dc78", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/articles/[slug]/page.tsx:167"}, "properties": {"repobilityId": "f27876659d8840d1", "scanner": "scanner-primary", "fingerprint": "89947f688b19dc78", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1a1e4110f6241c53", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/page.tsx:105"}, "properties": {"repobilityId": "6c52b8797673615d", "scanner": "scanner-primary", "fingerprint": "1a1e4110f6241c53", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-169f006499d8f483", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airlines/[code]/page.tsx:304"}, "properties": {"repobilityId": "8ff0d77b8320756b", "scanner": "scanner-primary", "fingerprint": "169f006499d8f483", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e87f0c8d257183a7", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/[code]/page.tsx:138"}, "properties": {"repobilityId": "6d638fc6a5d48be8", "scanner": "scanner-primary", "fingerprint": "e87f0c8d257183a7", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f6a35c909d912b9c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/airlines/[code]/airports/[iata]/page.tsx:379"}, "properties": {"repobilityId": "b126408d3a7c52c3", "scanner": "scanner-primary", "fingerprint": "f6a35c909d912b9c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a950afbe86bbdfcc", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/[code]/airports/[iata]/page.tsx:272"}, "properties": {"repobilityId": "e2615b0e942057c1", "scanner": "scanner-primary", "fingerprint": "a950afbe86bbdfcc", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-95a1f5ccfd0a419b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/airlines/[code]/sales/page.tsx:224"}, "properties": {"repobilityId": "3b8f3cc4d5fd3c3e", "scanner": "scanner-primary", "fingerprint": "95a1f5ccfd0a419b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8785e93d4dc8fc8b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/package-tour/page.tsx:204"}, "properties": {"repobilityId": "9400a85b62bdcf3a", "scanner": "scanner-primary", "fingerprint": "8785e93d4dc8fc8b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5dc8b1492fa27b2e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/deals/page.tsx:75"}, "properties": {"repobilityId": "4946bff81bc691f9", "scanner": "scanner-primary", "fingerprint": "5dc8b1492fa27b2e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-bb6a3d3420f4571c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[lang]/deals/[id]/page.tsx:632"}, "properties": {"repobilityId": "e0d2c45900944367", "scanner": "scanner-primary", "fingerprint": "bb6a3d3420f4571c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6635cad3b2cea974", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/deals/[id]/page.tsx:211"}, "properties": {"repobilityId": "3570ec5dcad1a901", "scanner": "scanner-primary", "fingerprint": "6635cad3b2cea974", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6ed43ece867d9dc4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[lang]/faq/page.tsx:58"}, "properties": {"repobilityId": "62dbd9221ec3407d", "scanner": "scanner-primary", "fingerprint": "6ed43ece867d9dc4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8c87eef70f2543c2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/articles/ranking-template.tsx:173"}, "properties": {"repobilityId": "dd5a6ea7baacd705", "scanner": "scanner-primary", "fingerprint": "8c87eef70f2543c2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-dfb902fdc9c88c31", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/articles/ota-compare-template.tsx:283"}, "properties": {"repobilityId": "d662d570bf986f88", "scanner": "scanner-primary", "fingerprint": "dfb902fdc9c88c31", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-72064a6ba70b65d7", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/articles/guide-template.tsx:117"}, "properties": {"repobilityId": "73875aa5bbaa52e2", "scanner": "scanner-primary", "fingerprint": "72064a6ba70b65d7", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-58197f39e8242dfc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/deals/deal-service.ts:98"}, "properties": {"repobilityId": "1cfff28fd737acd4", "scanner": "scanner-primary", "fingerprint": "58197f39e8242dfc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-273363a41f170610", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/breadcrumbs.tsx:67"}, "properties": {"repobilityId": "c6d7d317cf8588d6", "scanner": "scanner-primary", "fingerprint": "273363a41f170610", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/breadcrumbs.tsx"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-32206ab09020539f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/not-found.tsx:67"}, "properties": {"repobilityId": "9b750183dbd07158", "scanner": "scanner-primary", "fingerprint": "32206ab09020539f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/not-found.tsx"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-396346b0f6f2c3c9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/page.tsx:198"}, "properties": {"repobilityId": "17822c43d89dc5c7", "scanner": "scanner-primary", "fingerprint": "396346b0f6f2c3c9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/page.tsx"}, "region": {"startLine": 198}}}]}, {"ruleId": "scanner-1572f5b2ed6bd90a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/layout.tsx:148"}, "properties": {"repobilityId": "aef17f44aeee407c", "scanner": "scanner-primary", "fingerprint": "1572f5b2ed6bd90a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/layout.tsx"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-a544ab29b836eb74", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/esim/page.tsx:163"}, "properties": {"repobilityId": "2bd7325d435aafc6", "scanner": "scanner-primary", "fingerprint": "a544ab29b836eb74", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/esim/page.tsx"}, "region": {"startLine": 163}}}]}, {"ruleId": "scanner-d47139d58fb6c19d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hawaii/page.tsx:146"}, "properties": {"repobilityId": "01c1baf9608cd0cb", "scanner": "scanner-primary", "fingerprint": "d47139d58fb6c19d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/hawaii/page.tsx"}, "region": {"startLine": 146}}}]}, {"ruleId": "scanner-3b3522d75fce3419", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/credit-cards/page.tsx:287"}, "properties": {"repobilityId": "95a5c1ac8722f03a", "scanner": "scanner-primary", "fingerprint": "3b3522d75fce3419", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/credit-cards/page.tsx"}, "region": {"startLine": 287}}}]}, {"ruleId": "scanner-6d8670b3488f1056", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/cruise/page.tsx:128"}, "properties": {"repobilityId": "c858070cf17a24e2", "scanner": "scanner-primary", "fingerprint": "6d8670b3488f1056", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/cruise/page.tsx"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-035900d2cc632223", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/page.tsx:71"}, "properties": {"repobilityId": "737e8c1591310396", "scanner": "scanner-primary", "fingerprint": "035900d2cc632223", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/hotels/page.tsx"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-d0bcd272eaeb66d6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/page.tsx:254"}, "properties": {"repobilityId": "2398d282c1ddfd5d", "scanner": "scanner-primary", "fingerprint": "d0bcd272eaeb66d6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/hotels/[city]/page.tsx"}, "region": {"startLine": 254}}}]}, {"ruleId": "scanner-66007950cc65d9e1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/esim/page.tsx:144"}, "properties": {"repobilityId": "db52d5c8abe27bf5", "scanner": "scanner-primary", "fingerprint": "66007950cc65d9e1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/hotels/[city]/esim/page.tsx"}, "region": {"startLine": 144}}}]}, {"ruleId": "scanner-719df1118052dda7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/best-season/page.tsx:198"}, "properties": {"repobilityId": "1aea84c47184e6ee", "scanner": "scanner-primary", "fingerprint": "719df1118052dda7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/hotels/[city]/best-season/page.tsx"}, "region": {"startLine": 198}}}]}, {"ruleId": "scanner-64026d1a8f2ec91e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/hotels/[city]/activities/page.tsx:167"}, "properties": {"repobilityId": "bc80812a93a3e867", "scanner": "scanner-primary", "fingerprint": "64026d1a8f2ec91e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/hotels/[city]/activities/page.tsx"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-a5b51290f21546e4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/okinawa/page.tsx:173"}, "properties": {"repobilityId": "063987f7c189ef8c", "scanner": "scanner-primary", "fingerprint": "a5b51290f21546e4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/okinawa/page.tsx"}, "region": {"startLine": 173}}}]}, {"ruleId": "scanner-bfac0d4e5e87e1af", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/seasons/summer/page.tsx:158"}, "properties": {"repobilityId": "5927cf2f295e57a5", "scanner": "scanner-primary", "fingerprint": "bfac0d4e5e87e1af", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/seasons/summer/page.tsx"}, "region": {"startLine": 158}}}]}, {"ruleId": "scanner-1349cf909cb1338c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/seasons/golden-week/page.tsx:159"}, "properties": {"repobilityId": "79ba0503b04daa0d", "scanner": "scanner-primary", "fingerprint": "1349cf909cb1338c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/seasons/golden-week/page.tsx"}, "region": {"startLine": 159}}}]}, {"ruleId": "scanner-57dfc4a0c7fcd60d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/seasons/year-end/page.tsx:158"}, "properties": {"repobilityId": "8fe6d35675929727", "scanner": "scanner-primary", "fingerprint": "57dfc4a0c7fcd60d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/seasons/year-end/page.tsx"}, "region": {"startLine": 158}}}]}, {"ruleId": "scanner-3a68f4f9232da21f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/insurance/page.tsx:234"}, "properties": {"repobilityId": "254cb1c2d52d8058", "scanner": "scanner-primary", "fingerprint": "3a68f4f9232da21f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/insurance/page.tsx"}, "region": {"startLine": 234}}}]}, {"ruleId": "scanner-383150b30c09d236", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airports/page.tsx:87"}, "properties": {"repobilityId": "4868c6b189e44ce9", "scanner": "scanner-primary", "fingerprint": "383150b30c09d236", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/airports/page.tsx"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-fa48d50e9cf0b187", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airports/[code]/page.tsx:210"}, "properties": {"repobilityId": "d8fe9f7bb55375a2", "scanner": "scanner-primary", "fingerprint": "fa48d50e9cf0b187", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/airports/[code]/page.tsx"}, "region": {"startLine": 210}}}]}, {"ruleId": "scanner-f035597cd76a7d0f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/routes/[route]/page.tsx:394"}, "properties": {"repobilityId": "d65e1f982d1308d6", "scanner": "scanner-primary", "fingerprint": "f035597cd76a7d0f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/routes/[route]/page.tsx"}, "region": {"startLine": 394}}}]}, {"ruleId": "scanner-64f01a4c7c85cd98", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/ota-sales/page.tsx:397"}, "properties": {"repobilityId": "c4634483881e99ac", "scanner": "scanner-primary", "fingerprint": "64f01a4c7c85cd98", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/ota-sales/page.tsx"}, "region": {"startLine": 397}}}]}, {"ruleId": "scanner-4d7aa2e5d62e668a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/glossary/page.tsx:354"}, "properties": {"repobilityId": "580b41a4ec493d97", "scanner": "scanner-primary", "fingerprint": "4d7aa2e5d62e668a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/glossary/page.tsx"}, "region": {"startLine": 354}}}]}, {"ruleId": "scanner-a9c5cf15f587d1e7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/local-flights/page.tsx:211"}, "properties": {"repobilityId": "ba2e90da7fe2f036", "scanner": "scanner-primary", "fingerprint": "a9c5cf15f587d1e7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/local-flights/page.tsx"}, "region": {"startLine": 211}}}]}, {"ruleId": "scanner-c3619f4f3df719a7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/local-flights/[region]/page.tsx:278"}, "properties": {"repobilityId": "af3a99ff4ce515fd", "scanner": "scanner-primary", "fingerprint": "c3619f4f3df719a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/local-flights/[region]/page.tsx"}, "region": {"startLine": 278}}}]}, {"ruleId": "scanner-f964444adfa35a02", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/page.tsx:94"}, "properties": {"repobilityId": "fb6853f9d66721ab", "scanner": "scanner-primary", "fingerprint": "f964444adfa35a02", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/articles/page.tsx"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-c316f84cebb8ff94", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/miles-booking-guide/page.tsx:187"}, "properties": {"repobilityId": "19bb7fb574b30547", "scanner": "scanner-primary", "fingerprint": "c316f84cebb8ff94", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/articles/miles-booking-guide/page.tsx"}, "region": {"startLine": 187}}}]}, {"ruleId": "scanner-9a3aad18834bb1d1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/sale-prediction-2027/page.tsx:195"}, "properties": {"repobilityId": "201969ce67ebd00c", "scanner": "scanner-primary", "fingerprint": "9a3aad18834bb1d1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/articles/sale-prediction-2027/page.tsx"}, "region": {"startLine": 195}}}]}, {"ruleId": "scanner-c05adad42d9563c9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/seasonal/autumn-2026/page.tsx:167"}, "properties": {"repobilityId": "577ab84998382900", "scanner": "scanner-primary", "fingerprint": "c05adad42d9563c9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/articles/seasonal/autumn-2026/page.tsx"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-a30a42363d4b1a36", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/seasonal/winter-2026/page.tsx:167"}, "properties": {"repobilityId": "047d03ee9040cf32", "scanner": "scanner-primary", "fingerprint": "a30a42363d4b1a36", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/articles/seasonal/winter-2026/page.tsx"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-57466062c8f61946", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/articles/[slug]/page.tsx:167"}, "properties": {"repobilityId": "8dc56357ee73d60f", "scanner": "scanner-primary", "fingerprint": "57466062c8f61946", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/articles/[slug]/page.tsx"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-ee5da09293b0fc98", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/page.tsx:105"}, "properties": {"repobilityId": "83fa2a27b08c77b3", "scanner": "scanner-primary", "fingerprint": "ee5da09293b0fc98", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/airlines/page.tsx"}, "region": {"startLine": 105}}}]}, {"ruleId": "scanner-51e8cf3332995065", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/[code]/page.tsx:138"}, "properties": {"repobilityId": "36b7cafe808bcf25", "scanner": "scanner-primary", "fingerprint": "51e8cf3332995065", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/airlines/[code]/page.tsx"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-84851a1288931f33", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/[code]/airports/[iata]/page.tsx:272"}, "properties": {"repobilityId": "fc473e1828b13578", "scanner": "scanner-primary", "fingerprint": "84851a1288931f33", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/airlines/[code]/airports/[iata]/page.tsx"}, "region": {"startLine": 272}}}]}, {"ruleId": "scanner-c955428548c53874", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/airlines/[code]/sales/page.tsx:224"}, "properties": {"repobilityId": "dbbc4f9d1af0534c", "scanner": "scanner-primary", "fingerprint": "c955428548c53874", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/airlines/[code]/sales/page.tsx"}, "region": {"startLine": 224}}}]}, {"ruleId": "scanner-68365644a9dc6664", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/package-tour/page.tsx:204"}, "properties": {"repobilityId": "4cb07649c35d848f", "scanner": "scanner-primary", "fingerprint": "68365644a9dc6664", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/package-tour/page.tsx"}, "region": {"startLine": 204}}}]}, {"ruleId": "scanner-e8cda3725fd88a89", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/deals/page.tsx:75"}, "properties": {"repobilityId": "fd1ee1ea2e70e3a8", "scanner": "scanner-primary", "fingerprint": "e8cda3725fd88a89", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/deals/page.tsx"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-0f9a4a68dda9606c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/deals/[id]/page.tsx:211"}, "properties": {"repobilityId": "a582f2e5541de9f6", "scanner": "scanner-primary", "fingerprint": "0f9a4a68dda9606c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/deals/[id]/page.tsx"}, "region": {"startLine": 211}}}]}, {"ruleId": "scanner-2be4f406df5bc1c8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[lang]/faq/page.tsx:58"}, "properties": {"repobilityId": "3f31328cf907455b", "scanner": "scanner-primary", "fingerprint": "2be4f406df5bc1c8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[lang]/faq/page.tsx"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "446b30b7c4ac5583", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "5242b389163ed091", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "93e6edddff78572c", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "70df4d14bb6fd44f", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "51df8547d094271a", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "60ed7fcffe20e3c9", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "e8e855fb2a812f92", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-f8869eb359195598", "level": "none", "message": {"text": "Commented-code block (5 lines) in next.config.ts:2"}, "properties": {"repobilityId": "6e3c91f66856aa20", "scanner": "scanner-primary", "fingerprint": "f8869eb359195598", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-659f05c5db243b9b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/site-footer.tsx:26"}, "properties": {"repobilityId": "8ab15f3aece4b317", "scanner": "scanner-primary", "fingerprint": "659f05c5db243b9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57c83c5a80b18132", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/notifications/notification-panel.tsx:56"}, "properties": {"repobilityId": "d539602d4d8badce", "scanner": "scanner-primary", "fingerprint": "57c83c5a80b18132", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-89415041770297a6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/affiliate/japanese-partners-panel.tsx:1"}, "properties": {"repobilityId": "4101ab0ef80bb3e2", "scanner": "scanner-primary", "fingerprint": "89415041770297a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-edc75bae7adeb640", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sticky-cta/mobile-sticky-cta.tsx:126"}, "properties": {"repobilityId": "5c92b93b6dfbebd9", "scanner": "scanner-primary", "fingerprint": "edc75bae7adeb640", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b5b4b44508af045", "level": "none", "message": {"text": "Commented-code block (12 lines) in src/app/sitemap.ts:119"}, "properties": {"repobilityId": "77781088b24198f7", "scanner": "scanner-primary", "fingerprint": "7b5b4b44508af045", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8163104459325c13", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/line/webhook/route.ts:27"}, "properties": {"repobilityId": "37eb75e77c7fe840", "scanner": "scanner-primary", "fingerprint": "8163104459325c13", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-487f1dffd37aef9b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/alerts/dispatch/route.ts:80"}, "properties": {"repobilityId": "1dbeb0b8a5107372", "scanner": "scanner-primary", "fingerprint": "487f1dffd37aef9b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-56c0e420923b4de2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/[lang]/layout.tsx:112"}, "properties": {"repobilityId": "b1da878437d1e37d", "scanner": "scanner-primary", "fingerprint": "56c0e420923b4de2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-726ed2169159915b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/google/places-client.ts:144"}, "properties": {"repobilityId": "e329fc9a7ddc54f5", "scanner": "scanner-primary", "fingerprint": "726ed2169159915b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d021c6f357c7a262", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/affiliate/url-builder.ts:39"}, "properties": {"repobilityId": "fefc95c0f803acf8", "scanner": "scanner-primary", "fingerprint": "d021c6f357c7a262", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5336772dda3772c5", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/lib/affiliate/asp-partners.ts:600"}, "properties": {"repobilityId": "dc54b1172e3783ae", "scanner": "scanner-primary", "fingerprint": "5336772dda3772c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b529e0c27d384893", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/deals/deal-service.ts:77"}, "properties": {"repobilityId": "85d76c90fcc38098", "scanner": "scanner-primary", "fingerprint": "b529e0c27d384893", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70fcae2d13c708b6", "level": "note", "message": {"text": "17 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "f21675bed249619c", "scanner": "scanner-primary", "fingerprint": "70fcae2d13c708b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}