{"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-3cbe07ea4e253922", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-redirect-slug-cleanup.ts:165", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-redirect-slug-cleanup.ts:165"}, "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-75ae66f84d7fd08a", "name": "Stray `console.log` in TS/JS \u2014 scripts/find-next-edition.ts:529", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/find-next-edition.ts:529"}, "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-7386bed6350b482f", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-backfill-categories.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-backfill-categories.ts:57"}, "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-60affae106e170b0", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-catalogue-corrections-apply.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-catalogue-corrections-apply.ts:89"}, "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-d20d2da49b063e21", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-emdash-mdx.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-emdash-mdx.ts:100"}, "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-1aa89cbec0887ae2", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-gsc-list.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-gsc-list.ts:46"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8a29b7ca0a9797c6", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-edito-roll-apply.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-edito-roll-apply.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b37f58b9559b785a", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-redirect-coherence.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-redirect-coherence.ts:52"}, "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-d88d3fc13386d5e3", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-slug-year-apply.ts:116", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-slug-year-apply.ts:116"}, "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-7e13227e14a2dc4d", "name": "Stray `console.log` in TS/JS \u2014 scripts/classify-categories.ts:176", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/classify-categories.ts:176"}, "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-d2219d4c7d163ce9", "name": "Stray `console.log` in TS/JS \u2014 scripts/gsc-baseline-export.ts:212", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gsc-baseline-export.ts:212"}, "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-340817926f91011b", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-final-pass-apply.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-final-pass-apply.ts:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bac8a1339c5fccb9", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-cohorte10-apply.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-cohorte10-apply.ts:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-85672b3de0b97eec", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-mdx-to-db.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-mdx-to-db.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b37fe62c8120da00", "name": "Stray `console.log` in TS/JS \u2014 scripts/populate-logos.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/populate-logos.ts:80"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f7c370de98a8e53", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-venues-coverage-apply.ts:287", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-venues-coverage-apply.ts:287"}, "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-6a3e6718a216ea02", "name": "Stray `console.log` in TS/JS \u2014 scripts/docx-to-mdx.ts:449", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/docx-to-mdx.ts:449"}, "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-a4c7f27a411a0db9", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-venues-cohorte-apply.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-venues-cohorte-apply.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a7544b424e2d41c9", "name": "Stray `console.log` in TS/JS \u2014 scripts/spell-check.ts:147", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/spell-check.ts:147"}, "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-78b3048b8fb6d8ff", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-fixes-apply.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-fixes-apply.ts:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-659f542676a3176c", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-catalogue.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-catalogue.ts:71"}, "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-ced54e18377af994", "name": "Stray `console.log` in TS/JS \u2014 scripts/validate-covers.ts:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validate-covers.ts:98"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42eafa16dc943931", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-arbitrages-apply.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-arbitrages-apply.ts:8"}, "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-8608033f6754d73b", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-upcoming.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-upcoming.ts:71"}, "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-4a78e678e126256f", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-cohorte8-apply.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-cohorte8-apply.ts:103"}, "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-b49e17065ad8af6a", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-corrections-apply.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-corrections-apply.ts:66"}, "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-a427de5a1a413338", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-slug-migration.ts:110", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-slug-migration.ts:110"}, "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-e64e143eddc78141", "name": "Stray `console.log` in TS/JS \u2014 scripts/scrape-hero-images.ts:222", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scrape-hero-images.ts:222"}, "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-ab0d2d459dea0537", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-cohorte9-apply.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-cohorte9-apply.ts:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c4fc1beac126918f", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-depublier-fantomes.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-depublier-fantomes.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e9a2490bf9e6e177", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-emdash-mdx.ts:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-emdash-mdx.ts:102"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d226460eaa07098e", "name": "Stray `console.log` in TS/JS \u2014 scripts/diag-city-cleanup-villepinte.ts:170", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-city-cleanup-villepinte.ts:170"}, "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-1a0d3527c816d79f", "name": "Stray `console.log` in TS/JS \u2014 scripts/scraper/run.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scraper/run.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b4c130ac1122a994", "name": "Stray `console.log` in TS/JS \u2014 scripts/scraper/discover.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scraper/discover.ts:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-39f7c1fa80f0d901", "name": "Stray `console.log` in TS/JS \u2014 scripts/scraper/enrich.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scraper/enrich.ts:88"}, "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-01dc3f33d11cd28b", "name": "Stray `console.log` in TS/JS \u2014 scripts/scraper/sync.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scraper/sync.ts:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab7967867983faf1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/venue-sort-bar.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venue-sort-bar.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e9ab16d2d439cae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/user-chip.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/user-chip.tsx:64"}, "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-f4a04f5e47d3f87d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sort-bar.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sort-bar.tsx:147"}, "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-f0a7ff2591c1e1b5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/provider-sort-bar.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/provider-sort-bar.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-fc6b355cf4a8bb4a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/json-ld.tsx:9", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/json-ld.tsx:9"}, "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-b4bd85e6adb14713", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/devis/page.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/devis/page.tsx:84"}, "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-732f4ef0ec41e920", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/avis/page.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/avis/page.tsx:91"}, "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-2bf2499fd631c09a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/reports/page.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/reports/page.tsx:83"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c438892841c51ccf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/sampling/page.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/sampling/page.tsx:146"}, "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-e13ae906f3211621", "name": "Insecure pattern 'node_child_process' in scripts/docx-to-mdx.ts:24", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/docx-to-mdx.ts:24"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-47fa55767e2931ea", "name": "Insecure pattern 'node_child_process' in scripts/scraper/run.ts:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/scraper/run.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9f04b0d772c7c5d7", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/json-ld.tsx:9", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/json-ld.tsx:9"}, "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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 197 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 299 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 33 placeholder/mock markers across 21 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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, tests. 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-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-87af7f6d989ce25a", "name": "Commented-code block (5 lines) in next.config.ts:134", "shortDescription": {"text": "Commented-code block (5 lines) in next.config.ts:134"}, "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-80dc7bda952fd59e", "name": "Commented-code block (25 lines) in scripts/diag-redirect-slug-cleanup.ts:6", "shortDescription": {"text": "Commented-code block (25 lines) in scripts/diag-redirect-slug-cleanup.ts:6"}, "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-b5f29a6695c176df", "name": "Commented-code block (21 lines) in scripts/find-next-edition.ts:4", "shortDescription": {"text": "Commented-code block (21 lines) in scripts/find-next-edition.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a57934f907ba5b74", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/find-next-edition.ts:210", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/find-next-edition.ts:210"}, "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-baff734ab631ac57", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag-backfill-categories.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag-backfill-categories.ts:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6029e4215cbe20a9", "name": "Commented-code block (7 lines) in scripts/diag-redirect-coherence.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/diag-redirect-coherence.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7cf479c32f2a1417", "name": "Commented-code block (7 lines) in scripts/classify-categories.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/classify-categories.ts: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-dd2506786ede198f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/classify-categories.ts:91", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/classify-categories.ts:91"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1531245c5be75fda", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/spell-check.ts:105", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/spell-check.ts:105"}, "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-36e5dd15f56d35e8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag-audit-catalogue.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag-audit-catalogue.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-f5e468fbf755827b", "name": "Commented-code block (7 lines) in scripts/validate-covers.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/validate-covers.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a7b6ca1ad5306b4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag-audit-upcoming.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag-audit-upcoming.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-47fe7320caae4f43", "name": "Commented-code block (5 lines) in scripts/scrape-hero-images.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/scrape-hero-images.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7014815b26b75187", "name": "Commented-code block (6 lines) in scripts/diag-emdash-mdx.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/diag-emdash-mdx.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-77204606fd2901ae", "name": "Commented-code block (18 lines) in scripts/diag-city-cleanup-villepinte.ts:9", "shortDescription": {"text": "Commented-code block (18 lines) in scripts/diag-city-cleanup-villepinte.ts:9"}, "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-bad1a64e7c36b1bd", "name": "Commented-code block (5 lines) in src/proxy.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/proxy.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-996ba2bdf6beac1d", "name": "Commented-code block (5 lines) in src/components/salon-actions-bar.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/salon-actions-bar.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e1c7c9dd85848bc", "name": "Commented-code block (6 lines) in src/components/admin-salon-form.tsx:5", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/admin-salon-form.tsx:5"}, "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-11f555c087d5a675", "name": "Commented-code block (6 lines) in src/app/page.tsx:18", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/page.tsx:18"}, "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-d717e51e73df6b8a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/page.tsx:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/page.tsx:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-03ba583bf32f145f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/devis/page.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/devis/page.tsx:29"}, "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-933c0b7bc3eebefd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/salons/page.tsx:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/salons/page.tsx: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-3ed5a5b86845f899", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/salons/nouveau/page.tsx:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/salons/nouveau/page.tsx:12"}, "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-6d6a5fe864c2fce8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/salons/[id]/page.tsx:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/salons/[id]/page.tsx:17"}, "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-73f52b2d4ba88e52", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/secteurs/page.tsx:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/secteurs/page.tsx: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-ce8ad99f8fba99de", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/secteurs/[id]/page.tsx:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/secteurs/[id]/page.tsx:25"}, "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-98a4eb9f205bb209", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/venues/page.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/venues/page.tsx: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-1adfd2994de1cfad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/venues/[id]/page.tsx:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/venues/[id]/page.tsx:25"}, "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-26725d7422d1055b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/alertes/page.tsx:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/alertes/page.tsx:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f9fed74f33659cf8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/avis/page.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/avis/page.tsx: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-7b5a9c6ac4b8b9ce", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/reports/page.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/reports/page.tsx:29"}, "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-9fe44edb46beef94", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/prestataires/page.tsx:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/prestataires/page.tsx:45"}, "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-5b3f27eef0161cf2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/prestataires/[id]/page.tsx:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/prestataires/[id]/page.tsx:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-350079f1928cb9e9", "name": "Commented-code block (6 lines) in src/app/admin/sampling/page.tsx:7", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/admin/sampling/page.tsx: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-9ababf786ff5ddf0", "name": "Commented-code block (5 lines) in src/lib/auth.ts:26", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/auth.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-304942a71dc84ef9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/brevo.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/brevo.ts:44"}, "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-fda7634f1f86f29c", "name": "Commented-code block (5 lines) in src/lib/queries.ts:196", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/queries.ts:196"}, "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}}]}}, "automationDetails": {"id": "repobility/19548"}, "properties": {"repository": "showfinder-io/showfinder", "repoUrl": "https://github.com/showfinder-io/showfinder", "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-3cbe07ea4e253922", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-redirect-slug-cleanup.ts:165"}, "properties": {"repobilityId": "90627b391cc88b84", "scanner": "scanner-primary", "fingerprint": "3cbe07ea4e253922", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-75ae66f84d7fd08a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/find-next-edition.ts:529"}, "properties": {"repobilityId": "a9317499b6ac2f66", "scanner": "scanner-primary", "fingerprint": "75ae66f84d7fd08a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7386bed6350b482f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-backfill-categories.ts:57"}, "properties": {"repobilityId": "d4e8819599f37c16", "scanner": "scanner-primary", "fingerprint": "7386bed6350b482f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-60affae106e170b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-catalogue-corrections-apply.ts:89"}, "properties": {"repobilityId": "d5389d00a8ce5530", "scanner": "scanner-primary", "fingerprint": "60affae106e170b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d20d2da49b063e21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-emdash-mdx.ts:100"}, "properties": {"repobilityId": "f823e1ffe53aee37", "scanner": "scanner-primary", "fingerprint": "d20d2da49b063e21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1aa89cbec0887ae2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-gsc-list.ts:46"}, "properties": {"repobilityId": "3f5f0487a3f5f137", "scanner": "scanner-primary", "fingerprint": "1aa89cbec0887ae2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8a29b7ca0a9797c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-edito-roll-apply.ts:34"}, "properties": {"repobilityId": "b046ee7886a01205", "scanner": "scanner-primary", "fingerprint": "8a29b7ca0a9797c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b37f58b9559b785a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-redirect-coherence.ts:52"}, "properties": {"repobilityId": "3d505f2dc29ebdb3", "scanner": "scanner-primary", "fingerprint": "b37f58b9559b785a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d88d3fc13386d5e3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-slug-year-apply.ts:116"}, "properties": {"repobilityId": "1e9b0b9b5c3585b3", "scanner": "scanner-primary", "fingerprint": "d88d3fc13386d5e3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e13227e14a2dc4d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/classify-categories.ts:176"}, "properties": {"repobilityId": "a3aa0c5924b14cc8", "scanner": "scanner-primary", "fingerprint": "7e13227e14a2dc4d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d2219d4c7d163ce9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gsc-baseline-export.ts:212"}, "properties": {"repobilityId": "dd75cf74b119eb5d", "scanner": "scanner-primary", "fingerprint": "d2219d4c7d163ce9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-340817926f91011b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-final-pass-apply.ts:41"}, "properties": {"repobilityId": "a366c7ebc93e4556", "scanner": "scanner-primary", "fingerprint": "340817926f91011b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bac8a1339c5fccb9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-cohorte10-apply.ts:32"}, "properties": {"repobilityId": "42f02b91b37c911f", "scanner": "scanner-primary", "fingerprint": "bac8a1339c5fccb9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85672b3de0b97eec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-mdx-to-db.ts:48"}, "properties": {"repobilityId": "e39c32acb8131080", "scanner": "scanner-primary", "fingerprint": "85672b3de0b97eec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b37fe62c8120da00", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/populate-logos.ts:80"}, "properties": {"repobilityId": "01129fbf7d19fd7e", "scanner": "scanner-primary", "fingerprint": "b37fe62c8120da00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f7c370de98a8e53", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-venues-coverage-apply.ts:287"}, "properties": {"repobilityId": "3c57d7fbf55575dc", "scanner": "scanner-primary", "fingerprint": "5f7c370de98a8e53", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a3e6718a216ea02", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/docx-to-mdx.ts:449"}, "properties": {"repobilityId": "d716c319500a8c98", "scanner": "scanner-primary", "fingerprint": "6a3e6718a216ea02", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a4c7f27a411a0db9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-venues-cohorte-apply.ts:34"}, "properties": {"repobilityId": "6ae6e049e65b126d", "scanner": "scanner-primary", "fingerprint": "a4c7f27a411a0db9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a7544b424e2d41c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/spell-check.ts:147"}, "properties": {"repobilityId": "896bc76e5982a0ba", "scanner": "scanner-primary", "fingerprint": "a7544b424e2d41c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78b3048b8fb6d8ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-fixes-apply.ts:33"}, "properties": {"repobilityId": "46882e5a04b05044", "scanner": "scanner-primary", "fingerprint": "78b3048b8fb6d8ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-659f542676a3176c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-catalogue.ts:71"}, "properties": {"repobilityId": "91994c687fec0328", "scanner": "scanner-primary", "fingerprint": "659f542676a3176c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ced54e18377af994", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validate-covers.ts:98"}, "properties": {"repobilityId": "6f3f98316be38095", "scanner": "scanner-primary", "fingerprint": "ced54e18377af994", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-42eafa16dc943931", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-arbitrages-apply.ts:8"}, "properties": {"repobilityId": "85b0035ca9a34b93", "scanner": "scanner-primary", "fingerprint": "42eafa16dc943931", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8608033f6754d73b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-upcoming.ts:71"}, "properties": {"repobilityId": "1759afce416fb59b", "scanner": "scanner-primary", "fingerprint": "8608033f6754d73b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a78e678e126256f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-cohorte8-apply.ts:103"}, "properties": {"repobilityId": "857084efaf320708", "scanner": "scanner-primary", "fingerprint": "4a78e678e126256f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b49e17065ad8af6a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-audit-corrections-apply.ts:66"}, "properties": {"repobilityId": "75b4f9c2b835a970", "scanner": "scanner-primary", "fingerprint": "b49e17065ad8af6a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a427de5a1a413338", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-slug-migration.ts:110"}, "properties": {"repobilityId": "a2e8af27951d63bc", "scanner": "scanner-primary", "fingerprint": "a427de5a1a413338", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e64e143eddc78141", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scrape-hero-images.ts:222"}, "properties": {"repobilityId": "3470d93914a1f39e", "scanner": "scanner-primary", "fingerprint": "e64e143eddc78141", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ab0d2d459dea0537", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-cohorte9-apply.ts:53"}, "properties": {"repobilityId": "bc03e7aa3e43029b", "scanner": "scanner-primary", "fingerprint": "ab0d2d459dea0537", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c4fc1beac126918f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-depublier-fantomes.ts:13"}, "properties": {"repobilityId": "b0ce5843ce15e5aa", "scanner": "scanner-primary", "fingerprint": "c4fc1beac126918f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e9a2490bf9e6e177", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-emdash-mdx.ts:102"}, "properties": {"repobilityId": "e12cc6219577e9f3", "scanner": "scanner-primary", "fingerprint": "e9a2490bf9e6e177", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d226460eaa07098e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diag-city-cleanup-villepinte.ts:170"}, "properties": {"repobilityId": "7632430a1c53b240", "scanner": "scanner-primary", "fingerprint": "d226460eaa07098e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1a0d3527c816d79f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scraper/run.ts:10"}, "properties": {"repobilityId": "839d51c58067d325", "scanner": "scanner-primary", "fingerprint": "1a0d3527c816d79f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b4c130ac1122a994", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scraper/discover.ts:27"}, "properties": {"repobilityId": "8c0951133b0d2071", "scanner": "scanner-primary", "fingerprint": "b4c130ac1122a994", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-39f7c1fa80f0d901", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scraper/enrich.ts:88"}, "properties": {"repobilityId": "e01b2f284d3a577d", "scanner": "scanner-primary", "fingerprint": "39f7c1fa80f0d901", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-01dc3f33d11cd28b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scraper/sync.ts:67"}, "properties": {"repobilityId": "6be80707e73784de", "scanner": "scanner-primary", "fingerprint": "01dc3f33d11cd28b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ab7967867983faf1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/venue-sort-bar.tsx:130"}, "properties": {"repobilityId": "012351e37ea45405", "scanner": "scanner-primary", "fingerprint": "ab7967867983faf1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e9ab16d2d439cae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/user-chip.tsx:64"}, "properties": {"repobilityId": "92958fcbeaa0bd16", "scanner": "scanner-primary", "fingerprint": "2e9ab16d2d439cae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4a04f5e47d3f87d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sort-bar.tsx:147"}, "properties": {"repobilityId": "fdd79551b1648649", "scanner": "scanner-primary", "fingerprint": "f4a04f5e47d3f87d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0a7ff2591c1e1b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/provider-sort-bar.tsx:142"}, "properties": {"repobilityId": "4c887ebe89072e8d", "scanner": "scanner-primary", "fingerprint": "f0a7ff2591c1e1b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc6b355cf4a8bb4a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/json-ld.tsx:9"}, "properties": {"repobilityId": "a0a0d37f8caa6f14", "scanner": "scanner-primary", "fingerprint": "fc6b355cf4a8bb4a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b4bd85e6adb14713", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/devis/page.tsx:84"}, "properties": {"repobilityId": "9730b44768e9f0c0", "scanner": "scanner-primary", "fingerprint": "b4bd85e6adb14713", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-732f4ef0ec41e920", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/avis/page.tsx:91"}, "properties": {"repobilityId": "98188f2038ea67fe", "scanner": "scanner-primary", "fingerprint": "732f4ef0ec41e920", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2bf2499fd631c09a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/reports/page.tsx:83"}, "properties": {"repobilityId": "b403cb8ac5852776", "scanner": "scanner-primary", "fingerprint": "2bf2499fd631c09a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c438892841c51ccf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/sampling/page.tsx:146"}, "properties": {"repobilityId": "7a68e4ea7d698106", "scanner": "scanner-primary", "fingerprint": "c438892841c51ccf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e13ae906f3211621", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/docx-to-mdx.ts:24"}, "properties": {"repobilityId": "43bde9426e1f8d06", "scanner": "scanner-primary", "fingerprint": "e13ae906f3211621", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/docx-to-mdx.ts"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-47fa55767e2931ea", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/scraper/run.ts:4"}, "properties": {"repobilityId": "cd65d836ad557f55", "scanner": "scanner-primary", "fingerprint": "47fa55767e2931ea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/scraper/run.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-9f04b0d772c7c5d7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/json-ld.tsx:9"}, "properties": {"repobilityId": "9b57d463e843e76c", "scanner": "scanner-primary", "fingerprint": "9f04b0d772c7c5d7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/json-ld.tsx"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "3bb470f551d547c8", "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": "1cbec1305ce77f12", "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": "2b6beea3fe96bc8d", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "522a55dde365479f", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "907dae54b95f4ba3", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "dde935d1fdd2d562", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "1d3dedc3ecee983f", "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": "e9ccb714827f18cc", "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": "abe8ea517f6cf208", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 451}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-87af7f6d989ce25a", "level": "none", "message": {"text": "Commented-code block (5 lines) in next.config.ts:134"}, "properties": {"repobilityId": "85a3f58867d92e92", "scanner": "scanner-primary", "fingerprint": "87af7f6d989ce25a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80dc7bda952fd59e", "level": "none", "message": {"text": "Commented-code block (25 lines) in scripts/diag-redirect-slug-cleanup.ts:6"}, "properties": {"repobilityId": "349ebcadc2fc5cb3", "scanner": "scanner-primary", "fingerprint": "80dc7bda952fd59e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5f29a6695c176df", "level": "none", "message": {"text": "Commented-code block (21 lines) in scripts/find-next-edition.ts:4"}, "properties": {"repobilityId": "8bd47c10b86e2e92", "scanner": "scanner-primary", "fingerprint": "b5f29a6695c176df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a57934f907ba5b74", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/find-next-edition.ts:210"}, "properties": {"repobilityId": "40807e188537609e", "scanner": "scanner-primary", "fingerprint": "a57934f907ba5b74", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-baff734ab631ac57", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag-backfill-categories.ts:35"}, "properties": {"repobilityId": "2d0d374513ac73ed", "scanner": "scanner-primary", "fingerprint": "baff734ab631ac57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6029e4215cbe20a9", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/diag-redirect-coherence.ts:3"}, "properties": {"repobilityId": "c9581225f9c0e9bc", "scanner": "scanner-primary", "fingerprint": "6029e4215cbe20a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7cf479c32f2a1417", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/classify-categories.ts:1"}, "properties": {"repobilityId": "b5dd85120228952f", "scanner": "scanner-primary", "fingerprint": "7cf479c32f2a1417", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd2506786ede198f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/classify-categories.ts:91"}, "properties": {"repobilityId": "0d88a3948ff8d008", "scanner": "scanner-primary", "fingerprint": "dd2506786ede198f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1531245c5be75fda", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/spell-check.ts:105"}, "properties": {"repobilityId": "a63694f9ad5592ef", "scanner": "scanner-primary", "fingerprint": "1531245c5be75fda", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36e5dd15f56d35e8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag-audit-catalogue.ts:53"}, "properties": {"repobilityId": "2999e3de1616c162", "scanner": "scanner-primary", "fingerprint": "36e5dd15f56d35e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f5e468fbf755827b", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/validate-covers.ts:3"}, "properties": {"repobilityId": "89d82d915c75467c", "scanner": "scanner-primary", "fingerprint": "f5e468fbf755827b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a7b6ca1ad5306b4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag-audit-upcoming.ts:53"}, "properties": {"repobilityId": "025d68f423338c47", "scanner": "scanner-primary", "fingerprint": "2a7b6ca1ad5306b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-47fe7320caae4f43", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/scrape-hero-images.ts:3"}, "properties": {"repobilityId": "4c9a707d31eac575", "scanner": "scanner-primary", "fingerprint": "47fe7320caae4f43", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7014815b26b75187", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/diag-emdash-mdx.ts:3"}, "properties": {"repobilityId": "79f350937e817e6d", "scanner": "scanner-primary", "fingerprint": "7014815b26b75187", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77204606fd2901ae", "level": "none", "message": {"text": "Commented-code block (18 lines) in scripts/diag-city-cleanup-villepinte.ts:9"}, "properties": {"repobilityId": "13c27539537aee0f", "scanner": "scanner-primary", "fingerprint": "77204606fd2901ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bad1a64e7c36b1bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/proxy.ts:8"}, "properties": {"repobilityId": "77bfe708d9fa92d5", "scanner": "scanner-primary", "fingerprint": "bad1a64e7c36b1bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-996ba2bdf6beac1d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/salon-actions-bar.tsx:3"}, "properties": {"repobilityId": "76c1e2b35bbbbbde", "scanner": "scanner-primary", "fingerprint": "996ba2bdf6beac1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e1c7c9dd85848bc", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/admin-salon-form.tsx:5"}, "properties": {"repobilityId": "9cc91bc0c3ba333a", "scanner": "scanner-primary", "fingerprint": "1e1c7c9dd85848bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11f555c087d5a675", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/page.tsx:18"}, "properties": {"repobilityId": "a8dfabd4dabb8484", "scanner": "scanner-primary", "fingerprint": "11f555c087d5a675", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d717e51e73df6b8a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/page.tsx:48"}, "properties": {"repobilityId": "02a74e80baf4cd03", "scanner": "scanner-primary", "fingerprint": "d717e51e73df6b8a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-03ba583bf32f145f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/devis/page.tsx:29"}, "properties": {"repobilityId": "e1019d992fdb60fe", "scanner": "scanner-primary", "fingerprint": "03ba583bf32f145f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-933c0b7bc3eebefd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/salons/page.tsx:49"}, "properties": {"repobilityId": "28ab18e48148b267", "scanner": "scanner-primary", "fingerprint": "933c0b7bc3eebefd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3ed5a5b86845f899", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/salons/nouveau/page.tsx:12"}, "properties": {"repobilityId": "2261c2d6bbe0b338", "scanner": "scanner-primary", "fingerprint": "3ed5a5b86845f899", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d6a5fe864c2fce8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/salons/[id]/page.tsx:17"}, "properties": {"repobilityId": "1a71a033fffedffc", "scanner": "scanner-primary", "fingerprint": "6d6a5fe864c2fce8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-73f52b2d4ba88e52", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/secteurs/page.tsx:23"}, "properties": {"repobilityId": "165acb3967298759", "scanner": "scanner-primary", "fingerprint": "73f52b2d4ba88e52", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce8ad99f8fba99de", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/secteurs/[id]/page.tsx:25"}, "properties": {"repobilityId": "69f0785dc8d6636a", "scanner": "scanner-primary", "fingerprint": "ce8ad99f8fba99de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-98a4eb9f205bb209", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/venues/page.tsx:24"}, "properties": {"repobilityId": "74a5311c1c54d714", "scanner": "scanner-primary", "fingerprint": "98a4eb9f205bb209", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1adfd2994de1cfad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/venues/[id]/page.tsx:25"}, "properties": {"repobilityId": "8405260e2f69f92b", "scanner": "scanner-primary", "fingerprint": "1adfd2994de1cfad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-26725d7422d1055b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/alertes/page.tsx:28"}, "properties": {"repobilityId": "2d8b57e9439e3b15", "scanner": "scanner-primary", "fingerprint": "26725d7422d1055b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f9fed74f33659cf8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/avis/page.tsx:24"}, "properties": {"repobilityId": "492e467017531215", "scanner": "scanner-primary", "fingerprint": "f9fed74f33659cf8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7b5a9c6ac4b8b9ce", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/reports/page.tsx:29"}, "properties": {"repobilityId": "628842f834c5471f", "scanner": "scanner-primary", "fingerprint": "7b5a9c6ac4b8b9ce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9fe44edb46beef94", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/prestataires/page.tsx:45"}, "properties": {"repobilityId": "fc31b6f527aa9ba1", "scanner": "scanner-primary", "fingerprint": "9fe44edb46beef94", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b3f27eef0161cf2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/prestataires/[id]/page.tsx:35"}, "properties": {"repobilityId": "0d71e7e13e9833b6", "scanner": "scanner-primary", "fingerprint": "5b3f27eef0161cf2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-350079f1928cb9e9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/admin/sampling/page.tsx:7"}, "properties": {"repobilityId": "b89eb96149d3c738", "scanner": "scanner-primary", "fingerprint": "350079f1928cb9e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ababf786ff5ddf0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/auth.ts:26"}, "properties": {"repobilityId": "6e7b0d874f0c86cb", "scanner": "scanner-primary", "fingerprint": "9ababf786ff5ddf0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-304942a71dc84ef9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/brevo.ts:44"}, "properties": {"repobilityId": "8867ae1fb5eaf1d0", "scanner": "scanner-primary", "fingerprint": "304942a71dc84ef9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fda7634f1f86f29c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/queries.ts:196"}, "properties": {"repobilityId": "3edba082894ee6bc", "scanner": "scanner-primary", "fingerprint": "fda7634f1f86f29c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}