{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b74f0240978a7e5e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/SearchClient.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SearchClient.tsx:237"}, "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-ce4d8c0952001970", "name": "`truncate` class without `title=` for hover reveal \u2014 components/CommandPalette.tsx:580", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CommandPalette.tsx:580"}, "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-3c0d1b91a1d45ad9", "name": "`truncate` class without `title=` for hover reveal \u2014 components/Top10CryptosClient.tsx:569", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/Top10CryptosClient.tsx:569"}, "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-a40b4bc41864a566", "name": "`truncate` class without `title=` for hover reveal \u2014 components/MarketTableClient.tsx:353", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MarketTableClient.tsx:353"}, "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-5e211c02227b77d7", "name": "`truncate` class without `title=` for hover reveal \u2014 components/GainerLoserList.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/GainerLoserList.tsx:85"}, "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-e27ac1d382449b94", "name": "`truncate` class without `title=` for hover reveal \u2014 components/NewsletterInline.tsx:266", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/NewsletterInline.tsx:266"}, "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-ff2f77a714fdde33", "name": "`truncate` class without `title=` for hover reveal \u2014 components/NewsBarRotator.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/NewsBarRotator.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-dc391e417e3f6685", "name": "`truncate` class without `title=` for hover reveal \u2014 components/HeroPriceChart.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/HeroPriceChart.tsx:150"}, "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-773658f3f65b08be", "name": "`truncate` class without `title=` for hover reveal \u2014 components/PlatformCard.tsx:133", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PlatformCard.tsx:133"}, "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-20c38ec686533a58", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/StructuredData.tsx:36", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/StructuredData.tsx:36"}, "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-685533c8ba45a803", "name": "`truncate` class without `title=` for hover reveal \u2014 components/WatchlistView.tsx:322", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/WatchlistView.tsx:322"}, "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-dcb673fcf2656ae0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/PriceCards.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PriceCards.tsx:36"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38bddc519ab1c2f0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/StakingComparator.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/StakingComparator.tsx:195"}, "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-72fe4c3198934576", "name": "`truncate` class without `title=` for hover reveal \u2014 components/PlatformQuiz.tsx:736", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PlatformQuiz.tsx:736"}, "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-9a464458b60a24b0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/AddHoldingDialog.tsx:322", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AddHoldingDialog.tsx:322"}, "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-7eabc629deb4f55f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/MobileStickyCTA.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MobileStickyCTA.tsx:100"}, "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-83718a553e9aacbb", "name": "`truncate` class without `title=` for hover reveal \u2014 components/NewsTicker.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/NewsTicker.tsx:114"}, "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-b8c67b3f594c27f1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/PortfolioView.tsx:638", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PortfolioView.tsx:638"}, "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-0b714a81584b0e51", "name": "`truncate` class without `title=` for hover reveal \u2014 components/MicaVerifier.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MicaVerifier.tsx:176"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19bb3eccaeaf5984", "name": "`truncate` class without `title=` for hover reveal \u2014 components/PortfolioPieChart.tsx:246", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PortfolioPieChart.tsx:246"}, "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-749d342e3aa9720e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/CryptoQuiz.tsx:729", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CryptoQuiz.tsx:729"}, "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-d56f7f9e68b1fc70", "name": "`truncate` class without `title=` for hover reveal \u2014 components/RelatedEntities.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/RelatedEntities.tsx:150"}, "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-8ec310a4d9e719c2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/FirstPurchaseWizard.tsx:897", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/FirstPurchaseWizard.tsx:897"}, "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-53c57a077dc9e0e6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/HeroLiveWidget.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/HeroLiveWidget.tsx:164"}, "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-4c3439229999f137", "name": "`truncate` class without `title=` for hover reveal \u2014 components/HiddenGemsSection.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/HiddenGemsSection.tsx:113"}, "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-9543e3df5688bb86", "name": "`truncate` class without `title=` for hover reveal \u2014 components/HeroLiveWidgetMobile.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/HeroLiveWidgetMobile.tsx:136"}, "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-8305b19feb07c5a2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/SpeculationRules.tsx:108", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/SpeculationRules.tsx:108"}, "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-e2d37f1c66eb4cc7", "name": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/CopyCompareLink.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/CopyCompareLink.tsx:46"}, "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-43a3fd9100f54344", "name": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/QuickCombosGrid.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/QuickCombosGrid.tsx:122"}, "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-16de49fb6f49a325", "name": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/CompareSelector.tsx:282", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/CompareSelector.tsx:282"}, "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-0c971b270c4cf4bd", "name": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/CryptosBrowser.tsx:394", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/CryptosBrowser.tsx:394"}, "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-e5bc939f6516243a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/calculateur-fiscalite/PdfModal.tsx:382", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/calculateur-fiscalite/PdfModal.tsx:382"}, "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-202ae1f0668e638f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/calculateur-fiscalite/PdfPreview.tsx:90", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/calculateur-fiscalite/PdfPreview.tsx:90"}, "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-0481f1cbd8be7f3d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/email/FiscaliteEmailTemplate.tsx:25", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/email/FiscaliteEmailTemplate.tsx:25"}, "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-6539837ce6b49880", "name": "`truncate` class without `title=` for hover reveal \u2014 components/academy/AcademyResumeBanner.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/academy/AcademyResumeBanner.tsx:89"}, "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-36e0a22326721d9e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/fiscal-tools/StickyWaltioCta.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/fiscal-tools/StickyWaltioCta.tsx:101"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-09945bcbd5b1e666", "name": "`truncate` class without `title=` for hover reveal \u2014 components/fiscal-tools/WaltioPromoBanner.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/fiscal-tools/WaltioPromoBanner.tsx:77"}, "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-8bf223bba4b4827c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/glossary/CryptoGlossarySection.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/glossary/CryptoGlossarySection.tsx:196"}, "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-e02ef46581af4b4e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/glossary/CryptoGlossarySection.tsx:113", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/glossary/CryptoGlossarySection.tsx:113"}, "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-fe3ea67810d501cf", "name": "`truncate` class without `title=` for hover reveal \u2014 components/portfolio/PortfolioRow.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/portfolio/PortfolioRow.tsx:79"}, "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-d38fd0bbceffc672", "name": "`truncate` class without `title=` for hover reveal \u2014 components/portfolio/CryptoAutocomplete.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/portfolio/CryptoAutocomplete.tsx:144"}, "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-f5204bc0be0dc2f1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ta/AnalysesIndexClient.tsx:320", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ta/AnalysesIndexClient.tsx:320"}, "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-4c781c0490cf6aa5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/news/NewsCard.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/news/NewsCard.tsx:92"}, "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-d1f7d32f5136eeb8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/WhaleWatcher.tsx:297", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/WhaleWatcher.tsx:297"}, "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-2855c7de30bd775f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/WhitepaperTldr.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/WhitepaperTldr.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-ae117cc63481bac3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/OnChainMetricsLive.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/OnChainMetricsLive.tsx:191"}, "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-ebc5837f9f597c52", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/QuickBuyBox.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/QuickBuyBox.tsx:142"}, "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-6d45262fec84f197", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoSources.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoSources.tsx:135"}, "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-d5cf976998a4be13", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoStats.tsx:325", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoStats.tsx:325"}, "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-8b33659765916d7b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/StickyBreadcrumb.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/StickyBreadcrumb.tsx:115"}, "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-4685c6093a15fead", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/NextEventCountdown.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/NextEventCountdown.tsx:126"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-933ca5fd7aaf1a2f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoQuickSwitcher.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoQuickSwitcher.tsx:221"}, "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-1ad5ae2e3e2b31b3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoNewsAggregator.tsx:276", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoNewsAggregator.tsx:276"}, "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-8905fde76df02dee", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/mdx/FAQ.tsx:59", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/mdx/FAQ.tsx:59"}, "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-903560f3beeaa6e1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/mdx/FaqAccordion.tsx:49", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/mdx/FaqAccordion.tsx:49"}, "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-77b5e4b993b89cc1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/mdx/HowToSchema.tsx:112", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/mdx/HowToSchema.tsx:112"}, "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-1af5f5c8f0159163", "name": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/CalendarGrid.tsx:318", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/CalendarGrid.tsx:318"}, "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-90705c658e532e26", "name": "TODO/FIXME marker in shipping code \u2014 app/layout.tsx:67", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/layout.tsx:67"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-631b1576d40f3b0b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/cryptos/page.tsx:98", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/cryptos/page.tsx:98"}, "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-de9c81606e9b243b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/cryptos/comparer/page.tsx:596", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/cryptos/comparer/page.tsx:596"}, "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-9ee98450ea1e0472", "name": "`truncate` class without `title=` for hover reveal \u2014 app/airdrops/page.tsx:420", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/airdrops/page.tsx:420"}, "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-3f4fd795c5b7be68", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/ressources/page.tsx:220", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/ressources/page.tsx:220"}, "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-9a837df8460fc01a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/glossaire/page.tsx:74", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/glossaire/page.tsx:74"}, "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-929cd25366ea8f29", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/glossaire/[slug]/page.tsx:120", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/glossaire/[slug]/page.tsx:120"}, "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-4540e94ca1d0dedf", "name": "Stray `console.log` in TS/JS \u2014 app/api/auth/reset-password/route.ts:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/auth/reset-password/route.ts:114"}, "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-ba619f49ec07492d", "name": "Stray `console.log` in TS/JS \u2014 app/api/auth/login/route.ts:162", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/auth/login/route.ts:162"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6c91edc375c59e1", "name": "Stray `console.log` in TS/JS \u2014 app/api/admin/set-password/route.ts:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/admin/set-password/route.ts:130"}, "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-1f0e507cec9a2625", "name": "Stray `console.log` in TS/JS \u2014 app/api/cron/daily-brief/route.ts:325", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/daily-brief/route.ts:325"}, "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-8677a76476f9bc77", "name": "Stray `console.log` in TS/JS \u2014 app/api/cron/daily-orchestrator/route.ts:159", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/daily-orchestrator/route.ts:159"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d909ae39df3003a6", "name": "Stray `console.log` in TS/JS \u2014 app/api/cron/email-series-fiscalite/route.ts:175", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/email-series-fiscalite/route.ts:175"}, "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-cba8394b7840d968", "name": "Stray `console.log` in TS/JS \u2014 app/api/account/delete/route.ts:152", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/account/delete/route.ts:152"}, "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-812e87d8586ae728", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/partenaires/[slug]/page.tsx:1190", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/partenaires/[slug]/page.tsx:1190"}, "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-be462571cb7e1de4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/marche/whales/page.tsx:426", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/marche/whales/page.tsx:426"}, "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-65d7cff0ecd9382c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/mon-compte/dev/page.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/mon-compte/dev/page.tsx:145"}, "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-35902e2307f4066d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/alternative-a/page.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/alternative-a/page.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-864a789ac202cb8e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/comparatif/page.tsx:493", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/comparatif/page.tsx:493"}, "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-9fe355c0aa67b3ac", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/comparatif/[slug]/page.tsx:289", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/comparatif/[slug]/page.tsx:289"}, "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-866af5aae20b705b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/avis/page.tsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/avis/page.tsx:271"}, "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-18db65508a75c9c4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/avis/[slug]/page.tsx:301", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/avis/[slug]/page.tsx:301"}, "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-566ae87fc50a1390", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/outils/page.tsx:481", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/outils/page.tsx:481"}, "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-537b348f8d4f53d3", "name": "`truncate` class without `title=` for hover reveal \u2014 app/outils/verificateur-mica/page.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/outils/verificateur-mica/page.tsx:193"}, "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-168758890b140899", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/outils/verificateur-mica/page.tsx:125", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/outils/verificateur-mica/page.tsx:125"}, "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-3d1fc595b86c7557", "name": "`truncate` class without `title=` for hover reveal \u2014 app/vs/page.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/vs/page.tsx:164"}, "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-c8965c9e9e52958a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/analyses-techniques/[slug]/page.tsx:318", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/analyses-techniques/[slug]/page.tsx:318"}, "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-103a6a1e53c0c63c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/guides/declaration-crypto-2026-checklist/page.tsx:170", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/guides/declaration-crypto-2026-checklist/page.tsx:170"}, "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-686e7d2da180b141", "name": "Stray `console.log` in TS/JS \u2014 app/go/[partner]/route.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/go/[partner]/route.ts:40"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a07956334e961109", "name": "TODO/FIXME marker in shipping code \u2014 lib/env.ts:105", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 lib/env.ts:105"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-81f57274e5b22d46", "name": "Stray `console.log` in TS/JS \u2014 lib/env.ts:208", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/env.ts:208"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6d8d9426520878f2", "name": "Stray `console.log` in TS/JS \u2014 lib/exchange-crypto.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/exchange-crypto.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8bb6ef289d742ade", "name": "Privileged port 15 in use", "shortDescription": {"text": "Privileged port 15 in use"}, "fullDescription": {"text": "Port 15 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b8089a2b2ac55bef", "name": "Insecure pattern 'dangerous_innerhtml' in components/StructuredData.tsx:36", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/StructuredData.tsx:36"}, "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-afc07f6f5713d511", "name": "Insecure pattern 'dangerous_innerhtml' in components/SpeculationRules.tsx:108", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/SpeculationRules.tsx:108"}, "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-a8faab021c689eee", "name": "Insecure pattern 'dangerous_innerhtml' in components/calculateur-fiscalite/PdfModal.tsx:382", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/calculateur-fiscalite/PdfModal.tsx:382"}, "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-e73f5fc55acde384", "name": "Insecure pattern 'dangerous_innerhtml' in components/calculateur-fiscalite/PdfPreview.tsx:90", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/calculateur-fiscalite/PdfPreview.tsx:90"}, "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-ca467b9d8c92a902", "name": "Insecure pattern 'dangerous_innerhtml' in components/glossary/CryptoGlossarySection.tsx:113", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/glossary/CryptoGlossarySection.tsx:113"}, "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-495f910aba65515a", "name": "Insecure pattern 'local_storage_auth_token' in components/crypto-detail/CryptoNewsAggregator.tsx:129", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in components/crypto-detail/CryptoNewsAggregator.tsx:129"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1008b4c167a91161", "name": "Insecure pattern 'dangerous_innerhtml' in components/mdx/FAQ.tsx:59", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/mdx/FAQ.tsx:59"}, "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-8b8c057c758c93d8", "name": "Insecure pattern 'dangerous_innerhtml' in components/mdx/FaqAccordion.tsx:49", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/mdx/FaqAccordion.tsx:49"}, "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-2dd504ec00bff5da", "name": "Insecure pattern 'dangerous_innerhtml' in components/mdx/HowToSchema.tsx:112", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/mdx/HowToSchema.tsx:112"}, "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-c81ae99585474db3", "name": "Insecure pattern 'dangerous_innerhtml' in app/cryptos/page.tsx:98", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/cryptos/page.tsx:98"}, "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-93841076c603c23d", "name": "Insecure pattern 'cors_wildcard' in app/monitoring/route.ts:124", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/monitoring/route.ts:124"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-937d39ba68a24a48", "name": "Insecure pattern 'dangerous_innerhtml' in app/ressources/page.tsx:220", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/ressources/page.tsx:220"}, "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-5db14602fb37b150", "name": "Insecure pattern 'dangerous_innerhtml' in app/glossaire/page.tsx:74", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/glossaire/page.tsx:74"}, "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-77e0aebc26486263", "name": "Insecure pattern 'dangerous_innerhtml' in app/glossaire/[slug]/page.tsx:120", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/glossaire/[slug]/page.tsx:120"}, "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-8703651dab5c187c", "name": "Insecure pattern 'cors_wildcard' in app/api/public/route.ts:21", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/route.ts:21"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2f90fb00fc040460", "name": "Insecure pattern 'cors_wildcard' in app/api/public/platforms/route.ts:83", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/platforms/route.ts:83"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-164e2b4a661a91d0", "name": "Insecure pattern 'cors_wildcard' in app/api/public/fiscal-tools/route.ts:65", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/fiscal-tools/route.ts:65"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9adbb7aaf5633680", "name": "Insecure pattern 'cors_wildcard' in app/api/public/glossary/route.ts:65", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/glossary/route.ts:65"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5a800cdbc9e83448", "name": "Insecure pattern 'cors_wildcard' in app/api/public/openapi.json/route.ts:24", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/openapi.json/route.ts:24"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6a25b8f2fe829d4b", "name": "Insecure pattern 'cors_wildcard' in app/api/public/psan-registry/route.ts:78", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/psan-registry/route.ts:78"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b2d1b96cbcfda8b", "name": "Insecure pattern 'cors_wildcard' in app/api/public/top-cryptos/route.ts:66", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/top-cryptos/route.ts:66"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5a040ef963096f8c", "name": "Insecure pattern 'cors_wildcard' in app/api/public/decentralization-scores/route.ts:74", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/decentralization-scores/route.ts:74"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9fb8c850e340167a", "name": "Insecure pattern 'dangerous_innerhtml' in app/partenaires/[slug]/page.tsx:1190", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/partenaires/[slug]/page.tsx:1190"}, "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-cb2be4bbb2028e54", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/embed/v1.js/route.ts:162", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/embed/v1.js/route.ts:162"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a9a7f8595e4fe6a", "name": "Insecure pattern 'cors_wildcard' in app/embed/v1.js/route.ts:391", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/embed/v1.js/route.ts:391"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d31e9cd04950c0ff", "name": "Insecure pattern 'cors_wildcard' in app/api-publique/page.tsx:118", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/api-publique/page.tsx:118"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-184c91e18e026caa", "name": "Insecure pattern 'dangerous_innerhtml' in app/comparatif/[slug]/page.tsx:289", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/comparatif/[slug]/page.tsx:289"}, "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-859b272c4aaab97f", "name": "Insecure pattern 'dangerous_innerhtml' in app/avis/[slug]/page.tsx:301", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/avis/[slug]/page.tsx:301"}, "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-aaca56efb4a324a7", "name": "Insecure pattern 'dangerous_innerhtml' in app/outils/page.tsx:481", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/outils/page.tsx:481"}, "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-a49826eaf4444159", "name": "Insecure pattern 'dangerous_innerhtml' in app/outils/verificateur-mica/page.tsx:125", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/outils/verificateur-mica/page.tsx:125"}, "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-aa5d993547207300", "name": "Insecure pattern 'dangerous_innerhtml' in app/guides/declaration-crypto-2026-checklist/page.tsx:170", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/guides/declaration-crypto-2026-checklist/page.tsx:170"}, "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-c67ec90d4781244c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f26dfe665f9a851", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cc611130ddab6326", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f125132f92b8164b", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9365cde873fecff3", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a38e2562f244d9d", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-65c9bd56493a81d3", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6707bd4715147694", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0aa1446c2867f6af", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-16bd1e295d550f64", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af05dcdf9747b392", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27931ee31963d9f0", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e29c9502eebbaa9c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f2519bd897a6f98", "name": "Very large file: scripts/generate-fiche-crypto.mjs (1302 lines)", "shortDescription": {"text": "Very large file: scripts/generate-fiche-crypto.mjs (1302 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab7f40213d6ca64c", "name": "Very large file: scripts/batch-generate-fiches.mjs (1297 lines)", "shortDescription": {"text": "Very large file: scripts/batch-generate-fiches.mjs (1297 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8af85fe1df61e97a", "name": "Very large file: scripts/lib/seo-topics-data.mjs (1366 lines)", "shortDescription": {"text": "Very large file: scripts/lib/seo-topics-data.mjs (1366 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1246c43c8bfcc7fd", "name": "Very large file: app/cryptos/[slug]/page.tsx (1513 lines)", "shortDescription": {"text": "Very large file: app/cryptos/[slug]/page.tsx (1513 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42c4434a91b35021", "name": "Very large file: app/partenaires/[slug]/page.tsx (1556 lines)", "shortDescription": {"text": "Very large file: app/partenaires/[slug]/page.tsx (1556 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b9df03594b1fa875", "name": "Very large file: app/etudes/fiscalite-crypto-france-2026-guide-cerfa/page.tsx (1118 lines)", "shortDescription": {"text": "Very large file: app/etudes/fiscalite-crypto-france-2026-guide-cerfa/page.tsx (1118 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-85c319bc23a47a52", "name": "Very large file: app/avis/[slug]/page.tsx (1026 lines)", "shortDescription": {"text": "Very large file: app/avis/[slug]/page.tsx (1026 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d9f7d42507d0e04", "name": "Very large file: app/outils/calculateur-fiscalite/page.tsx (1071 lines)", "shortDescription": {"text": "Very large file: app/outils/calculateur-fiscalite/page.tsx (1071 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-407906b9771be4b9", "name": "Very large file: lib/academy-quizzes.ts (1045 lines)", "shortDescription": {"text": "Very large file: lib/academy-quizzes.ts (1045 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ba64d3588b76f048", "name": "Very large file: lib/seo-keyword-targets.ts (1453 lines)", "shortDescription": {"text": "Very large file: lib/seo-keyword-targets.ts (1453 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48f87c562ea597ab", "name": "Very large file: lib/coingecko.ts (1465 lines)", "shortDescription": {"text": "Very large file: lib/coingecko.ts (1465 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "35 test file(s) for 809 source file(s) (ratio 0.04). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5734ebc1d2fbbb9c", "name": "35 TODO/FIXME markers", "shortDescription": {"text": "35 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 401 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 232 placeholder/mock markers across 101 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-1ec06fa59cc69a55", "name": "Commented-code block (6 lines) in tailwind.config.ts:47", "shortDescription": {"text": "Commented-code block (6 lines) in tailwind.config.ts:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-215187be0bda81f7", "name": "Commented-code block (8 lines) in next.config.js:44", "shortDescription": {"text": "Commented-code block (8 lines) in next.config.js:44"}, "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-9ddc04d6ff1adba5", "name": "Commented-code block (10 lines) in middleware.ts:173", "shortDescription": {"text": "Commented-code block (10 lines) in middleware.ts:173"}, "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-d0e5c297488eec26", "name": "Commented-code block (8 lines) in instrumentation-client.ts:59", "shortDescription": {"text": "Commented-code block (8 lines) in instrumentation-client.ts:59"}, "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-a4b4a37e59ca0bbf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 instrumentation-client.ts:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 instrumentation-client.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-53158d1721042861", "name": "Commented-code block (6 lines) in vitest.config.ts:22", "shortDescription": {"text": "Commented-code block (6 lines) in vitest.config.ts:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7bf62fcf4a01c256", "name": "Commented-code block (5 lines) in tests/fiscalite-no-stale-rate.test.ts:27", "shortDescription": {"text": "Commented-code block (5 lines) in tests/fiscalite-no-stale-rate.test.ts:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa61f4e40fe5bbb0", "name": "Commented-code block (5 lines) in tests/lib/cerfa-2086.test.ts:120", "shortDescription": {"text": "Commented-code block (5 lines) in tests/lib/cerfa-2086.test.ts:120"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc56c3b78e38a499", "name": "Legacy-named symbol `pepperOld` in tests/lib/api-keys-hash.test.ts:99", "shortDescription": {"text": "Legacy-named symbol `pepperOld` in tests/lib/api-keys-hash.test.ts:99"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef6bd3eb74f42bde", "name": "Commented-code block (5 lines) in scripts/audit-b2b-schema.mjs:2", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/audit-b2b-schema.mjs:2"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dad6033c8c5e05ef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-fiche-crypto.mjs:111", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-fiche-crypto.mjs:111"}, "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-a68e23fd89cc0ea3", "name": "Commented-code block (6 lines) in scripts/batch-generate-fiches.mjs:81", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/batch-generate-fiches.mjs:81"}, "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-7d6c38b7471a970c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/batch-generate-fiches.mjs:171", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/batch-generate-fiches.mjs:171"}, "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-32cad2aae0655f7d", "name": "Commented-code block (8 lines) in scripts/bench-rider.mjs:1", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/bench-rider.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c9d0d97a229312c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/create-api-key.mjs:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/create-api-key.mjs:84"}, "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-e6578f7be09e3457", "name": "Commented-code block (5 lines) in scripts/fix-nbsp-units.mjs:35", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/fix-nbsp-units.mjs:35"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30122434e912942c", "name": "Commented-code block (5 lines) in scripts/fix-mica-flags.mjs:7", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/fix-mica-flags.mjs:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17c885a0a335d50f", "name": "Commented-code block (6 lines) in scripts/bench-rider-tele.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/bench-rider-tele.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7a0a073b01ebc99b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-ticker-prices-kv.mjs:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-ticker-prices-kv.mjs:49"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-05e747af606d2fe8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-static-details-kv.mjs:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-static-details-kv.mjs:79"}, "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-6b0e68479deeba8d", "name": "Commented-code block (5 lines) in scripts/audit-quality.mjs:76", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/audit-quality.mjs:76"}, "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-10de7d7337297d6c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/audit-quality.mjs:179", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/audit-quality.mjs:179"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1809eedb297e98b2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-all-cryptos-kv.mjs:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-all-cryptos-kv.mjs:96"}, "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-10bbf2365bd6955f", "name": "Commented-code block (7 lines) in scripts/reaudit-existing-fiches.mjs:2", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/reaudit-existing-fiches.mjs:2"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-90660b3bea088ba0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-missing-only.mjs:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-missing-only.mjs:39"}, "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-bbb162a8b7e84dee", "name": "Commented-code block (5 lines) in scripts/build-lead-magnets.mjs:375", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/build-lead-magnets.mjs:375"}, "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-b2d12ae2e9b9987e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/audit-missing-cryptos.mjs:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/audit-missing-cryptos.mjs:46"}, "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-82feeb8c898ea344", "name": "Commented-code block (5 lines) in components/EventCountdown.tsx:36", "shortDescription": {"text": "Commented-code block (5 lines) in components/EventCountdown.tsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b088726b484847b8", "name": "Commented-code block (8 lines) in components/Top10CryptosClient.tsx:324", "shortDescription": {"text": "Commented-code block (8 lines) in components/Top10CryptosClient.tsx:324"}, "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-8927599c256b0275", "name": "Commented-code block (6 lines) in components/MicaCountdown.tsx:71", "shortDescription": {"text": "Commented-code block (6 lines) in components/MicaCountdown.tsx:71"}, "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-e3a3048c37cb1064", "name": "Commented-code block (7 lines) in components/QuizExchange.tsx:185", "shortDescription": {"text": "Commented-code block (7 lines) in components/QuizExchange.tsx:185"}, "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-dd1aa1977b3aa530", "name": "Commented-code block (6 lines) in components/PlatformCard.tsx:93", "shortDescription": {"text": "Commented-code block (6 lines) in components/PlatformCard.tsx:93"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-478bf391587269c0", "name": "Commented-code block (7 lines) in components/LiveCommunityStats.tsx:34", "shortDescription": {"text": "Commented-code block (7 lines) in components/LiveCommunityStats.tsx:34"}, "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-a47669e66fa6fb31", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/LiveCommunityStats.tsx:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/LiveCommunityStats.tsx:11"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b6e00cd5b848b1f", "name": "Legacy-named symbol `pricing_display_v1` in components/TieredPricing.tsx:47", "shortDescription": {"text": "Legacy-named symbol `pricing_display_v1` in components/TieredPricing.tsx:47"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65a830ab9ccb39f2", "name": "Legacy-named symbol `hero_headline_v1` in components/HeroHeadline.tsx:27", "shortDescription": {"text": "Legacy-named symbol `hero_headline_v1` in components/HeroHeadline.tsx:27"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab49261f51a9b4dc", "name": "Commented-code block (7 lines) in components/HeroHeadline.tsx:53", "shortDescription": {"text": "Commented-code block (7 lines) in components/HeroHeadline.tsx:53"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c923fb5ae113016", "name": "Commented-code block (5 lines) in components/PlatformLogo.tsx:127", "shortDescription": {"text": "Commented-code block (5 lines) in components/PlatformLogo.tsx:127"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6061c1e147adb7d2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/PushOptIn.tsx:114", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/PushOptIn.tsx:114"}, "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-1a1bd2791b825efe", "name": "Commented-code block (5 lines) in components/LiveHeatmap.tsx:629", "shortDescription": {"text": "Commented-code block (5 lines) in components/LiveHeatmap.tsx:629"}, "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-151f675567ad3abc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/MiniInvestSimulator.tsx:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/MiniInvestSimulator.tsx:84"}, "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-811822b973689f47", "name": "Legacy-named symbol `hero_headline_v1` in components/HeroPrimaryCta.tsx:7", "shortDescription": {"text": "Legacy-named symbol `hero_headline_v1` in components/HeroPrimaryCta.tsx:7"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35f717be9bfb11f8", "name": "Commented-code block (6 lines) in components/UserLevelBadge.tsx:47", "shortDescription": {"text": "Commented-code block (6 lines) in components/UserLevelBadge.tsx:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11ede42d439420c9", "name": "Commented-code block (13 lines) in components/AffiliateLink.tsx:114", "shortDescription": {"text": "Commented-code block (13 lines) in components/AffiliateLink.tsx:114"}, "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-6791bf51050a29db", "name": "Commented-code block (6 lines) in components/MobileStickyCTA.tsx:81", "shortDescription": {"text": "Commented-code block (6 lines) in components/MobileStickyCTA.tsx:81"}, "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-7bec8a231062600c", "name": "Commented-code block (5 lines) in components/MobileBottomNav.tsx:97", "shortDescription": {"text": "Commented-code block (5 lines) in components/MobileBottomNav.tsx:97"}, "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-45874d8d60fe4e85", "name": "Commented-code block (6 lines) in components/ClarityScript.tsx:64", "shortDescription": {"text": "Commented-code block (6 lines) in components/ClarityScript.tsx:64"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5e3c3cab11a09ecc", "name": "Commented-code block (8 lines) in components/MdxContent.tsx:303", "shortDescription": {"text": "Commented-code block (8 lines) in components/MdxContent.tsx:303"}, "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-465dab4810381e1b", "name": "Commented-code block (5 lines) in components/NewsletterStickyBar.tsx:164", "shortDescription": {"text": "Commented-code block (5 lines) in components/NewsletterStickyBar.tsx:164"}, "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-7cd5d8b6790112e8", "name": "Commented-code block (5 lines) in components/CalculateurFiscalite.tsx:509", "shortDescription": {"text": "Commented-code block (5 lines) in components/CalculateurFiscalite.tsx:509"}, "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-fe77f04265bcd9c3", "name": "Commented-code block (5 lines) in components/HeroLiveWidgetMobile.tsx:188", "shortDescription": {"text": "Commented-code block (5 lines) in components/HeroLiveWidgetMobile.tsx:188"}, "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-7f1d4dcbd4ed88e0", "name": "Legacy-named symbol `hero_headline_v1` in components/Hero.tsx:37", "shortDescription": {"text": "Legacy-named symbol `hero_headline_v1` in components/Hero.tsx:37"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d9060b2046cc3fa3", "name": "Commented-code block (6 lines) in components/SpeculationRules.tsx:64", "shortDescription": {"text": "Commented-code block (6 lines) in components/SpeculationRules.tsx:64"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e101128f3d55b35", "name": "Commented-code block (5 lines) in components/cryptos/QuickCombosGrid.tsx:96", "shortDescription": {"text": "Commented-code block (5 lines) in components/cryptos/QuickCombosGrid.tsx:96"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73a3d827944f92c9", "name": "Commented-code block (8 lines) in components/ui/LiveAge.tsx:20", "shortDescription": {"text": "Commented-code block (8 lines) in components/ui/LiveAge.tsx:20"}, "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-f5dfc5feae1ad8b5", "name": "Commented-code block (6 lines) in components/ui/AnimatedNumber.tsx:56", "shortDescription": {"text": "Commented-code block (6 lines) in components/ui/AnimatedNumber.tsx:56"}, "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-ba48390f0564a809", "name": "Commented-code block (7 lines) in components/ui/CryptoLogo.tsx:75", "shortDescription": {"text": "Commented-code block (7 lines) in components/ui/CryptoLogo.tsx:75"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f43d0535c990adef", "name": "Commented-code block (7 lines) in components/ui/DirectionalNavigator.tsx:46", "shortDescription": {"text": "Commented-code block (7 lines) in components/ui/DirectionalNavigator.tsx:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-198e73318fbdc62a", "name": "Commented-code block (5 lines) in components/hero/HeroPulseRider.tsx:229", "shortDescription": {"text": "Commented-code block (5 lines) in components/hero/HeroPulseRider.tsx:229"}, "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-9f9e34780d832c03", "name": "Commented-code block (5 lines) in components/portfolio/CryptoAutocomplete.tsx:49", "shortDescription": {"text": "Commented-code block (5 lines) in components/portfolio/CryptoAutocomplete.tsx:49"}, "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-999a1da2d00aaa2b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/portfolio/CryptoAutocomplete.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/portfolio/CryptoAutocomplete.tsx:54"}, "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-90e8d51683219234", "name": "Commented-code block (7 lines) in components/crypto-detail/WhaleWatcher.tsx:62", "shortDescription": {"text": "Commented-code block (7 lines) in components/crypto-detail/WhaleWatcher.tsx:62"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb4b78807812490f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/crypto-detail/WhaleWatcher.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/crypto-detail/WhaleWatcher.tsx:82"}, "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-d5036aeab4cba6f2", "name": "Commented-code block (5 lines) in components/crypto-detail/LLMFicheView.tsx:81", "shortDescription": {"text": "Commented-code block (5 lines) in components/crypto-detail/LLMFicheView.tsx:81"}, "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-b6d89f6dd2af3427", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/crypto-detail/MiniOrderBook.tsx:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/crypto-detail/MiniOrderBook.tsx:79"}, "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-cde4cd6e49ba9a72", "name": "Commented-code block (6 lines) in components/crypto-detail/ROISimulator.tsx:185", "shortDescription": {"text": "Commented-code block (6 lines) in components/crypto-detail/ROISimulator.tsx:185"}, "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-adf89f627deef894", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/crypto-detail/ROISimulator.tsx:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/crypto-detail/ROISimulator.tsx:129"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c33c1a9d2ff40c2e", "name": "Commented-code block (6 lines) in components/crypto-detail/CryptoStats.tsx:36", "shortDescription": {"text": "Commented-code block (6 lines) in components/crypto-detail/CryptoStats.tsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dad512139fd42960", "name": "Commented-code block (5 lines) in components/crypto-detail/CryptoNewsAggregator.tsx:90", "shortDescription": {"text": "Commented-code block (5 lines) in components/crypto-detail/CryptoNewsAggregator.tsx:90"}, "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-6d52ec6ad16b46f4", "name": "Commented-code block (6 lines) in components/calendar/CalendarGrid.tsx:71", "shortDescription": {"text": "Commented-code block (6 lines) in components/calendar/CalendarGrid.tsx:71"}, "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-a57482e9429b6eb9", "name": "Commented-code block (7 lines) in app/sitemap.ts:29", "shortDescription": {"text": "Commented-code block (7 lines) in app/sitemap.ts:29"}, "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-de8669c86fc6e692", "name": "Commented-code block (10 lines) in app/page.tsx:53", "shortDescription": {"text": "Commented-code block (10 lines) in app/page.tsx:53"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ddedfb7caabc4cc3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/page.tsx:231", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/page.tsx:231"}, "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-35f6ceeb3d2458cd", "name": "Commented-code block (10 lines) in app/layout.tsx:27", "shortDescription": {"text": "Commented-code block (10 lines) in app/layout.tsx:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-778dba0804c442c0", "name": "Commented-code block (5 lines) in app/cryptos/[slug]/page.tsx:226", "shortDescription": {"text": "Commented-code block (5 lines) in app/cryptos/[slug]/page.tsx:226"}, "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-dd516237f497a288", "name": "Commented-code block (5 lines) in app/cryptos/[slug]/acheter-en-france/page.tsx:57", "shortDescription": {"text": "Commented-code block (5 lines) in app/cryptos/[slug]/acheter-en-france/page.tsx:57"}, "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-42f27bac4d96e15b", "name": "Commented-code block (5 lines) in app/blog/[slug]/opengraph-image.tsx:385", "shortDescription": {"text": "Commented-code block (5 lines) in app/blog/[slug]/opengraph-image.tsx:385"}, "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-6f9be3cd85e89604", "name": "Commented-code block (8 lines) in app/blog/[slug]/page.tsx:51", "shortDescription": {"text": "Commented-code block (8 lines) in app/blog/[slug]/page.tsx:51"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13f446b0d1640758", "name": "Commented-code block (9 lines) in app/actualites/[slug]/page.tsx:49", "shortDescription": {"text": "Commented-code block (9 lines) in app/actualites/[slug]/page.tsx:49"}, "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-8d45219f22b724d8", "name": "Commented-code block (5 lines) in app/comparer/page.tsx:32", "shortDescription": {"text": "Commented-code block (5 lines) in app/comparer/page.tsx:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e2ee9765e9d640b", "name": "Commented-code block (5 lines) in app/monitoring/route.ts:72", "shortDescription": {"text": "Commented-code block (5 lines) in app/monitoring/route.ts:72"}, "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-3d28ed566b7c8bd2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/monitoring/route.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/monitoring/route.ts:72"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c6cf5bb8ad540d5c", "name": "Commented-code block (5 lines) in app/transparence/page.tsx:90", "shortDescription": {"text": "Commented-code block (5 lines) in app/transparence/page.tsx:90"}, "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-d04577b2784dbe6b", "name": "Commented-code block (8 lines) in app/glossaire/[slug]/page.tsx:27", "shortDescription": {"text": "Commented-code block (8 lines) in app/glossaire/[slug]/page.tsx:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae492bcbc7215b80", "name": "Commented-code block (7 lines) in app/api/historical/route.ts:84", "shortDescription": {"text": "Commented-code block (7 lines) in app/api/historical/route.ts:84"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5a79520ad73690a9", "name": "Commented-code block (5 lines) in app/api/diag/api-usage/route.ts:58", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/diag/api-usage/route.ts:58"}, "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-eba0c45b6b950ea5", "name": "Commented-code block (13 lines) in app/api/auth/reset-password/route.ts:67", "shortDescription": {"text": "Commented-code block (13 lines) in app/api/auth/reset-password/route.ts:67"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3454b7acf4dadd0e", "name": "Commented-code block (5 lines) in app/api/auth/login/route.ts:76", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/auth/login/route.ts:76"}, "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-a5777a8d6f02215a", "name": "Commented-code block (5 lines) in app/api/auth/callback/route.ts:64", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/auth/callback/route.ts:64"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e40098c6e4d9f6ec", "name": "Commented-code block (5 lines) in app/api/v1/prices/route.ts:102", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/v1/prices/route.ts:102"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34fd9099099bf52d", "name": "Commented-code block (5 lines) in app/api/analytics/affiliate-click/route.ts:87", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/analytics/affiliate-click/route.ts:87"}, "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-d06aabf2bcbcb9a1", "name": "Commented-code block (6 lines) in app/api/prices/route.ts:46", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/prices/route.ts:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d1a15ab735afd00d", "name": "Commented-code block (5 lines) in app/api/alerts/create/route.ts:106", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/alerts/create/route.ts:106"}, "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-49b9caef27f65690", "name": "Commented-code block (6 lines) in app/api/portfolio-prices/route.ts:68", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/portfolio-prices/route.ts:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-74f9588b80d320e7", "name": "Commented-code block (6 lines) in app/api/cron/refresh-ticker-prices/route.ts:39", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/cron/refresh-ticker-prices/route.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-506a9c727f2b048b", "name": "Commented-code block (5 lines) in app/api/cron/daily-orchestrator/route.ts:64", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/cron/daily-orchestrator/route.ts:64"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b75b6be4fa30599e", "name": "Commented-code block (6 lines) in app/api/cron/generate-ta/route.ts:159", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/cron/generate-ta/route.ts:159"}, "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-6c3cad7beda25172", "name": "Commented-code block (5 lines) in app/api/cron/audit-cryptos-health/route.ts:253", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/cron/audit-cryptos-health/route.ts:253"}, "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-2bd20eb8d10b7816", "name": "Commented-code block (6 lines) in app/api/cron/aggregate-news/route.ts:152", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/cron/aggregate-news/route.ts:152"}, "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-f7c0e50d46172256", "name": "Commented-code block (5 lines) in app/api/cron/refresh-prices/route.ts:162", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/cron/refresh-prices/route.ts:162"}, "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-99b2b09edeb800f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-prices/route.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-prices/route.ts:54"}, "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-da66c8d002283fe5", "name": "Commented-code block (5 lines) in app/api/account/delete/route.ts:94", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/account/delete/route.ts:94"}, "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-25d4e6c64ee4e8f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/public/route.ts:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/public/route.ts:95"}, "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-0a491009e58eb54e", "name": "Commented-code block (6 lines) in app/api/newsletter/subscribe/route.ts:28", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/newsletter/subscribe/route.ts:28"}, "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-5451dbf1b95f0ee4", "name": "Commented-code block (5 lines) in app/api/calculateur-pdf-lead/route.ts:133", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/calculateur-pdf-lead/route.ts:133"}, "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-a47f079617a85307", "name": "Legacy-named symbol `hero_headline_v1` in app/api/abtest/conversion/route.ts:36", "shortDescription": {"text": "Legacy-named symbol `hero_headline_v1` in app/api/abtest/conversion/route.ts:36"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-91b665cafeaf2f39", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/embed/v1.js/route.ts:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/embed/v1.js/route.ts:147"}, "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-51e8d5a0a0c77a32", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/marche/page.tsx:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/marche/page.tsx:119"}, "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-0ceb805cbc7e260a", "name": "Commented-code block (5 lines) in app/mon-compte/dev/actions.ts:51", "shortDescription": {"text": "Commented-code block (5 lines) in app/mon-compte/dev/actions.ts:51"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8cabc5c7fc23567", "name": "Commented-code block (7 lines) in app/quiz/crypto/page.tsx:39", "shortDescription": {"text": "Commented-code block (7 lines) in app/quiz/crypto/page.tsx: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-14d83baf7142634a", "name": "Commented-code block (5 lines) in app/alertes/page.tsx:101", "shortDescription": {"text": "Commented-code block (5 lines) in app/alertes/page.tsx:101"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b923fcaae2f3bca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api-publique/page.tsx:434", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api-publique/page.tsx:434"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc93af08206d7766", "name": "Commented-code block (5 lines) in app/comparatif/page.tsx:482", "shortDescription": {"text": "Commented-code block (5 lines) in app/comparatif/page.tsx:482"}, "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-990de66f0a9fda19", "name": "Commented-code block (7 lines) in app/avis/page.tsx:100", "shortDescription": {"text": "Commented-code block (7 lines) in app/avis/page.tsx:100"}, "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-0895c25e4dcbb151", "name": "Commented-code block (6 lines) in app/outils/page.tsx:45", "shortDescription": {"text": "Commented-code block (6 lines) in app/outils/page.tsx:45"}, "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-bebd0b22e551249e", "name": "Commented-code block (5 lines) in app/outils/calculateur-fiscalite/page.tsx:16", "shortDescription": {"text": "Commented-code block (5 lines) in app/outils/calculateur-fiscalite/page.tsx:16"}, "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-a977fefa94332a98", "name": "Commented-code block (5 lines) in app/historique-prix/page.tsx:26", "shortDescription": {"text": "Commented-code block (5 lines) in app/historique-prix/page.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-87c76f4159b1b16b", "name": "Commented-code block (5 lines) in app/historique-prix/[crypto]/[annee]/page.tsx:52", "shortDescription": {"text": "Commented-code block (5 lines) in app/historique-prix/[crypto]/[annee]/page.tsx:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7715373b2ea3a736", "name": "Commented-code block (5 lines) in app/vs/page.tsx:22", "shortDescription": {"text": "Commented-code block (5 lines) in app/vs/page.tsx:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fdb555577aeb5691", "name": "Commented-code block (8 lines) in app/vs/[a]/[b]/page.tsx:64", "shortDescription": {"text": "Commented-code block (8 lines) in app/vs/[a]/[b]/page.tsx:64"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d1a1c5087618781a", "name": "Commented-code block (7 lines) in app/analyses-techniques/[slug]/page.tsx:45", "shortDescription": {"text": "Commented-code block (7 lines) in app/analyses-techniques/[slug]/page.tsx:45"}, "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-12084c9ab9470c05", "name": "Commented-code block (5 lines) in app/acheter/[crypto]/[pays]/page.tsx:37", "shortDescription": {"text": "Commented-code block (5 lines) in app/acheter/[crypto]/[pays]/page.tsx:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a88ae83513b206c1", "name": "Commented-code block (6 lines) in lib/crypto-slug-aliases.ts:50", "shortDescription": {"text": "Commented-code block (6 lines) in lib/crypto-slug-aliases.ts:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9f6e56b2be05ad7b", "name": "Commented-code block (5 lines) in lib/events-fetcher.ts:197", "shortDescription": {"text": "Commented-code block (5 lines) in lib/events-fetcher.ts:197"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b571ca1e3dc4a8d4", "name": "Commented-code block (5 lines) in lib/schema.ts:854", "shortDescription": {"text": "Commented-code block (5 lines) in lib/schema.ts:854"}, "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-63c8230f609ba046", "name": "Commented-code block (7 lines) in lib/og-fonts.ts:54", "shortDescription": {"text": "Commented-code block (7 lines) in lib/og-fonts.ts:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a7c118d65169225", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/og-fonts.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/og-fonts.ts:11"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ece4a8321ad13162", "name": "Commented-code block (7 lines) in lib/stripe.ts:26", "shortDescription": {"text": "Commented-code block (7 lines) in lib/stripe.ts: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-3d317b47a6cf8db5", "name": "Legacy-named symbol `hero_headline_v1` in lib/abtest.ts:115", "shortDescription": {"text": "Legacy-named symbol `hero_headline_v1` in lib/abtest.ts:115"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1777acd568ae82b4", "name": "Commented-code block (8 lines) in lib/abtest.ts:107", "shortDescription": {"text": "Commented-code block (8 lines) in lib/abtest.ts:107"}, "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-725e5ce37d4ae813", "name": "Commented-code block (5 lines) in lib/onchain-metrics.ts:195", "shortDescription": {"text": "Commented-code block (5 lines) in lib/onchain-metrics.ts:195"}, "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-b50522929a215bcf", "name": "Commented-code block (5 lines) in lib/cryptos-extended.ts:71", "shortDescription": {"text": "Commented-code block (5 lines) in lib/cryptos-extended.ts:71"}, "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-f1d2e720669103a7", "name": "Commented-code block (5 lines) in lib/price-source.ts:42", "shortDescription": {"text": "Commented-code block (5 lines) in lib/price-source.ts:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe26c35cc9016769", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/cryptos.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/cryptos.ts:9"}, "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-214bcfafbdbcf0fc", "name": "Commented-code block (9 lines) in lib/historical-prices.ts:176", "shortDescription": {"text": "Commented-code block (9 lines) in lib/historical-prices.ts:176"}, "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-87ce0ec80f219d45", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/cmdk-actions.ts:289", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/cmdk-actions.ts:289"}, "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-3f8a915c5c775801", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/community-stats.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/community-stats.ts:8"}, "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-82414da8180de045", "name": "Legacy-named symbol `hero_headline_v1` in lib/abtest-experiments.ts:31", "shortDescription": {"text": "Legacy-named symbol `hero_headline_v1` in lib/abtest-experiments.ts:31"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9498a6879c8043e8", "name": "Commented-code block (9 lines) in lib/programmatic.ts:420", "shortDescription": {"text": "Commented-code block (9 lines) in lib/programmatic.ts:420"}, "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-6ddbb36321e6cc35", "name": "Commented-code block (5 lines) in lib/cryptocompare.ts:104", "shortDescription": {"text": "Commented-code block (5 lines) in lib/cryptocompare.ts:104"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b76f185c2b5a19f", "name": "Commented-code block (7 lines) in lib/internal-link-graph.ts:241", "shortDescription": {"text": "Commented-code block (7 lines) in lib/internal-link-graph.ts:241"}, "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-9492122865a87a24", "name": "Commented-code block (7 lines) in lib/alerts.ts:624", "shortDescription": {"text": "Commented-code block (7 lines) in lib/alerts.ts:624"}, "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-22b457fa0f3a8efe", "name": "Commented-code block (6 lines) in lib/search.ts:32", "shortDescription": {"text": "Commented-code block (6 lines) in lib/search.ts:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8dd265820b6b8d87", "name": "Commented-code block (9 lines) in lib/rate-limit.ts:163", "shortDescription": {"text": "Commented-code block (9 lines) in lib/rate-limit.ts:163"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e56242c93cb02d6f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/news-aggregator.ts:496", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/news-aggregator.ts:496"}, "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-927f6b4c011e9117", "name": "Legacy-named symbol `cryptoreflex_compare_v1` in lib/use-compare-list.ts:7", "shortDescription": {"text": "Legacy-named symbol `cryptoreflex_compare_v1` in lib/use-compare-list.ts:7"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca80473b647e9af1", "name": "Commented-code block (6 lines) in lib/remark-auto-link-entities.ts:201", "shortDescription": {"text": "Commented-code block (6 lines) in lib/remark-auto-link-entities.ts:201"}, "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-81364c71d867a8cb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/use-user-plan.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/use-user-plan.ts:68"}, "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-7eec6613a16a9382", "name": "Commented-code block (5 lines) in lib/crypto-logos.ts:29", "shortDescription": {"text": "Commented-code block (5 lines) in lib/crypto-logos.ts:29"}, "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-ee0bbd573f6708cf", "name": "Commented-code block (5 lines) in lib/seo-fiscalite-helpers.ts:192", "shortDescription": {"text": "Commented-code block (5 lines) in lib/seo-fiscalite-helpers.ts:192"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b898d0326bb5786a", "name": "Commented-code block (5 lines) in lib/coingecko.ts:89", "shortDescription": {"text": "Commented-code block (5 lines) in lib/coingecko.ts:89"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27e8c5c0572acf6a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/coingecko.ts:1384", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/coingecko.ts:1384"}, "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-46c98e2d022efc09", "name": "Commented-code block (7 lines) in lib/email/components.ts:91", "shortDescription": {"text": "Commented-code block (7 lines) in lib/email/components.ts:91"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-113c67c36e480712", "name": "Commented-code block (5 lines) in lib/hooks/useLivePrices.ts:66", "shortDescription": {"text": "Commented-code block (5 lines) in lib/hooks/useLivePrices.ts:66"}, "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-9ee3435cad809caf", "name": "Commented-code block (5 lines) in lib/supabase/route-handler.ts:68", "shortDescription": {"text": "Commented-code block (5 lines) in lib/supabase/route-handler.ts:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d3ab1f7c7666d02", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/kucoin.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/kucoin.ts:23"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d1679737e82b45de", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/coinbase.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/coinbase.ts:22"}, "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-5a15eb050bab2675", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/dexscreener.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/dexscreener.ts:42"}, "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-10be335463f15f1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/static.ts:87", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/static.ts:87"}, "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-6f341c195ab2553e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/cryptocompare.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/cryptocompare.ts:24"}, "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-c0f6071a2aca43dd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/kraken.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/kraken.ts:26"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-46ab04176816ec1a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/types.ts:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/types.ts:97"}, "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-20697c6aa2dc5523", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/binance.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/binance.ts:73"}, "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-d13c52fce52507da", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/coingecko.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/coingecko.ts:53"}, "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-c449113710e3e5d2", "name": "Commented-code block (6 lines) in public/sw.js:25", "shortDescription": {"text": "Commented-code block (6 lines) in public/sw.js:25"}, "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-49a8711faa5c8a3e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js: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-d0b17c8c07a7421d", "name": "8 env vars used in code but missing from .env.example", "shortDescription": {"text": "8 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `CRYPTOCOMPARE_API_KEY`, `NEXT_PHASE`, `NEXT_RUNTIME`, `NODE_ENV`, `PLAYWRIGHT_BASE_URL`, `VERCEL`, `VERCEL_ENV`. 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/17603"}, "properties": {"repository": "Qlpha-png/cryptoreflex", "repoUrl": "https://github.com/Qlpha-png/cryptoreflex", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-b74f0240978a7e5e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SearchClient.tsx:237"}, "properties": {"repobilityId": "52b506cac1bacda5", "scanner": "scanner-primary", "fingerprint": "b74f0240978a7e5e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce4d8c0952001970", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CommandPalette.tsx:580"}, "properties": {"repobilityId": "2762e53bf39d7009", "scanner": "scanner-primary", "fingerprint": "ce4d8c0952001970", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c0d1b91a1d45ad9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/Top10CryptosClient.tsx:569"}, "properties": {"repobilityId": "96ea9ac9df0fa23f", "scanner": "scanner-primary", "fingerprint": "3c0d1b91a1d45ad9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a40b4bc41864a566", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MarketTableClient.tsx:353"}, "properties": {"repobilityId": "f3bb1549d07e0cb0", "scanner": "scanner-primary", "fingerprint": "a40b4bc41864a566", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e211c02227b77d7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/GainerLoserList.tsx:85"}, "properties": {"repobilityId": "347ee9036c8f7add", "scanner": "scanner-primary", "fingerprint": "5e211c02227b77d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e27ac1d382449b94", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/NewsletterInline.tsx:266"}, "properties": {"repobilityId": "c348888bf80c4d0b", "scanner": "scanner-primary", "fingerprint": "e27ac1d382449b94", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff2f77a714fdde33", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/NewsBarRotator.tsx:111"}, "properties": {"repobilityId": "51aeb1b917772561", "scanner": "scanner-primary", "fingerprint": "ff2f77a714fdde33", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc391e417e3f6685", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/HeroPriceChart.tsx:150"}, "properties": {"repobilityId": "8f65144d840762ba", "scanner": "scanner-primary", "fingerprint": "dc391e417e3f6685", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-773658f3f65b08be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PlatformCard.tsx:133"}, "properties": {"repobilityId": "e0c529056174b5cf", "scanner": "scanner-primary", "fingerprint": "773658f3f65b08be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20c38ec686533a58", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/StructuredData.tsx:36"}, "properties": {"repobilityId": "edede6e915b82a4d", "scanner": "scanner-primary", "fingerprint": "20c38ec686533a58", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-685533c8ba45a803", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/WatchlistView.tsx:322"}, "properties": {"repobilityId": "628e5cf57b2b7e99", "scanner": "scanner-primary", "fingerprint": "685533c8ba45a803", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dcb673fcf2656ae0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PriceCards.tsx:36"}, "properties": {"repobilityId": "691d83c5c8a7674b", "scanner": "scanner-primary", "fingerprint": "dcb673fcf2656ae0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38bddc519ab1c2f0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/StakingComparator.tsx:195"}, "properties": {"repobilityId": "955e6b8a674f1744", "scanner": "scanner-primary", "fingerprint": "38bddc519ab1c2f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72fe4c3198934576", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PlatformQuiz.tsx:736"}, "properties": {"repobilityId": "54bfe0c94c472c91", "scanner": "scanner-primary", "fingerprint": "72fe4c3198934576", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a464458b60a24b0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AddHoldingDialog.tsx:322"}, "properties": {"repobilityId": "293e421400f0b093", "scanner": "scanner-primary", "fingerprint": "9a464458b60a24b0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7eabc629deb4f55f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MobileStickyCTA.tsx:100"}, "properties": {"repobilityId": "ffbd95481e8b36d7", "scanner": "scanner-primary", "fingerprint": "7eabc629deb4f55f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-83718a553e9aacbb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/NewsTicker.tsx:114"}, "properties": {"repobilityId": "aef867670e83b7e3", "scanner": "scanner-primary", "fingerprint": "83718a553e9aacbb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8c67b3f594c27f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PortfolioView.tsx:638"}, "properties": {"repobilityId": "2d3be1ea448e5798", "scanner": "scanner-primary", "fingerprint": "b8c67b3f594c27f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0b714a81584b0e51", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MicaVerifier.tsx:176"}, "properties": {"repobilityId": "ca26da1cef2837df", "scanner": "scanner-primary", "fingerprint": "0b714a81584b0e51", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19bb3eccaeaf5984", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PortfolioPieChart.tsx:246"}, "properties": {"repobilityId": "1836f65205dbba65", "scanner": "scanner-primary", "fingerprint": "19bb3eccaeaf5984", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-749d342e3aa9720e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CryptoQuiz.tsx:729"}, "properties": {"repobilityId": "32ac94ecbc341ad8", "scanner": "scanner-primary", "fingerprint": "749d342e3aa9720e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d56f7f9e68b1fc70", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/RelatedEntities.tsx:150"}, "properties": {"repobilityId": "567cd3048997663b", "scanner": "scanner-primary", "fingerprint": "d56f7f9e68b1fc70", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ec310a4d9e719c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/FirstPurchaseWizard.tsx:897"}, "properties": {"repobilityId": "0648722953aa9a40", "scanner": "scanner-primary", "fingerprint": "8ec310a4d9e719c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-53c57a077dc9e0e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/HeroLiveWidget.tsx:164"}, "properties": {"repobilityId": "715eb4e088d5a359", "scanner": "scanner-primary", "fingerprint": "53c57a077dc9e0e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c3439229999f137", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/HiddenGemsSection.tsx:113"}, "properties": {"repobilityId": "cd0eabe432b9855f", "scanner": "scanner-primary", "fingerprint": "4c3439229999f137", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9543e3df5688bb86", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/HeroLiveWidgetMobile.tsx:136"}, "properties": {"repobilityId": "14ec9db7c4e83b75", "scanner": "scanner-primary", "fingerprint": "9543e3df5688bb86", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8305b19feb07c5a2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/SpeculationRules.tsx:108"}, "properties": {"repobilityId": "b725168153f76b6a", "scanner": "scanner-primary", "fingerprint": "8305b19feb07c5a2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e2d37f1c66eb4cc7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/CopyCompareLink.tsx:46"}, "properties": {"repobilityId": "0ae29bd94487cdd8", "scanner": "scanner-primary", "fingerprint": "e2d37f1c66eb4cc7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-43a3fd9100f54344", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/QuickCombosGrid.tsx:122"}, "properties": {"repobilityId": "c2a98f1318c68acf", "scanner": "scanner-primary", "fingerprint": "43a3fd9100f54344", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-16de49fb6f49a325", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/CompareSelector.tsx:282"}, "properties": {"repobilityId": "4ea2d7a0315f5c93", "scanner": "scanner-primary", "fingerprint": "16de49fb6f49a325", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c971b270c4cf4bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cryptos/CryptosBrowser.tsx:394"}, "properties": {"repobilityId": "a8dceaab1f588ec1", "scanner": "scanner-primary", "fingerprint": "0c971b270c4cf4bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5bc939f6516243a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/calculateur-fiscalite/PdfModal.tsx:382"}, "properties": {"repobilityId": "0f4fcc01078a67ca", "scanner": "scanner-primary", "fingerprint": "e5bc939f6516243a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-202ae1f0668e638f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/calculateur-fiscalite/PdfPreview.tsx:90"}, "properties": {"repobilityId": "87d15df5cea9890f", "scanner": "scanner-primary", "fingerprint": "202ae1f0668e638f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0481f1cbd8be7f3d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/email/FiscaliteEmailTemplate.tsx:25"}, "properties": {"repobilityId": "aa82a533c35d9e4a", "scanner": "scanner-primary", "fingerprint": "0481f1cbd8be7f3d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6539837ce6b49880", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/academy/AcademyResumeBanner.tsx:89"}, "properties": {"repobilityId": "0a3e14140b0e5be0", "scanner": "scanner-primary", "fingerprint": "6539837ce6b49880", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36e0a22326721d9e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/fiscal-tools/StickyWaltioCta.tsx:101"}, "properties": {"repobilityId": "f40915ab85b88ee9", "scanner": "scanner-primary", "fingerprint": "36e0a22326721d9e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-09945bcbd5b1e666", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/fiscal-tools/WaltioPromoBanner.tsx:77"}, "properties": {"repobilityId": "f8062edc5ac25f92", "scanner": "scanner-primary", "fingerprint": "09945bcbd5b1e666", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8bf223bba4b4827c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/glossary/CryptoGlossarySection.tsx:196"}, "properties": {"repobilityId": "fd128ad8fefd9578", "scanner": "scanner-primary", "fingerprint": "8bf223bba4b4827c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e02ef46581af4b4e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/glossary/CryptoGlossarySection.tsx:113"}, "properties": {"repobilityId": "9b1f790d661eccc4", "scanner": "scanner-primary", "fingerprint": "e02ef46581af4b4e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fe3ea67810d501cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/portfolio/PortfolioRow.tsx:79"}, "properties": {"repobilityId": "edbf5571319f7e89", "scanner": "scanner-primary", "fingerprint": "fe3ea67810d501cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d38fd0bbceffc672", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/portfolio/CryptoAutocomplete.tsx:144"}, "properties": {"repobilityId": "b8e1400341b37e68", "scanner": "scanner-primary", "fingerprint": "d38fd0bbceffc672", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f5204bc0be0dc2f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ta/AnalysesIndexClient.tsx:320"}, "properties": {"repobilityId": "cdbb3c9e8da9df2e", "scanner": "scanner-primary", "fingerprint": "f5204bc0be0dc2f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c781c0490cf6aa5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/news/NewsCard.tsx:92"}, "properties": {"repobilityId": "131ec87bbd579fe8", "scanner": "scanner-primary", "fingerprint": "4c781c0490cf6aa5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1f7d32f5136eeb8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/WhaleWatcher.tsx:297"}, "properties": {"repobilityId": "3636ed0f7a221cc9", "scanner": "scanner-primary", "fingerprint": "d1f7d32f5136eeb8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2855c7de30bd775f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/WhitepaperTldr.tsx:107"}, "properties": {"repobilityId": "41b1cb2d41550f17", "scanner": "scanner-primary", "fingerprint": "2855c7de30bd775f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae117cc63481bac3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/OnChainMetricsLive.tsx:191"}, "properties": {"repobilityId": "82e12c5c12e7f290", "scanner": "scanner-primary", "fingerprint": "ae117cc63481bac3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebc5837f9f597c52", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/QuickBuyBox.tsx:142"}, "properties": {"repobilityId": "ef69a568bae612f0", "scanner": "scanner-primary", "fingerprint": "ebc5837f9f597c52", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d45262fec84f197", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoSources.tsx:135"}, "properties": {"repobilityId": "729abf40ceb814f7", "scanner": "scanner-primary", "fingerprint": "6d45262fec84f197", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5cf976998a4be13", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoStats.tsx:325"}, "properties": {"repobilityId": "99845ac99fec6e0b", "scanner": "scanner-primary", "fingerprint": "d5cf976998a4be13", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b33659765916d7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/StickyBreadcrumb.tsx:115"}, "properties": {"repobilityId": "201eaf28aa66faa9", "scanner": "scanner-primary", "fingerprint": "8b33659765916d7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4685c6093a15fead", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/NextEventCountdown.tsx:126"}, "properties": {"repobilityId": "efa7e0076b93fb50", "scanner": "scanner-primary", "fingerprint": "4685c6093a15fead", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-933ca5fd7aaf1a2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoQuickSwitcher.tsx:221"}, "properties": {"repobilityId": "e8b1d604769bd5ac", "scanner": "scanner-primary", "fingerprint": "933ca5fd7aaf1a2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ad5ae2e3e2b31b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crypto-detail/CryptoNewsAggregator.tsx:276"}, "properties": {"repobilityId": "1859521822f0e27f", "scanner": "scanner-primary", "fingerprint": "1ad5ae2e3e2b31b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8905fde76df02dee", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/mdx/FAQ.tsx:59"}, "properties": {"repobilityId": "41a3e7b11fe461e0", "scanner": "scanner-primary", "fingerprint": "8905fde76df02dee", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-903560f3beeaa6e1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/mdx/FaqAccordion.tsx:49"}, "properties": {"repobilityId": "4ebbc411dc569ea5", "scanner": "scanner-primary", "fingerprint": "903560f3beeaa6e1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-77b5e4b993b89cc1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/mdx/HowToSchema.tsx:112"}, "properties": {"repobilityId": "85a3d44e0f5215c3", "scanner": "scanner-primary", "fingerprint": "77b5e4b993b89cc1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1af5f5c8f0159163", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/CalendarGrid.tsx:318"}, "properties": {"repobilityId": "53a640e5955015dd", "scanner": "scanner-primary", "fingerprint": "1af5f5c8f0159163", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90705c658e532e26", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/layout.tsx:67"}, "properties": {"repobilityId": "34250da41865f4b7", "scanner": "scanner-primary", "fingerprint": "90705c658e532e26", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-631b1576d40f3b0b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/cryptos/page.tsx:98"}, "properties": {"repobilityId": "0238666ba1f38d83", "scanner": "scanner-primary", "fingerprint": "631b1576d40f3b0b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-de9c81606e9b243b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/cryptos/comparer/page.tsx:596"}, "properties": {"repobilityId": "34c936ffaf07935e", "scanner": "scanner-primary", "fingerprint": "de9c81606e9b243b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ee98450ea1e0472", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/airdrops/page.tsx:420"}, "properties": {"repobilityId": "7eadeca5f683c803", "scanner": "scanner-primary", "fingerprint": "9ee98450ea1e0472", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f4fd795c5b7be68", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/ressources/page.tsx:220"}, "properties": {"repobilityId": "ac3f2ce0791fb68d", "scanner": "scanner-primary", "fingerprint": "3f4fd795c5b7be68", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9a837df8460fc01a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/glossaire/page.tsx:74"}, "properties": {"repobilityId": "940e800219b4ac43", "scanner": "scanner-primary", "fingerprint": "9a837df8460fc01a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-929cd25366ea8f29", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/glossaire/[slug]/page.tsx:120"}, "properties": {"repobilityId": "fa2ce02f338e1af8", "scanner": "scanner-primary", "fingerprint": "929cd25366ea8f29", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4540e94ca1d0dedf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/auth/reset-password/route.ts:114"}, "properties": {"repobilityId": "ed3f2d3ce5002e64", "scanner": "scanner-primary", "fingerprint": "4540e94ca1d0dedf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ba619f49ec07492d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/auth/login/route.ts:162"}, "properties": {"repobilityId": "6186c9c9e7d34e8b", "scanner": "scanner-primary", "fingerprint": "ba619f49ec07492d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6c91edc375c59e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/admin/set-password/route.ts:130"}, "properties": {"repobilityId": "d9b657b9877de8db", "scanner": "scanner-primary", "fingerprint": "f6c91edc375c59e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f0e507cec9a2625", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/daily-brief/route.ts:325"}, "properties": {"repobilityId": "004dcbb1e3c4d1d1", "scanner": "scanner-primary", "fingerprint": "1f0e507cec9a2625", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8677a76476f9bc77", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/daily-orchestrator/route.ts:159"}, "properties": {"repobilityId": "f4311879b35bb5dd", "scanner": "scanner-primary", "fingerprint": "8677a76476f9bc77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d909ae39df3003a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/email-series-fiscalite/route.ts:175"}, "properties": {"repobilityId": "38254c2669b75a27", "scanner": "scanner-primary", "fingerprint": "d909ae39df3003a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cba8394b7840d968", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/account/delete/route.ts:152"}, "properties": {"repobilityId": "6c564be3f2775bf7", "scanner": "scanner-primary", "fingerprint": "cba8394b7840d968", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-812e87d8586ae728", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/partenaires/[slug]/page.tsx:1190"}, "properties": {"repobilityId": "0398fbee846d3f8c", "scanner": "scanner-primary", "fingerprint": "812e87d8586ae728", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-be462571cb7e1de4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/marche/whales/page.tsx:426"}, "properties": {"repobilityId": "4c116792514437c4", "scanner": "scanner-primary", "fingerprint": "be462571cb7e1de4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65d7cff0ecd9382c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/mon-compte/dev/page.tsx:145"}, "properties": {"repobilityId": "bdf24d915d0a8ea5", "scanner": "scanner-primary", "fingerprint": "65d7cff0ecd9382c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35902e2307f4066d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/alternative-a/page.tsx:87"}, "properties": {"repobilityId": "17801c2edc840d21", "scanner": "scanner-primary", "fingerprint": "35902e2307f4066d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-864a789ac202cb8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/comparatif/page.tsx:493"}, "properties": {"repobilityId": "e91033023e68a7b4", "scanner": "scanner-primary", "fingerprint": "864a789ac202cb8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9fe355c0aa67b3ac", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/comparatif/[slug]/page.tsx:289"}, "properties": {"repobilityId": "177ef45c67605281", "scanner": "scanner-primary", "fingerprint": "9fe355c0aa67b3ac", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-866af5aae20b705b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/avis/page.tsx:271"}, "properties": {"repobilityId": "b986184c4bf267e9", "scanner": "scanner-primary", "fingerprint": "866af5aae20b705b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18db65508a75c9c4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/avis/[slug]/page.tsx:301"}, "properties": {"repobilityId": "c1eeda7c2364ed3e", "scanner": "scanner-primary", "fingerprint": "18db65508a75c9c4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-566ae87fc50a1390", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/outils/page.tsx:481"}, "properties": {"repobilityId": "fedbfd13bfbada66", "scanner": "scanner-primary", "fingerprint": "566ae87fc50a1390", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-537b348f8d4f53d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/outils/verificateur-mica/page.tsx:193"}, "properties": {"repobilityId": "b3375bd4f80e07a4", "scanner": "scanner-primary", "fingerprint": "537b348f8d4f53d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-168758890b140899", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/outils/verificateur-mica/page.tsx:125"}, "properties": {"repobilityId": "d4f0b85621ab3b1f", "scanner": "scanner-primary", "fingerprint": "168758890b140899", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3d1fc595b86c7557", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/vs/page.tsx:164"}, "properties": {"repobilityId": "a95d4737c107b773", "scanner": "scanner-primary", "fingerprint": "3d1fc595b86c7557", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8965c9e9e52958a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/analyses-techniques/[slug]/page.tsx:318"}, "properties": {"repobilityId": "fa314add1f350183", "scanner": "scanner-primary", "fingerprint": "c8965c9e9e52958a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-103a6a1e53c0c63c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/guides/declaration-crypto-2026-checklist/page.tsx:170"}, "properties": {"repobilityId": "edb7bcf13d459134", "scanner": "scanner-primary", "fingerprint": "103a6a1e53c0c63c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-686e7d2da180b141", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/go/[partner]/route.ts:40"}, "properties": {"repobilityId": "3447007c4aa1c8ad", "scanner": "scanner-primary", "fingerprint": "686e7d2da180b141", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a07956334e961109", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 lib/env.ts:105"}, "properties": {"repobilityId": "483728723d6d26e7", "scanner": "scanner-primary", "fingerprint": "a07956334e961109", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-81f57274e5b22d46", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/env.ts:208"}, "properties": {"repobilityId": "bd8ba38b8529d1ab", "scanner": "scanner-primary", "fingerprint": "81f57274e5b22d46", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6d8d9426520878f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/exchange-crypto.ts:15"}, "properties": {"repobilityId": "58685ce080c6e7bb", "scanner": "scanner-primary", "fingerprint": "6d8d9426520878f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8bb6ef289d742ade", "level": "warning", "message": {"text": "Privileged port 15 in use"}, "properties": {"repobilityId": "3340f9a170f285cd", "scanner": "scanner-primary", "fingerprint": "8bb6ef289d742ade", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/programmatic.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b8089a2b2ac55bef", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/StructuredData.tsx:36"}, "properties": {"repobilityId": "f68753f9eb1eaa2d", "scanner": "scanner-primary", "fingerprint": "b8089a2b2ac55bef", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/StructuredData.tsx"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-afc07f6f5713d511", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/SpeculationRules.tsx:108"}, "properties": {"repobilityId": "9da0e9abd3973277", "scanner": "scanner-primary", "fingerprint": "afc07f6f5713d511", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/SpeculationRules.tsx"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-a8faab021c689eee", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/calculateur-fiscalite/PdfModal.tsx:382"}, "properties": {"repobilityId": "f281cb79cd3f3bc6", "scanner": "scanner-primary", "fingerprint": "a8faab021c689eee", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/calculateur-fiscalite/PdfModal.tsx"}, "region": {"startLine": 382}}}]}, {"ruleId": "scanner-e73f5fc55acde384", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/calculateur-fiscalite/PdfPreview.tsx:90"}, "properties": {"repobilityId": "43fdc5649b596d1b", "scanner": "scanner-primary", "fingerprint": "e73f5fc55acde384", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/calculateur-fiscalite/PdfPreview.tsx"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-ca467b9d8c92a902", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/glossary/CryptoGlossarySection.tsx:113"}, "properties": {"repobilityId": "1fce46d2f634fc41", "scanner": "scanner-primary", "fingerprint": "ca467b9d8c92a902", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/glossary/CryptoGlossarySection.tsx"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-495f910aba65515a", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in components/crypto-detail/CryptoNewsAggregator.tsx:129"}, "properties": {"repobilityId": "3360caa8031a1671", "scanner": "scanner-primary", "fingerprint": "495f910aba65515a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/crypto-detail/CryptoNewsAggregator.tsx"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-1008b4c167a91161", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/mdx/FAQ.tsx:59"}, "properties": {"repobilityId": "061f338892887867", "scanner": "scanner-primary", "fingerprint": "1008b4c167a91161", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/mdx/FAQ.tsx"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-8b8c057c758c93d8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/mdx/FaqAccordion.tsx:49"}, "properties": {"repobilityId": "e762fb4191bf6b1d", "scanner": "scanner-primary", "fingerprint": "8b8c057c758c93d8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/mdx/FaqAccordion.tsx"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-2dd504ec00bff5da", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/mdx/HowToSchema.tsx:112"}, "properties": {"repobilityId": "fa44b44a4e0257b8", "scanner": "scanner-primary", "fingerprint": "2dd504ec00bff5da", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/mdx/HowToSchema.tsx"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-c81ae99585474db3", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/cryptos/page.tsx:98"}, "properties": {"repobilityId": "6ed8771be7a98642", "scanner": "scanner-primary", "fingerprint": "c81ae99585474db3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/cryptos/page.tsx"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-93841076c603c23d", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/monitoring/route.ts:124"}, "properties": {"repobilityId": "0431bfa426640362", "scanner": "scanner-primary", "fingerprint": "93841076c603c23d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/monitoring/route.ts"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-937d39ba68a24a48", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/ressources/page.tsx:220"}, "properties": {"repobilityId": "fdd04129d2a70368", "scanner": "scanner-primary", "fingerprint": "937d39ba68a24a48", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/ressources/page.tsx"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-5db14602fb37b150", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/glossaire/page.tsx:74"}, "properties": {"repobilityId": "236e08a51e301b5c", "scanner": "scanner-primary", "fingerprint": "5db14602fb37b150", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/glossaire/page.tsx"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-77e0aebc26486263", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/glossaire/[slug]/page.tsx:120"}, "properties": {"repobilityId": "1e26d9a30d82bc63", "scanner": "scanner-primary", "fingerprint": "77e0aebc26486263", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/glossaire/[slug]/page.tsx"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-8703651dab5c187c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/route.ts:21"}, "properties": {"repobilityId": "bc052f33f664ee66", "scanner": "scanner-primary", "fingerprint": "8703651dab5c187c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/public/route.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-2f90fb00fc040460", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/platforms/route.ts:83"}, "properties": {"repobilityId": "f7eb21be22c6b70e", "scanner": "scanner-primary", "fingerprint": "2f90fb00fc040460", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/public/platforms/route.ts"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-164e2b4a661a91d0", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/fiscal-tools/route.ts:65"}, "properties": {"repobilityId": "da00adffbc5739a7", "scanner": "scanner-primary", "fingerprint": "164e2b4a661a91d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/public/fiscal-tools/route.ts"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-9adbb7aaf5633680", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/glossary/route.ts:65"}, "properties": {"repobilityId": "ab5ca45e57b63dbc", "scanner": "scanner-primary", "fingerprint": "9adbb7aaf5633680", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/public/glossary/route.ts"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-5a800cdbc9e83448", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/openapi.json/route.ts:24"}, "properties": {"repobilityId": "37d76410f5dc64df", "scanner": "scanner-primary", "fingerprint": "5a800cdbc9e83448", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/public/openapi.json/route.ts"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-6a25b8f2fe829d4b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/psan-registry/route.ts:78"}, "properties": {"repobilityId": "9cdfd5b7c1316f52", "scanner": "scanner-primary", "fingerprint": "6a25b8f2fe829d4b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/public/psan-registry/route.ts"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-8b2d1b96cbcfda8b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/top-cryptos/route.ts:66"}, "properties": {"repobilityId": "30da9f1af9571c84", "scanner": "scanner-primary", "fingerprint": "8b2d1b96cbcfda8b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/public/top-cryptos/route.ts"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-5a040ef963096f8c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/api/public/decentralization-scores/route.ts:74"}, "properties": {"repobilityId": "4b0395fca13a30dd", "scanner": "scanner-primary", "fingerprint": "5a040ef963096f8c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/public/decentralization-scores/route.ts"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-9fb8c850e340167a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/partenaires/[slug]/page.tsx:1190"}, "properties": {"repobilityId": "0fee35b714bf4c1f", "scanner": "scanner-primary", "fingerprint": "9fb8c850e340167a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/partenaires/[slug]/page.tsx"}, "region": {"startLine": 1190}}}]}, {"ruleId": "scanner-cb2be4bbb2028e54", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/embed/v1.js/route.ts:162"}, "properties": {"repobilityId": "8c6d9a6d33f0c0cc", "scanner": "scanner-primary", "fingerprint": "cb2be4bbb2028e54", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/embed/v1.js/route.ts"}, "region": {"startLine": 162}}}]}, {"ruleId": "scanner-7a9a7f8595e4fe6a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/embed/v1.js/route.ts:391"}, "properties": {"repobilityId": "fbfddb30cf07cb95", "scanner": "scanner-primary", "fingerprint": "7a9a7f8595e4fe6a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/embed/v1.js/route.ts"}, "region": {"startLine": 391}}}]}, {"ruleId": "scanner-d31e9cd04950c0ff", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/api-publique/page.tsx:118"}, "properties": {"repobilityId": "8bc72169943b3125", "scanner": "scanner-primary", "fingerprint": "d31e9cd04950c0ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api-publique/page.tsx"}, "region": {"startLine": 118}}}]}, {"ruleId": "scanner-184c91e18e026caa", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/comparatif/[slug]/page.tsx:289"}, "properties": {"repobilityId": "ad5a21fe5c1c3610", "scanner": "scanner-primary", "fingerprint": "184c91e18e026caa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/comparatif/[slug]/page.tsx"}, "region": {"startLine": 289}}}]}, {"ruleId": "scanner-859b272c4aaab97f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/avis/[slug]/page.tsx:301"}, "properties": {"repobilityId": "3bfb0038b1058ebb", "scanner": "scanner-primary", "fingerprint": "859b272c4aaab97f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/avis/[slug]/page.tsx"}, "region": {"startLine": 301}}}]}, {"ruleId": "scanner-aaca56efb4a324a7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/outils/page.tsx:481"}, "properties": {"repobilityId": "aeeb3c394c971dc8", "scanner": "scanner-primary", "fingerprint": "aaca56efb4a324a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/outils/page.tsx"}, "region": {"startLine": 481}}}]}, {"ruleId": "scanner-a49826eaf4444159", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/outils/verificateur-mica/page.tsx:125"}, "properties": {"repobilityId": "6aa7d7bca8d36c78", "scanner": "scanner-primary", "fingerprint": "a49826eaf4444159", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/outils/verificateur-mica/page.tsx"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-aa5d993547207300", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/guides/declaration-crypto-2026-checklist/page.tsx:170"}, "properties": {"repobilityId": "6aeb8085a1822ae8", "scanner": "scanner-primary", "fingerprint": "aa5d993547207300", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/guides/declaration-crypto-2026-checklist/page.tsx"}, "region": {"startLine": 170}}}]}, {"ruleId": "scanner-c67ec90d4781244c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "861fa6b575f7dfa0", "scanner": "scanner-primary", "fingerprint": "c67ec90d4781244c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/daily-content.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-c67ec90d4781244c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "04e1f835b48c3799", "scanner": "scanner-primary", "fingerprint": "c67ec90d4781244c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/daily-content.yml"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-c67ec90d4781244c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a9094b0941276a01", "scanner": "scanner-primary", "fingerprint": "c67ec90d4781244c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/daily-content.yml"}, "region": {"startLine": 159}}}]}, {"ruleId": "scanner-0f26dfe665f9a851", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "e3c6c2b826d38f59", "scanner": "scanner-primary", "fingerprint": "0f26dfe665f9a851", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/daily-content.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cc611130ddab6326", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4dc07a1c84690c99", "scanner": "scanner-primary", "fingerprint": "cc611130ddab6326", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/freshness-check.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-cc611130ddab6326", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3254658c9f6477ea", "scanner": "scanner-primary", "fingerprint": "cc611130ddab6326", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/freshness-check.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-cc611130ddab6326", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "55de2f49215e63e8", "scanner": "scanner-primary", "fingerprint": "cc611130ddab6326", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/freshness-check.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-f125132f92b8164b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "33b3c009d3d78070", "scanner": "scanner-primary", "fingerprint": "f125132f92b8164b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/batch-fiches.yml"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-f125132f92b8164b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2d13844b57917654", "scanner": "scanner-primary", "fingerprint": "f125132f92b8164b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/batch-fiches.yml"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-9365cde873fecff3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e3786c2724f0f4f4", "scanner": "scanner-primary", "fingerprint": "9365cde873fecff3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/weekly-blog.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-9365cde873fecff3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ce87da8bd9db8f86", "scanner": "scanner-primary", "fingerprint": "9365cde873fecff3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/weekly-blog.yml"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-9365cde873fecff3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "df1f0494d9f34a6d", "scanner": "scanner-primary", "fingerprint": "9365cde873fecff3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/weekly-blog.yml"}, "region": {"startLine": 131}}}]}, {"ruleId": "scanner-9a38e2562f244d9d", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "0a96c09a5aaf33b1", "scanner": "scanner-primary", "fingerprint": "9a38e2562f244d9d", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/weekly-blog.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "959b10a5a2338a0a", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0594fc417402ba44", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3b3d8b8ee5da1f9b", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8e879d8d5d310b9f", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8e879d8d5d310b9f", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-6707bd4715147694", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3a568592f5eae229", "scanner": "scanner-primary", "fingerprint": "6707bd4715147694", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/audit-b2b-schema.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-6707bd4715147694", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d01f861e0c82721f", "scanner": "scanner-primary", "fingerprint": "6707bd4715147694", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/audit-b2b-schema.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-6707bd4715147694", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ef60b8c442e442de", "scanner": "scanner-primary", "fingerprint": "6707bd4715147694", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/audit-b2b-schema.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-0aa1446c2867f6af", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "51a7e4e07e9baf95", "scanner": "scanner-primary", "fingerprint": "0aa1446c2867f6af", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/refresh-static-details-kv.yml"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-0aa1446c2867f6af", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a0aad41a91e68831", "scanner": "scanner-primary", "fingerprint": "0aa1446c2867f6af", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/refresh-static-details-kv.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-16bd1e295d550f64", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6eda521160e30bbe", "scanner": "scanner-primary", "fingerprint": "16bd1e295d550f64", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/weekly-events.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-16bd1e295d550f64", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "339af1cefe9b829f", "scanner": "scanner-primary", "fingerprint": "16bd1e295d550f64", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/weekly-events.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-16bd1e295d550f64", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "49e8e8192eecf116", "scanner": "scanner-primary", "fingerprint": "16bd1e295d550f64", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/weekly-events.yml"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-af05dcdf9747b392", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "6da41c6f554f9232", "scanner": "scanner-primary", "fingerprint": "af05dcdf9747b392", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/weekly-events.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-27931ee31963d9f0", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2f399189650e0f27", "scanner": "scanner-primary", "fingerprint": "27931ee31963d9f0", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/health-check.yml"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-27931ee31963d9f0", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cb554af21be9a78b", "scanner": "scanner-primary", "fingerprint": "27931ee31963d9f0", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/health-check.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-27931ee31963d9f0", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b8707bf7c845b4f8", "scanner": "scanner-primary", "fingerprint": "27931ee31963d9f0", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/health-check.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-e29c9502eebbaa9c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c80bdd217283fc0e", "scanner": "scanner-primary", "fingerprint": "e29c9502eebbaa9c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test-fiche-pipeline.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-e29c9502eebbaa9c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b71a85a0cd8fe9f0", "scanner": "scanner-primary", "fingerprint": "e29c9502eebbaa9c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test-fiche-pipeline.yml"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-e29c9502eebbaa9c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2d22066989251204", "scanner": "scanner-primary", "fingerprint": "e29c9502eebbaa9c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test-fiche-pipeline.yml"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-2f2519bd897a6f98", "level": "note", "message": {"text": "Very large file: scripts/generate-fiche-crypto.mjs (1302 lines)"}, "properties": {"repobilityId": "676542c6d7af79af", "scanner": "scanner-primary", "fingerprint": "2f2519bd897a6f98", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ab7f40213d6ca64c", "level": "note", "message": {"text": "Very large file: scripts/batch-generate-fiches.mjs (1297 lines)"}, "properties": {"repobilityId": "c056c4bfece96a3b", "scanner": "scanner-primary", "fingerprint": "ab7f40213d6ca64c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8af85fe1df61e97a", "level": "note", "message": {"text": "Very large file: scripts/lib/seo-topics-data.mjs (1366 lines)"}, "properties": {"repobilityId": "200b13bf29489849", "scanner": "scanner-primary", "fingerprint": "8af85fe1df61e97a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1246c43c8bfcc7fd", "level": "note", "message": {"text": "Very large file: app/cryptos/[slug]/page.tsx (1513 lines)"}, "properties": {"repobilityId": "168d3f49289e4913", "scanner": "scanner-primary", "fingerprint": "1246c43c8bfcc7fd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-42c4434a91b35021", "level": "note", "message": {"text": "Very large file: app/partenaires/[slug]/page.tsx (1556 lines)"}, "properties": {"repobilityId": "1359f27fdf62d8e9", "scanner": "scanner-primary", "fingerprint": "42c4434a91b35021", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b9df03594b1fa875", "level": "note", "message": {"text": "Very large file: app/etudes/fiscalite-crypto-france-2026-guide-cerfa/page.tsx (1118 lines)"}, "properties": {"repobilityId": "a43a8cb0a3e9786b", "scanner": "scanner-primary", "fingerprint": "b9df03594b1fa875", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-85c319bc23a47a52", "level": "note", "message": {"text": "Very large file: app/avis/[slug]/page.tsx (1026 lines)"}, "properties": {"repobilityId": "c91e17ade32a4184", "scanner": "scanner-primary", "fingerprint": "85c319bc23a47a52", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4d9f7d42507d0e04", "level": "note", "message": {"text": "Very large file: app/outils/calculateur-fiscalite/page.tsx (1071 lines)"}, "properties": {"repobilityId": "3b213473d54f8f1c", "scanner": "scanner-primary", "fingerprint": "4d9f7d42507d0e04", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-407906b9771be4b9", "level": "note", "message": {"text": "Very large file: lib/academy-quizzes.ts (1045 lines)"}, "properties": {"repobilityId": "59c4a53a3ef4a2b2", "scanner": "scanner-primary", "fingerprint": "407906b9771be4b9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ba64d3588b76f048", "level": "note", "message": {"text": "Very large file: lib/seo-keyword-targets.ts (1453 lines)"}, "properties": {"repobilityId": "787901758b14485d", "scanner": "scanner-primary", "fingerprint": "ba64d3588b76f048", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-48f87c562ea597ab", "level": "note", "message": {"text": "Very large file: lib/coingecko.ts (1465 lines)"}, "properties": {"repobilityId": "b7e0e281473fbea4", "scanner": "scanner-primary", "fingerprint": "48f87c562ea597ab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"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-5734ebc1d2fbbb9c", "level": "note", "message": {"text": "35 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "5734ebc1d2fbbb9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "26e46f06e83dfeeb", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "06985c4c29de30c2", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "8bd6f40f81fba130", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "d225a4e0bf92c34d", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "e7a9520df50bea9d", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "45af728da3366bab", "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": "e4b3498eed89972d", "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": "8d909f10b151b9bb", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-1ec06fa59cc69a55", "level": "none", "message": {"text": "Commented-code block (6 lines) in tailwind.config.ts:47"}, "properties": {"repobilityId": "bee1a300150cabec", "scanner": "scanner-primary", "fingerprint": "1ec06fa59cc69a55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-215187be0bda81f7", "level": "none", "message": {"text": "Commented-code block (8 lines) in next.config.js:44"}, "properties": {"repobilityId": "57f7b481a7aae326", "scanner": "scanner-primary", "fingerprint": "215187be0bda81f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ddc04d6ff1adba5", "level": "none", "message": {"text": "Commented-code block (10 lines) in middleware.ts:173"}, "properties": {"repobilityId": "62a88931db67016c", "scanner": "scanner-primary", "fingerprint": "9ddc04d6ff1adba5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0e5c297488eec26", "level": "none", "message": {"text": "Commented-code block (8 lines) in instrumentation-client.ts:59"}, "properties": {"repobilityId": "15efb062208a3113", "scanner": "scanner-primary", "fingerprint": "d0e5c297488eec26", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4b4a37e59ca0bbf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 instrumentation-client.ts:80"}, "properties": {"repobilityId": "3cbc58edb5d5e7e4", "scanner": "scanner-primary", "fingerprint": "a4b4a37e59ca0bbf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-53158d1721042861", "level": "none", "message": {"text": "Commented-code block (6 lines) in vitest.config.ts:22"}, "properties": {"repobilityId": "158b2e8fc73fb540", "scanner": "scanner-primary", "fingerprint": "53158d1721042861", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7bf62fcf4a01c256", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/fiscalite-no-stale-rate.test.ts:27"}, "properties": {"repobilityId": "5d7783bcdee4a220", "scanner": "scanner-primary", "fingerprint": "7bf62fcf4a01c256", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa61f4e40fe5bbb0", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/lib/cerfa-2086.test.ts:120"}, "properties": {"repobilityId": "8b87bf8ba90411ba", "scanner": "scanner-primary", "fingerprint": "fa61f4e40fe5bbb0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc56c3b78e38a499", "level": "note", "message": {"text": "Legacy-named symbol `pepperOld` in tests/lib/api-keys-hash.test.ts:99"}, "properties": {"repobilityId": "167f8ac7d1f95b99", "scanner": "scanner-primary", "fingerprint": "fc56c3b78e38a499", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ef6bd3eb74f42bde", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/audit-b2b-schema.mjs:2"}, "properties": {"repobilityId": "a09742ed64e6b36c", "scanner": "scanner-primary", "fingerprint": "ef6bd3eb74f42bde", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dad6033c8c5e05ef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-fiche-crypto.mjs:111"}, "properties": {"repobilityId": "c0ccdbc2e8c2b198", "scanner": "scanner-primary", "fingerprint": "dad6033c8c5e05ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a68e23fd89cc0ea3", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/batch-generate-fiches.mjs:81"}, "properties": {"repobilityId": "6c967971dc849f1a", "scanner": "scanner-primary", "fingerprint": "a68e23fd89cc0ea3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d6c38b7471a970c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/batch-generate-fiches.mjs:171"}, "properties": {"repobilityId": "38e99f0e6410dd1a", "scanner": "scanner-primary", "fingerprint": "7d6c38b7471a970c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-32cad2aae0655f7d", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/bench-rider.mjs:1"}, "properties": {"repobilityId": "e9ed94418e4dbb8f", "scanner": "scanner-primary", "fingerprint": "32cad2aae0655f7d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c9d0d97a229312c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/create-api-key.mjs:84"}, "properties": {"repobilityId": "2ae965e0ebffdbd5", "scanner": "scanner-primary", "fingerprint": "0c9d0d97a229312c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e6578f7be09e3457", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/fix-nbsp-units.mjs:35"}, "properties": {"repobilityId": "88a0ff9917529af5", "scanner": "scanner-primary", "fingerprint": "e6578f7be09e3457", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30122434e912942c", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/fix-mica-flags.mjs:7"}, "properties": {"repobilityId": "55be142fe2569d83", "scanner": "scanner-primary", "fingerprint": "30122434e912942c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17c885a0a335d50f", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/bench-rider-tele.mjs:1"}, "properties": {"repobilityId": "e8c5b8f9b9a73d56", "scanner": "scanner-primary", "fingerprint": "17c885a0a335d50f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a0a073b01ebc99b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-ticker-prices-kv.mjs:49"}, "properties": {"repobilityId": "2f098144ea424131", "scanner": "scanner-primary", "fingerprint": "7a0a073b01ebc99b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-05e747af606d2fe8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-static-details-kv.mjs:79"}, "properties": {"repobilityId": "12e9d74d0ba35cfa", "scanner": "scanner-primary", "fingerprint": "05e747af606d2fe8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6b0e68479deeba8d", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/audit-quality.mjs:76"}, "properties": {"repobilityId": "9a0b85b819a7200c", "scanner": "scanner-primary", "fingerprint": "6b0e68479deeba8d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10de7d7337297d6c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/audit-quality.mjs:179"}, "properties": {"repobilityId": "f2d71cf3dbf215a3", "scanner": "scanner-primary", "fingerprint": "10de7d7337297d6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1809eedb297e98b2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-all-cryptos-kv.mjs:96"}, "properties": {"repobilityId": "88746c05c7992e0b", "scanner": "scanner-primary", "fingerprint": "1809eedb297e98b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-10bbf2365bd6955f", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/reaudit-existing-fiches.mjs:2"}, "properties": {"repobilityId": "428865ad6869c156", "scanner": "scanner-primary", "fingerprint": "10bbf2365bd6955f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90660b3bea088ba0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-missing-only.mjs:39"}, "properties": {"repobilityId": "3d6386d33c570de3", "scanner": "scanner-primary", "fingerprint": "90660b3bea088ba0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bbb162a8b7e84dee", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/build-lead-magnets.mjs:375"}, "properties": {"repobilityId": "afff707b21010b4b", "scanner": "scanner-primary", "fingerprint": "bbb162a8b7e84dee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2d12ae2e9b9987e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/audit-missing-cryptos.mjs:46"}, "properties": {"repobilityId": "1f41b68d56e397b0", "scanner": "scanner-primary", "fingerprint": "b2d12ae2e9b9987e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-82feeb8c898ea344", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/EventCountdown.tsx:36"}, "properties": {"repobilityId": "5335b4bf4c4a4d18", "scanner": "scanner-primary", "fingerprint": "82feeb8c898ea344", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b088726b484847b8", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/Top10CryptosClient.tsx:324"}, "properties": {"repobilityId": "941ab40933e4a58f", "scanner": "scanner-primary", "fingerprint": "b088726b484847b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8927599c256b0275", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/MicaCountdown.tsx:71"}, "properties": {"repobilityId": "ab72c529f8093e3d", "scanner": "scanner-primary", "fingerprint": "8927599c256b0275", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e3a3048c37cb1064", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/QuizExchange.tsx:185"}, "properties": {"repobilityId": "41480df1b8fb0126", "scanner": "scanner-primary", "fingerprint": "e3a3048c37cb1064", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd1aa1977b3aa530", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/PlatformCard.tsx:93"}, "properties": {"repobilityId": "e4903e1e071d560c", "scanner": "scanner-primary", "fingerprint": "dd1aa1977b3aa530", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-478bf391587269c0", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/LiveCommunityStats.tsx:34"}, "properties": {"repobilityId": "b7ab89d64ff9ba1f", "scanner": "scanner-primary", "fingerprint": "478bf391587269c0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a47669e66fa6fb31", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/LiveCommunityStats.tsx:11"}, "properties": {"repobilityId": "b1fbbea6fc404ae4", "scanner": "scanner-primary", "fingerprint": "a47669e66fa6fb31", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b6e00cd5b848b1f", "level": "note", "message": {"text": "Legacy-named symbol `pricing_display_v1` in components/TieredPricing.tsx:47"}, "properties": {"repobilityId": "d809c88c57946354", "scanner": "scanner-primary", "fingerprint": "1b6e00cd5b848b1f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-65a830ab9ccb39f2", "level": "note", "message": {"text": "Legacy-named symbol `hero_headline_v1` in components/HeroHeadline.tsx:27"}, "properties": {"repobilityId": "02bc7cba236cae03", "scanner": "scanner-primary", "fingerprint": "65a830ab9ccb39f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ab49261f51a9b4dc", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/HeroHeadline.tsx:53"}, "properties": {"repobilityId": "6a137a9241404099", "scanner": "scanner-primary", "fingerprint": "ab49261f51a9b4dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c923fb5ae113016", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/PlatformLogo.tsx:127"}, "properties": {"repobilityId": "2b3258324bf1562d", "scanner": "scanner-primary", "fingerprint": "6c923fb5ae113016", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6061c1e147adb7d2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/PushOptIn.tsx:114"}, "properties": {"repobilityId": "b955b4baa1b198b4", "scanner": "scanner-primary", "fingerprint": "6061c1e147adb7d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a1bd2791b825efe", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/LiveHeatmap.tsx:629"}, "properties": {"repobilityId": "0e63f4e1badcf357", "scanner": "scanner-primary", "fingerprint": "1a1bd2791b825efe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-151f675567ad3abc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/MiniInvestSimulator.tsx:84"}, "properties": {"repobilityId": "f224c2102cf69e84", "scanner": "scanner-primary", "fingerprint": "151f675567ad3abc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-811822b973689f47", "level": "note", "message": {"text": "Legacy-named symbol `hero_headline_v1` in components/HeroPrimaryCta.tsx:7"}, "properties": {"repobilityId": "62295343caf2a37a", "scanner": "scanner-primary", "fingerprint": "811822b973689f47", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-35f717be9bfb11f8", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/UserLevelBadge.tsx:47"}, "properties": {"repobilityId": "990c75363a25cccc", "scanner": "scanner-primary", "fingerprint": "35f717be9bfb11f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11ede42d439420c9", "level": "none", "message": {"text": "Commented-code block (13 lines) in components/AffiliateLink.tsx:114"}, "properties": {"repobilityId": "9522eba6586968ab", "scanner": "scanner-primary", "fingerprint": "11ede42d439420c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6791bf51050a29db", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/MobileStickyCTA.tsx:81"}, "properties": {"repobilityId": "d825964c035d28f9", "scanner": "scanner-primary", "fingerprint": "6791bf51050a29db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7bec8a231062600c", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/MobileBottomNav.tsx:97"}, "properties": {"repobilityId": "99f4b33a97aa949a", "scanner": "scanner-primary", "fingerprint": "7bec8a231062600c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-45874d8d60fe4e85", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/ClarityScript.tsx:64"}, "properties": {"repobilityId": "211ee2928e456f0e", "scanner": "scanner-primary", "fingerprint": "45874d8d60fe4e85", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e3c3cab11a09ecc", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/MdxContent.tsx:303"}, "properties": {"repobilityId": "ffb1f8fab7372f1b", "scanner": "scanner-primary", "fingerprint": "5e3c3cab11a09ecc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-465dab4810381e1b", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/NewsletterStickyBar.tsx:164"}, "properties": {"repobilityId": "160fa2171d97f2f4", "scanner": "scanner-primary", "fingerprint": "465dab4810381e1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7cd5d8b6790112e8", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/CalculateurFiscalite.tsx:509"}, "properties": {"repobilityId": "0f19d520a61f3d8b", "scanner": "scanner-primary", "fingerprint": "7cd5d8b6790112e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe77f04265bcd9c3", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/HeroLiveWidgetMobile.tsx:188"}, "properties": {"repobilityId": "fa6f9a2a7c8f7d84", "scanner": "scanner-primary", "fingerprint": "fe77f04265bcd9c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f1d4dcbd4ed88e0", "level": "note", "message": {"text": "Legacy-named symbol `hero_headline_v1` in components/Hero.tsx:37"}, "properties": {"repobilityId": "aa18b981c4a779da", "scanner": "scanner-primary", "fingerprint": "7f1d4dcbd4ed88e0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d9060b2046cc3fa3", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/SpeculationRules.tsx:64"}, "properties": {"repobilityId": "1051e6454f5e545d", "scanner": "scanner-primary", "fingerprint": "d9060b2046cc3fa3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e101128f3d55b35", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/cryptos/QuickCombosGrid.tsx:96"}, "properties": {"repobilityId": "cc20c5f3fee850c3", "scanner": "scanner-primary", "fingerprint": "6e101128f3d55b35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73a3d827944f92c9", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/ui/LiveAge.tsx:20"}, "properties": {"repobilityId": "364a280fc99d6a71", "scanner": "scanner-primary", "fingerprint": "73a3d827944f92c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5dfc5feae1ad8b5", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/ui/AnimatedNumber.tsx:56"}, "properties": {"repobilityId": "bb67182565fae285", "scanner": "scanner-primary", "fingerprint": "f5dfc5feae1ad8b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba48390f0564a809", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/ui/CryptoLogo.tsx:75"}, "properties": {"repobilityId": "bbfa8c3fa023ac28", "scanner": "scanner-primary", "fingerprint": "ba48390f0564a809", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f43d0535c990adef", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/ui/DirectionalNavigator.tsx:46"}, "properties": {"repobilityId": "7199e6e6bbfed143", "scanner": "scanner-primary", "fingerprint": "f43d0535c990adef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-198e73318fbdc62a", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/hero/HeroPulseRider.tsx:229"}, "properties": {"repobilityId": "55b9d9700a990880", "scanner": "scanner-primary", "fingerprint": "198e73318fbdc62a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f9e34780d832c03", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/portfolio/CryptoAutocomplete.tsx:49"}, "properties": {"repobilityId": "74361a37957bbfa1", "scanner": "scanner-primary", "fingerprint": "9f9e34780d832c03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-999a1da2d00aaa2b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/portfolio/CryptoAutocomplete.tsx:54"}, "properties": {"repobilityId": "51a35ec6f5116e53", "scanner": "scanner-primary", "fingerprint": "999a1da2d00aaa2b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-90e8d51683219234", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/crypto-detail/WhaleWatcher.tsx:62"}, "properties": {"repobilityId": "25e7d40c555d7992", "scanner": "scanner-primary", "fingerprint": "90e8d51683219234", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb4b78807812490f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/crypto-detail/WhaleWatcher.tsx:82"}, "properties": {"repobilityId": "8c2167a1fb3bd256", "scanner": "scanner-primary", "fingerprint": "eb4b78807812490f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5036aeab4cba6f2", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/crypto-detail/LLMFicheView.tsx:81"}, "properties": {"repobilityId": "e624ebce9a075849", "scanner": "scanner-primary", "fingerprint": "d5036aeab4cba6f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b6d89f6dd2af3427", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/crypto-detail/MiniOrderBook.tsx:79"}, "properties": {"repobilityId": "ff8e73bb65a04b12", "scanner": "scanner-primary", "fingerprint": "b6d89f6dd2af3427", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cde4cd6e49ba9a72", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/crypto-detail/ROISimulator.tsx:185"}, "properties": {"repobilityId": "f912bdcd96dcbff2", "scanner": "scanner-primary", "fingerprint": "cde4cd6e49ba9a72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-adf89f627deef894", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/crypto-detail/ROISimulator.tsx:129"}, "properties": {"repobilityId": "78f8451dcff56923", "scanner": "scanner-primary", "fingerprint": "adf89f627deef894", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c33c1a9d2ff40c2e", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/crypto-detail/CryptoStats.tsx:36"}, "properties": {"repobilityId": "b6ad09b908139d63", "scanner": "scanner-primary", "fingerprint": "c33c1a9d2ff40c2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dad512139fd42960", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/crypto-detail/CryptoNewsAggregator.tsx:90"}, "properties": {"repobilityId": "39faef9f5896ec2d", "scanner": "scanner-primary", "fingerprint": "dad512139fd42960", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d52ec6ad16b46f4", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/calendar/CalendarGrid.tsx:71"}, "properties": {"repobilityId": "586f4e1cfc3907c6", "scanner": "scanner-primary", "fingerprint": "6d52ec6ad16b46f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a57482e9429b6eb9", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/sitemap.ts:29"}, "properties": {"repobilityId": "3edc91bd0b922c86", "scanner": "scanner-primary", "fingerprint": "a57482e9429b6eb9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de8669c86fc6e692", "level": "none", "message": {"text": "Commented-code block (10 lines) in app/page.tsx:53"}, "properties": {"repobilityId": "24d19119e96677d3", "scanner": "scanner-primary", "fingerprint": "de8669c86fc6e692", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ddedfb7caabc4cc3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/page.tsx:231"}, "properties": {"repobilityId": "6b822f09080fa4d1", "scanner": "scanner-primary", "fingerprint": "ddedfb7caabc4cc3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-35f6ceeb3d2458cd", "level": "none", "message": {"text": "Commented-code block (10 lines) in app/layout.tsx:27"}, "properties": {"repobilityId": "533b53fd99c36ea6", "scanner": "scanner-primary", "fingerprint": "35f6ceeb3d2458cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-778dba0804c442c0", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/cryptos/[slug]/page.tsx:226"}, "properties": {"repobilityId": "abf6532746d8adec", "scanner": "scanner-primary", "fingerprint": "778dba0804c442c0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd516237f497a288", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/cryptos/[slug]/acheter-en-france/page.tsx:57"}, "properties": {"repobilityId": "a1f6d346075661fd", "scanner": "scanner-primary", "fingerprint": "dd516237f497a288", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42f27bac4d96e15b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/blog/[slug]/opengraph-image.tsx:385"}, "properties": {"repobilityId": "207cdfc5aea5ecfe", "scanner": "scanner-primary", "fingerprint": "42f27bac4d96e15b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f9be3cd85e89604", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/blog/[slug]/page.tsx:51"}, "properties": {"repobilityId": "640d6721cd9deb1a", "scanner": "scanner-primary", "fingerprint": "6f9be3cd85e89604", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13f446b0d1640758", "level": "none", "message": {"text": "Commented-code block (9 lines) in app/actualites/[slug]/page.tsx:49"}, "properties": {"repobilityId": "5f17fd27aad4af34", "scanner": "scanner-primary", "fingerprint": "13f446b0d1640758", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d45219f22b724d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/comparer/page.tsx:32"}, "properties": {"repobilityId": "5c4ee5fcfde4a158", "scanner": "scanner-primary", "fingerprint": "8d45219f22b724d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e2ee9765e9d640b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/monitoring/route.ts:72"}, "properties": {"repobilityId": "35a0f7f5e23eaed7", "scanner": "scanner-primary", "fingerprint": "2e2ee9765e9d640b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d28ed566b7c8bd2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/monitoring/route.ts:72"}, "properties": {"repobilityId": "cb0e85780b5b1fa0", "scanner": "scanner-primary", "fingerprint": "3d28ed566b7c8bd2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c6cf5bb8ad540d5c", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/transparence/page.tsx:90"}, "properties": {"repobilityId": "de5a5eca056a525d", "scanner": "scanner-primary", "fingerprint": "c6cf5bb8ad540d5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d04577b2784dbe6b", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/glossaire/[slug]/page.tsx:27"}, "properties": {"repobilityId": "15cd50b199892602", "scanner": "scanner-primary", "fingerprint": "d04577b2784dbe6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae492bcbc7215b80", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/api/historical/route.ts:84"}, "properties": {"repobilityId": "f54f2e92372ff25c", "scanner": "scanner-primary", "fingerprint": "ae492bcbc7215b80", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a79520ad73690a9", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/diag/api-usage/route.ts:58"}, "properties": {"repobilityId": "084cade17ff4c593", "scanner": "scanner-primary", "fingerprint": "5a79520ad73690a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eba0c45b6b950ea5", "level": "none", "message": {"text": "Commented-code block (13 lines) in app/api/auth/reset-password/route.ts:67"}, "properties": {"repobilityId": "de20c1c9cbae852b", "scanner": "scanner-primary", "fingerprint": "eba0c45b6b950ea5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3454b7acf4dadd0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/auth/login/route.ts:76"}, "properties": {"repobilityId": "d948bad441cc2aef", "scanner": "scanner-primary", "fingerprint": "3454b7acf4dadd0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a5777a8d6f02215a", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/auth/callback/route.ts:64"}, "properties": {"repobilityId": "e0cda3eb7307ce09", "scanner": "scanner-primary", "fingerprint": "a5777a8d6f02215a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e40098c6e4d9f6ec", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/v1/prices/route.ts:102"}, "properties": {"repobilityId": "d198573ac5d3f8c9", "scanner": "scanner-primary", "fingerprint": "e40098c6e4d9f6ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34fd9099099bf52d", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/analytics/affiliate-click/route.ts:87"}, "properties": {"repobilityId": "f74ed72399d8f8c4", "scanner": "scanner-primary", "fingerprint": "34fd9099099bf52d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d06aabf2bcbcb9a1", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/prices/route.ts:46"}, "properties": {"repobilityId": "e3258a0936bcb4f5", "scanner": "scanner-primary", "fingerprint": "d06aabf2bcbcb9a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1a15ab735afd00d", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/alerts/create/route.ts:106"}, "properties": {"repobilityId": "6f5d9a4612651dd6", "scanner": "scanner-primary", "fingerprint": "d1a15ab735afd00d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49b9caef27f65690", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/portfolio-prices/route.ts:68"}, "properties": {"repobilityId": "f510fcac4a78c0a2", "scanner": "scanner-primary", "fingerprint": "49b9caef27f65690", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74f9588b80d320e7", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/cron/refresh-ticker-prices/route.ts:39"}, "properties": {"repobilityId": "27fc39af4419ae4b", "scanner": "scanner-primary", "fingerprint": "74f9588b80d320e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-506a9c727f2b048b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/cron/daily-orchestrator/route.ts:64"}, "properties": {"repobilityId": "931bedac227cd9b7", "scanner": "scanner-primary", "fingerprint": "506a9c727f2b048b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b75b6be4fa30599e", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/cron/generate-ta/route.ts:159"}, "properties": {"repobilityId": "db2a250d62247615", "scanner": "scanner-primary", "fingerprint": "b75b6be4fa30599e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c3cad7beda25172", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/cron/audit-cryptos-health/route.ts:253"}, "properties": {"repobilityId": "e67efd380334b4e6", "scanner": "scanner-primary", "fingerprint": "6c3cad7beda25172", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2bd20eb8d10b7816", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/cron/aggregate-news/route.ts:152"}, "properties": {"repobilityId": "22250f9223221cdd", "scanner": "scanner-primary", "fingerprint": "2bd20eb8d10b7816", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7c0e50d46172256", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/cron/refresh-prices/route.ts:162"}, "properties": {"repobilityId": "749c513acc70f1ed", "scanner": "scanner-primary", "fingerprint": "f7c0e50d46172256", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99b2b09edeb800f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-prices/route.ts:54"}, "properties": {"repobilityId": "3b3b1a74facb9d0b", "scanner": "scanner-primary", "fingerprint": "99b2b09edeb800f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-da66c8d002283fe5", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/account/delete/route.ts:94"}, "properties": {"repobilityId": "9b15c5bab1975683", "scanner": "scanner-primary", "fingerprint": "da66c8d002283fe5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25d4e6c64ee4e8f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/public/route.ts:95"}, "properties": {"repobilityId": "8749b3799c26d174", "scanner": "scanner-primary", "fingerprint": "25d4e6c64ee4e8f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0a491009e58eb54e", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/newsletter/subscribe/route.ts:28"}, "properties": {"repobilityId": "faddc795b342d195", "scanner": "scanner-primary", "fingerprint": "0a491009e58eb54e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5451dbf1b95f0ee4", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/calculateur-pdf-lead/route.ts:133"}, "properties": {"repobilityId": "dfafd54293db3f11", "scanner": "scanner-primary", "fingerprint": "5451dbf1b95f0ee4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a47f079617a85307", "level": "note", "message": {"text": "Legacy-named symbol `hero_headline_v1` in app/api/abtest/conversion/route.ts:36"}, "properties": {"repobilityId": "02c9c3ffd6e9452c", "scanner": "scanner-primary", "fingerprint": "a47f079617a85307", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-91b665cafeaf2f39", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/embed/v1.js/route.ts:147"}, "properties": {"repobilityId": "74274d0b394d0a0e", "scanner": "scanner-primary", "fingerprint": "91b665cafeaf2f39", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51e8d5a0a0c77a32", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/marche/page.tsx:119"}, "properties": {"repobilityId": "dc8a62ff220ba79b", "scanner": "scanner-primary", "fingerprint": "51e8d5a0a0c77a32", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ceb805cbc7e260a", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/mon-compte/dev/actions.ts:51"}, "properties": {"repobilityId": "9ab1190f09ba3210", "scanner": "scanner-primary", "fingerprint": "0ceb805cbc7e260a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8cabc5c7fc23567", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/quiz/crypto/page.tsx:39"}, "properties": {"repobilityId": "40ad3fef01562652", "scanner": "scanner-primary", "fingerprint": "b8cabc5c7fc23567", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14d83baf7142634a", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/alertes/page.tsx:101"}, "properties": {"repobilityId": "606a694a03406bce", "scanner": "scanner-primary", "fingerprint": "14d83baf7142634a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b923fcaae2f3bca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api-publique/page.tsx:434"}, "properties": {"repobilityId": "279e0d75def7202e", "scanner": "scanner-primary", "fingerprint": "6b923fcaae2f3bca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc93af08206d7766", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/comparatif/page.tsx:482"}, "properties": {"repobilityId": "543e0a97a25e88fb", "scanner": "scanner-primary", "fingerprint": "dc93af08206d7766", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-990de66f0a9fda19", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/avis/page.tsx:100"}, "properties": {"repobilityId": "4a603181ed84f806", "scanner": "scanner-primary", "fingerprint": "990de66f0a9fda19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0895c25e4dcbb151", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/outils/page.tsx:45"}, "properties": {"repobilityId": "a85afce1a94fe887", "scanner": "scanner-primary", "fingerprint": "0895c25e4dcbb151", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bebd0b22e551249e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/outils/calculateur-fiscalite/page.tsx:16"}, "properties": {"repobilityId": "5e1a955d00e59515", "scanner": "scanner-primary", "fingerprint": "bebd0b22e551249e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a977fefa94332a98", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/historique-prix/page.tsx:26"}, "properties": {"repobilityId": "a2f03f50280c2ad8", "scanner": "scanner-primary", "fingerprint": "a977fefa94332a98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87c76f4159b1b16b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/historique-prix/[crypto]/[annee]/page.tsx:52"}, "properties": {"repobilityId": "d92659a4c37321ee", "scanner": "scanner-primary", "fingerprint": "87c76f4159b1b16b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7715373b2ea3a736", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/vs/page.tsx:22"}, "properties": {"repobilityId": "b71e6decd254fbdf", "scanner": "scanner-primary", "fingerprint": "7715373b2ea3a736", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fdb555577aeb5691", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/vs/[a]/[b]/page.tsx:64"}, "properties": {"repobilityId": "ff90e0ea1bcf7d55", "scanner": "scanner-primary", "fingerprint": "fdb555577aeb5691", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1a1c5087618781a", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/analyses-techniques/[slug]/page.tsx:45"}, "properties": {"repobilityId": "ec373349182fe1e1", "scanner": "scanner-primary", "fingerprint": "d1a1c5087618781a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-12084c9ab9470c05", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/acheter/[crypto]/[pays]/page.tsx:37"}, "properties": {"repobilityId": "f4704ec353aa0e56", "scanner": "scanner-primary", "fingerprint": "12084c9ab9470c05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a88ae83513b206c1", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/crypto-slug-aliases.ts:50"}, "properties": {"repobilityId": "823439e9f0269339", "scanner": "scanner-primary", "fingerprint": "a88ae83513b206c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f6e56b2be05ad7b", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/events-fetcher.ts:197"}, "properties": {"repobilityId": "6a604471adc22c55", "scanner": "scanner-primary", "fingerprint": "9f6e56b2be05ad7b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b571ca1e3dc4a8d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/schema.ts:854"}, "properties": {"repobilityId": "6e5975654d729efc", "scanner": "scanner-primary", "fingerprint": "b571ca1e3dc4a8d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63c8230f609ba046", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/og-fonts.ts:54"}, "properties": {"repobilityId": "29ccbc3efea20416", "scanner": "scanner-primary", "fingerprint": "63c8230f609ba046", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a7c118d65169225", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/og-fonts.ts:11"}, "properties": {"repobilityId": "a6b1641392292510", "scanner": "scanner-primary", "fingerprint": "1a7c118d65169225", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ece4a8321ad13162", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/stripe.ts:26"}, "properties": {"repobilityId": "8c86a15423b0d9da", "scanner": "scanner-primary", "fingerprint": "ece4a8321ad13162", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d317b47a6cf8db5", "level": "note", "message": {"text": "Legacy-named symbol `hero_headline_v1` in lib/abtest.ts:115"}, "properties": {"repobilityId": "b2fcdf034581b425", "scanner": "scanner-primary", "fingerprint": "3d317b47a6cf8db5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1777acd568ae82b4", "level": "none", "message": {"text": "Commented-code block (8 lines) in lib/abtest.ts:107"}, "properties": {"repobilityId": "e00a25410fce83bf", "scanner": "scanner-primary", "fingerprint": "1777acd568ae82b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-725e5ce37d4ae813", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/onchain-metrics.ts:195"}, "properties": {"repobilityId": "2dcb09b8e93e8f94", "scanner": "scanner-primary", "fingerprint": "725e5ce37d4ae813", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b50522929a215bcf", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/cryptos-extended.ts:71"}, "properties": {"repobilityId": "ef25277b408e0095", "scanner": "scanner-primary", "fingerprint": "b50522929a215bcf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1d2e720669103a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/price-source.ts:42"}, "properties": {"repobilityId": "c65dd7cfa75a0cf0", "scanner": "scanner-primary", "fingerprint": "f1d2e720669103a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe26c35cc9016769", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/cryptos.ts:9"}, "properties": {"repobilityId": "1d34c73fca6085d1", "scanner": "scanner-primary", "fingerprint": "fe26c35cc9016769", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-214bcfafbdbcf0fc", "level": "none", "message": {"text": "Commented-code block (9 lines) in lib/historical-prices.ts:176"}, "properties": {"repobilityId": "ae148dd7a134eff9", "scanner": "scanner-primary", "fingerprint": "214bcfafbdbcf0fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87ce0ec80f219d45", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/cmdk-actions.ts:289"}, "properties": {"repobilityId": "d0d5e1bbe41f4215", "scanner": "scanner-primary", "fingerprint": "87ce0ec80f219d45", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f8a915c5c775801", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/community-stats.ts:8"}, "properties": {"repobilityId": "722588bc2221b327", "scanner": "scanner-primary", "fingerprint": "3f8a915c5c775801", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-82414da8180de045", "level": "note", "message": {"text": "Legacy-named symbol `hero_headline_v1` in lib/abtest-experiments.ts:31"}, "properties": {"repobilityId": "220e33bc731547ab", "scanner": "scanner-primary", "fingerprint": "82414da8180de045", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9498a6879c8043e8", "level": "none", "message": {"text": "Commented-code block (9 lines) in lib/programmatic.ts:420"}, "properties": {"repobilityId": "aabcaca245fa90cc", "scanner": "scanner-primary", "fingerprint": "9498a6879c8043e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ddbb36321e6cc35", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/cryptocompare.ts:104"}, "properties": {"repobilityId": "bbeda4ff0eac1f27", "scanner": "scanner-primary", "fingerprint": "6ddbb36321e6cc35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b76f185c2b5a19f", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/internal-link-graph.ts:241"}, "properties": {"repobilityId": "53be02d21ad14024", "scanner": "scanner-primary", "fingerprint": "1b76f185c2b5a19f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9492122865a87a24", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/alerts.ts:624"}, "properties": {"repobilityId": "133eb4859f3775d1", "scanner": "scanner-primary", "fingerprint": "9492122865a87a24", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22b457fa0f3a8efe", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/search.ts:32"}, "properties": {"repobilityId": "a0e32d703f0f9358", "scanner": "scanner-primary", "fingerprint": "22b457fa0f3a8efe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8dd265820b6b8d87", "level": "none", "message": {"text": "Commented-code block (9 lines) in lib/rate-limit.ts:163"}, "properties": {"repobilityId": "7445cac7f0b41c2a", "scanner": "scanner-primary", "fingerprint": "8dd265820b6b8d87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e56242c93cb02d6f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/news-aggregator.ts:496"}, "properties": {"repobilityId": "6eff1b10e2e8103b", "scanner": "scanner-primary", "fingerprint": "e56242c93cb02d6f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-927f6b4c011e9117", "level": "note", "message": {"text": "Legacy-named symbol `cryptoreflex_compare_v1` in lib/use-compare-list.ts:7"}, "properties": {"repobilityId": "cc9d50a9bd6e93f3", "scanner": "scanner-primary", "fingerprint": "927f6b4c011e9117", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ca80473b647e9af1", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/remark-auto-link-entities.ts:201"}, "properties": {"repobilityId": "a821986377c731ce", "scanner": "scanner-primary", "fingerprint": "ca80473b647e9af1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81364c71d867a8cb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/use-user-plan.ts:68"}, "properties": {"repobilityId": "b056d266b653ff96", "scanner": "scanner-primary", "fingerprint": "81364c71d867a8cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7eec6613a16a9382", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/crypto-logos.ts:29"}, "properties": {"repobilityId": "c9315e6a04e24402", "scanner": "scanner-primary", "fingerprint": "7eec6613a16a9382", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee0bbd573f6708cf", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/seo-fiscalite-helpers.ts:192"}, "properties": {"repobilityId": "81062d19b35f06ea", "scanner": "scanner-primary", "fingerprint": "ee0bbd573f6708cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b898d0326bb5786a", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/coingecko.ts:89"}, "properties": {"repobilityId": "270c96381bd65f56", "scanner": "scanner-primary", "fingerprint": "b898d0326bb5786a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27e8c5c0572acf6a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/coingecko.ts:1384"}, "properties": {"repobilityId": "9207bec88b76f5dd", "scanner": "scanner-primary", "fingerprint": "27e8c5c0572acf6a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-46c98e2d022efc09", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/email/components.ts:91"}, "properties": {"repobilityId": "02d6fdd57598c64e", "scanner": "scanner-primary", "fingerprint": "46c98e2d022efc09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-113c67c36e480712", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/hooks/useLivePrices.ts:66"}, "properties": {"repobilityId": "0a867dd5d7376129", "scanner": "scanner-primary", "fingerprint": "113c67c36e480712", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ee3435cad809caf", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/supabase/route-handler.ts:68"}, "properties": {"repobilityId": "bbf35ed14cc5d268", "scanner": "scanner-primary", "fingerprint": "9ee3435cad809caf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d3ab1f7c7666d02", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/kucoin.ts:23"}, "properties": {"repobilityId": "5d7314333d4854fd", "scanner": "scanner-primary", "fingerprint": "1d3ab1f7c7666d02", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d1679737e82b45de", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/coinbase.ts:22"}, "properties": {"repobilityId": "44f418289606e3de", "scanner": "scanner-primary", "fingerprint": "d1679737e82b45de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5a15eb050bab2675", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/dexscreener.ts:42"}, "properties": {"repobilityId": "33bdb2802e411c79", "scanner": "scanner-primary", "fingerprint": "5a15eb050bab2675", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-10be335463f15f1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/static.ts:87"}, "properties": {"repobilityId": "e9b075576489ea34", "scanner": "scanner-primary", "fingerprint": "10be335463f15f1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6f341c195ab2553e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/cryptocompare.ts:24"}, "properties": {"repobilityId": "52740ac1928c3f54", "scanner": "scanner-primary", "fingerprint": "6f341c195ab2553e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c0f6071a2aca43dd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/kraken.ts:26"}, "properties": {"repobilityId": "84cddad7a7ef7764", "scanner": "scanner-primary", "fingerprint": "c0f6071a2aca43dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-46ab04176816ec1a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/types.ts:97"}, "properties": {"repobilityId": "0450cff2d6c47c8f", "scanner": "scanner-primary", "fingerprint": "46ab04176816ec1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-20697c6aa2dc5523", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/binance.ts:73"}, "properties": {"repobilityId": "98b864db03f54e59", "scanner": "scanner-primary", "fingerprint": "20697c6aa2dc5523", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d13c52fce52507da", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/price-providers/coingecko.ts:53"}, "properties": {"repobilityId": "c3cd877ed57193da", "scanner": "scanner-primary", "fingerprint": "d13c52fce52507da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c449113710e3e5d2", "level": "none", "message": {"text": "Commented-code block (6 lines) in public/sw.js:25"}, "properties": {"repobilityId": "84bf8bd57c338e0e", "scanner": "scanner-primary", "fingerprint": "c449113710e3e5d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49a8711faa5c8a3e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:27"}, "properties": {"repobilityId": "de2175499d6ce3a2", "scanner": "scanner-primary", "fingerprint": "49a8711faa5c8a3e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0b17c8c07a7421d", "level": "note", "message": {"text": "8 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "17fe720e8247f9df", "scanner": "scanner-primary", "fingerprint": "d0b17c8c07a7421d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}