{"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-227a9f92823b1574", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-boamp-descriptions.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-boamp-descriptions.ts:45"}, "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-87218f6e28fef4e3", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-ice-breaker.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-ice-breaker.ts:17"}, "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-b99325fb4fb81b0a", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-ted/route.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-ted/route.ts:35"}, "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-5d6f7cc759ddc722", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/embed-tenders/route.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/embed-tenders/route.ts:26"}, "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-83ee19dcbde57988", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-dedup/route.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-dedup/route.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-6bf9f042f8b7e146", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-atexo/route.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-atexo/route.ts:37"}, "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-66a43c5fd48bc390", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-aws/route.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-aws/route.ts:29"}, "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-86b0c422b0de3f7b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/enrich-tenders/route.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/enrich-tenders/route.ts:60"}, "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-8313983a34cc3d25", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-boamp/route.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-boamp/route.ts:36"}, "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-58a52b2a6cab2eac", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/monitoring/users/page.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/monitoring/users/page.tsx:158"}, "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-4b6788cb7ccec1fa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/monitoring/errors/page.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/monitoring/errors/page.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b4afe6baed0e453c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/monitoring/by-tool/page.tsx:256", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/monitoring/by-tool/page.tsx:256"}, "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-e84796e741ffa429", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/credits/page.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/credits/page.tsx:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d919fd15f02c3648", "name": "Icon-only button without accessible name \u2014 src/app/(app)/admin/users/page.tsx:670", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/(app)/admin/users/page.tsx:670"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e361ccaebcf35956", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/users/page.tsx:372", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/users/page.tsx:372"}, "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-e197b88977bdd2de", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/prompts/prompt-editor.tsx:426", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/prompts/prompt-editor.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-d46c25ce67ac2841", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profil/page.tsx:518", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profil/page.tsx:518"}, "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-e8663653a1786c99", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/appels-offres/dashboard/page.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/appels-offres/dashboard/page.tsx:105"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a01212f9037402cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/veille/[idweb]/page.tsx:1203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/veille/[idweb]/page.tsx:1203"}, "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-fd9a3cafb4a39c9c", "name": "Icon-only button without accessible name \u2014 src/app/(app)/equipe/page.tsx:445", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/(app)/equipe/page.tsx:445"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cbad9d329f349767", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/BugReportRow.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/BugReportRow.tsx:110"}, "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-84c280890e74b971", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ice-breaker/liquid-field.tsx:66", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ice-breaker/liquid-field.tsx:66"}, "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-463ab0e114afbb15", "name": "Stray `console.log` in TS/JS \u2014 src/lib/aws/sync.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aws/sync.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-df690799d28ec6ed", "name": "Stray `console.log` in TS/JS \u2014 src/lib/aws/apify-client.ts:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aws/apify-client.ts:127"}, "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-17f8d522373545b6", "name": "Stray `console.log` in TS/JS \u2014 src/lib/boamp/sync.ts:498", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/boamp/sync.ts:498"}, "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-fce1fcd3eafc74b2", "name": "Stray `console.log` in TS/JS \u2014 src/lib/ted/sync.ts:423", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ted/sync.ts:423"}, "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-de139cf2019b8a9a", "name": "Stray `console.log` in TS/JS \u2014 src/lib/atexo/sync.ts:120", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/atexo/sync.ts:120"}, "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-701c3ce7de403a01", "name": "Stray `console.log` in TS/JS \u2014 src/lib/atexo/apify-client.ts:155", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/atexo/apify-client.ts:155"}, "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-caba5768792a03ba", "name": "Stray `console.log` in TS/JS \u2014 TESTS/veille-rs/dior-real-pipeline.test.ts:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 TESTS/veille-rs/dior-real-pipeline.test.ts:70"}, "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-4f74dbbce6d2870f", "name": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/deploy.ts:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/deploy.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-ce44ad517a327b0d", "name": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/deploy-only.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/deploy-only.ts:51"}, "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-c6a2c0a04f01dc95", "name": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-multi-pagination.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-multi-pagination.ts:35"}, "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-e60db17bb41aa97a", "name": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-keyword.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-keyword.ts:16"}, "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-e3d42013ba05f1b9", "name": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-parse.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-parse.ts:21"}, "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-cd4288d5054fa8ff", "name": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-playwright.ts:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-playwright.ts:144"}, "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-1055c706de1be2ca", "name": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-pagination.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-pagination.ts:35"}, "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-0b36dafeb05c0a71", "name": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-multi-keyword.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-multi-keyword.ts:43"}, "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-8ae068540b86993c", "name": "Dockerfile runs as root: apify-aws-actor/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apify-aws-actor/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8cbeef1e3fba3ea0", "name": "Docker base image is tag-pinned but not digest-pinned: apify/actor-node:20", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: apify/actor-node:20"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99f3da7c349d3c05", "name": "Dockerfile runs as root: apify-atexo-actor/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apify-atexo-actor/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c07f30084581c5a", "name": "Docker base image is tag-pinned but not digest-pinned: apify/actor-node-playwright-chrome:20", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: apify/actor-node-playwright-chrome:20"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-07cc86c6f466a1b3", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ice-breaker/liquid-field.tsx:66", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ice-breaker/liquid-field.tsx:66"}, "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-ef2f0b977cdc715e", "name": "Very large file: src/app/(app)/profil/page.tsx (1357 lines)", "shortDescription": {"text": "Very large file: src/app/(app)/profil/page.tsx (1357 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-23056a05077cc09f", "name": "Very large file: src/app/(app)/veille/[idweb]/page.tsx (1317 lines)", "shortDescription": {"text": "Very large file: src/app/(app)/veille/[idweb]/page.tsx (1317 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-8d9c865a9916fb11", "name": "Very large file: src/components/veille-rs/magazine/MagazineReport.tsx (3206 lines)", "shortDescription": {"text": "Very large file: src/components/veille-rs/magazine/MagazineReport.tsx (3206 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-dc8987146bab62c4", "name": "Very large file: src/components/veille-rs/magazine/magazine-utils.ts (1751 lines)", "shortDescription": {"text": "Very large file: src/components/veille-rs/magazine/magazine-utils.ts (1751 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": "30 test file(s) for 428 source file(s) (ratio 0.07). 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-b3ed68815bca2f8c", "name": "Node manifest has dependencies but no lockfile: package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffa2166606e42f89", "name": "Node manifest has dependencies but no lockfile: apify-aws-actor/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apify-aws-actor/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fe7bddb034cf1fb7", "name": "Node manifest has dependencies but no lockfile: apify-atexo-actor/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apify-atexo-actor/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 154 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 169 placeholder/mock markers across 57 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. 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, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8769bcc771831214", "name": "Agent instruction contains unpinned remote install: .claude/settings.json", "shortDescription": {"text": "Agent instruction contains unpinned remote install: .claude/settings.json"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-4705cabb788b089d", "name": "Commented-code block (6 lines) in next.config.ts:23", "shortDescription": {"text": "Commented-code block (6 lines) in next.config.ts:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f6f8eb5ef678b78d", "name": "Commented-code block (6 lines) in src/middleware.ts:37", "shortDescription": {"text": "Commented-code block (6 lines) in src/middleware.ts: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-e079e4d01f7c12c3", "name": "Legacy-named symbol `enrichment_v1` in src/app/api/cron/veille-rs-enrich-pending/route.ts:3", "shortDescription": {"text": "Legacy-named symbol `enrichment_v1` in src/app/api/cron/veille-rs-enrich-pending/route.ts:3"}, "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-aeebb4915fc33cac", "name": "Commented-code block (11 lines) in src/app/api/cron/ice-breaker-alerts/route.ts:4", "shortDescription": {"text": "Commented-code block (11 lines) in src/app/api/cron/ice-breaker-alerts/route.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-6e58d10e4e790579", "name": "Commented-code block (6 lines) in src/app/api/cron/veille-rs-worker/route.ts:47", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/cron/veille-rs-worker/route.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-204a72dbbb8d1934", "name": "Commented-code block (9 lines) in src/app/api/cron/ice-breaker-followups/route.ts:7", "shortDescription": {"text": "Commented-code block (9 lines) in src/app/api/cron/ice-breaker-followups/route.ts: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-185e1af2af347967", "name": "Commented-code block (5 lines) in src/app/api/admin/credits/overrides/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/admin/credits/overrides/route.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-ee953e9413c5cf60", "name": "Commented-code block (6 lines) in src/app/api/admin/users/route.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/admin/users/route.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-70a07956da001735", "name": "Commented-code block (5 lines) in src/app/api/admin/prompts/[key]/promote/route.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/admin/prompts/[key]/promote/route.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-b1fdd8f47f3b705b", "name": "Legacy-named symbol `enrich_analysis_v1` in src/app/api/admin/veille-rs/reports/[id]/enrich-analysis/route.ts:15", "shortDescription": {"text": "Legacy-named symbol `enrich_analysis_v1` in src/app/api/admin/veille-rs/reports/[id]/enrich-analysis/route.ts:15"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-86d8cb70ca95a4f6", "name": "Commented-code block (5 lines) in src/app/api/admin/veille-rs/reports/[id]/enrich-analysis/route.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/admin/veille-rs/reports/[id]/enrich-analysis/route.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-e71747f8a2883142", "name": "Commented-code block (5 lines) in src/app/api/profil/route.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/profil/route.ts: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-f2c0c4a75b7e68df", "name": "Commented-code block (5 lines) in src/app/api/profil/deep-research/route.ts:93", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/profil/deep-research/route.ts: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-8f7c5e06f3a56057", "name": "Commented-code block (5 lines) in src/app/api/organizations/members/route.ts:244", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/organizations/members/route.ts:244"}, "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-000183e8abe2735a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/collaborateurs/linkedin/route.ts:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/collaborateurs/linkedin/route.ts:63"}, "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-58c554b938e0e7e9", "name": "Commented-code block (5 lines) in src/app/api/onboarding/finalize-conversation/route.ts:74", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/onboarding/finalize-conversation/route.ts:74"}, "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-dbe762a6676f8040", "name": "Commented-code block (5 lines) in src/app/api/me/profile/route.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/me/profile/route.ts: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-1eeb481e1a5777de", "name": "Commented-code block (6 lines) in src/app/api/veille/tenders/route.ts:395", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/veille/tenders/route.ts:395"}, "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-471c8932ecd5f1f3", "name": "Commented-code block (6 lines) in src/app/api/ice-breaker/prospects/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/ice-breaker/prospects/route.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-4b9f12b556838e3c", "name": "Commented-code block (5 lines) in src/app/api/ice-breaker/templates/preview/route.ts:68", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/ice-breaker/templates/preview/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-c5082f1bcf9d7827", "name": "Commented-code block (5 lines) in src/app/api/ice-breaker/analyze/route.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/ice-breaker/analyze/route.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-d52267c75a3dbad1", "name": "Commented-code block (6 lines) in src/app/api/ice-breaker/prospect/[id]/sequence/regenerate/route.ts:80", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/ice-breaker/prospect/[id]/sequence/regenerate/route.ts:80"}, "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-7f5a6bdbeaebc329", "name": "Commented-code block (6 lines) in src/app/api/ice-breaker/prospect/[id]/sequence/preview/route.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/ice-breaker/prospect/[id]/sequence/preview/route.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-17b50943a7e2f949", "name": "Commented-code block (5 lines) in src/app/api/ice-breaker/prospect/[id]/hubspot/push/route.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/ice-breaker/prospect/[id]/hubspot/push/route.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-e40a4a622f3cef35", "name": "Commented-code block (5 lines) in src/app/api/veille-rs/brands/route.ts:20", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/veille-rs/brands/route.ts: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-e36d4f92baaed7d5", "name": "Commented-code block (8 lines) in src/app/api/veille-rs/reports/route.ts:229", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/api/veille-rs/reports/route.ts: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-ceb4a403009db0ff", "name": "Commented-code block (5 lines) in src/app/api/veille-rs/reports/[id]/route.ts:96", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/veille-rs/reports/[id]/route.ts: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-846f2f1dec2b579f", "name": "Legacy-named symbol `tiktok_backup` in src/app/api/veille-rs/poc/run/route.ts:121", "shortDescription": {"text": "Legacy-named symbol `tiktok_backup` in src/app/api/veille-rs/poc/run/route.ts:121"}, "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-af742f447d22d677", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/auth/accept-invite/page.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/auth/accept-invite/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-d8cc84726571a042", "name": "Commented-code block (9 lines) in src/app/auth/register/page.tsx:60", "shortDescription": {"text": "Commented-code block (9 lines) in src/app/auth/register/page.tsx:60"}, "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-6160f8f97a03f2e4", "name": "Commented-code block (5 lines) in src/app/(app)/admin/monitoring/by-tool/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(app)/admin/monitoring/by-tool/page.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-a6b77a7efd542f4e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/admin/credits/[id]/page.tsx:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/admin/credits/[id]/page.tsx: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-f30140074a2b6971", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/admin/credits/settings/page.tsx:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/admin/credits/settings/page.tsx:71"}, "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-61eebc5e58191b5e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/admin/users/page.tsx:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/admin/users/page.tsx:99"}, "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-ebb455ea9a32f655", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/appels-offres/dashboard/page.tsx:188", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/appels-offres/dashboard/page.tsx:188"}, "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-e8c840b0dbce3d6e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille/page.tsx:298", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille/page.tsx:298"}, "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-3650fcdac3062ad1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille/[idweb]/page.tsx:862", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille/[idweb]/page.tsx:862"}, "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-65361ef96b873963", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/folders-sidebar.tsx:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/folders-sidebar.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-875c541d3721fed1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/page.tsx:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/page.tsx:85"}, "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-01632dab6c277ea5", "name": "Commented-code block (7 lines) in src/app/(app)/ice-breaker/[id]/sequence-tab.tsx:5", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/(app)/ice-breaker/[id]/sequence-tab.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-823231cb36a87891", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/[id]/sequence-tab.tsx:105", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/[id]/sequence-tab.tsx: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-573267f5c96b0c54", "name": "Commented-code block (5 lines) in src/app/(app)/ice-breaker/[id]/hubspot-panel.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(app)/ice-breaker/[id]/hubspot-panel.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-e2beb703eedd9220", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/mon-profil/voice-training-section.tsx:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/mon-profil/voice-training-section.tsx:55"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1932634f5bba74a1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/mon-profil/page.tsx:108", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/mon-profil/page.tsx:108"}, "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-e30e7170bef58320", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/templates/template-editor.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/templates/template-editor.tsx:59"}, "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-2a458feb0ed12715", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille-rs/page.tsx:168", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille-rs/page.tsx:168"}, "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-b70ab3270318c3f5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille-rs/branding/page.tsx:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille-rs/branding/page.tsx:76"}, "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-888074b2dfdfb866", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille-rs/nouveau/page.tsx:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille-rs/nouveau/page.tsx:133"}, "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-090b3f6fe522731a", "name": "Commented-code block (5 lines) in src/components/layout/sidebar.tsx:65", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/layout/sidebar.tsx:65"}, "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-1d83e4df450fe83c", "name": "Commented-code block (5 lines) in src/components/appels-offres/MemoireTechniqueEditor.tsx:42", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/appels-offres/MemoireTechniqueEditor.tsx:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04a3b505fcadfb64", "name": "Commented-code block (5 lines) in src/components/appels-offres/AppelsOffresListClient.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/appels-offres/AppelsOffresListClient.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-9c00ec484dd9e88a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/appels-offres/DceUploadZone.tsx:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/appels-offres/DceUploadZone.tsx:88"}, "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-4efe5ebe36af1aa1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/appels-offres/AOActions.tsx:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/appels-offres/AOActions.tsx:76"}, "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-df6918eb432679ba", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/appels-offres/DeleteAOButton.tsx:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/appels-offres/DeleteAOButton.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-29c07082124cdfd2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/onboarding/ToolOnboardingGate.tsx:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/onboarding/ToolOnboardingGate.tsx: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-fa68aba231bec4d3", "name": "Commented-code block (6 lines) in src/components/ice-breaker/liquid-field.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/ice-breaker/liquid-field.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-73babcd16b85a656", "name": "Commented-code block (7 lines) in src/components/veille-rs/magazine/MagazineReport.tsx:260", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/veille-rs/magazine/MagazineReport.tsx:260"}, "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-226b8e94a91dec6c", "name": "Legacy-named symbol `enrichment_v1` in src/components/veille-rs/magazine/magazine-utils.ts:966", "shortDescription": {"text": "Legacy-named symbol `enrichment_v1` in src/components/veille-rs/magazine/magazine-utils.ts:966"}, "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-bec79899719a04aa", "name": "Commented-code block (5 lines) in src/components/veille-rs/magazine/magazine-utils.ts:281", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/veille-rs/magazine/magazine-utils.ts:281"}, "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-990696caa95ec322", "name": "Commented-code block (5 lines) in src/lib/validations.ts:111", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/validations.ts:111"}, "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-23b9c658dd625112", "name": "Commented-code block (7 lines) in src/lib/aws/sync.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/aws/sync.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-a9bd222d7469feff", "name": "Commented-code block (5 lines) in src/lib/aws/transform.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/aws/transform.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-b123f19b5cfc9611", "name": "Commented-code block (5 lines) in src/lib/monitoring/api-usage.ts:289", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/monitoring/api-usage.ts:289"}, "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-f3b0e5c8697eea06", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/monitoring/api-usage.ts:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/monitoring/api-usage.ts:126"}, "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-f6a012b90aa21e7a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/monitoring/api-credentials.ts:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/monitoring/api-credentials.ts: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-eac9f68f12b22f70", "name": "Commented-code block (11 lines) in src/lib/boamp/codes.ts:16", "shortDescription": {"text": "Commented-code block (11 lines) in src/lib/boamp/codes.ts: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-7d45d7d166e07bd2", "name": "Commented-code block (5 lines) in src/lib/enrichment/web-search.ts:75", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/enrichment/web-search.ts: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-0ae43f9d634fea9e", "name": "Legacy-named symbol `analyze_v1` in src/lib/voice-training/analyze.ts:4", "shortDescription": {"text": "Legacy-named symbol `analyze_v1` in src/lib/voice-training/analyze.ts:4"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e8937cf602faedf3", "name": "Commented-code block (5 lines) in src/lib/ted/sync.ts:160", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ted/sync.ts:160"}, "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-1d9b31b33fd426bd", "name": "Legacy-named symbol `analyze_v1` in src/lib/prompts/fallbacks.ts:5", "shortDescription": {"text": "Legacy-named symbol `analyze_v1` in src/lib/prompts/fallbacks.ts:5"}, "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-9bb281cfb41c8666", "name": "Commented-code block (6 lines) in src/lib/prompts/fallbacks.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/prompts/fallbacks.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-6494fc3b6dccf927", "name": "Legacy-named symbol `analyze_v1` in src/lib/prompts/loader.ts:3", "shortDescription": {"text": "Legacy-named symbol `analyze_v1` in src/lib/prompts/loader.ts:3"}, "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-bdaa45624a619e8b", "name": "Commented-code block (6 lines) in src/lib/sso/provision.ts:140", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sso/provision.ts:140"}, "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-62175224198cd85a", "name": "Commented-code block (10 lines) in src/lib/atexo/sync.ts:9", "shortDescription": {"text": "Commented-code block (10 lines) in src/lib/atexo/sync.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-a3de3a6ef7e5a3a2", "name": "Commented-code block (11 lines) in src/lib/atexo/providers.ts:35", "shortDescription": {"text": "Commented-code block (11 lines) in src/lib/atexo/providers.ts: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-022bdedeeaae0737", "name": "Legacy-named symbol `analyze_v1` in src/lib/ice-breaker/analyze.ts:27", "shortDescription": {"text": "Legacy-named symbol `analyze_v1` in src/lib/ice-breaker/analyze.ts: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-8fc8c9bc436f3aa5", "name": "Commented-code block (5 lines) in src/lib/ice-breaker/alerts-diff.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ice-breaker/alerts-diff.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-e7201d40ca9d7ab6", "name": "Commented-code block (9 lines) in src/lib/ice-breaker/avatar-cache.ts:78", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/ice-breaker/avatar-cache.ts:78"}, "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-946378b948089227", "name": "Legacy-named symbol `generate_v1` in src/lib/ice-breaker/generate.ts:251", "shortDescription": {"text": "Legacy-named symbol `generate_v1` in src/lib/ice-breaker/generate.ts:251"}, "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-366431c57dd075b8", "name": "Commented-code block (5 lines) in src/lib/ice-breaker/apify-posts.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ice-breaker/apify-posts.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-4f777621905439f2", "name": "Commented-code block (6 lines) in src/lib/ice-breaker/context.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ice-breaker/context.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-be37cf353fff8a2d", "name": "Commented-code block (5 lines) in src/lib/ice-breaker/prospect-variables.ts:98", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ice-breaker/prospect-variables.ts:98"}, "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-a973fa1eb8c33e44", "name": "Commented-code block (6 lines) in src/lib/ice-breaker/company-intel.ts:15", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ice-breaker/company-intel.ts:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6cdcb1bd9ff5ded9", "name": "Commented-code block (6 lines) in src/lib/ice-breaker/followup-generate.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ice-breaker/followup-generate.ts: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-558c4b7598ec3c16", "name": "Legacy-named symbol `too_old` in src/lib/veille-rs/brand-context-research.ts:112", "shortDescription": {"text": "Legacy-named symbol `too_old` in src/lib/veille-rs/brand-context-research.ts:112"}, "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-e2d61bd411c14f9e", "name": "Commented-code block (6 lines) in src/lib/veille-rs/brand-context-research.ts:255", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/veille-rs/brand-context-research.ts:255"}, "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-0a8f0a989ca28406", "name": "Commented-code block (7 lines) in src/lib/veille-rs/scrape.ts:62", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/veille-rs/scrape.ts:62"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18d6c0ec05e86d56", "name": "Legacy-named symbol `enrichment_v1` in src/lib/veille-rs/report-builder.ts:364", "shortDescription": {"text": "Legacy-named symbol `enrichment_v1` in src/lib/veille-rs/report-builder.ts:364"}, "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-6fdf92b286e307b5", "name": "Commented-code block (6 lines) in src/lib/veille-rs/report-builder.ts:53", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/veille-rs/report-builder.ts: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-5a40f6dd1e90cdca", "name": "Commented-code block (5 lines) in src/lib/veille-rs/thumbnail-cache.ts:278", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/veille-rs/thumbnail-cache.ts:278"}, "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-ec618725f4ea4d32", "name": "Legacy-named symbol `too_old` in src/lib/veille-rs/types.ts:282", "shortDescription": {"text": "Legacy-named symbol `too_old` in src/lib/veille-rs/types.ts:282"}, "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-69128c1602d17d21", "name": "Commented-code block (6 lines) in src/lib/ai/ice-breaker-llm.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai/ice-breaker-llm.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-69d18baa616f42b2", "name": "Commented-code block (5 lines) in src/lib/ai/claude-client.ts:125", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/claude-client.ts:125"}, "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-98327758c786fbfc", "name": "Commented-code block (6 lines) in src/lib/ai/embeddings.ts:14", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai/embeddings.ts:14"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c84073989c4cb158", "name": "Commented-code block (9 lines) in src/lib/ai/gemini-client.ts:19", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/ai/gemini-client.ts:19"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-855d52a90c42182d", "name": "Commented-code block (9 lines) in TESTS/scoring/seed-fixtures.ts:41", "shortDescription": {"text": "Commented-code block (9 lines) in TESTS/scoring/seed-fixtures.ts:41"}, "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-c64a5a3f6508fb76", "name": "Legacy-named symbol `linkedin_backup` in TESTS/veille-rs-poc/rls.test.ts:85", "shortDescription": {"text": "Legacy-named symbol `linkedin_backup` in TESTS/veille-rs-poc/rls.test.ts:85"}, "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-21f11758de70a64d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/deploy.ts:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/deploy.ts:77"}, "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-e22739734c27c37b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/deploy-only.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/deploy-only.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-0abe9f1ba197f687", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-multi-pagination.ts:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-multi-pagination.ts:38"}, "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-dbc05ff268f976b5", "name": "Commented-code block (11 lines) in apify-atexo-actor/src/scraper.ts:10", "shortDescription": {"text": "Commented-code block (11 lines) in apify-atexo-actor/src/scraper.ts:10"}, "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-6ab8043bd8e348eb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-keyword.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-keyword.ts:19"}, "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-e4cb9430379fa8ee", "name": "Commented-code block (6 lines) in apify-atexo-actor/src/fetchDetail.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in apify-atexo-actor/src/fetchDetail.ts: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-efd5158e1fdfbd91", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-pagination.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-pagination.ts: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-cccaeaa6ce66ff64", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-multi-keyword.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-multi-keyword.ts:15"}, "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}}]}}, "automationDetails": {"id": "repobility/24539"}, "properties": {"repository": "bendeblanzy/aop", "repoUrl": "https://github.com/bendeblanzy/aop", "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-227a9f92823b1574", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-boamp-descriptions.ts:45"}, "properties": {"repobilityId": "9c33cf5e71f162b8", "scanner": "scanner-primary", "fingerprint": "227a9f92823b1574", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-87218f6e28fef4e3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-ice-breaker.ts:17"}, "properties": {"repobilityId": "d2b15d74e3cb43db", "scanner": "scanner-primary", "fingerprint": "87218f6e28fef4e3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b99325fb4fb81b0a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-ted/route.ts:35"}, "properties": {"repobilityId": "319f2881fd86597d", "scanner": "scanner-primary", "fingerprint": "b99325fb4fb81b0a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d6f7cc759ddc722", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/embed-tenders/route.ts:26"}, "properties": {"repobilityId": "f4e3f1f58e80a769", "scanner": "scanner-primary", "fingerprint": "5d6f7cc759ddc722", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83ee19dcbde57988", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-dedup/route.ts:41"}, "properties": {"repobilityId": "bfe76f038e18c353", "scanner": "scanner-primary", "fingerprint": "83ee19dcbde57988", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6bf9f042f8b7e146", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-atexo/route.ts:37"}, "properties": {"repobilityId": "00da5e1e939b85f3", "scanner": "scanner-primary", "fingerprint": "6bf9f042f8b7e146", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-66a43c5fd48bc390", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-aws/route.ts:29"}, "properties": {"repobilityId": "f791a5b249007a03", "scanner": "scanner-primary", "fingerprint": "66a43c5fd48bc390", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-86b0c422b0de3f7b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/enrich-tenders/route.ts:60"}, "properties": {"repobilityId": "8a519a70dcd79e69", "scanner": "scanner-primary", "fingerprint": "86b0c422b0de3f7b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8313983a34cc3d25", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sync-boamp/route.ts:36"}, "properties": {"repobilityId": "331f920a3e017a90", "scanner": "scanner-primary", "fingerprint": "8313983a34cc3d25", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-58a52b2a6cab2eac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/monitoring/users/page.tsx:158"}, "properties": {"repobilityId": "b1d3d1f63bc29e7a", "scanner": "scanner-primary", "fingerprint": "58a52b2a6cab2eac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b6788cb7ccec1fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/monitoring/errors/page.tsx:109"}, "properties": {"repobilityId": "0d04b64d54cc54aa", "scanner": "scanner-primary", "fingerprint": "4b6788cb7ccec1fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4afe6baed0e453c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/monitoring/by-tool/page.tsx:256"}, "properties": {"repobilityId": "fd59c6e13480f8b2", "scanner": "scanner-primary", "fingerprint": "b4afe6baed0e453c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e84796e741ffa429", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/credits/page.tsx:94"}, "properties": {"repobilityId": "0ded3bda1f478383", "scanner": "scanner-primary", "fingerprint": "e84796e741ffa429", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d919fd15f02c3648", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/(app)/admin/users/page.tsx:670"}, "properties": {"repobilityId": "72bd2a2310889a0c", "scanner": "scanner-primary", "fingerprint": "d919fd15f02c3648", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e361ccaebcf35956", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/users/page.tsx:372"}, "properties": {"repobilityId": "0b134c871eb7dd26", "scanner": "scanner-primary", "fingerprint": "e361ccaebcf35956", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e197b88977bdd2de", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/admin/prompts/prompt-editor.tsx:426"}, "properties": {"repobilityId": "d84cc71a0a523949", "scanner": "scanner-primary", "fingerprint": "e197b88977bdd2de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d46c25ce67ac2841", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profil/page.tsx:518"}, "properties": {"repobilityId": "7b19dfa3c85f528b", "scanner": "scanner-primary", "fingerprint": "d46c25ce67ac2841", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e8663653a1786c99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/appels-offres/dashboard/page.tsx:105"}, "properties": {"repobilityId": "c4ccc62b90d2fbea", "scanner": "scanner-primary", "fingerprint": "e8663653a1786c99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a01212f9037402cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/veille/[idweb]/page.tsx:1203"}, "properties": {"repobilityId": "0f939903249aa2b4", "scanner": "scanner-primary", "fingerprint": "a01212f9037402cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fd9a3cafb4a39c9c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/(app)/equipe/page.tsx:445"}, "properties": {"repobilityId": "e364e9ed2009b5d9", "scanner": "scanner-primary", "fingerprint": "fd9a3cafb4a39c9c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-cbad9d329f349767", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/BugReportRow.tsx:110"}, "properties": {"repobilityId": "eb56a4f4b3529456", "scanner": "scanner-primary", "fingerprint": "cbad9d329f349767", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84c280890e74b971", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ice-breaker/liquid-field.tsx:66"}, "properties": {"repobilityId": "6757bc62e9a92200", "scanner": "scanner-primary", "fingerprint": "84c280890e74b971", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-463ab0e114afbb15", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aws/sync.ts:57"}, "properties": {"repobilityId": "780339b05da039bc", "scanner": "scanner-primary", "fingerprint": "463ab0e114afbb15", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-df690799d28ec6ed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aws/apify-client.ts:127"}, "properties": {"repobilityId": "adfb5f5ed86eb26c", "scanner": "scanner-primary", "fingerprint": "df690799d28ec6ed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-17f8d522373545b6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/boamp/sync.ts:498"}, "properties": {"repobilityId": "afb7dfd90d5124ee", "scanner": "scanner-primary", "fingerprint": "17f8d522373545b6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fce1fcd3eafc74b2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ted/sync.ts:423"}, "properties": {"repobilityId": "b8b433870b89e441", "scanner": "scanner-primary", "fingerprint": "fce1fcd3eafc74b2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de139cf2019b8a9a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/atexo/sync.ts:120"}, "properties": {"repobilityId": "776efc9369d91b86", "scanner": "scanner-primary", "fingerprint": "de139cf2019b8a9a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-701c3ce7de403a01", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/atexo/apify-client.ts:155"}, "properties": {"repobilityId": "46a7e9d2a2c3788c", "scanner": "scanner-primary", "fingerprint": "701c3ce7de403a01", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-caba5768792a03ba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 TESTS/veille-rs/dior-real-pipeline.test.ts:70"}, "properties": {"repobilityId": "b2f3209c6c36e389", "scanner": "scanner-primary", "fingerprint": "caba5768792a03ba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4f74dbbce6d2870f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/deploy.ts:98"}, "properties": {"repobilityId": "3837689d35730754", "scanner": "scanner-primary", "fingerprint": "4f74dbbce6d2870f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ce44ad517a327b0d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/deploy-only.ts:51"}, "properties": {"repobilityId": "7305027d2f34e6b2", "scanner": "scanner-primary", "fingerprint": "ce44ad517a327b0d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6a2c0a04f01dc95", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-multi-pagination.ts:35"}, "properties": {"repobilityId": "0e5140e9dfc57b29", "scanner": "scanner-primary", "fingerprint": "c6a2c0a04f01dc95", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e60db17bb41aa97a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-keyword.ts:16"}, "properties": {"repobilityId": "55b1dd410b367887", "scanner": "scanner-primary", "fingerprint": "e60db17bb41aa97a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3d42013ba05f1b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-parse.ts:21"}, "properties": {"repobilityId": "44f88880c08bd18f", "scanner": "scanner-primary", "fingerprint": "e3d42013ba05f1b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd4288d5054fa8ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-playwright.ts:144"}, "properties": {"repobilityId": "efe8fe853c4c48ab", "scanner": "scanner-primary", "fingerprint": "cd4288d5054fa8ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1055c706de1be2ca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-pagination.ts:35"}, "properties": {"repobilityId": "181adb242157a943", "scanner": "scanner-primary", "fingerprint": "1055c706de1be2ca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0b36dafeb05c0a71", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apify-atexo-actor/src/test-multi-keyword.ts:43"}, "properties": {"repobilityId": "7a683e2bd080d925", "scanner": "scanner-primary", "fingerprint": "0b36dafeb05c0a71", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ae068540b86993c", "level": "warning", "message": {"text": "Dockerfile runs as root: apify-aws-actor/Dockerfile"}, "properties": {"repobilityId": "5db4e1cbc79daec4", "scanner": "scanner-primary", "fingerprint": "8ae068540b86993c", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-8cbeef1e3fba3ea0", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: apify/actor-node:20"}, "properties": {"repobilityId": "765c3f9caac89f40", "scanner": "scanner-primary", "fingerprint": "8cbeef1e3fba3ea0", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apify-aws-actor/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-99f3da7c349d3c05", "level": "warning", "message": {"text": "Dockerfile runs as root: apify-atexo-actor/Dockerfile"}, "properties": {"repobilityId": "9687b0e5b2da3092", "scanner": "scanner-primary", "fingerprint": "99f3da7c349d3c05", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-1c07f30084581c5a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: apify/actor-node-playwright-chrome:20"}, "properties": {"repobilityId": "4dec0f81f49d6746", "scanner": "scanner-primary", "fingerprint": "1c07f30084581c5a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apify-atexo-actor/Dockerfile"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-07cc86c6f466a1b3", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ice-breaker/liquid-field.tsx:66"}, "properties": {"repobilityId": "9246fe655f13acaa", "scanner": "scanner-primary", "fingerprint": "07cc86c6f466a1b3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ice-breaker/liquid-field.tsx"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-ef2f0b977cdc715e", "level": "note", "message": {"text": "Very large file: src/app/(app)/profil/page.tsx (1357 lines)"}, "properties": {"repobilityId": "230ef9426471d956", "scanner": "scanner-primary", "fingerprint": "ef2f0b977cdc715e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-23056a05077cc09f", "level": "note", "message": {"text": "Very large file: src/app/(app)/veille/[idweb]/page.tsx (1317 lines)"}, "properties": {"repobilityId": "acd31b0b3ae0e555", "scanner": "scanner-primary", "fingerprint": "23056a05077cc09f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8d9c865a9916fb11", "level": "note", "message": {"text": "Very large file: src/components/veille-rs/magazine/MagazineReport.tsx (3206 lines)"}, "properties": {"repobilityId": "961129e0668a54d0", "scanner": "scanner-primary", "fingerprint": "8d9c865a9916fb11", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dc8987146bab62c4", "level": "note", "message": {"text": "Very large file: src/components/veille-rs/magazine/magazine-utils.ts (1751 lines)"}, "properties": {"repobilityId": "530fd73e5bee36e0", "scanner": "scanner-primary", "fingerprint": "dc8987146bab62c4", "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-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "210e8f8d0771845b", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b3ed68815bca2f8c", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: package.json"}, "properties": {"repobilityId": "7edae0550c126386", "scanner": "scanner-primary", "fingerprint": "b3ed68815bca2f8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ffa2166606e42f89", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apify-aws-actor/package.json"}, "properties": {"repobilityId": "58066e0c465274d5", "scanner": "scanner-primary", "fingerprint": "ffa2166606e42f89", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apify-aws-actor/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fe7bddb034cf1fb7", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apify-atexo-actor/package.json"}, "properties": {"repobilityId": "a87aaeb54137a970", "scanner": "scanner-primary", "fingerprint": "fe7bddb034cf1fb7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apify-atexo-actor/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "29b1aed3d115913a", "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": "cfe4ab7ace2c6d31", "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": "654a3836566cc351", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "7d0e90ee14f1cc67", "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": "f45c19682306e60a", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8769bcc771831214", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: .claude/settings.json"}, "properties": {"repobilityId": "f94968d1c8aa7dc6", "scanner": "scanner-primary", "fingerprint": "8769bcc771831214", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 227}}}]}, {"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-4705cabb788b089d", "level": "none", "message": {"text": "Commented-code block (6 lines) in next.config.ts:23"}, "properties": {"repobilityId": "ee84cc4f1033eb78", "scanner": "scanner-primary", "fingerprint": "4705cabb788b089d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6f8eb5ef678b78d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/middleware.ts:37"}, "properties": {"repobilityId": "e98c43653f862628", "scanner": "scanner-primary", "fingerprint": "f6f8eb5ef678b78d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e079e4d01f7c12c3", "level": "note", "message": {"text": "Legacy-named symbol `enrichment_v1` in src/app/api/cron/veille-rs-enrich-pending/route.ts:3"}, "properties": {"repobilityId": "bd858982e6effd8c", "scanner": "scanner-primary", "fingerprint": "e079e4d01f7c12c3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aeebb4915fc33cac", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/app/api/cron/ice-breaker-alerts/route.ts:4"}, "properties": {"repobilityId": "7ef84e0b2daa84e8", "scanner": "scanner-primary", "fingerprint": "aeebb4915fc33cac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e58d10e4e790579", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/cron/veille-rs-worker/route.ts:47"}, "properties": {"repobilityId": "03097df8d533b0d8", "scanner": "scanner-primary", "fingerprint": "6e58d10e4e790579", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-204a72dbbb8d1934", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/app/api/cron/ice-breaker-followups/route.ts:7"}, "properties": {"repobilityId": "f30273b4b39d7ad1", "scanner": "scanner-primary", "fingerprint": "204a72dbbb8d1934", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-185e1af2af347967", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/admin/credits/overrides/route.ts:1"}, "properties": {"repobilityId": "6e189dff3ab72c61", "scanner": "scanner-primary", "fingerprint": "185e1af2af347967", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee953e9413c5cf60", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/admin/users/route.ts:6"}, "properties": {"repobilityId": "db35fa18747e72d7", "scanner": "scanner-primary", "fingerprint": "ee953e9413c5cf60", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70a07956da001735", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/admin/prompts/[key]/promote/route.ts:3"}, "properties": {"repobilityId": "3a85b88ac863b3ef", "scanner": "scanner-primary", "fingerprint": "70a07956da001735", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1fdd8f47f3b705b", "level": "note", "message": {"text": "Legacy-named symbol `enrich_analysis_v1` in src/app/api/admin/veille-rs/reports/[id]/enrich-analysis/route.ts:15"}, "properties": {"repobilityId": "5456b878ee1d2ec5", "scanner": "scanner-primary", "fingerprint": "b1fdd8f47f3b705b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-86d8cb70ca95a4f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/admin/veille-rs/reports/[id]/enrich-analysis/route.ts:47"}, "properties": {"repobilityId": "4e6b33d1af551de3", "scanner": "scanner-primary", "fingerprint": "86d8cb70ca95a4f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e71747f8a2883142", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/profil/route.ts:7"}, "properties": {"repobilityId": "500730e05aae2c9b", "scanner": "scanner-primary", "fingerprint": "e71747f8a2883142", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2c0c4a75b7e68df", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/profil/deep-research/route.ts:93"}, "properties": {"repobilityId": "04ec66810187c042", "scanner": "scanner-primary", "fingerprint": "f2c0c4a75b7e68df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f7c5e06f3a56057", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/organizations/members/route.ts:244"}, "properties": {"repobilityId": "617894fa16d5a803", "scanner": "scanner-primary", "fingerprint": "8f7c5e06f3a56057", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-000183e8abe2735a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/collaborateurs/linkedin/route.ts:63"}, "properties": {"repobilityId": "6556fc9328ac7746", "scanner": "scanner-primary", "fingerprint": "000183e8abe2735a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-58c554b938e0e7e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/onboarding/finalize-conversation/route.ts:74"}, "properties": {"repobilityId": "c6cae4e1b8982b34", "scanner": "scanner-primary", "fingerprint": "58c554b938e0e7e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbe762a6676f8040", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/me/profile/route.ts:5"}, "properties": {"repobilityId": "ce591e605b0e0bfa", "scanner": "scanner-primary", "fingerprint": "dbe762a6676f8040", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1eeb481e1a5777de", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/veille/tenders/route.ts:395"}, "properties": {"repobilityId": "aaa8d79261484919", "scanner": "scanner-primary", "fingerprint": "1eeb481e1a5777de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-471c8932ecd5f1f3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/ice-breaker/prospects/route.ts:1"}, "properties": {"repobilityId": "a887be46c15a2127", "scanner": "scanner-primary", "fingerprint": "471c8932ecd5f1f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b9f12b556838e3c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/ice-breaker/templates/preview/route.ts:68"}, "properties": {"repobilityId": "3da8cdff24eff8b1", "scanner": "scanner-primary", "fingerprint": "4b9f12b556838e3c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c5082f1bcf9d7827", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/ice-breaker/analyze/route.ts:4"}, "properties": {"repobilityId": "955ba5adf71e602d", "scanner": "scanner-primary", "fingerprint": "c5082f1bcf9d7827", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d52267c75a3dbad1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/ice-breaker/prospect/[id]/sequence/regenerate/route.ts:80"}, "properties": {"repobilityId": "37a6c40bfe0d5591", "scanner": "scanner-primary", "fingerprint": "d52267c75a3dbad1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f5a6bdbeaebc329", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/ice-breaker/prospect/[id]/sequence/preview/route.ts:3"}, "properties": {"repobilityId": "f4ba8704b3438bf7", "scanner": "scanner-primary", "fingerprint": "7f5a6bdbeaebc329", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17b50943a7e2f949", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/ice-breaker/prospect/[id]/hubspot/push/route.ts:3"}, "properties": {"repobilityId": "d82f02615e4b894d", "scanner": "scanner-primary", "fingerprint": "17b50943a7e2f949", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e40a4a622f3cef35", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/veille-rs/brands/route.ts:20"}, "properties": {"repobilityId": "cea5014a6bffb6bb", "scanner": "scanner-primary", "fingerprint": "e40a4a622f3cef35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e36d4f92baaed7d5", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/api/veille-rs/reports/route.ts:229"}, "properties": {"repobilityId": "41745c160a8a9374", "scanner": "scanner-primary", "fingerprint": "e36d4f92baaed7d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ceb4a403009db0ff", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/veille-rs/reports/[id]/route.ts:96"}, "properties": {"repobilityId": "266b8fc0b68b0798", "scanner": "scanner-primary", "fingerprint": "ceb4a403009db0ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-846f2f1dec2b579f", "level": "note", "message": {"text": "Legacy-named symbol `tiktok_backup` in src/app/api/veille-rs/poc/run/route.ts:121"}, "properties": {"repobilityId": "bee9b76c9b6f9917", "scanner": "scanner-primary", "fingerprint": "846f2f1dec2b579f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-af742f447d22d677", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/auth/accept-invite/page.tsx:29"}, "properties": {"repobilityId": "13bbbcd2422c2647", "scanner": "scanner-primary", "fingerprint": "af742f447d22d677", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d8cc84726571a042", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/app/auth/register/page.tsx:60"}, "properties": {"repobilityId": "6b92257b9dc64e9c", "scanner": "scanner-primary", "fingerprint": "d8cc84726571a042", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6160f8f97a03f2e4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(app)/admin/monitoring/by-tool/page.tsx:3"}, "properties": {"repobilityId": "d194fb219a4c4b9c", "scanner": "scanner-primary", "fingerprint": "6160f8f97a03f2e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6b77a7efd542f4e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/admin/credits/[id]/page.tsx:97"}, "properties": {"repobilityId": "f59293d2c0ee7588", "scanner": "scanner-primary", "fingerprint": "a6b77a7efd542f4e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f30140074a2b6971", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/admin/credits/settings/page.tsx:71"}, "properties": {"repobilityId": "3c5ffe7cc137f3bb", "scanner": "scanner-primary", "fingerprint": "f30140074a2b6971", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-61eebc5e58191b5e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/admin/users/page.tsx:99"}, "properties": {"repobilityId": "4e61e5ef00b397f5", "scanner": "scanner-primary", "fingerprint": "61eebc5e58191b5e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ebb455ea9a32f655", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/appels-offres/dashboard/page.tsx:188"}, "properties": {"repobilityId": "030d20805ccb004e", "scanner": "scanner-primary", "fingerprint": "ebb455ea9a32f655", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e8c840b0dbce3d6e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille/page.tsx:298"}, "properties": {"repobilityId": "c5e9b69c1da291a6", "scanner": "scanner-primary", "fingerprint": "e8c840b0dbce3d6e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3650fcdac3062ad1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille/[idweb]/page.tsx:862"}, "properties": {"repobilityId": "9b856a5717d69996", "scanner": "scanner-primary", "fingerprint": "3650fcdac3062ad1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65361ef96b873963", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/folders-sidebar.tsx:28"}, "properties": {"repobilityId": "06b4e4eb8de4cf39", "scanner": "scanner-primary", "fingerprint": "65361ef96b873963", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-875c541d3721fed1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/page.tsx:85"}, "properties": {"repobilityId": "427e0298fca1a329", "scanner": "scanner-primary", "fingerprint": "875c541d3721fed1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-01632dab6c277ea5", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/(app)/ice-breaker/[id]/sequence-tab.tsx:5"}, "properties": {"repobilityId": "23550dc4c6b33d1f", "scanner": "scanner-primary", "fingerprint": "01632dab6c277ea5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-823231cb36a87891", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/[id]/sequence-tab.tsx:105"}, "properties": {"repobilityId": "1148befe4b34458d", "scanner": "scanner-primary", "fingerprint": "823231cb36a87891", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-573267f5c96b0c54", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(app)/ice-breaker/[id]/hubspot-panel.tsx:3"}, "properties": {"repobilityId": "97a90b77a2b60ff3", "scanner": "scanner-primary", "fingerprint": "573267f5c96b0c54", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2beb703eedd9220", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/mon-profil/voice-training-section.tsx:55"}, "properties": {"repobilityId": "3c8c56d109e70074", "scanner": "scanner-primary", "fingerprint": "e2beb703eedd9220", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1932634f5bba74a1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/mon-profil/page.tsx:108"}, "properties": {"repobilityId": "d249ebdab00b994c", "scanner": "scanner-primary", "fingerprint": "1932634f5bba74a1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e30e7170bef58320", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/ice-breaker/templates/template-editor.tsx:59"}, "properties": {"repobilityId": "1595a169f1aaac22", "scanner": "scanner-primary", "fingerprint": "e30e7170bef58320", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a458feb0ed12715", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille-rs/page.tsx:168"}, "properties": {"repobilityId": "cbb48a79988dab6d", "scanner": "scanner-primary", "fingerprint": "2a458feb0ed12715", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b70ab3270318c3f5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille-rs/branding/page.tsx:76"}, "properties": {"repobilityId": "b010510270e02a7a", "scanner": "scanner-primary", "fingerprint": "b70ab3270318c3f5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-888074b2dfdfb866", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/veille-rs/nouveau/page.tsx:133"}, "properties": {"repobilityId": "4aa31d21d6dc4363", "scanner": "scanner-primary", "fingerprint": "888074b2dfdfb866", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-090b3f6fe522731a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/layout/sidebar.tsx:65"}, "properties": {"repobilityId": "4bd0590d5c9268a9", "scanner": "scanner-primary", "fingerprint": "090b3f6fe522731a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d83e4df450fe83c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/appels-offres/MemoireTechniqueEditor.tsx:42"}, "properties": {"repobilityId": "d92a6cfc90034c37", "scanner": "scanner-primary", "fingerprint": "1d83e4df450fe83c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04a3b505fcadfb64", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/appels-offres/AppelsOffresListClient.tsx:3"}, "properties": {"repobilityId": "b2d43b7c48d9a0a0", "scanner": "scanner-primary", "fingerprint": "04a3b505fcadfb64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c00ec484dd9e88a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/appels-offres/DceUploadZone.tsx:88"}, "properties": {"repobilityId": "18bf01ad9cbc5b16", "scanner": "scanner-primary", "fingerprint": "9c00ec484dd9e88a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4efe5ebe36af1aa1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/appels-offres/AOActions.tsx:76"}, "properties": {"repobilityId": "41cbc1ecc6bf9fef", "scanner": "scanner-primary", "fingerprint": "4efe5ebe36af1aa1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df6918eb432679ba", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/appels-offres/DeleteAOButton.tsx:17"}, "properties": {"repobilityId": "9c36e2e63b17a930", "scanner": "scanner-primary", "fingerprint": "df6918eb432679ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-29c07082124cdfd2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/onboarding/ToolOnboardingGate.tsx:26"}, "properties": {"repobilityId": "648d4b1527122970", "scanner": "scanner-primary", "fingerprint": "29c07082124cdfd2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fa68aba231bec4d3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/ice-breaker/liquid-field.tsx:3"}, "properties": {"repobilityId": "80646729991f8e2a", "scanner": "scanner-primary", "fingerprint": "fa68aba231bec4d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73babcd16b85a656", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/veille-rs/magazine/MagazineReport.tsx:260"}, "properties": {"repobilityId": "b6bbdaa550a74326", "scanner": "scanner-primary", "fingerprint": "73babcd16b85a656", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-226b8e94a91dec6c", "level": "note", "message": {"text": "Legacy-named symbol `enrichment_v1` in src/components/veille-rs/magazine/magazine-utils.ts:966"}, "properties": {"repobilityId": "deb619646ce67ee7", "scanner": "scanner-primary", "fingerprint": "226b8e94a91dec6c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bec79899719a04aa", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/veille-rs/magazine/magazine-utils.ts:281"}, "properties": {"repobilityId": "fa60ec322fface63", "scanner": "scanner-primary", "fingerprint": "bec79899719a04aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-990696caa95ec322", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/validations.ts:111"}, "properties": {"repobilityId": "4bd8f08a5255a2a3", "scanner": "scanner-primary", "fingerprint": "990696caa95ec322", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-23b9c658dd625112", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/aws/sync.ts:8"}, "properties": {"repobilityId": "00caa0deb99e038a", "scanner": "scanner-primary", "fingerprint": "23b9c658dd625112", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9bd222d7469feff", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/aws/transform.ts:9"}, "properties": {"repobilityId": "e003eb81b990ac7a", "scanner": "scanner-primary", "fingerprint": "a9bd222d7469feff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b123f19b5cfc9611", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/monitoring/api-usage.ts:289"}, "properties": {"repobilityId": "26cc4dd3a27e6954", "scanner": "scanner-primary", "fingerprint": "b123f19b5cfc9611", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3b0e5c8697eea06", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/monitoring/api-usage.ts:126"}, "properties": {"repobilityId": "96fe6ed2a4860f76", "scanner": "scanner-primary", "fingerprint": "f3b0e5c8697eea06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f6a012b90aa21e7a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/monitoring/api-credentials.ts:119"}, "properties": {"repobilityId": "dc46022e58a0f49f", "scanner": "scanner-primary", "fingerprint": "f6a012b90aa21e7a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eac9f68f12b22f70", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/lib/boamp/codes.ts:16"}, "properties": {"repobilityId": "e3d81fabd363db97", "scanner": "scanner-primary", "fingerprint": "eac9f68f12b22f70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d45d7d166e07bd2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/enrichment/web-search.ts:75"}, "properties": {"repobilityId": "177615b1b381f5ea", "scanner": "scanner-primary", "fingerprint": "7d45d7d166e07bd2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ae43f9d634fea9e", "level": "note", "message": {"text": "Legacy-named symbol `analyze_v1` in src/lib/voice-training/analyze.ts:4"}, "properties": {"repobilityId": "f49db32418d6be5d", "scanner": "scanner-primary", "fingerprint": "0ae43f9d634fea9e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e8937cf602faedf3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ted/sync.ts:160"}, "properties": {"repobilityId": "fa6e7b35911426c6", "scanner": "scanner-primary", "fingerprint": "e8937cf602faedf3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d9b31b33fd426bd", "level": "note", "message": {"text": "Legacy-named symbol `analyze_v1` in src/lib/prompts/fallbacks.ts:5"}, "properties": {"repobilityId": "93eac0bd95c06785", "scanner": "scanner-primary", "fingerprint": "1d9b31b33fd426bd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9bb281cfb41c8666", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/prompts/fallbacks.ts:3"}, "properties": {"repobilityId": "d0ce3e992ce9d1fc", "scanner": "scanner-primary", "fingerprint": "9bb281cfb41c8666", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6494fc3b6dccf927", "level": "note", "message": {"text": "Legacy-named symbol `analyze_v1` in src/lib/prompts/loader.ts:3"}, "properties": {"repobilityId": "9ca520404179d409", "scanner": "scanner-primary", "fingerprint": "6494fc3b6dccf927", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bdaa45624a619e8b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sso/provision.ts:140"}, "properties": {"repobilityId": "f9d8eecba9a53d05", "scanner": "scanner-primary", "fingerprint": "bdaa45624a619e8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62175224198cd85a", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/lib/atexo/sync.ts:9"}, "properties": {"repobilityId": "968e7fd449c2b3c7", "scanner": "scanner-primary", "fingerprint": "62175224198cd85a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3de3a6ef7e5a3a2", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/lib/atexo/providers.ts:35"}, "properties": {"repobilityId": "fcb8ad9c7ac227da", "scanner": "scanner-primary", "fingerprint": "a3de3a6ef7e5a3a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-022bdedeeaae0737", "level": "note", "message": {"text": "Legacy-named symbol `analyze_v1` in src/lib/ice-breaker/analyze.ts:27"}, "properties": {"repobilityId": "7fa461f517de2215", "scanner": "scanner-primary", "fingerprint": "022bdedeeaae0737", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8fc8c9bc436f3aa5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ice-breaker/alerts-diff.ts:3"}, "properties": {"repobilityId": "5fe13c7a160d87f3", "scanner": "scanner-primary", "fingerprint": "8fc8c9bc436f3aa5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7201d40ca9d7ab6", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/ice-breaker/avatar-cache.ts:78"}, "properties": {"repobilityId": "5642bad438f494dc", "scanner": "scanner-primary", "fingerprint": "e7201d40ca9d7ab6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-946378b948089227", "level": "note", "message": {"text": "Legacy-named symbol `generate_v1` in src/lib/ice-breaker/generate.ts:251"}, "properties": {"repobilityId": "9f20f22ee0ae6e5c", "scanner": "scanner-primary", "fingerprint": "946378b948089227", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-366431c57dd075b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ice-breaker/apify-posts.ts:3"}, "properties": {"repobilityId": "2fe5f66aff5e7383", "scanner": "scanner-primary", "fingerprint": "366431c57dd075b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f777621905439f2", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ice-breaker/context.ts:4"}, "properties": {"repobilityId": "74baf0d2b3ad3db6", "scanner": "scanner-primary", "fingerprint": "4f777621905439f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be37cf353fff8a2d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ice-breaker/prospect-variables.ts:98"}, "properties": {"repobilityId": "1954ee24aa005c06", "scanner": "scanner-primary", "fingerprint": "be37cf353fff8a2d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a973fa1eb8c33e44", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ice-breaker/company-intel.ts:15"}, "properties": {"repobilityId": "19bf3a691747a993", "scanner": "scanner-primary", "fingerprint": "a973fa1eb8c33e44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6cdcb1bd9ff5ded9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ice-breaker/followup-generate.ts:7"}, "properties": {"repobilityId": "b3e6f88adade6462", "scanner": "scanner-primary", "fingerprint": "6cdcb1bd9ff5ded9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-558c4b7598ec3c16", "level": "note", "message": {"text": "Legacy-named symbol `too_old` in src/lib/veille-rs/brand-context-research.ts:112"}, "properties": {"repobilityId": "8c03906864982f84", "scanner": "scanner-primary", "fingerprint": "558c4b7598ec3c16", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e2d61bd411c14f9e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/veille-rs/brand-context-research.ts:255"}, "properties": {"repobilityId": "2e200b18b7cf8b84", "scanner": "scanner-primary", "fingerprint": "e2d61bd411c14f9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a8f0a989ca28406", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/veille-rs/scrape.ts:62"}, "properties": {"repobilityId": "e851ec64823b6a36", "scanner": "scanner-primary", "fingerprint": "0a8f0a989ca28406", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18d6c0ec05e86d56", "level": "note", "message": {"text": "Legacy-named symbol `enrichment_v1` in src/lib/veille-rs/report-builder.ts:364"}, "properties": {"repobilityId": "81ee9bcd6e370345", "scanner": "scanner-primary", "fingerprint": "18d6c0ec05e86d56", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6fdf92b286e307b5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/veille-rs/report-builder.ts:53"}, "properties": {"repobilityId": "8590ad6617f6ce57", "scanner": "scanner-primary", "fingerprint": "6fdf92b286e307b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a40f6dd1e90cdca", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/veille-rs/thumbnail-cache.ts:278"}, "properties": {"repobilityId": "6acd75bbcba8ed14", "scanner": "scanner-primary", "fingerprint": "5a40f6dd1e90cdca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec618725f4ea4d32", "level": "note", "message": {"text": "Legacy-named symbol `too_old` in src/lib/veille-rs/types.ts:282"}, "properties": {"repobilityId": "05e2c80d83bccaf9", "scanner": "scanner-primary", "fingerprint": "ec618725f4ea4d32", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-69128c1602d17d21", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai/ice-breaker-llm.ts:4"}, "properties": {"repobilityId": "60b1c41a01a1602f", "scanner": "scanner-primary", "fingerprint": "69128c1602d17d21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69d18baa616f42b2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/claude-client.ts:125"}, "properties": {"repobilityId": "2937d33caadecb93", "scanner": "scanner-primary", "fingerprint": "69d18baa616f42b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98327758c786fbfc", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai/embeddings.ts:14"}, "properties": {"repobilityId": "f57658c5d4ff37bd", "scanner": "scanner-primary", "fingerprint": "98327758c786fbfc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c84073989c4cb158", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/ai/gemini-client.ts:19"}, "properties": {"repobilityId": "6b264d299dd884c2", "scanner": "scanner-primary", "fingerprint": "c84073989c4cb158", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-855d52a90c42182d", "level": "none", "message": {"text": "Commented-code block (9 lines) in TESTS/scoring/seed-fixtures.ts:41"}, "properties": {"repobilityId": "5fcee0fa6fb1da6d", "scanner": "scanner-primary", "fingerprint": "855d52a90c42182d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c64a5a3f6508fb76", "level": "note", "message": {"text": "Legacy-named symbol `linkedin_backup` in TESTS/veille-rs-poc/rls.test.ts:85"}, "properties": {"repobilityId": "19e1d4a4157370f2", "scanner": "scanner-primary", "fingerprint": "c64a5a3f6508fb76", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-21f11758de70a64d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/deploy.ts:77"}, "properties": {"repobilityId": "570e313e46d65b74", "scanner": "scanner-primary", "fingerprint": "21f11758de70a64d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e22739734c27c37b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/deploy-only.ts:54"}, "properties": {"repobilityId": "d580e7e8fff2b41f", "scanner": "scanner-primary", "fingerprint": "e22739734c27c37b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0abe9f1ba197f687", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-multi-pagination.ts:38"}, "properties": {"repobilityId": "fed5bf2ef8c5b018", "scanner": "scanner-primary", "fingerprint": "0abe9f1ba197f687", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dbc05ff268f976b5", "level": "none", "message": {"text": "Commented-code block (11 lines) in apify-atexo-actor/src/scraper.ts:10"}, "properties": {"repobilityId": "026c4ac09aed0376", "scanner": "scanner-primary", "fingerprint": "dbc05ff268f976b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ab8043bd8e348eb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-keyword.ts:19"}, "properties": {"repobilityId": "5ef2a49739765fba", "scanner": "scanner-primary", "fingerprint": "6ab8043bd8e348eb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e4cb9430379fa8ee", "level": "none", "message": {"text": "Commented-code block (6 lines) in apify-atexo-actor/src/fetchDetail.ts:7"}, "properties": {"repobilityId": "bfc49c336315a742", "scanner": "scanner-primary", "fingerprint": "e4cb9430379fa8ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-efd5158e1fdfbd91", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-pagination.ts:39"}, "properties": {"repobilityId": "3a5fe533a5716a19", "scanner": "scanner-primary", "fingerprint": "efd5158e1fdfbd91", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cccaeaa6ce66ff64", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apify-atexo-actor/src/test-multi-keyword.ts:15"}, "properties": {"repobilityId": "a13cb5da27554a74", "scanner": "scanner-primary", "fingerprint": "cccaeaa6ce66ff64", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}