{"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": "foundry_blueprint_gap", "name": "Foundry mined blueprint gap alignment: Robindesairs/robin-des-airs", "shortDescription": {"text": "Foundry mined blueprint gap alignment: Robindesairs/robin-des-airs"}, "fullDescription": {"text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: supported_by_verification_signal\nRepo: Robindesairs/robin-des-airs\nThread: Robindesairs/robin-des-airs#1\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: Robindesairs/robin-des-airs\nThread: Robindesairs/robin-des-airs#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: Robindesairs/robin-des-airs#1\nRepo: Robindesairs/robin-des-airs\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 26\nEdges: 50\nNode types: {'pr_file': 6, 'commit': 5, 'link_quality': 5, 'comment'"}, "properties": {"scanner": "foundry_dataset", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "scanner-8c20597126a5ed13", "name": "Possibly dead Python function: already_has_byline", "shortDescription": {"text": "Possibly dead Python function: already_has_byline"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5858b9ebfa5eda98", "name": "Possibly dead Python function: ask_scan_next_passenger", "shortDescription": {"text": "Possibly dead Python function: ask_scan_next_passenger"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-927276df8bd9c4b4", "name": "Possibly dead Python function: sort_key", "shortDescription": {"text": "Possibly dead Python function: sort_key"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99183b67f591f640", "name": "Possibly dead Python function: configure_flask_app", "shortDescription": {"text": "Possibly dead Python function: configure_flask_app"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-262e3f9d5dac71cc", "name": "Possibly dead Python function: enregistrer_apres_recap", "shortDescription": {"text": "Possibly dead Python function: enregistrer_apres_recap"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-19f4e8e3ab8ccdf8", "name": "Possibly dead Python function: annuler_pour_telephone", "shortDescription": {"text": "Possibly dead Python function: annuler_pour_telephone"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d21a173758d11483", "name": "Possibly dead Python function: register_mandat_routes", "shortDescription": {"text": "Possibly dead Python function: register_mandat_routes"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-52e77296bdcd08c7", "name": "Possibly dead Python function: repl_box", "shortDescription": {"text": "Possibly dead Python function: repl_box"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-701c1ac59fcb60c6", "name": "Stray `console.log` in TS/JS \u2014 test-mandat-guards.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-mandat-guards.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de48597d2308fb10", "name": "Stray `console.log` in TS/JS \u2014 test-ig-prospector.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-ig-prospector.js:11"}, "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-75cf0a17c69e08f3", "name": "Stray `console.log` in TS/JS \u2014 test-agency-prospector.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-agency-prospector.js:11"}, "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-8be744078a78e473", "name": "Stray `console.log` in TS/JS \u2014 test-bureau-routines.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-bureau-routines.js:14"}, "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-2ff0c9a07dfa8f23", "name": "Stray `console.log` in TS/JS \u2014 test-legal-pipeline.js:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-legal-pipeline.js: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-dd5835fe9bffcff1", "name": "Stray `console.log` in TS/JS \u2014 test-bot-v8.js:190", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-bot-v8.js:190"}, "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-43d796ce986467bf", "name": "Stray `console.log` in TS/JS \u2014 whatsapp-af718-prospects.js:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 whatsapp-af718-prospects.js: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-06a1d5ab6d5d37a9", "name": "Stray `console.log` in TS/JS \u2014 test-ce261-verdict.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-ce261-verdict.js:9"}, "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-08a4221cbd314ea0", "name": "Stray `console.log` in TS/JS \u2014 scripts/wire-en-i18n.js:281", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/wire-en-i18n.js:281"}, "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-828c5c09337498a4", "name": "Stray `console.log` in TS/JS \u2014 scripts/imessage-radar-poller.js:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/imessage-radar-poller.js:76"}, "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-2e711095c82b9a16", "name": "Stray `console.log` in TS/JS \u2014 scripts/chef.js:167", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/chef.js:167"}, "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-03e57443b7f4d101", "name": "Stray `console.log` in TS/JS \u2014 scripts/prospection-agences.js:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/prospection-agences.js: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-10a9790c88424bd4", "name": "Stray `console.log` in TS/JS \u2014 scripts/meta-create-templates.js:168", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/meta-create-templates.js:168"}, "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-ef29561152c812e7", "name": "Stray `console.log` in TS/JS \u2014 scripts/upload-ad-images.js:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/upload-ad-images.js:130"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-90c5d2fe08774976", "name": "Stray `console.log` in TS/JS \u2014 scripts/capture-preuves-vol.js:95", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/capture-preuves-vol.js:95"}, "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-8ecd755782421ad1", "name": "Stray `console.log` in TS/JS \u2014 scripts/scraper-agences-cameroun.js:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scraper-agences-cameroun.js: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-1e1fe47ecdfb5afa", "name": "Stray `console.log` in TS/JS \u2014 scripts/fetch-vols-radar.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fetch-vols-radar.js:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eccf8cf5fc74724b", "name": "Stray `console.log` in TS/JS \u2014 scripts/agent-meteo-radar.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/agent-meteo-radar.js:24"}, "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-85cbbd4930d65c5c", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-en-home.js:207", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-en-home.js:207"}, "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-67c0c1aafd0271db", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-mandat-articles.js:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-mandat-articles.js:52"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fa2ce377c01a90b6", "name": "Icon-only button without accessible name \u2014 assets/radar-live.js:2044", "shortDescription": {"text": "Icon-only button without accessible name \u2014 assets/radar-live.js:2044"}, "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-9ab4a863b1def524", "name": "Stray `console.log` in TS/JS \u2014 assets/feedback-modal.js:172", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 assets/feedback-modal.js:172"}, "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-7f6e04f7595bf723", "name": "Stray `console.log` in TS/JS \u2014 railway/test-extract-eticket.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-extract-eticket.js: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-d8a3aaa461dec879", "name": "Stray `console.log` in TS/JS \u2014 railway/test-robustness.js:96", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-robustness.js:96"}, "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-b186144f5bff860a", "name": "Stray `console.log` in TS/JS \u2014 railway/test-scenarios-100.js:135", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-scenarios-100.js:135"}, "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-b54df0a70e2cc756", "name": "Stray `console.log` in TS/JS \u2014 railway/test-extract-live.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-extract-live.js:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f061716808a99d1", "name": "Stray `console.log` in TS/JS \u2014 railway/server.js:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 railway/server.js:103"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a7e3f6545c8ca90", "name": "Stray `console.log` in TS/JS \u2014 railway/test-load.js:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-load.js:73"}, "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-19b2241c4a5697c9", "name": "Stray `console.log` in TS/JS \u2014 railway/test-sim-20.js:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-sim-20.js:108"}, "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-5bb402f8887ca01c", "name": "Icon-only button without accessible name \u2014 robin-dossiers/src/app/page.tsx:631", "shortDescription": {"text": "Icon-only button without accessible name \u2014 robin-dossiers/src/app/page.tsx:631"}, "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-0a489b10398c606e", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/radar-ticker-refresh.js:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/radar-ticker-refresh.js:84"}, "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-b8e2875f3e5d740b", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/radar-veille-cron.js:153", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/radar-veille-cron.js:153"}, "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-591a8a0a122b95e8", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/submit-mandat.js:172", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/submit-mandat.js:172"}, "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-51bda310bbf881cf", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/whatsapp-webhook.js:196", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/whatsapp-webhook.js:196"}, "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-3924a3ce1ce0e838", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/radar-monitor.js:363", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/radar-monitor.js:363"}, "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-81ff325e1a3ef414", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/ad-watch.js:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/ad-watch.js:111"}, "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-a7f8a40b33ad3c65", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/instagram-dm-webhook.js:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/instagram-dm-webhook.js:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-894035e9041d9b9e", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/daily-radar-snapshot-background.js:241", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/daily-radar-snapshot-background.js:241"}, "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-98febd78640a186f", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/aerodatabox-webhook.js:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/aerodatabox-webhook.js: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-063361153e75bf1c", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/crm-status-notify.js:135", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/crm-status-notify.js:135"}, "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-66365f93d1dd7c96", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/whatsapp-gemini-fallback.js:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/whatsapp-gemini-fallback.js:49"}, "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-90ad0cdabbb0f81c", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/instagram-publisher.js:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/instagram-publisher.js:113"}, "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-97ddde71b4ef9b85", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/flight-info.js:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/flight-info.js: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-fae7e62f057b8309", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/lib/agency-accounts.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/lib/agency-accounts.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7d33ba74103d3d57", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/lib/callmebot.js:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/lib/callmebot.js: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-80ee72ff857da170", "name": "Stray `console.log` in TS/JS \u2014 src/runCertification.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/runCertification.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb992dc6f6897887", "name": "Stray `console.log` in TS/JS \u2014 src/seedAfricanHubs.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/seedAfricanHubs.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-096e6b9f092a1ce3", "name": "Stray `console.log` in TS/JS \u2014 src/server.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/server.ts:42"}, "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-11ec7a35846828a1", "name": "Stray `console.log` in TS/JS \u2014 src/scripts/notify-indexnow.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/notify-indexnow.ts:52"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a1e3f32e26211a40", "name": "Stray `console.log` in TS/JS \u2014 src/scripts/build-blog.ts:318", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/build-blog.ts:318"}, "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-ffdd1ae0fc59ff8c", "name": "Stray `console.log` in TS/JS \u2014 src/scripts/build-sitemap.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/build-sitemap.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7307ed532869df63", "name": "Stray `console.log` in TS/JS \u2014 src/components/FeedbackModal.tsx:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/FeedbackModal.tsx:52"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a220d120f033a17", "name": "Insecure pattern 'direct_innerhtml_assignment' in radar-direct.html:133", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in radar-direct.html:133"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0ee8150911b0d8dd", "name": "Insecure pattern 'direct_innerhtml_assignment' in dossier.html:742", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dossier.html:742"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2e0d9b9a0b487d70", "name": "Insecure pattern 'direct_innerhtml_assignment' in scan-airport-v8.html:96", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scan-airport-v8.html:96"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2e59b2c0f5c943c1", "name": "Insecure pattern 'direct_innerhtml_assignment' in live-campagnes.html:146", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in live-campagnes.html:146"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7dbdb41a7201f325", "name": "Insecure pattern 'direct_innerhtml_assignment' in verification-fonctions.html:42", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in verification-fonctions.html:42"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0004c601df8a0fd2", "name": "Insecure pattern 'direct_innerhtml_assignment' in espace-agence.html:619", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in espace-agence.html:619"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-92338dcc5166998a", "name": "Insecure pattern 'direct_innerhtml_assignment' in mandat.html:1070", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mandat.html:1070"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e4e59b873042401d", "name": "Insecure pattern 'direct_innerhtml_assignment' in depot-en-ligne.html:80", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in depot-en-ligne.html:80"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-856c734782f0b33c", "name": "Insecure pattern 'cors_wildcard' in scrape.js:45", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in scrape.js:45"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6693c1777fc23735", "name": "Insecure pattern 'direct_innerhtml_assignment' in bureau.html:703", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in bureau.html:703"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e477be1eeaf6b1c7", "name": "Insecure pattern 'direct_innerhtml_assignment' in generateur-pub-stories.html:553", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in generateur-pub-stories.html:553"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad77f3ce5b31da21", "name": "Insecure pattern 'direct_innerhtml_assignment' in test-radar.html:42", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in test-radar.html:42"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f70b1bf1dd8c62fc", "name": "Insecure pattern 'direct_innerhtml_assignment' in autorisation.html:1070", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in autorisation.html:1070"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-baf7dd29ea2f7b27", "name": "Insecure pattern 'direct_innerhtml_assignment' in mandat-en.html:974", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mandat-en.html:974"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b7d4c7a6b33d457c", "name": "Insecure pattern 'direct_innerhtml_assignment' in i18n.js:978", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in i18n.js:978"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e3a28113e4246f5", "name": "Insecure pattern 'direct_innerhtml_assignment' in statistiques.html:172", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in statistiques.html:172"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba779edc2dd35538", "name": "Insecure pattern 'direct_innerhtml_assignment' in radar-v3.html:139", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in radar-v3.html:139"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-55ce48b0c444af04", "name": "Insecure pattern 'direct_innerhtml_assignment' in navigation-interne.html:96", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in navigation-interne.html:96"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea36d2f0fb3b3ee9", "name": "Insecure pattern 'direct_innerhtml_assignment' in scripts/build-navigation-interne.mjs:272", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/build-navigation-interne.mjs:272"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-904e89b23d9fc8aa", "name": "Insecure pattern 'node_child_process' in scripts/imessage-radar-poller.js:30", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/imessage-radar-poller.js:30"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d2ade55cec73c940", "name": "Insecure pattern 'node_child_process' in scripts/chef.js:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/chef.js:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e2312a1aeeaedcb", "name": "Insecure pattern 'direct_innerhtml_assignment' in scripts/patch-radar-table-ui.py:8", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/patch-radar-table-ui.py:8"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7c6d48300b87f5b6", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/radar-live.js:346", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/radar-live.js:346"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d17b9a0ee615182", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/feedback-modal.js:72", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/feedback-modal.js:72"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1098d52fd68810c9", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/palette-robin.js:17", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/palette-robin.js:17"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e212157cc9167590", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/agence-currency.js:84", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/agence-currency.js:84"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9f4ba5447c163d32", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/radar-gate.js:79", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/radar-gate.js:79"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4a7c9e45285162eb", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/agence-i18n.js:455", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/agence-i18n.js:455"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b81f4987c1313681", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/index-page.js:437", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/index-page.js:437"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9da8fc1f912e0451", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/bureau-gate.js:62", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/bureau-gate.js:62"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7da1f30038fb2fca", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/radar-scan-scheduler.js:114", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/radar-scan-scheduler.js:114"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a31674b85898d83a", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/robin-locale-toolbar.js:38", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/robin-locale-toolbar.js:38"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9fbdfd241be4562f", "name": "Insecure pattern 'direct_innerhtml_assignment' in assets/agence-portal.js:48", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/agence-portal.js:48"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7352c6bb96f3b5c6", "name": "Insecure pattern 'direct_innerhtml_assignment' in crm/index.html:1136", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in crm/index.html:1136"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-099c65eaf03bf5bd", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/telegram-notify.js:64", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/telegram-notify.js:64"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ff99c6648df199b4", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/agent-chat.js:24", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/agent-chat.js:24"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-70a4d9b3967fc3f8", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/bureau-stats.js:30", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/bureau-stats.js:30"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5d71db910e527374", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/instagram-stats.js:24", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/instagram-stats.js:24"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-413bc88e3920abc7", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/mandat-verify.js:11", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/mandat-verify.js:11"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-636de6b0f77ca9b8", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/aerodatabox-webhook.js:22", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/aerodatabox-webhook.js:22"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-697f049c29117a6b", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/collect-proofs.js:12", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/collect-proofs.js:12"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1954255d3993f426", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/radar-today.js:13", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/radar-today.js:13"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e06245b08e9cf092", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/airtable-webhook.js:35", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/airtable-webhook.js:35"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-908e828d132e01d5", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/piece-store.js:13", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/piece-store.js:13"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a1b85e8cf2844b9", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/facebook-scheduled.js:22", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/facebook-scheduled.js:22"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8735060c3718830a", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/depot-upload.js:15", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/depot-upload.js:15"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-da388eb5f2fe36a6", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/wati-agency-webhook.js:18", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/wati-agency-webhook.js:18"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c4c52c8b5fb84292", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/meta-stats.js:16", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/meta-stats.js:16"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c9533f6b1177efa", "name": "Insecure pattern 'cors_wildcard' in netlify/functions/radar-enquete.js:17", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/radar-enquete.js:17"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43756fd041295ea4", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/index.html:418", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/index.html:418"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dfec12d3fc8a0793", "name": "Insecure pattern 'cors_wildcard' in src/server.ts:15", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/server.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e3014dadf7849b07", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/views/dashboard.html:139", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/views/dashboard.html:139"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-015b5d2bc13f292c", "name": "Very large file: i18n.js (1221 lines)", "shortDescription": {"text": "Very large file: i18n.js (1221 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-05930269cc92cce8", "name": "Very large file: scripts/generate_de_es_blog_batch.py (984 lines)", "shortDescription": {"text": "Very large file: scripts/generate_de_es_blog_batch.py (984 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-76dcfb4ef909f178", "name": "Very large file: scripts/whatsapp_bot.py (2624 lines)", "shortDescription": {"text": "Very large file: scripts/whatsapp_bot.py (2624 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-483bc1c780c55372", "name": "Very large file: assets/radar-live.js (2569 lines)", "shortDescription": {"text": "Very large file: assets/radar-live.js (2569 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-341efdda67b3a94a", "name": "Very large file: assets/index-page.js (1932 lines)", "shortDescription": {"text": "Very large file: assets/index-page.js (1932 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-49c7128cfe8aeb2f", "name": "Very large file: assets/agence-portal.js (1484 lines)", "shortDescription": {"text": "Very large file: assets/agence-portal.js (1484 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-1bf6cfe4ae574c39", "name": "Very large file: railway/server.js (2586 lines)", "shortDescription": {"text": "Very large file: railway/server.js (2586 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-3df5668b3c5893ae", "name": "Very large file: netlify/functions/whatsapp-webhook.js (1393 lines)", "shortDescription": {"text": "Very large file: netlify/functions/whatsapp-webhook.js (1393 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-49537acfdfe03b6c", "name": "Very large file: netlify/functions/radar.js (1400 lines)", "shortDescription": {"text": "Very large file: netlify/functions/radar.js (1400 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": "20 test file(s) for 275 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 456 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 76 placeholder/mock markers across 20 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-475fd7293219c56f", "name": "Commented-code block (7 lines) in test-bot-v8.js:420", "shortDescription": {"text": "Commented-code block (7 lines) in test-bot-v8.js:420"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8d495a69a2350171", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/mark_reviewed.py:116", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/mark_reviewed.py:116"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-081d441efe995511", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/build-espace-agence.py:10", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/build-espace-agence.py:10"}, "fullDescription": {"text": "`subprocess.check_output(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c4616914b0d525d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/upload-ad-images.js:108", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/upload-ad-images.js: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-145a7dd87bdd4398", "name": "Commented-code block (5 lines) in assets/radar-live.js:1418", "shortDescription": {"text": "Commented-code block (5 lines) in assets/radar-live.js:1418"}, "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-6b89331c681f314a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 assets/radar-live.js:1035", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/radar-live.js:1035"}, "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-bb70a5782c42b334", "name": "Commented-code block (5 lines) in assets/home-loader.js:100", "shortDescription": {"text": "Commented-code block (5 lines) in assets/home-loader.js:100"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b915f5f20c308c4c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 assets/radar-gate.js:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/radar-gate.js:106"}, "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-eea227efe6fe02a6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 assets/radar-veille-server.js:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/radar-veille-server.js:74"}, "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-6545a14eb2fe753c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 assets/index-page.js:1490", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/index-page.js:1490"}, "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-9ce9cbe218d034bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 assets/bureau-gate.js:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/bureau-gate.js:89"}, "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-d705d899b4c49725", "name": "Legacy-named symbol `rda_hub_last_scan_v1` in assets/radar-scan-scheduler.js:9", "shortDescription": {"text": "Legacy-named symbol `rda_hub_last_scan_v1` in assets/radar-scan-scheduler.js:9"}, "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-5049961bb34467ce", "name": "`fetch()` without try/.catch or AbortSignal \u2014 assets/agence-portal.js:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/agence-portal.js:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-329d7e10a1805757", "name": "Legacy-named symbol `tooOld` in railway/server.js:939", "shortDescription": {"text": "Legacy-named symbol `tooOld` in railway/server.js:939"}, "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-ac5683ff8e690447", "name": "Commented-code block (5 lines) in railway/server.js:374", "shortDescription": {"text": "Commented-code block (5 lines) in railway/server.js:374"}, "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-ef3020ac19e3ebaa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 robin-dossiers/src/app/page.tsx:173", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 robin-dossiers/src/app/page.tsx:173"}, "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-bb0b0bee93e64764", "name": "`fetch()` without try/.catch or AbortSignal \u2014 robin-dossiers/src/app/saisie-paiement/page.tsx:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 robin-dossiers/src/app/saisie-paiement/page.tsx:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-91d3482d7f8ecadf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-stats.js:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-stats.js:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad96f4e4a82a842b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/morning-report.js:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/morning-report.js:112"}, "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-c567218a2b8271b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/legal-daily.js:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/legal-daily.js: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-38cd3c484ec07ae4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/agent-chat.js:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/agent-chat.js:83"}, "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-55f51d4e5ede4e66", "name": "Legacy-named symbol `whatsapp_copy` in netlify/functions/submit-mandat.js:773", "shortDescription": {"text": "Legacy-named symbol `whatsapp_copy` in netlify/functions/submit-mandat.js:773"}, "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-ac5f4260258193b5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/submit-mandat.js:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/submit-mandat.js:94"}, "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-3f6e95ec6cb890d9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/analyze-flight.js:118", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/analyze-flight.js:118"}, "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-c9fbddffbcb9bd7c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/bureau-stats.js:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/bureau-stats.js:50"}, "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-0724b418c161cd9c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/instagram-stats.js:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/instagram-stats.js: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-c22fd710d60be4e9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/bureau-daily.js:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/bureau-daily.js:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f9fb56c65ed66a7a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/whatsapp-webhook.js:544", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/whatsapp-webhook.js:544"}, "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-05c320dc68e8eeae", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-watch.js:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-watch.js:129"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-461747e1b41c261e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/airport-search.js:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/airport-search.js:43"}, "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-e7e1b297100d44a2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-launch.js:357", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-launch.js:357"}, "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-ce3007f50b04d861", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/yousign-init.js:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/yousign-init.js:89"}, "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-9eebaa4c95f09196", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-breakdown.js:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-breakdown.js:66"}, "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-b3693ac49bfe9df9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-stop.js:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-stop.js:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-513ac3b321d06a5f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/radar.js:1090", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/radar.js:1090"}, "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-7a1e6bfadbedbb72", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/facebook-scheduled.js:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/facebook-scheduled.js:52"}, "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-ddeb702a3e94ee13", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/sofia-prospect.js:164", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/sofia-prospect.js:164"}, "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-cc798f6348fff90b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/meta-stats.js:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/meta-stats.js:52"}, "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-0c89dfe18e165252", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/crm-delete-dossier.js:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/crm-delete-dossier.js:67"}, "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-bd827120ec74f786", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-target.js:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-target.js:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-be55e60a5d8ac4e9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/agency-airtable.js:247", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/agency-airtable.js:247"}, "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-95d107097839bd1a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/airtable-robin.js:150", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/airtable-robin.js:150"}, "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-8e384f999f5f25bc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/airtable-attach.js:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/airtable-attach.js:68"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f48011debabe3047", "name": "Commented-code block (5 lines) in netlify/functions/lib/legal-pipeline.js:24", "shortDescription": {"text": "Commented-code block (5 lines) in netlify/functions/lib/legal-pipeline.js:24"}, "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-459d804129cd7d76", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/radar-report-email.js:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/radar-report-email.js:93"}, "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-0bf883f344b47d6d", "name": "Commented-code block (5 lines) in netlify/functions/lib/robin-ai-responder.js:36", "shortDescription": {"text": "Commented-code block (5 lines) in netlify/functions/lib/robin-ai-responder.js:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7d17d9314fac3e73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/meta-resolve.js:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/meta-resolve.js:21"}, "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-9f92bf4fa2c66a2f", "name": "Commented-code block (5 lines) in netlify/functions/lib/radar-enquete.js:234", "shortDescription": {"text": "Commented-code block (5 lines) in netlify/functions/lib/radar-enquete.js:234"}, "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-5b4c2b49406528ac", "name": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/radar-enquete.js:431", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/radar-enquete.js:431"}, "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-9bedb78e73432ee6", "name": "Commented-code block (5 lines) in netlify/functions/lib/radar-reschedule.js:100", "shortDescription": {"text": "Commented-code block (5 lines) in netlify/functions/lib/radar-reschedule.js:100"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21e401f37a7406cc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/visionService.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/visionService.ts:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b742757b9358738", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/monitoringService.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/monitoringService.ts:37"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c795c2dfdfa0cbca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/geminiService.ts:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/geminiService.ts:51"}, "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-232509bd1ae4da85", "name": "240 env vars used in code but missing from .env.example", "shortDescription": {"text": "240 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AERODATABOX_RAPIDAPI_HOST`, `AERODATABOX_RAPIDAPI_KEY`, `AERODATABOX_WEBHOOK_SECRET`, `AGENCY_ACCOUNTS`, `AGENCY_AIRTABLE_ADDRESS_PLACEHOLDER`, `AGENCY_AUTH_SECRET`, `AGENCY_CLIENT_NET_EUR`, `AGENCY_GMD_PER_EUR` + 232 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/add-quick-answer.py:main, scripts/add-date-modified-visible.py:main, scripts/add-faq-schema.py:main\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/whatsapp_bot.py:test_flow, scripts/whatsapp_bot.py:test\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4bca1677cfea50f", "name": "Flask mutation route `webhook` without `@login_required` \u2014 scripts/whatsapp_bot.py:1854", "shortDescription": {"text": "Flask mutation route `webhook` without `@login_required` \u2014 scripts/whatsapp_bot.py:1854"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-212c86a84458f71b", "name": "Flask mutation route `cron_mandat_reminders` without `@login_required` \u2014 scripts/relances_mandat.py:174", "shortDescription": {"text": "Flask mutation route `cron_mandat_reminders` without `@login_required` \u2014 scripts/relances_mandat.py:174"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4067b3c9dd0e7008", "name": "Flask mutation route `webhook_mandat_signed` without `@login_required` \u2014 scripts/relances_mandat.py:181", "shortDescription": {"text": "Flask mutation route `webhook_mandat_signed` without `@login_required` \u2014 scripts/relances_mandat.py:181"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e74dfc28a84acd48", "name": "Dangling fetch: POST /.netlify/functions/ad-launch (assets/radar-live.js:2105)", "shortDescription": {"text": "Dangling fetch: POST /.netlify/functions/ad-launch (assets/radar-live.js:2105)"}, "fullDescription": {"text": "`assets/radar-live.js:2105` calls `POST /.netlify/functions/ad-launch` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/.netlify/functions/ad-launch`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-952db808d2617998", "name": "Dangling fetch: POST /.netlify/functions/ad-stop (assets/radar-live.js:2198)", "shortDescription": {"text": "Dangling fetch: POST /.netlify/functions/ad-stop (assets/radar-live.js:2198)"}, "fullDescription": {"text": "`assets/radar-live.js:2198` calls `POST /.netlify/functions/ad-stop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/.netlify/functions/ad-stop`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9b6d7b8a9463df99", "name": "Dangling fetch: POST http://127.0.0.1:${BOT}/api/wati-webhook?s=${SECRET} (railway/test-robustness.js:35)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${BOT}/api/wati-webhook?s=${SECRET} (railway/test-robustness.js:35)"}, "fullDescription": {"text": "`railway/test-robustness.js:35` calls `POST http://127.0.0.1:${BOT}/api/wati-webhook?s=${SECRET}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/api/wati-webhook`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-291cfcaf42818de4", "name": "Dangling fetch: GET http://127.0.0.1:${BOT}/health (railway/test-robustness.js:42)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT}/health (railway/test-robustness.js:42)"}, "fullDescription": {"text": "`railway/test-robustness.js:42` calls `GET http://127.0.0.1:${BOT}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-363bab632f17a70d", "name": "Dangling fetch: GET http://127.0.0.1:${BOT}/health (railway/test-robustness.js:95)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT}/health (railway/test-robustness.js:95)"}, "fullDescription": {"text": "`railway/test-robustness.js:95` calls `GET http://127.0.0.1:${BOT}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-abdfaa093cb0e04f", "name": "Dangling fetch: POST https://robindesairs.eu/api/bot-state (railway/server.js:132)", "shortDescription": {"text": "Dangling fetch: POST https://robindesairs.eu/api/bot-state (railway/server.js:132)"}, "fullDescription": {"text": "`railway/server.js:132` calls `POST https://robindesairs.eu/api/bot-state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/robindesairs.eu/api/bot-state`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9ec3bf0e6e8176ac", "name": "Dangling fetch: GET https://robindesairs.eu/api/bot-state (railway/server.js:144)", "shortDescription": {"text": "Dangling fetch: GET https://robindesairs.eu/api/bot-state (railway/server.js:144)"}, "fullDescription": {"text": "`railway/server.js:144` calls `GET https://robindesairs.eu/api/bot-state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/robindesairs.eu/api/bot-state`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a33f55fb7bea8eac", "name": "Dangling fetch: GET https://robindesairs.eu/api/flight-info?flight=${encodeURIComponent(v)}&date=${encodeURIComponent(ym", "shortDescription": {"text": "Dangling fetch: GET https://robindesairs.eu/api/flight-info?flight=${encodeURIComponent(v)}&date=${encodeURIComponent(ymd)} (railway/server.js:477)"}, "fullDescription": {"text": "`railway/server.js:477` calls `GET https://robindesairs.eu/api/flight-info?flight=${encodeURIComponent(v)}&date=${encodeURIComponent(ymd)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/robindesairs.eu/api/flight-info`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-446673c7d5b5afbc", "name": "Dangling fetch: POST https://robindesairs.eu/api/dossier-store (railway/server.js:574)", "shortDescription": {"text": "Dangling fetch: POST https://robindesairs.eu/api/dossier-store (railway/server.js:574)"}, "fullDescription": {"text": "`railway/server.js:574` calls `POST https://robindesairs.eu/api/dossier-store` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/robindesairs.eu/api/dossier-store`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a1f4786e27ed04c2", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:619)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:619)"}, "fullDescription": {"text": "`railway/server.js:619` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-13979a2c25f0f759", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:752)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:752)"}, "fullDescription": {"text": "`railway/server.js:752` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-83de917092f6ffb0", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:794)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:794)"}, "fullDescription": {"text": "`railway/server.js:794` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c0e0183c1d1b28a6", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:1002)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:1002)"}, "fullDescription": {"text": "`railway/server.js:1002` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-442f1946d8f30a2e", "name": "Dangling fetch: POST https://robindesairs.eu/api/piece-store (railway/server.js:1022)", "shortDescription": {"text": "Dangling fetch: POST https://robindesairs.eu/api/piece-store (railway/server.js:1022)"}, "fullDescription": {"text": "`railway/server.js:1022` calls `POST https://robindesairs.eu/api/piece-store` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/robindesairs.eu/api/piece-store`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-75232777cb02cb4e", "name": "Dangling fetch: POST http://127.0.0.1:${BOT_PORT}/api/wati-webhook?s=${SECRET} (railway/test-load.js:54)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${BOT_PORT}/api/wati-webhook?s=${SECRET} (railway/test-load.js:54)"}, "fullDescription": {"text": "`railway/test-load.js:54` calls `POST http://127.0.0.1:${BOT_PORT}/api/wati-webhook?s=${SECRET}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/api/wati-webhook`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6b758d7a2f1e9ec6", "name": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-load.js:72)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-load.js:72)"}, "fullDescription": {"text": "`railway/test-load.js:72` calls `GET http://127.0.0.1:${BOT_PORT}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-43e69054739d8608", "name": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-load.js:89)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-load.js:89)"}, "fullDescription": {"text": "`railway/test-load.js:89` calls `GET http://127.0.0.1:${BOT_PORT}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d05fadb1ba2b83b3", "name": "Dangling fetch: POST http://127.0.0.1:${BOT_PORT}/api/wati-webhook?s=${SECRET} (railway/test-sim-20.js:53)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${BOT_PORT}/api/wati-webhook?s=${SECRET} (railway/test-sim-20.js:53)"}, "fullDescription": {"text": "`railway/test-sim-20.js:53` calls `POST http://127.0.0.1:${BOT_PORT}/api/wati-webhook?s=${SECRET}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/api/wati-webhook`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a6b633dae98c18b4", "name": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-sim-20.js:85)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-sim-20.js:85)"}, "fullDescription": {"text": "`railway/test-sim-20.js:85` calls `GET http://127.0.0.1:${BOT_PORT}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-73b6ced4d52afc62", "name": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-sim-20.js:105)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-sim-20.js:105)"}, "fullDescription": {"text": "`railway/test-sim-20.js:105` calls `GET http://127.0.0.1:${BOT_PORT}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bde3fc74236a1d9e", "name": "Dangling fetch: POST https://robindesairs.eu/api/owner-alert (railway/lib/owner-notify.js:14)", "shortDescription": {"text": "Dangling fetch: POST https://robindesairs.eu/api/owner-alert (railway/lib/owner-notify.js:14)"}, "fullDescription": {"text": "`railway/lib/owner-notify.js:14` calls `POST https://robindesairs.eu/api/owner-alert` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/robindesairs.eu/api/owner-alert`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-94a2907a726726bd", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/lib/extract-eticket.js:171)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/lib/extract-eticket.js:171)"}, "fullDescription": {"text": "`railway/lib/extract-eticket.js:171` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3698c7f2ef638802", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (railway/lib/extract-eticket.js:191)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (railway/lib/extract-eticket.js:191)"}, "fullDescription": {"text": "`railway/lib/extract-eticket.js:191` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-84ea649382a4caeb", "name": "Dangling fetch: GET https://api.airtable.com/v0/${baseId}/${tableId}?${params} (netlify/functions/morning-report.js:112)", "shortDescription": {"text": "Dangling fetch: GET https://api.airtable.com/v0/${baseId}/${tableId}?${params} (netlify/functions/morning-report.js:112)"}, "fullDescription": {"text": "`netlify/functions/morning-report.js:112` calls `GET https://api.airtable.com/v0/${baseId}/${tableId}?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.airtable.com/v0/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-77b854546b6c5264", "name": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (netlify/functions/telegram-notify.js:74)", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (netlify/functions/telegram-notify.js:74)"}, "fullDescription": {"text": "`netlify/functions/telegram-notify.js:74` calls `POST https://api.telegram.org/bot${token}/sendMessage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/bot/<p>/sendmessage`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-89c65a4e0e213636", "name": "Dangling fetch: GET https://api.airtable.com/v0/${baseId}/${tableId}?${params} (netlify/functions/legal-daily.js:70)", "shortDescription": {"text": "Dangling fetch: GET https://api.airtable.com/v0/${baseId}/${tableId}?${params} (netlify/functions/legal-daily.js:70)"}, "fullDescription": {"text": "`netlify/functions/legal-daily.js:70` calls `GET https://api.airtable.com/v0/${baseId}/${tableId}?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.airtable.com/v0/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-42e1a73171721cd3", "name": "Dangling fetch: PATCH https://api.airtable.com/v0/${cfg.base}/${cfg.table} (netlify/functions/submit-mandat.js:214)", "shortDescription": {"text": "Dangling fetch: PATCH https://api.airtable.com/v0/${cfg.base}/${cfg.table} (netlify/functions/submit-mandat.js:214)"}, "fullDescription": {"text": "`netlify/functions/submit-mandat.js:214` calls `PATCH https://api.airtable.com/v0/${cfg.base}/${cfg.table}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.airtable.com/v0/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-baae2de76a3541ce", "name": "Dangling fetch: POST https://content.airtable.com/v0/${cfg.base}/${rec.id}/${field}/uploadAttachment (netlify/functions/", "shortDescription": {"text": "Dangling fetch: POST https://content.airtable.com/v0/${cfg.base}/${rec.id}/${field}/uploadAttachment (netlify/functions/submit-mandat.js:277)"}, "fullDescription": {"text": "`netlify/functions/submit-mandat.js:277` calls `POST https://content.airtable.com/v0/${cfg.base}/${rec.id}/${field}/uploadAttachment` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/content.airtable.com/v0/<p>/<p>/<p>/uploadattachment`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-38d47be19720f0c8", "name": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/submit-mandat.js:413)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/submit-mandat.js:413)"}, "fullDescription": {"text": "`netlify/functions/submit-mandat.js:413` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-57af5d5d0db822f7", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (netlify/functions/analyze-flight.js:118)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (netlify/functions/analyze-flight.js:118)"}, "fullDescription": {"text": "`netlify/functions/analyze-flight.js:118` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d2acd7862465d88", "name": "Dangling fetch: GET https://api.airtable.com/v0/${BASE}/${table}?${p} (netlify/functions/bureau-daily.js:73)", "shortDescription": {"text": "Dangling fetch: GET https://api.airtable.com/v0/${BASE}/${table}?${p} (netlify/functions/bureau-daily.js:73)"}, "fullDescription": {"text": "`netlify/functions/bureau-daily.js:73` calls `GET https://api.airtable.com/v0/${BASE}/${table}?${p}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.airtable.com/v0/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b4a1dd91205a9f48", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/whatsapp-webhook.js:544)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/whatsapp-webhook.js:544)"}, "fullDescription": {"text": "`netlify/functions/whatsapp-webhook.js:544` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a398e672509905f0", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/whatsapp-webhook.js:601)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/whatsapp-webhook.js:601)"}, "fullDescription": {"text": "`netlify/functions/whatsapp-webhook.js:601` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-220baf976da77cff", "name": "Dangling fetch: POST https://${AMADEUS_HOST}/v1/security/oauth2/token (netlify/functions/airport-search.js:90)", "shortDescription": {"text": "Dangling fetch: POST https://${AMADEUS_HOST}/v1/security/oauth2/token (netlify/functions/airport-search.js:90)"}, "fullDescription": {"text": "`netlify/functions/airport-search.js:90` calls `POST https://${AMADEUS_HOST}/v1/security/oauth2/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>/v1/security/oauth2/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-becc93994481ec88", "name": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/submit-partner-agreement.js:94)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/submit-partner-agreement.js:94)"}, "fullDescription": {"text": "`netlify/functions/submit-partner-agreement.js:94` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-101e371a1b9c6ffd", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/whatsapp-gemini-fallback.js:37)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/whatsapp-gemini-fallback.js:37)"}, "fullDescription": {"text": "`netlify/functions/whatsapp-gemini-fallback.js:37` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9bbbcdcc1d9882a3", "name": "Dangling fetch: POST https://api.airtable.com/v0/${BASE}/${T_AGENCES} (netlify/functions/sofia-prospect.js:195)", "shortDescription": {"text": "Dangling fetch: POST https://api.airtable.com/v0/${BASE}/${T_AGENCES} (netlify/functions/sofia-prospect.js:195)"}, "fullDescription": {"text": "`netlify/functions/sofia-prospect.js:195` calls `POST https://api.airtable.com/v0/${BASE}/${T_AGENCES}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.airtable.com/v0/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a39c4111de56b938", "name": "Dangling fetch: POST https://api.airtable.com/v0/${BASE}/${T_DOSSIERS} (netlify/functions/lead-hunter.js:178)", "shortDescription": {"text": "Dangling fetch: POST https://api.airtable.com/v0/${BASE}/${T_DOSSIERS} (netlify/functions/lead-hunter.js:178)"}, "fullDescription": {"text": "`netlify/functions/lead-hunter.js:178` calls `POST https://api.airtable.com/v0/${BASE}/${T_DOSSIERS}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.airtable.com/v0/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e645cf7d7e80985", "name": "Dangling fetch: DELETE https://api.airtable.com/v0/${cfg.base}/${cfg.table}/${r.id} (netlify/functions/crm-delete-dossie", "shortDescription": {"text": "Dangling fetch: DELETE https://api.airtable.com/v0/${cfg.base}/${cfg.table}/${r.id} (netlify/functions/crm-delete-dossier.js:67)"}, "fullDescription": {"text": "`netlify/functions/crm-delete-dossier.js:67` calls `DELETE https://api.airtable.com/v0/${cfg.base}/${cfg.table}/${r.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.airtable.com/v0/<p>/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f44694057f515fbf", "name": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/lib/airline-auto-submit.js:267)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/lib/airline-auto-submit.js:267)"}, "fullDescription": {"text": "`netlify/functions/lib/airline-auto-submit.js:267` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e65290f40449a80b", "name": "Dangling fetch: POST https://content.airtable.com/v0/${c.base}/${rec.id}/${field}/uploadAttachment (netlify/functions/li", "shortDescription": {"text": "Dangling fetch: POST https://content.airtable.com/v0/${c.base}/${rec.id}/${field}/uploadAttachment (netlify/functions/lib/airtable-attach.js:83)"}, "fullDescription": {"text": "`netlify/functions/lib/airtable-attach.js:83` calls `POST https://content.airtable.com/v0/${c.base}/${rec.id}/${field}/uploadAttachment` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/content.airtable.com/v0/<p>/<p>/<p>/uploadattachment`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b521e5097e52aebd", "name": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/lib/radar-report-email.js:93)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/lib/radar-report-email.js:93)"}, "fullDescription": {"text": "`netlify/functions/lib/radar-report-email.js:93` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5f80c9cb64773372", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/lib/robin-ai-responder.js:59)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/lib/robin-ai-responder.js:59)"}, "fullDescription": {"text": "`netlify/functions/lib/robin-ai-responder.js:59` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2964ddfe6eca4f08", "name": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/lib/owner-notify.js:40)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/lib/owner-notify.js:40)"}, "fullDescription": {"text": "`netlify/functions/lib/owner-notify.js:40` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-807d543cc7bf2548", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/lib/radar-enquete.js:489)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/lib/radar-enquete.js:489)"}, "fullDescription": {"text": "`netlify/functions/lib/radar-enquete.js:489` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e60851f0b65f37ed", "name": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (netlify/functions/lib/robin-notify.js:16)", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (netlify/functions/lib/robin-notify.js:16)"}, "fullDescription": {"text": "`netlify/functions/lib/robin-notify.js:16` calls `POST https://api.telegram.org/bot${token}/sendMessage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/bot/<p>/sendmessage`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f4819d9a05493c6e", "name": "Dangling fetch: GET /api/dossiers (robin-dossiers/src/app/page.tsx:122)", "shortDescription": {"text": "Dangling fetch: GET /api/dossiers (robin-dossiers/src/app/page.tsx:122)"}, "fullDescription": {"text": "`robin-dossiers/src/app/page.tsx:122` calls `GET /api/dossiers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dossiers`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-137067e96836903c", "name": "Dangling fetch: GET /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/page.tsx:155)", "shortDescription": {"text": "Dangling fetch: GET /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/page.tsx:155)"}, "fullDescription": {"text": "`robin-dossiers/src/app/page.tsx:155` calls `GET /api/dossiers/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dossiers/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f936fcab3308f2d9", "name": "Dangling fetch: PATCH /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/page.tsx:173)", "shortDescription": {"text": "Dangling fetch: PATCH /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/page.tsx:173)"}, "fullDescription": {"text": "`robin-dossiers/src/app/page.tsx:173` calls `PATCH /api/dossiers/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dossiers/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a3139a586c884880", "name": "Dangling fetch: POST /api/dossiers/${encodeURIComponent(id)}/evenement (robin-dossiers/src/app/page.tsx:191)", "shortDescription": {"text": "Dangling fetch: POST /api/dossiers/${encodeURIComponent(id)}/evenement (robin-dossiers/src/app/page.tsx:191)"}, "fullDescription": {"text": "`robin-dossiers/src/app/page.tsx:191` calls `POST /api/dossiers/${encodeURIComponent(id)}/evenement` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dossiers/<p>/evenement`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-01e0d82638bf6957", "name": "Dangling fetch: GET /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/page.tsx:199)", "shortDescription": {"text": "Dangling fetch: GET /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/page.tsx:199)"}, "fullDescription": {"text": "`robin-dossiers/src/app/page.tsx:199` calls `GET /api/dossiers/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dossiers/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ff97230100b43baa", "name": "Dangling fetch: POST /api/dossiers (robin-dossiers/src/app/page.tsx:613)", "shortDescription": {"text": "Dangling fetch: POST /api/dossiers (robin-dossiers/src/app/page.tsx:613)"}, "fullDescription": {"text": "`robin-dossiers/src/app/page.tsx:613` calls `POST /api/dossiers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dossiers`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-215b0a81c7b7555d", "name": "Dangling fetch: GET /api/compta/resolve-token?token=${encodeURIComponent(token)} (robin-dossiers/src/app/saisie-paiement", "shortDescription": {"text": "Dangling fetch: GET /api/compta/resolve-token?token=${encodeURIComponent(token)} (robin-dossiers/src/app/saisie-paiement/page.tsx:44)"}, "fullDescription": {"text": "`robin-dossiers/src/app/saisie-paiement/page.tsx:44` calls `GET /api/compta/resolve-token?token=${encodeURIComponent(token)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/compta/resolve-token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c7e9a0f167b8b731", "name": "Dangling fetch: GET /api/compta (robin-dossiers/src/app/saisie-paiement/page.tsx:72)", "shortDescription": {"text": "Dangling fetch: GET /api/compta (robin-dossiers/src/app/saisie-paiement/page.tsx:72)"}, "fullDescription": {"text": "`robin-dossiers/src/app/saisie-paiement/page.tsx:72` calls `GET /api/compta` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/compta`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4607912f4c79540e", "name": "Dangling fetch: POST /api/compta/instructions (robin-dossiers/src/app/saisie-paiement/page.tsx:127)", "shortDescription": {"text": "Dangling fetch: POST /api/compta/instructions (robin-dossiers/src/app/saisie-paiement/page.tsx:127)"}, "fullDescription": {"text": "`robin-dossiers/src/app/saisie-paiement/page.tsx:127` calls `POST /api/compta/instructions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/compta/instructions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b7b4b61ff562b792", "name": "Dangling fetch: GET /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/dossiers/[id]/page.tsx:56)", "shortDescription": {"text": "Dangling fetch: GET /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/dossiers/[id]/page.tsx:56)"}, "fullDescription": {"text": "`robin-dossiers/src/app/dossiers/[id]/page.tsx:56` calls `GET /api/dossiers/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dossiers/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9b5fdfe4cdf40eb4", "name": "Dangling fetch: PATCH /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/dossiers/[id]/page.tsx:74)", "shortDescription": {"text": "Dangling fetch: PATCH /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/dossiers/[id]/page.tsx:74)"}, "fullDescription": {"text": "`robin-dossiers/src/app/dossiers/[id]/page.tsx:74` calls `PATCH /api/dossiers/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dossiers/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-77fb4c43cdd8ef24", "name": "Dangling fetch: GET /api/compta (robin-dossiers/src/app/compta/page.tsx:54)", "shortDescription": {"text": "Dangling fetch: GET /api/compta (robin-dossiers/src/app/compta/page.tsx:54)"}, "fullDescription": {"text": "`robin-dossiers/src/app/compta/page.tsx:54` calls `GET /api/compta` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/compta`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a6c83934eba7bab", "name": "Dangling fetch: POST /api/compta (robin-dossiers/src/app/compta/page.tsx:113)", "shortDescription": {"text": "Dangling fetch: POST /api/compta (robin-dossiers/src/app/compta/page.tsx:113)"}, "fullDescription": {"text": "`robin-dossiers/src/app/compta/page.tsx:113` calls `POST /api/compta` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/compta`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-759a38b85440d1f9", "name": "Dangling fetch: POST /api/compta (robin-dossiers/src/app/compta/page.tsx:144)", "shortDescription": {"text": "Dangling fetch: POST /api/compta (robin-dossiers/src/app/compta/page.tsx:144)"}, "fullDescription": {"text": "`robin-dossiers/src/app/compta/page.tsx:144` calls `POST /api/compta` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/compta`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-973c5c512872f950", "name": "Dangling fetch: POST /api/compta (robin-dossiers/src/app/compta/page.tsx:172)", "shortDescription": {"text": "Dangling fetch: POST /api/compta (robin-dossiers/src/app/compta/page.tsx:172)"}, "fullDescription": {"text": "`robin-dossiers/src/app/compta/page.tsx:172` calls `POST /api/compta` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/compta`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8083c77a98f7dfb4", "name": "Dangling fetch: POST /api/compta/link (robin-dossiers/src/app/compta/page.tsx:198)", "shortDescription": {"text": "Dangling fetch: POST /api/compta/link (robin-dossiers/src/app/compta/page.tsx:198)"}, "fullDescription": {"text": "`robin-dossiers/src/app/compta/page.tsx:198` calls `POST /api/compta/link` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/compta/link`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-68c9d5e17d04d050", "name": "Unused endpoint: ANY /webhook", "shortDescription": {"text": "Unused endpoint: ANY /webhook"}, "fullDescription": {"text": "`scripts/whatsapp_bot.py` declares `ANY /webhook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0c6010a9d8a42f30", "name": "Unused endpoint: ANY /test_flow/<phone>", "shortDescription": {"text": "Unused endpoint: ANY /test_flow/<phone>"}, "fullDescription": {"text": "`scripts/whatsapp_bot.py` declares `ANY /test_flow/<phone>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8a169eee26216aee", "name": "Unused endpoint: ANY /dossier_status/<phone>", "shortDescription": {"text": "Unused endpoint: ANY /dossier_status/<phone>"}, "fullDescription": {"text": "`scripts/whatsapp_bot.py` declares `ANY /dossier_status/<phone>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbbcb1f1541aab58", "name": "Unused endpoint: ANY /conversations", "shortDescription": {"text": "Unused endpoint: ANY /conversations"}, "fullDescription": {"text": "`scripts/whatsapp_bot.py` declares `ANY /conversations` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb338ea1d973bf0f", "name": "Unused endpoint: ANY /check_abandoned", "shortDescription": {"text": "Unused endpoint: ANY /check_abandoned"}, "fullDescription": {"text": "`scripts/whatsapp_bot.py` declares `ANY /check_abandoned` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-799101ee76e9f6de", "name": "Unused endpoint: ANY /reset/<phone>", "shortDescription": {"text": "Unused endpoint: ANY /reset/<phone>"}, "fullDescription": {"text": "`scripts/whatsapp_bot.py` declares `ANY /reset/<phone>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-937e16b716dc2dda", "name": "Unused endpoint: ANY /test", "shortDescription": {"text": "Unused endpoint: ANY /test"}, "fullDescription": {"text": "`scripts/whatsapp_bot.py` declares `ANY /test` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`scripts/whatsapp_bot.py` declares `ANY /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-30b768642c73c529", "name": "Unused endpoint: ANY /cron/mandat-reminders", "shortDescription": {"text": "Unused endpoint: ANY /cron/mandat-reminders"}, "fullDescription": {"text": "`scripts/relances_mandat.py` declares `ANY /cron/mandat-reminders` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83a631aff57f3802", "name": "Unused endpoint: ANY /webhook/mandat-signed", "shortDescription": {"text": "Unused endpoint: ANY /webhook/mandat-signed"}, "fullDescription": {"text": "`scripts/relances_mandat.py` declares `ANY /webhook/mandat-signed` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e76c990441852b31", "name": "Unused endpoint: GET /api/wati-webhook", "shortDescription": {"text": "Unused endpoint: GET /api/wati-webhook"}, "fullDescription": {"text": "`railway/server.js` declares `GET /api/wati-webhook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35270f21785aff0f", "name": "Unused endpoint: POST /api/wati-webhook", "shortDescription": {"text": "Unused endpoint: POST /api/wati-webhook"}, "fullDescription": {"text": "`railway/server.js` declares `POST /api/wati-webhook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-51e32ca6592b70a0", "name": "Unused endpoint: GET /api/dossier", "shortDescription": {"text": "Unused endpoint: GET /api/dossier"}, "fullDescription": {"text": "`railway/server.js` declares `GET /api/dossier` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-847959d6a8691963", "name": "Unused endpoint: GET /api/leads-a-rappeler", "shortDescription": {"text": "Unused endpoint: GET /api/leads-a-rappeler"}, "fullDescription": {"text": "`railway/server.js` declares `GET /api/leads-a-rappeler` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-61d5911206615ce7", "name": "Unused endpoint: GET /api/recent-conversations", "shortDescription": {"text": "Unused endpoint: GET /api/recent-conversations"}, "fullDescription": {"text": "`railway/server.js` declares `GET /api/recent-conversations` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`railway/server.js` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-74b47f46448c13b6", "name": "Unused endpoint: POST /api/mandat-signed", "shortDescription": {"text": "Unused endpoint: POST /api/mandat-signed"}, "fullDescription": {"text": "`railway/server.js` declares `POST /api/mandat-signed` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18320"}, "properties": {"repository": "Robindesairs/robin-des-airs", "repoUrl": "https://github.com/Robindesairs/robin-des-airs", "branch": "main"}, "results": [{"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: Robindesairs/robin-des-airs"}, "properties": {"repobilityId": 446824, "scanner": "foundry_dataset", "fingerprint": "98afeb2a9f6f95b5143d111b66b96cfcdf7ad8e9055ffb30a20882724be8222e", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"bug_fix": 3, "source_or_other": 6, "deployment_env_gap": 1, "api_integration_gap": 1, "verification_or_tests": 2, "mostly follows blueprint": 1, "claimed_resolved_unverified": 1, "issue_or_pull_request_thread": 1, "blueprint_human_gap_disagreement": 1, "human_reported_issue_then_fix_attempt": 1, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 3, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"claimed_resolved_unverified": 2, "claimed_resolved_with_verification_signal": 6}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 50, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 6, "alignment_uses_comment": 1, "alignment_uses_finding": 1, "chain_has_link_quality": 5, "comment_aligns_finding": 1, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 6, "thread_has_comment_chain": 2, "comment_chain_links_commit": 6, "comment_chain_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 26, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 6, "alignment": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 5, "comment_chain": 2, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "Robindesairs/robin-des-airs#1", "issue_number": "1", "quality_tiers": {"high_confidence": 3, "assumption_check": 1, "weak_supervision": 1}, "repo_full_name": "Robindesairs/robin-des-airs", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-7969207b01a42cc8", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"source_or_other": 30}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: supported_by_verification_signal\nRepo: Robindesairs/robin-des-airs\nThread: Robindesairs/robin-des-airs#1\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: Robindesairs/robin-des-airs\nThread: Robindesairs/robin-des-airs#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: Robindesairs/robin-des-airs#1\nRepo: Robindesairs/robin-des-airs\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 26\nEdges: 50\nNode types: {'pr_file': 6, 'commit': 5, 'link_quality': 5, 'comment': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 12, 'thread_touches_file': 6, 'comment_chain_links_commit': 6, 'issue_chain_touches_file': 6, 'chain_has_link_quality': 5, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1, 'alignment_uses_comment': 1, 'alignment_uses_finding': 1, 'comment_aligns_finding': 1}\nLabels: {'source_or_other': 6, 'bug_fix': 3, 'claimed_resolved_with_verification_signal': 3, 'verification_or_tests': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'deployment_env_gap': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'human_reported_issue_then_fix_attempt': 1, 'claimed_resolved_unverified': 1, 'blueprint_human_gap_disagreement': 1, 'mostly follows blueprint': 1}\nOutcomes: {'claimed_resolved_with_verification_signal': 6, 'claimed_resolved_unverified': 2}\nQuality tiers: {'high_confidence': 3, 'weak_supervision': 1, 'assumption_check': 1}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/Robindesairs/robin-des-airs", "source_id": "graph-query-motif_query-f89b71706fb4eda6", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "Robindesairs/robin-des-airs", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "scanner-8c20597126a5ed13", "level": "note", "message": {"text": "Possibly dead Python function: already_has_byline"}, "properties": {"repobilityId": "5dcc89151e037264", "scanner": "scanner-primary", "fingerprint": "8c20597126a5ed13", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/add-date-modified-visible.py:54"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5858b9ebfa5eda98", "level": "note", "message": {"text": "Possibly dead Python function: ask_scan_next_passenger"}, "properties": {"repobilityId": "fe29a4e8ebc32129", "scanner": "scanner-primary", "fingerprint": "5858b9ebfa5eda98", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/whatsapp_bot.py:764"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-927276df8bd9c4b4", "level": "note", "message": {"text": "Possibly dead Python function: sort_key"}, "properties": {"repobilityId": "ac2a4181eae38738", "scanner": "scanner-primary", "fingerprint": "927276df8bd9c4b4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/whatsapp_bot.py:788"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-99183b67f591f640", "level": "note", "message": {"text": "Possibly dead Python function: configure_flask_app"}, "properties": {"repobilityId": "eb63330665e0c090", "scanner": "scanner-primary", "fingerprint": "99183b67f591f640", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/relances_mandat.py:33"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-262e3f9d5dac71cc", "level": "note", "message": {"text": "Possibly dead Python function: enregistrer_apres_recap"}, "properties": {"repobilityId": "9c5e049879c50f34", "scanner": "scanner-primary", "fingerprint": "262e3f9d5dac71cc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/relances_mandat.py:61"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-19f4e8e3ab8ccdf8", "level": "note", "message": {"text": "Possibly dead Python function: annuler_pour_telephone"}, "properties": {"repobilityId": "ba36d6763d6a2384", "scanner": "scanner-primary", "fingerprint": "19f4e8e3ab8ccdf8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/relances_mandat.py:91"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d21a173758d11483", "level": "note", "message": {"text": "Possibly dead Python function: register_mandat_routes"}, "properties": {"repobilityId": "7fe26c2bb69dfe85", "scanner": "scanner-primary", "fingerprint": "d21a173758d11483", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/relances_mandat.py:165"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-52e77296bdcd08c7", "level": "note", "message": {"text": "Possibly dead Python function: repl_box"}, "properties": {"repobilityId": "138af5f86cfe453f", "scanner": "scanner-primary", "fingerprint": "52e77296bdcd08c7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/normalize_blog.py:409"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-701c1ac59fcb60c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-mandat-guards.js:10"}, "properties": {"repobilityId": "c59a019ab3c2f35a", "scanner": "scanner-primary", "fingerprint": "701c1ac59fcb60c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de48597d2308fb10", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-ig-prospector.js:11"}, "properties": {"repobilityId": "1e90928f3cbb3b6c", "scanner": "scanner-primary", "fingerprint": "de48597d2308fb10", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-75cf0a17c69e08f3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-agency-prospector.js:11"}, "properties": {"repobilityId": "ffb6c449adbed5b7", "scanner": "scanner-primary", "fingerprint": "75cf0a17c69e08f3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8be744078a78e473", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-bureau-routines.js:14"}, "properties": {"repobilityId": "2ca7215b14f0c626", "scanner": "scanner-primary", "fingerprint": "8be744078a78e473", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ff0c9a07dfa8f23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-legal-pipeline.js:29"}, "properties": {"repobilityId": "7197952db513652a", "scanner": "scanner-primary", "fingerprint": "2ff0c9a07dfa8f23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd5835fe9bffcff1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-bot-v8.js:190"}, "properties": {"repobilityId": "8b4e0b8e206b8a87", "scanner": "scanner-primary", "fingerprint": "dd5835fe9bffcff1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-43d796ce986467bf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 whatsapp-af718-prospects.js:98"}, "properties": {"repobilityId": "5e776a4aeea5d5d4", "scanner": "scanner-primary", "fingerprint": "43d796ce986467bf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06a1d5ab6d5d37a9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-ce261-verdict.js:9"}, "properties": {"repobilityId": "1e49b6c3278dd496", "scanner": "scanner-primary", "fingerprint": "06a1d5ab6d5d37a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-08a4221cbd314ea0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/wire-en-i18n.js:281"}, "properties": {"repobilityId": "5e32a78d7c693e57", "scanner": "scanner-primary", "fingerprint": "08a4221cbd314ea0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-828c5c09337498a4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/imessage-radar-poller.js:76"}, "properties": {"repobilityId": "57f3522b0c62a6ae", "scanner": "scanner-primary", "fingerprint": "828c5c09337498a4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2e711095c82b9a16", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/chef.js:167"}, "properties": {"repobilityId": "12e60527fd430350", "scanner": "scanner-primary", "fingerprint": "2e711095c82b9a16", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-03e57443b7f4d101", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/prospection-agences.js:51"}, "properties": {"repobilityId": "e4558de671a8d2e5", "scanner": "scanner-primary", "fingerprint": "03e57443b7f4d101", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-10a9790c88424bd4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/meta-create-templates.js:168"}, "properties": {"repobilityId": "e1cae378f3ea9dcc", "scanner": "scanner-primary", "fingerprint": "10a9790c88424bd4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef29561152c812e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/upload-ad-images.js:130"}, "properties": {"repobilityId": "3d1d32b47d2d7702", "scanner": "scanner-primary", "fingerprint": "ef29561152c812e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-90c5d2fe08774976", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/capture-preuves-vol.js:95"}, "properties": {"repobilityId": "80d484e484774c26", "scanner": "scanner-primary", "fingerprint": "90c5d2fe08774976", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ecd755782421ad1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scraper-agences-cameroun.js:36"}, "properties": {"repobilityId": "4ee8b4fa1abce1ee", "scanner": "scanner-primary", "fingerprint": "8ecd755782421ad1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1e1fe47ecdfb5afa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fetch-vols-radar.js:20"}, "properties": {"repobilityId": "a1298555fb3ca5f5", "scanner": "scanner-primary", "fingerprint": "1e1fe47ecdfb5afa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eccf8cf5fc74724b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/agent-meteo-radar.js:24"}, "properties": {"repobilityId": "6b0954556e22f72b", "scanner": "scanner-primary", "fingerprint": "eccf8cf5fc74724b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85cbbd4930d65c5c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-en-home.js:207"}, "properties": {"repobilityId": "9fb9fdc6014469de", "scanner": "scanner-primary", "fingerprint": "85cbbd4930d65c5c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-67c0c1aafd0271db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-mandat-articles.js:52"}, "properties": {"repobilityId": "46b97ddb0c6f2165", "scanner": "scanner-primary", "fingerprint": "67c0c1aafd0271db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fa2ce377c01a90b6", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 assets/radar-live.js:2044"}, "properties": {"repobilityId": "913c1f99ff41799c", "scanner": "scanner-primary", "fingerprint": "fa2ce377c01a90b6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-9ab4a863b1def524", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 assets/feedback-modal.js:172"}, "properties": {"repobilityId": "c4e96108d48764d8", "scanner": "scanner-primary", "fingerprint": "9ab4a863b1def524", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f6e04f7595bf723", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-extract-eticket.js:21"}, "properties": {"repobilityId": "b829d87525a93ca2", "scanner": "scanner-primary", "fingerprint": "7f6e04f7595bf723", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8a3aaa461dec879", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-robustness.js:96"}, "properties": {"repobilityId": "2693cc5c8948e087", "scanner": "scanner-primary", "fingerprint": "d8a3aaa461dec879", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b186144f5bff860a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-scenarios-100.js:135"}, "properties": {"repobilityId": "f663749bb917a1cb", "scanner": "scanner-primary", "fingerprint": "b186144f5bff860a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b54df0a70e2cc756", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-extract-live.js:27"}, "properties": {"repobilityId": "9e465002a354c82b", "scanner": "scanner-primary", "fingerprint": "b54df0a70e2cc756", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f061716808a99d1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 railway/server.js:103"}, "properties": {"repobilityId": "13736c5d28e00add", "scanner": "scanner-primary", "fingerprint": "5f061716808a99d1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a7e3f6545c8ca90", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-load.js:73"}, "properties": {"repobilityId": "bf2cf385d35c8bb1", "scanner": "scanner-primary", "fingerprint": "9a7e3f6545c8ca90", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19b2241c4a5697c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 railway/test-sim-20.js:108"}, "properties": {"repobilityId": "81e70ebd959b481e", "scanner": "scanner-primary", "fingerprint": "19b2241c4a5697c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5bb402f8887ca01c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 robin-dossiers/src/app/page.tsx:631"}, "properties": {"repobilityId": "430706d87b0ba951", "scanner": "scanner-primary", "fingerprint": "5bb402f8887ca01c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-0a489b10398c606e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/radar-ticker-refresh.js:84"}, "properties": {"repobilityId": "dea2cc2f01fd9eda", "scanner": "scanner-primary", "fingerprint": "0a489b10398c606e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b8e2875f3e5d740b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/radar-veille-cron.js:153"}, "properties": {"repobilityId": "e68f3e33367afd16", "scanner": "scanner-primary", "fingerprint": "b8e2875f3e5d740b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-591a8a0a122b95e8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/submit-mandat.js:172"}, "properties": {"repobilityId": "12b6c463f343baad", "scanner": "scanner-primary", "fingerprint": "591a8a0a122b95e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-51bda310bbf881cf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/whatsapp-webhook.js:196"}, "properties": {"repobilityId": "8473ead66ea43c80", "scanner": "scanner-primary", "fingerprint": "51bda310bbf881cf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3924a3ce1ce0e838", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/radar-monitor.js:363"}, "properties": {"repobilityId": "8093d649eaf3716d", "scanner": "scanner-primary", "fingerprint": "3924a3ce1ce0e838", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81ff325e1a3ef414", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/ad-watch.js:111"}, "properties": {"repobilityId": "53b17ace46c49c07", "scanner": "scanner-primary", "fingerprint": "81ff325e1a3ef414", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a7f8a40b33ad3c65", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/instagram-dm-webhook.js:67"}, "properties": {"repobilityId": "aa4141c2cd8a860c", "scanner": "scanner-primary", "fingerprint": "a7f8a40b33ad3c65", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-894035e9041d9b9e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/daily-radar-snapshot-background.js:241"}, "properties": {"repobilityId": "123e9455685972e8", "scanner": "scanner-primary", "fingerprint": "894035e9041d9b9e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-98febd78640a186f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/aerodatabox-webhook.js:57"}, "properties": {"repobilityId": "b8c22068fb5bdf39", "scanner": "scanner-primary", "fingerprint": "98febd78640a186f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-063361153e75bf1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/crm-status-notify.js:135"}, "properties": {"repobilityId": "e60c1b33f85c75ca", "scanner": "scanner-primary", "fingerprint": "063361153e75bf1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-66365f93d1dd7c96", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/whatsapp-gemini-fallback.js:49"}, "properties": {"repobilityId": "3061b4f1038c4361", "scanner": "scanner-primary", "fingerprint": "66365f93d1dd7c96", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-90ad0cdabbb0f81c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/instagram-publisher.js:113"}, "properties": {"repobilityId": "a28cdc057b923f94", "scanner": "scanner-primary", "fingerprint": "90ad0cdabbb0f81c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97ddde71b4ef9b85", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/flight-info.js:60"}, "properties": {"repobilityId": "4c72937ecfc3d9ae", "scanner": "scanner-primary", "fingerprint": "97ddde71b4ef9b85", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fae7e62f057b8309", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/lib/agency-accounts.js:10"}, "properties": {"repobilityId": "53c9f98b5a721e37", "scanner": "scanner-primary", "fingerprint": "fae7e62f057b8309", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d33ba74103d3d57", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/lib/callmebot.js:36"}, "properties": {"repobilityId": "a8a0a8d080329866", "scanner": "scanner-primary", "fingerprint": "7d33ba74103d3d57", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-80ee72ff857da170", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/runCertification.ts:10"}, "properties": {"repobilityId": "d00feff7f4d46640", "scanner": "scanner-primary", "fingerprint": "80ee72ff857da170", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cb992dc6f6897887", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/seedAfricanHubs.ts:10"}, "properties": {"repobilityId": "940568f3260a658e", "scanner": "scanner-primary", "fingerprint": "cb992dc6f6897887", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-096e6b9f092a1ce3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/server.ts:42"}, "properties": {"repobilityId": "7753d6bdd8ad49dd", "scanner": "scanner-primary", "fingerprint": "096e6b9f092a1ce3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-11ec7a35846828a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/notify-indexnow.ts:52"}, "properties": {"repobilityId": "27747c16b657cc78", "scanner": "scanner-primary", "fingerprint": "11ec7a35846828a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1e3f32e26211a40", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/build-blog.ts:318"}, "properties": {"repobilityId": "b5ae6e609263864a", "scanner": "scanner-primary", "fingerprint": "a1e3f32e26211a40", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ffdd1ae0fc59ff8c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/build-sitemap.ts:34"}, "properties": {"repobilityId": "9e2a9938c4a2d341", "scanner": "scanner-primary", "fingerprint": "ffdd1ae0fc59ff8c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7307ed532869df63", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/FeedbackModal.tsx:52"}, "properties": {"repobilityId": "d39b680986235d92", "scanner": "scanner-primary", "fingerprint": "7307ed532869df63", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a220d120f033a17", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in radar-direct.html:133"}, "properties": {"repobilityId": "9ba65111973db35e", "scanner": "scanner-primary", "fingerprint": "9a220d120f033a17", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "radar-direct.html"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-0ee8150911b0d8dd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dossier.html:742"}, "properties": {"repobilityId": "a876b91fae6762c8", "scanner": "scanner-primary", "fingerprint": "0ee8150911b0d8dd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dossier.html"}, "region": {"startLine": 742}}}]}, {"ruleId": "scanner-2e0d9b9a0b487d70", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scan-airport-v8.html:96"}, "properties": {"repobilityId": "90fd83d66cb710a8", "scanner": "scanner-primary", "fingerprint": "2e0d9b9a0b487d70", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scan-airport-v8.html"}, "region": {"startLine": 96}}}]}, {"ruleId": "scanner-2e59b2c0f5c943c1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in live-campagnes.html:146"}, "properties": {"repobilityId": "9f1f2a3a1325deaf", "scanner": "scanner-primary", "fingerprint": "2e59b2c0f5c943c1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "live-campagnes.html"}, "region": {"startLine": 146}}}]}, {"ruleId": "scanner-7dbdb41a7201f325", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in verification-fonctions.html:42"}, "properties": {"repobilityId": "bf246feabce8124d", "scanner": "scanner-primary", "fingerprint": "7dbdb41a7201f325", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "verification-fonctions.html"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-0004c601df8a0fd2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in espace-agence.html:619"}, "properties": {"repobilityId": "03a195594e1d7344", "scanner": "scanner-primary", "fingerprint": "0004c601df8a0fd2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "espace-agence.html"}, "region": {"startLine": 619}}}]}, {"ruleId": "scanner-92338dcc5166998a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mandat.html:1070"}, "properties": {"repobilityId": "8a54da607fca00ff", "scanner": "scanner-primary", "fingerprint": "92338dcc5166998a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mandat.html"}, "region": {"startLine": 1070}}}]}, {"ruleId": "scanner-e4e59b873042401d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in depot-en-ligne.html:80"}, "properties": {"repobilityId": "d33a64d97ce864c0", "scanner": "scanner-primary", "fingerprint": "e4e59b873042401d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "depot-en-ligne.html"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-856c734782f0b33c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in scrape.js:45"}, "properties": {"repobilityId": "678b86d0955cd71f", "scanner": "scanner-primary", "fingerprint": "856c734782f0b33c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scrape.js"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-6693c1777fc23735", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in bureau.html:703"}, "properties": {"repobilityId": "25e5c89ac46c7554", "scanner": "scanner-primary", "fingerprint": "6693c1777fc23735", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bureau.html"}, "region": {"startLine": 703}}}]}, {"ruleId": "scanner-e477be1eeaf6b1c7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in generateur-pub-stories.html:553"}, "properties": {"repobilityId": "453792532c2336e0", "scanner": "scanner-primary", "fingerprint": "e477be1eeaf6b1c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "generateur-pub-stories.html"}, "region": {"startLine": 553}}}]}, {"ruleId": "scanner-ad77f3ce5b31da21", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in test-radar.html:42"}, "properties": {"repobilityId": "98440a043eb578be", "scanner": "scanner-primary", "fingerprint": "ad77f3ce5b31da21", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test-radar.html"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-f70b1bf1dd8c62fc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in autorisation.html:1070"}, "properties": {"repobilityId": "d51ed2ffb42dabe1", "scanner": "scanner-primary", "fingerprint": "f70b1bf1dd8c62fc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "autorisation.html"}, "region": {"startLine": 1070}}}]}, {"ruleId": "scanner-baf7dd29ea2f7b27", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mandat-en.html:974"}, "properties": {"repobilityId": "e152adc07c1f76af", "scanner": "scanner-primary", "fingerprint": "baf7dd29ea2f7b27", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mandat-en.html"}, "region": {"startLine": 974}}}]}, {"ruleId": "scanner-b7d4c7a6b33d457c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in i18n.js:978"}, "properties": {"repobilityId": "4231557a5319c233", "scanner": "scanner-primary", "fingerprint": "b7d4c7a6b33d457c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "i18n.js"}, "region": {"startLine": 978}}}]}, {"ruleId": "scanner-6e3a28113e4246f5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in statistiques.html:172"}, "properties": {"repobilityId": "9f63109fee99c4c6", "scanner": "scanner-primary", "fingerprint": "6e3a28113e4246f5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "statistiques.html"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-ba779edc2dd35538", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in radar-v3.html:139"}, "properties": {"repobilityId": "1d4a734c5b00b87d", "scanner": "scanner-primary", "fingerprint": "ba779edc2dd35538", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "radar-v3.html"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-55ce48b0c444af04", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in navigation-interne.html:96"}, "properties": {"repobilityId": "c4a0be21675bb1f6", "scanner": "scanner-primary", "fingerprint": "55ce48b0c444af04", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "navigation-interne.html"}, "region": {"startLine": 96}}}]}, {"ruleId": "scanner-ea36d2f0fb3b3ee9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/build-navigation-interne.mjs:272"}, "properties": {"repobilityId": "bce563717bdef86c", "scanner": "scanner-primary", "fingerprint": "ea36d2f0fb3b3ee9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build-navigation-interne.mjs"}, "region": {"startLine": 272}}}]}, {"ruleId": "scanner-904e89b23d9fc8aa", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/imessage-radar-poller.js:30"}, "properties": {"repobilityId": "a3ad34d4635bfc19", "scanner": "scanner-primary", "fingerprint": "904e89b23d9fc8aa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/imessage-radar-poller.js"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-d2ade55cec73c940", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/chef.js:5"}, "properties": {"repobilityId": "db728a8969a93142", "scanner": "scanner-primary", "fingerprint": "d2ade55cec73c940", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/chef.js"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-6e2312a1aeeaedcb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/patch-radar-table-ui.py:8"}, "properties": {"repobilityId": "9aa8ce0b1a59c085", "scanner": "scanner-primary", "fingerprint": "6e2312a1aeeaedcb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/patch-radar-table-ui.py"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-7c6d48300b87f5b6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/radar-live.js:346"}, "properties": {"repobilityId": "944d1b0327fa7bb8", "scanner": "scanner-primary", "fingerprint": "7c6d48300b87f5b6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/radar-live.js"}, "region": {"startLine": 346}}}]}, {"ruleId": "scanner-2d17b9a0ee615182", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/feedback-modal.js:72"}, "properties": {"repobilityId": "70b3483c09d382ce", "scanner": "scanner-primary", "fingerprint": "2d17b9a0ee615182", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/feedback-modal.js"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-1098d52fd68810c9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/palette-robin.js:17"}, "properties": {"repobilityId": "46e3d9c1035ab566", "scanner": "scanner-primary", "fingerprint": "1098d52fd68810c9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/palette-robin.js"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-e212157cc9167590", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/agence-currency.js:84"}, "properties": {"repobilityId": "353582cc6de58c1c", "scanner": "scanner-primary", "fingerprint": "e212157cc9167590", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/agence-currency.js"}, "region": {"startLine": 84}}}]}, {"ruleId": "scanner-9f4ba5447c163d32", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/radar-gate.js:79"}, "properties": {"repobilityId": "6ac6bad217b2ef84", "scanner": "scanner-primary", "fingerprint": "9f4ba5447c163d32", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/radar-gate.js"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-4a7c9e45285162eb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/agence-i18n.js:455"}, "properties": {"repobilityId": "0c2a43f4e68bdf3f", "scanner": "scanner-primary", "fingerprint": "4a7c9e45285162eb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/agence-i18n.js"}, "region": {"startLine": 455}}}]}, {"ruleId": "scanner-b81f4987c1313681", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/index-page.js:437"}, "properties": {"repobilityId": "237aaa51ef6a2461", "scanner": "scanner-primary", "fingerprint": "b81f4987c1313681", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/index-page.js"}, "region": {"startLine": 437}}}]}, {"ruleId": "scanner-9da8fc1f912e0451", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/bureau-gate.js:62"}, "properties": {"repobilityId": "d1ec9cc5b5cc0f18", "scanner": "scanner-primary", "fingerprint": "9da8fc1f912e0451", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/bureau-gate.js"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-7da1f30038fb2fca", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/radar-scan-scheduler.js:114"}, "properties": {"repobilityId": "fb4e8f4355d0b874", "scanner": "scanner-primary", "fingerprint": "7da1f30038fb2fca", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/radar-scan-scheduler.js"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-a31674b85898d83a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/robin-locale-toolbar.js:38"}, "properties": {"repobilityId": "d7ae0b0658c9a416", "scanner": "scanner-primary", "fingerprint": "a31674b85898d83a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/robin-locale-toolbar.js"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-9fbdfd241be4562f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in assets/agence-portal.js:48"}, "properties": {"repobilityId": "d9dc44f39632c2f7", "scanner": "scanner-primary", "fingerprint": "9fbdfd241be4562f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "assets/agence-portal.js"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-7352c6bb96f3b5c6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in crm/index.html:1136"}, "properties": {"repobilityId": "518cda24903c7ced", "scanner": "scanner-primary", "fingerprint": "7352c6bb96f3b5c6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "crm/index.html"}, "region": {"startLine": 1136}}}]}, {"ruleId": "scanner-099c65eaf03bf5bd", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/telegram-notify.js:64"}, "properties": {"repobilityId": "7d20f3c48317746e", "scanner": "scanner-primary", "fingerprint": "099c65eaf03bf5bd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/telegram-notify.js"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-ff99c6648df199b4", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/agent-chat.js:24"}, "properties": {"repobilityId": "32e0346fd255a557", "scanner": "scanner-primary", "fingerprint": "ff99c6648df199b4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/agent-chat.js"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-70a4d9b3967fc3f8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/bureau-stats.js:30"}, "properties": {"repobilityId": "deb4473375e46d49", "scanner": "scanner-primary", "fingerprint": "70a4d9b3967fc3f8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/bureau-stats.js"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-5d71db910e527374", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/instagram-stats.js:24"}, "properties": {"repobilityId": "66c01d23b3d1b6de", "scanner": "scanner-primary", "fingerprint": "5d71db910e527374", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/instagram-stats.js"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-413bc88e3920abc7", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/mandat-verify.js:11"}, "properties": {"repobilityId": "c313422f70ed7913", "scanner": "scanner-primary", "fingerprint": "413bc88e3920abc7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/mandat-verify.js"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-636de6b0f77ca9b8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/aerodatabox-webhook.js:22"}, "properties": {"repobilityId": "22576ae8e8a62d2f", "scanner": "scanner-primary", "fingerprint": "636de6b0f77ca9b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/aerodatabox-webhook.js"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-697f049c29117a6b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/collect-proofs.js:12"}, "properties": {"repobilityId": "e315c302372721de", "scanner": "scanner-primary", "fingerprint": "697f049c29117a6b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/collect-proofs.js"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-1954255d3993f426", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/radar-today.js:13"}, "properties": {"repobilityId": "7dea8cf88cf5701d", "scanner": "scanner-primary", "fingerprint": "1954255d3993f426", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/radar-today.js"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-e06245b08e9cf092", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/airtable-webhook.js:35"}, "properties": {"repobilityId": "d763490493297047", "scanner": "scanner-primary", "fingerprint": "e06245b08e9cf092", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/airtable-webhook.js"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-908e828d132e01d5", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/piece-store.js:13"}, "properties": {"repobilityId": "18d5f3fb5fc462ed", "scanner": "scanner-primary", "fingerprint": "908e828d132e01d5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/piece-store.js"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-2a1b85e8cf2844b9", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/facebook-scheduled.js:22"}, "properties": {"repobilityId": "a1eb75aecf82c9b8", "scanner": "scanner-primary", "fingerprint": "2a1b85e8cf2844b9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/facebook-scheduled.js"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-8735060c3718830a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/depot-upload.js:15"}, "properties": {"repobilityId": "615006995399ac6f", "scanner": "scanner-primary", "fingerprint": "8735060c3718830a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/depot-upload.js"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-da388eb5f2fe36a6", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/wati-agency-webhook.js:18"}, "properties": {"repobilityId": "f156370dd6be7fa7", "scanner": "scanner-primary", "fingerprint": "da388eb5f2fe36a6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/wati-agency-webhook.js"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-c4c52c8b5fb84292", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/meta-stats.js:16"}, "properties": {"repobilityId": "563b68b1dfede4f9", "scanner": "scanner-primary", "fingerprint": "c4c52c8b5fb84292", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/meta-stats.js"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-8c9533f6b1177efa", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in netlify/functions/radar-enquete.js:17"}, "properties": {"repobilityId": "80c4142758533145", "scanner": "scanner-primary", "fingerprint": "8c9533f6b1177efa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "netlify/functions/radar-enquete.js"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-43756fd041295ea4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/index.html:418"}, "properties": {"repobilityId": "fcd975cc51168fca", "scanner": "scanner-primary", "fingerprint": "43756fd041295ea4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/index.html"}, "region": {"startLine": 418}}}]}, {"ruleId": "scanner-dfec12d3fc8a0793", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/server.ts:15"}, "properties": {"repobilityId": "1fe4d9ae53c13ee0", "scanner": "scanner-primary", "fingerprint": "dfec12d3fc8a0793", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/server.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-e3014dadf7849b07", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/views/dashboard.html:139"}, "properties": {"repobilityId": "9eaab5d9c2c4aa96", "scanner": "scanner-primary", "fingerprint": "e3014dadf7849b07", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/views/dashboard.html"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-015b5d2bc13f292c", "level": "note", "message": {"text": "Very large file: i18n.js (1221 lines)"}, "properties": {"repobilityId": "b6f30bd653e776b2", "scanner": "scanner-primary", "fingerprint": "015b5d2bc13f292c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-05930269cc92cce8", "level": "note", "message": {"text": "Very large file: scripts/generate_de_es_blog_batch.py (984 lines)"}, "properties": {"repobilityId": "0e8bde773a08aba2", "scanner": "scanner-primary", "fingerprint": "05930269cc92cce8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-76dcfb4ef909f178", "level": "note", "message": {"text": "Very large file: scripts/whatsapp_bot.py (2624 lines)"}, "properties": {"repobilityId": "ea0f299f6fe15ed0", "scanner": "scanner-primary", "fingerprint": "76dcfb4ef909f178", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-483bc1c780c55372", "level": "note", "message": {"text": "Very large file: assets/radar-live.js (2569 lines)"}, "properties": {"repobilityId": "56b15d5cdec97307", "scanner": "scanner-primary", "fingerprint": "483bc1c780c55372", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-341efdda67b3a94a", "level": "note", "message": {"text": "Very large file: assets/index-page.js (1932 lines)"}, "properties": {"repobilityId": "9ef9ec41dc773e3d", "scanner": "scanner-primary", "fingerprint": "341efdda67b3a94a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-49c7128cfe8aeb2f", "level": "note", "message": {"text": "Very large file: assets/agence-portal.js (1484 lines)"}, "properties": {"repobilityId": "e856b930a269f7c1", "scanner": "scanner-primary", "fingerprint": "49c7128cfe8aeb2f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1bf6cfe4ae574c39", "level": "note", "message": {"text": "Very large file: railway/server.js (2586 lines)"}, "properties": {"repobilityId": "6451386c3b70a7e7", "scanner": "scanner-primary", "fingerprint": "1bf6cfe4ae574c39", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3df5668b3c5893ae", "level": "note", "message": {"text": "Very large file: netlify/functions/whatsapp-webhook.js (1393 lines)"}, "properties": {"repobilityId": "25953cbc03adbb00", "scanner": "scanner-primary", "fingerprint": "3df5668b3c5893ae", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-49537acfdfe03b6c", "level": "note", "message": {"text": "Very large file: netlify/functions/radar.js (1400 lines)"}, "properties": {"repobilityId": "a6543e83ba98449c", "scanner": "scanner-primary", "fingerprint": "49537acfdfe03b6c", "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": "6b17cc5d2969461f", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "4d86f5af0778831b", "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": "a3ce0b478aa16abb", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "f2d73e858c360d40", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "72e13f9e0e7070fc", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "da8201676a203d61", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "536e2853cf1fa151", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "4e868e4303830852", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-475fd7293219c56f", "level": "none", "message": {"text": "Commented-code block (7 lines) in test-bot-v8.js:420"}, "properties": {"repobilityId": "c3e594ee61eff292", "scanner": "scanner-primary", "fingerprint": "475fd7293219c56f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d495a69a2350171", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/mark_reviewed.py:116"}, "properties": {"repobilityId": "7e5a114380235088", "scanner": "scanner-primary", "fingerprint": "8d495a69a2350171", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-081d441efe995511", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/build-espace-agence.py:10"}, "properties": {"repobilityId": "77a3a33568473f02", "scanner": "scanner-primary", "fingerprint": "081d441efe995511", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c4616914b0d525d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/upload-ad-images.js:108"}, "properties": {"repobilityId": "42e2df8aa9dab64f", "scanner": "scanner-primary", "fingerprint": "c4616914b0d525d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-145a7dd87bdd4398", "level": "none", "message": {"text": "Commented-code block (5 lines) in assets/radar-live.js:1418"}, "properties": {"repobilityId": "0c9eeac64b1f9155", "scanner": "scanner-primary", "fingerprint": "145a7dd87bdd4398", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b89331c681f314a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/radar-live.js:1035"}, "properties": {"repobilityId": "d3e4d1f1e72d10d0", "scanner": "scanner-primary", "fingerprint": "6b89331c681f314a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb70a5782c42b334", "level": "none", "message": {"text": "Commented-code block (5 lines) in assets/home-loader.js:100"}, "properties": {"repobilityId": "548b872fd866f6cb", "scanner": "scanner-primary", "fingerprint": "bb70a5782c42b334", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b915f5f20c308c4c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/radar-gate.js:106"}, "properties": {"repobilityId": "e559c4a69c695c79", "scanner": "scanner-primary", "fingerprint": "b915f5f20c308c4c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eea227efe6fe02a6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/radar-veille-server.js:74"}, "properties": {"repobilityId": "8cc3d49ca4956bf3", "scanner": "scanner-primary", "fingerprint": "eea227efe6fe02a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6545a14eb2fe753c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/index-page.js:1490"}, "properties": {"repobilityId": "a2d1d6ee7dc7f9dc", "scanner": "scanner-primary", "fingerprint": "6545a14eb2fe753c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9ce9cbe218d034bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/bureau-gate.js:89"}, "properties": {"repobilityId": "9a740ff756fc37ca", "scanner": "scanner-primary", "fingerprint": "9ce9cbe218d034bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d705d899b4c49725", "level": "note", "message": {"text": "Legacy-named symbol `rda_hub_last_scan_v1` in assets/radar-scan-scheduler.js:9"}, "properties": {"repobilityId": "b8b5c0dd14aee438", "scanner": "scanner-primary", "fingerprint": "d705d899b4c49725", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5049961bb34467ce", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 assets/agence-portal.js:27"}, "properties": {"repobilityId": "ff87327aaae6eeff", "scanner": "scanner-primary", "fingerprint": "5049961bb34467ce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-329d7e10a1805757", "level": "note", "message": {"text": "Legacy-named symbol `tooOld` in railway/server.js:939"}, "properties": {"repobilityId": "37fd4da8946eda15", "scanner": "scanner-primary", "fingerprint": "329d7e10a1805757", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ac5683ff8e690447", "level": "none", "message": {"text": "Commented-code block (5 lines) in railway/server.js:374"}, "properties": {"repobilityId": "8f807bbc451cc291", "scanner": "scanner-primary", "fingerprint": "ac5683ff8e690447", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef3020ac19e3ebaa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 robin-dossiers/src/app/page.tsx:173"}, "properties": {"repobilityId": "04af75d4f83129dd", "scanner": "scanner-primary", "fingerprint": "ef3020ac19e3ebaa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb0b0bee93e64764", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 robin-dossiers/src/app/saisie-paiement/page.tsx:44"}, "properties": {"repobilityId": "e6a9022178e278cd", "scanner": "scanner-primary", "fingerprint": "bb0b0bee93e64764", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-91d3482d7f8ecadf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-stats.js:24"}, "properties": {"repobilityId": "f8a3e9e7edb8ba79", "scanner": "scanner-primary", "fingerprint": "91d3482d7f8ecadf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ad96f4e4a82a842b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/morning-report.js:112"}, "properties": {"repobilityId": "ba00beb9143b4abc", "scanner": "scanner-primary", "fingerprint": "ad96f4e4a82a842b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c567218a2b8271b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/legal-daily.js:39"}, "properties": {"repobilityId": "bdcdd4804c2aea05", "scanner": "scanner-primary", "fingerprint": "c567218a2b8271b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38cd3c484ec07ae4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/agent-chat.js:83"}, "properties": {"repobilityId": "216744de52df4818", "scanner": "scanner-primary", "fingerprint": "38cd3c484ec07ae4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55f51d4e5ede4e66", "level": "note", "message": {"text": "Legacy-named symbol `whatsapp_copy` in netlify/functions/submit-mandat.js:773"}, "properties": {"repobilityId": "48c32d813bdbcc34", "scanner": "scanner-primary", "fingerprint": "55f51d4e5ede4e66", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ac5f4260258193b5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/submit-mandat.js:94"}, "properties": {"repobilityId": "d38966c522103f56", "scanner": "scanner-primary", "fingerprint": "ac5f4260258193b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f6e95ec6cb890d9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/analyze-flight.js:118"}, "properties": {"repobilityId": "4a831b7a02076b6e", "scanner": "scanner-primary", "fingerprint": "3f6e95ec6cb890d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c9fbddffbcb9bd7c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/bureau-stats.js:50"}, "properties": {"repobilityId": "099dd94fe3cdac6e", "scanner": "scanner-primary", "fingerprint": "c9fbddffbcb9bd7c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0724b418c161cd9c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/instagram-stats.js:54"}, "properties": {"repobilityId": "1523cfe186833a53", "scanner": "scanner-primary", "fingerprint": "0724b418c161cd9c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c22fd710d60be4e9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/bureau-daily.js:73"}, "properties": {"repobilityId": "381e76f5e582e9fd", "scanner": "scanner-primary", "fingerprint": "c22fd710d60be4e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f9fb56c65ed66a7a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/whatsapp-webhook.js:544"}, "properties": {"repobilityId": "0ae7fc84f3b7454d", "scanner": "scanner-primary", "fingerprint": "f9fb56c65ed66a7a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-05c320dc68e8eeae", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-watch.js:129"}, "properties": {"repobilityId": "c3dd45be3698db97", "scanner": "scanner-primary", "fingerprint": "05c320dc68e8eeae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-461747e1b41c261e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/airport-search.js:43"}, "properties": {"repobilityId": "cdd260c7bff13bf2", "scanner": "scanner-primary", "fingerprint": "461747e1b41c261e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e7e1b297100d44a2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-launch.js:357"}, "properties": {"repobilityId": "397831365e4ac887", "scanner": "scanner-primary", "fingerprint": "e7e1b297100d44a2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce3007f50b04d861", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/yousign-init.js:89"}, "properties": {"repobilityId": "39a02564aed7a57c", "scanner": "scanner-primary", "fingerprint": "ce3007f50b04d861", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9eebaa4c95f09196", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-breakdown.js:66"}, "properties": {"repobilityId": "09da0bb5983c8a86", "scanner": "scanner-primary", "fingerprint": "9eebaa4c95f09196", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b3693ac49bfe9df9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-stop.js:48"}, "properties": {"repobilityId": "eab9628e3cc3b97a", "scanner": "scanner-primary", "fingerprint": "b3693ac49bfe9df9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-513ac3b321d06a5f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/radar.js:1090"}, "properties": {"repobilityId": "e091cfb074f67478", "scanner": "scanner-primary", "fingerprint": "513ac3b321d06a5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a1e6bfadbedbb72", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/facebook-scheduled.js:52"}, "properties": {"repobilityId": "e1bd5eaa7459880e", "scanner": "scanner-primary", "fingerprint": "7a1e6bfadbedbb72", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ddeb702a3e94ee13", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/sofia-prospect.js:164"}, "properties": {"repobilityId": "f06c4572652187ac", "scanner": "scanner-primary", "fingerprint": "ddeb702a3e94ee13", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cc798f6348fff90b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/meta-stats.js:52"}, "properties": {"repobilityId": "41d9dcb31a781cea", "scanner": "scanner-primary", "fingerprint": "cc798f6348fff90b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0c89dfe18e165252", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/crm-delete-dossier.js:67"}, "properties": {"repobilityId": "d7a1bb39c58941d6", "scanner": "scanner-primary", "fingerprint": "0c89dfe18e165252", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bd827120ec74f786", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/ad-target.js:28"}, "properties": {"repobilityId": "12fe72495a7e9862", "scanner": "scanner-primary", "fingerprint": "bd827120ec74f786", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-be55e60a5d8ac4e9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/agency-airtable.js:247"}, "properties": {"repobilityId": "5ae4df34bfc4d3d4", "scanner": "scanner-primary", "fingerprint": "be55e60a5d8ac4e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-95d107097839bd1a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/airtable-robin.js:150"}, "properties": {"repobilityId": "4400d6f770ca092a", "scanner": "scanner-primary", "fingerprint": "95d107097839bd1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8e384f999f5f25bc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/airtable-attach.js:68"}, "properties": {"repobilityId": "fa4cff2e2e79509d", "scanner": "scanner-primary", "fingerprint": "8e384f999f5f25bc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f48011debabe3047", "level": "none", "message": {"text": "Commented-code block (5 lines) in netlify/functions/lib/legal-pipeline.js:24"}, "properties": {"repobilityId": "323aad69f0716ec0", "scanner": "scanner-primary", "fingerprint": "f48011debabe3047", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-459d804129cd7d76", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/radar-report-email.js:93"}, "properties": {"repobilityId": "8a255752b26a38fc", "scanner": "scanner-primary", "fingerprint": "459d804129cd7d76", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0bf883f344b47d6d", "level": "none", "message": {"text": "Commented-code block (5 lines) in netlify/functions/lib/robin-ai-responder.js:36"}, "properties": {"repobilityId": "582b096e9e597824", "scanner": "scanner-primary", "fingerprint": "0bf883f344b47d6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d17d9314fac3e73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/meta-resolve.js:21"}, "properties": {"repobilityId": "517f8a162af4f7f1", "scanner": "scanner-primary", "fingerprint": "7d17d9314fac3e73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9f92bf4fa2c66a2f", "level": "none", "message": {"text": "Commented-code block (5 lines) in netlify/functions/lib/radar-enquete.js:234"}, "properties": {"repobilityId": "9bfb994314e27055", "scanner": "scanner-primary", "fingerprint": "9f92bf4fa2c66a2f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5b4c2b49406528ac", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 netlify/functions/lib/radar-enquete.js:431"}, "properties": {"repobilityId": "6836442449f90660", "scanner": "scanner-primary", "fingerprint": "5b4c2b49406528ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9bedb78e73432ee6", "level": "none", "message": {"text": "Commented-code block (5 lines) in netlify/functions/lib/radar-reschedule.js:100"}, "properties": {"repobilityId": "6da6322cab1e4c56", "scanner": "scanner-primary", "fingerprint": "9bedb78e73432ee6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21e401f37a7406cc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/visionService.ts:44"}, "properties": {"repobilityId": "36b2c2efb4313625", "scanner": "scanner-primary", "fingerprint": "21e401f37a7406cc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b742757b9358738", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/monitoringService.ts:37"}, "properties": {"repobilityId": "6477d59cec9f955a", "scanner": "scanner-primary", "fingerprint": "8b742757b9358738", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c795c2dfdfa0cbca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/geminiService.ts:51"}, "properties": {"repobilityId": "204605cd7631c0b9", "scanner": "scanner-primary", "fingerprint": "c795c2dfdfa0cbca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-232509bd1ae4da85", "level": "note", "message": {"text": "240 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "db01733dc8ef17a9", "scanner": "scanner-primary", "fingerprint": "232509bd1ae4da85", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "d7e87ab619a52c01", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "91ab41319355d55f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-e4bca1677cfea50f", "level": "error", "message": {"text": "Flask mutation route `webhook` without `@login_required` \u2014 scripts/whatsapp_bot.py:1854"}, "properties": {"repobilityId": "113ef7aa3a4d558b", "scanner": "scanner-primary", "fingerprint": "e4bca1677cfea50f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/whatsapp_bot.py"}, "region": {"startLine": 1854}}}]}, {"ruleId": "scanner-212c86a84458f71b", "level": "error", "message": {"text": "Flask mutation route `cron_mandat_reminders` without `@login_required` \u2014 scripts/relances_mandat.py:174"}, "properties": {"repobilityId": "fde03f4926a07f5a", "scanner": "scanner-primary", "fingerprint": "212c86a84458f71b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/relances_mandat.py"}, "region": {"startLine": 174}}}]}, {"ruleId": "scanner-4067b3c9dd0e7008", "level": "error", "message": {"text": "Flask mutation route `webhook_mandat_signed` without `@login_required` \u2014 scripts/relances_mandat.py:181"}, "properties": {"repobilityId": "7c1f9f8b5918a5cf", "scanner": "scanner-primary", "fingerprint": "4067b3c9dd0e7008", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/relances_mandat.py"}, "region": {"startLine": 181}}}]}, {"ruleId": "scanner-e74dfc28a84acd48", "level": "error", "message": {"text": "Dangling fetch: POST /.netlify/functions/ad-launch (assets/radar-live.js:2105)"}, "properties": {"repobilityId": "32fd87c5a8fc45bb", "scanner": "scanner-primary", "fingerprint": "e74dfc28a84acd48", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-952db808d2617998", "level": "error", "message": {"text": "Dangling fetch: POST /.netlify/functions/ad-stop (assets/radar-live.js:2198)"}, "properties": {"repobilityId": "c3a946412df23258", "scanner": "scanner-primary", "fingerprint": "952db808d2617998", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b6d7b8a9463df99", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${BOT}/api/wati-webhook?s=${SECRET} (railway/test-robustness.js:35)"}, "properties": {"repobilityId": "0fb77d7be31b6b7e", "scanner": "scanner-primary", "fingerprint": "9b6d7b8a9463df99", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-291cfcaf42818de4", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT}/health (railway/test-robustness.js:42)"}, "properties": {"repobilityId": "4c7a94d6a7460295", "scanner": "scanner-primary", "fingerprint": "291cfcaf42818de4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-363bab632f17a70d", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT}/health (railway/test-robustness.js:95)"}, "properties": {"repobilityId": "20e4d23fbcdfcf5c", "scanner": "scanner-primary", "fingerprint": "363bab632f17a70d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-abdfaa093cb0e04f", "level": "error", "message": {"text": "Dangling fetch: POST https://robindesairs.eu/api/bot-state (railway/server.js:132)"}, "properties": {"repobilityId": "0fa15d5568ba25b4", "scanner": "scanner-primary", "fingerprint": "abdfaa093cb0e04f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9ec3bf0e6e8176ac", "level": "error", "message": {"text": "Dangling fetch: GET https://robindesairs.eu/api/bot-state (railway/server.js:144)"}, "properties": {"repobilityId": "b295699f660eea5f", "scanner": "scanner-primary", "fingerprint": "9ec3bf0e6e8176ac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a33f55fb7bea8eac", "level": "error", "message": {"text": "Dangling fetch: GET https://robindesairs.eu/api/flight-info?flight=${encodeURIComponent(v)}&date=${encodeURIComponent(ymd)} (railway/server.js:477)"}, "properties": {"repobilityId": "7b866c11851351f7", "scanner": "scanner-primary", "fingerprint": "a33f55fb7bea8eac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-446673c7d5b5afbc", "level": "error", "message": {"text": "Dangling fetch: POST https://robindesairs.eu/api/dossier-store (railway/server.js:574)"}, "properties": {"repobilityId": "b5c9f06bce604f72", "scanner": "scanner-primary", "fingerprint": "446673c7d5b5afbc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a1f4786e27ed04c2", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:619)"}, "properties": {"repobilityId": "a0ed962640ca599a", "scanner": "scanner-primary", "fingerprint": "a1f4786e27ed04c2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-13979a2c25f0f759", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:752)"}, "properties": {"repobilityId": "87fd42b4964a0c24", "scanner": "scanner-primary", "fingerprint": "13979a2c25f0f759", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-83de917092f6ffb0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:794)"}, "properties": {"repobilityId": "1919dd2ba5d76a8e", "scanner": "scanner-primary", "fingerprint": "83de917092f6ffb0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c0e0183c1d1b28a6", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/server.js:1002)"}, "properties": {"repobilityId": "b304fc968f68c2dc", "scanner": "scanner-primary", "fingerprint": "c0e0183c1d1b28a6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-442f1946d8f30a2e", "level": "error", "message": {"text": "Dangling fetch: POST https://robindesairs.eu/api/piece-store (railway/server.js:1022)"}, "properties": {"repobilityId": "791b9bf20c1c7b01", "scanner": "scanner-primary", "fingerprint": "442f1946d8f30a2e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-75232777cb02cb4e", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${BOT_PORT}/api/wati-webhook?s=${SECRET} (railway/test-load.js:54)"}, "properties": {"repobilityId": "6865f30356e06626", "scanner": "scanner-primary", "fingerprint": "75232777cb02cb4e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b758d7a2f1e9ec6", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-load.js:72)"}, "properties": {"repobilityId": "0d6da0b39482fbec", "scanner": "scanner-primary", "fingerprint": "6b758d7a2f1e9ec6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-43e69054739d8608", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-load.js:89)"}, "properties": {"repobilityId": "33e2c989ef183e6a", "scanner": "scanner-primary", "fingerprint": "43e69054739d8608", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d05fadb1ba2b83b3", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${BOT_PORT}/api/wati-webhook?s=${SECRET} (railway/test-sim-20.js:53)"}, "properties": {"repobilityId": "7ebd6776a9b04271", "scanner": "scanner-primary", "fingerprint": "d05fadb1ba2b83b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a6b633dae98c18b4", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-sim-20.js:85)"}, "properties": {"repobilityId": "18d3ea7b9821b645", "scanner": "scanner-primary", "fingerprint": "a6b633dae98c18b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-73b6ced4d52afc62", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${BOT_PORT}/health (railway/test-sim-20.js:105)"}, "properties": {"repobilityId": "8296ce1e17b80528", "scanner": "scanner-primary", "fingerprint": "73b6ced4d52afc62", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bde3fc74236a1d9e", "level": "error", "message": {"text": "Dangling fetch: POST https://robindesairs.eu/api/owner-alert (railway/lib/owner-notify.js:14)"}, "properties": {"repobilityId": "66a30416a9d517c1", "scanner": "scanner-primary", "fingerprint": "bde3fc74236a1d9e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-94a2907a726726bd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (railway/lib/extract-eticket.js:171)"}, "properties": {"repobilityId": "87f14904c8d71e8c", "scanner": "scanner-primary", "fingerprint": "94a2907a726726bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3698c7f2ef638802", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (railway/lib/extract-eticket.js:191)"}, "properties": {"repobilityId": "41f4e94c31325f67", "scanner": "scanner-primary", "fingerprint": "3698c7f2ef638802", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84ea649382a4caeb", "level": "error", "message": {"text": "Dangling fetch: GET https://api.airtable.com/v0/${baseId}/${tableId}?${params} (netlify/functions/morning-report.js:112)"}, "properties": {"repobilityId": "f25e839438a5bc9e", "scanner": "scanner-primary", "fingerprint": "84ea649382a4caeb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-77b854546b6c5264", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (netlify/functions/telegram-notify.js:74)"}, "properties": {"repobilityId": "483b4293d46abb65", "scanner": "scanner-primary", "fingerprint": "77b854546b6c5264", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-89c65a4e0e213636", "level": "error", "message": {"text": "Dangling fetch: GET https://api.airtable.com/v0/${baseId}/${tableId}?${params} (netlify/functions/legal-daily.js:70)"}, "properties": {"repobilityId": "4b661417730ea35f", "scanner": "scanner-primary", "fingerprint": "89c65a4e0e213636", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-42e1a73171721cd3", "level": "error", "message": {"text": "Dangling fetch: PATCH https://api.airtable.com/v0/${cfg.base}/${cfg.table} (netlify/functions/submit-mandat.js:214)"}, "properties": {"repobilityId": "7b2cdc0a06bd0b3b", "scanner": "scanner-primary", "fingerprint": "42e1a73171721cd3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-baae2de76a3541ce", "level": "error", "message": {"text": "Dangling fetch: POST https://content.airtable.com/v0/${cfg.base}/${rec.id}/${field}/uploadAttachment (netlify/functions/submit-mandat.js:277)"}, "properties": {"repobilityId": "5401e1e840033107", "scanner": "scanner-primary", "fingerprint": "baae2de76a3541ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-38d47be19720f0c8", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/submit-mandat.js:413)"}, "properties": {"repobilityId": "b6d378c046ada4fe", "scanner": "scanner-primary", "fingerprint": "38d47be19720f0c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-57af5d5d0db822f7", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (netlify/functions/analyze-flight.js:118)"}, "properties": {"repobilityId": "b66a8e931a4b7c28", "scanner": "scanner-primary", "fingerprint": "57af5d5d0db822f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d2acd7862465d88", "level": "error", "message": {"text": "Dangling fetch: GET https://api.airtable.com/v0/${BASE}/${table}?${p} (netlify/functions/bureau-daily.js:73)"}, "properties": {"repobilityId": "9cad3b82d4c95e71", "scanner": "scanner-primary", "fingerprint": "7d2acd7862465d88", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b4a1dd91205a9f48", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/whatsapp-webhook.js:544)"}, "properties": {"repobilityId": "c77f191aefde4be2", "scanner": "scanner-primary", "fingerprint": "b4a1dd91205a9f48", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a398e672509905f0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/whatsapp-webhook.js:601)"}, "properties": {"repobilityId": "a5ffa8ad9b94e1c3", "scanner": "scanner-primary", "fingerprint": "a398e672509905f0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-220baf976da77cff", "level": "error", "message": {"text": "Dangling fetch: POST https://${AMADEUS_HOST}/v1/security/oauth2/token (netlify/functions/airport-search.js:90)"}, "properties": {"repobilityId": "d12f30f6dd65eec3", "scanner": "scanner-primary", "fingerprint": "220baf976da77cff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-becc93994481ec88", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/submit-partner-agreement.js:94)"}, "properties": {"repobilityId": "58f5e17e244cad20", "scanner": "scanner-primary", "fingerprint": "becc93994481ec88", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-101e371a1b9c6ffd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/whatsapp-gemini-fallback.js:37)"}, "properties": {"repobilityId": "7b5f04eeb5a5a6ae", "scanner": "scanner-primary", "fingerprint": "101e371a1b9c6ffd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9bbbcdcc1d9882a3", "level": "error", "message": {"text": "Dangling fetch: POST https://api.airtable.com/v0/${BASE}/${T_AGENCES} (netlify/functions/sofia-prospect.js:195)"}, "properties": {"repobilityId": "18003c2319312c60", "scanner": "scanner-primary", "fingerprint": "9bbbcdcc1d9882a3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a39c4111de56b938", "level": "error", "message": {"text": "Dangling fetch: POST https://api.airtable.com/v0/${BASE}/${T_DOSSIERS} (netlify/functions/lead-hunter.js:178)"}, "properties": {"repobilityId": "e3e94cf4e4e17d67", "scanner": "scanner-primary", "fingerprint": "a39c4111de56b938", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3e645cf7d7e80985", "level": "error", "message": {"text": "Dangling fetch: DELETE https://api.airtable.com/v0/${cfg.base}/${cfg.table}/${r.id} (netlify/functions/crm-delete-dossier.js:67)"}, "properties": {"repobilityId": "2b5c76c933e73156", "scanner": "scanner-primary", "fingerprint": "3e645cf7d7e80985", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f44694057f515fbf", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/lib/airline-auto-submit.js:267)"}, "properties": {"repobilityId": "3196bb2ebfa8805a", "scanner": "scanner-primary", "fingerprint": "f44694057f515fbf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e65290f40449a80b", "level": "error", "message": {"text": "Dangling fetch: POST https://content.airtable.com/v0/${c.base}/${rec.id}/${field}/uploadAttachment (netlify/functions/lib/airtable-attach.js:83)"}, "properties": {"repobilityId": "57d74612bb7c32be", "scanner": "scanner-primary", "fingerprint": "e65290f40449a80b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b521e5097e52aebd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/lib/radar-report-email.js:93)"}, "properties": {"repobilityId": "6796e06b42cf797e", "scanner": "scanner-primary", "fingerprint": "b521e5097e52aebd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5f80c9cb64773372", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/lib/robin-ai-responder.js:59)"}, "properties": {"repobilityId": "28e4d4394cac1721", "scanner": "scanner-primary", "fingerprint": "5f80c9cb64773372", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2964ddfe6eca4f08", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (netlify/functions/lib/owner-notify.js:40)"}, "properties": {"repobilityId": "ed1de0aa88eaa2d0", "scanner": "scanner-primary", "fingerprint": "2964ddfe6eca4f08", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-807d543cc7bf2548", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (netlify/functions/lib/radar-enquete.js:489)"}, "properties": {"repobilityId": "d0abde0372c17289", "scanner": "scanner-primary", "fingerprint": "807d543cc7bf2548", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e60851f0b65f37ed", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${token}/sendMessage (netlify/functions/lib/robin-notify.js:16)"}, "properties": {"repobilityId": "706a0472b9efa19a", "scanner": "scanner-primary", "fingerprint": "e60851f0b65f37ed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f4819d9a05493c6e", "level": "error", "message": {"text": "Dangling fetch: GET /api/dossiers (robin-dossiers/src/app/page.tsx:122)"}, "properties": {"repobilityId": "6088f71893c9e75b", "scanner": "scanner-primary", "fingerprint": "f4819d9a05493c6e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-137067e96836903c", "level": "error", "message": {"text": "Dangling fetch: GET /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/page.tsx:155)"}, "properties": {"repobilityId": "ef38221785e750f6", "scanner": "scanner-primary", "fingerprint": "137067e96836903c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f936fcab3308f2d9", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/page.tsx:173)"}, "properties": {"repobilityId": "33eabf05a6c2311a", "scanner": "scanner-primary", "fingerprint": "f936fcab3308f2d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a3139a586c884880", "level": "error", "message": {"text": "Dangling fetch: POST /api/dossiers/${encodeURIComponent(id)}/evenement (robin-dossiers/src/app/page.tsx:191)"}, "properties": {"repobilityId": "c5a546cc4d1f3752", "scanner": "scanner-primary", "fingerprint": "a3139a586c884880", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-01e0d82638bf6957", "level": "error", "message": {"text": "Dangling fetch: GET /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/page.tsx:199)"}, "properties": {"repobilityId": "11561e02d1b53b16", "scanner": "scanner-primary", "fingerprint": "01e0d82638bf6957", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ff97230100b43baa", "level": "error", "message": {"text": "Dangling fetch: POST /api/dossiers (robin-dossiers/src/app/page.tsx:613)"}, "properties": {"repobilityId": "27f9095f8661afb1", "scanner": "scanner-primary", "fingerprint": "ff97230100b43baa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-215b0a81c7b7555d", "level": "error", "message": {"text": "Dangling fetch: GET /api/compta/resolve-token?token=${encodeURIComponent(token)} (robin-dossiers/src/app/saisie-paiement/page.tsx:44)"}, "properties": {"repobilityId": "dd91543ba235030c", "scanner": "scanner-primary", "fingerprint": "215b0a81c7b7555d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c7e9a0f167b8b731", "level": "error", "message": {"text": "Dangling fetch: GET /api/compta (robin-dossiers/src/app/saisie-paiement/page.tsx:72)"}, "properties": {"repobilityId": "92a412c293932d3e", "scanner": "scanner-primary", "fingerprint": "c7e9a0f167b8b731", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4607912f4c79540e", "level": "error", "message": {"text": "Dangling fetch: POST /api/compta/instructions (robin-dossiers/src/app/saisie-paiement/page.tsx:127)"}, "properties": {"repobilityId": "bf1f03301e43dd16", "scanner": "scanner-primary", "fingerprint": "4607912f4c79540e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b7b4b61ff562b792", "level": "error", "message": {"text": "Dangling fetch: GET /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/dossiers/[id]/page.tsx:56)"}, "properties": {"repobilityId": "fff9bbab73d5c655", "scanner": "scanner-primary", "fingerprint": "b7b4b61ff562b792", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b5fdfe4cdf40eb4", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/dossiers/${encodeURIComponent(id)} (robin-dossiers/src/app/dossiers/[id]/page.tsx:74)"}, "properties": {"repobilityId": "1f5c4c703e3a40cc", "scanner": "scanner-primary", "fingerprint": "9b5fdfe4cdf40eb4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-77fb4c43cdd8ef24", "level": "error", "message": {"text": "Dangling fetch: GET /api/compta (robin-dossiers/src/app/compta/page.tsx:54)"}, "properties": {"repobilityId": "7eadbf3b3d7cb23b", "scanner": "scanner-primary", "fingerprint": "77fb4c43cdd8ef24", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4a6c83934eba7bab", "level": "error", "message": {"text": "Dangling fetch: POST /api/compta (robin-dossiers/src/app/compta/page.tsx:113)"}, "properties": {"repobilityId": "644b99fa6d86f29e", "scanner": "scanner-primary", "fingerprint": "4a6c83934eba7bab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-759a38b85440d1f9", "level": "error", "message": {"text": "Dangling fetch: POST /api/compta (robin-dossiers/src/app/compta/page.tsx:144)"}, "properties": {"repobilityId": "e5f7099d8f46e5c3", "scanner": "scanner-primary", "fingerprint": "759a38b85440d1f9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-973c5c512872f950", "level": "error", "message": {"text": "Dangling fetch: POST /api/compta (robin-dossiers/src/app/compta/page.tsx:172)"}, "properties": {"repobilityId": "658bedb5bc4f0fd8", "scanner": "scanner-primary", "fingerprint": "973c5c512872f950", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8083c77a98f7dfb4", "level": "error", "message": {"text": "Dangling fetch: POST /api/compta/link (robin-dossiers/src/app/compta/page.tsx:198)"}, "properties": {"repobilityId": "ba012814ce444f1d", "scanner": "scanner-primary", "fingerprint": "8083c77a98f7dfb4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68c9d5e17d04d050", "level": "note", "message": {"text": "Unused endpoint: ANY /webhook"}, "properties": {"repobilityId": "ced0ff02abf3f72d", "scanner": "scanner-primary", "fingerprint": "68c9d5e17d04d050", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c6010a9d8a42f30", "level": "note", "message": {"text": "Unused endpoint: ANY /test_flow/<phone>"}, "properties": {"repobilityId": "a47782a4999a1c7e", "scanner": "scanner-primary", "fingerprint": "0c6010a9d8a42f30", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a169eee26216aee", "level": "note", "message": {"text": "Unused endpoint: ANY /dossier_status/<phone>"}, "properties": {"repobilityId": "1fc3373c03c586c3", "scanner": "scanner-primary", "fingerprint": "8a169eee26216aee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bbbcb1f1541aab58", "level": "note", "message": {"text": "Unused endpoint: ANY /conversations"}, "properties": {"repobilityId": "c385ee0e532eb8e3", "scanner": "scanner-primary", "fingerprint": "bbbcb1f1541aab58", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb338ea1d973bf0f", "level": "note", "message": {"text": "Unused endpoint: ANY /check_abandoned"}, "properties": {"repobilityId": "72aeab106419dae9", "scanner": "scanner-primary", "fingerprint": "bb338ea1d973bf0f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-799101ee76e9f6de", "level": "note", "message": {"text": "Unused endpoint: ANY /reset/<phone>"}, "properties": {"repobilityId": "2b7140aab8134192", "scanner": "scanner-primary", "fingerprint": "799101ee76e9f6de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-937e16b716dc2dda", "level": "note", "message": {"text": "Unused endpoint: ANY /test"}, "properties": {"repobilityId": "319dc39485cef406", "scanner": "scanner-primary", "fingerprint": "937e16b716dc2dda", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "76d0d68bf3143bc4", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-30b768642c73c529", "level": "note", "message": {"text": "Unused endpoint: ANY /cron/mandat-reminders"}, "properties": {"repobilityId": "dde327a42e23d602", "scanner": "scanner-primary", "fingerprint": "30b768642c73c529", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-83a631aff57f3802", "level": "note", "message": {"text": "Unused endpoint: ANY /webhook/mandat-signed"}, "properties": {"repobilityId": "618f5613cae1a71a", "scanner": "scanner-primary", "fingerprint": "83a631aff57f3802", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e76c990441852b31", "level": "note", "message": {"text": "Unused endpoint: GET /api/wati-webhook"}, "properties": {"repobilityId": "4f9d84fc7a4eed1a", "scanner": "scanner-primary", "fingerprint": "e76c990441852b31", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-35270f21785aff0f", "level": "note", "message": {"text": "Unused endpoint: POST /api/wati-webhook"}, "properties": {"repobilityId": "7a646a73b3aef4c9", "scanner": "scanner-primary", "fingerprint": "35270f21785aff0f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-51e32ca6592b70a0", "level": "note", "message": {"text": "Unused endpoint: GET /api/dossier"}, "properties": {"repobilityId": "671c7ab9c94beb92", "scanner": "scanner-primary", "fingerprint": "51e32ca6592b70a0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-847959d6a8691963", "level": "note", "message": {"text": "Unused endpoint: GET /api/leads-a-rappeler"}, "properties": {"repobilityId": "9b9e2b575444b463", "scanner": "scanner-primary", "fingerprint": "847959d6a8691963", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-61d5911206615ce7", "level": "note", "message": {"text": "Unused endpoint: GET /api/recent-conversations"}, "properties": {"repobilityId": "5c56ebc0ee090762", "scanner": "scanner-primary", "fingerprint": "61d5911206615ce7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "a1a5fb403bc83e14", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-74b47f46448c13b6", "level": "note", "message": {"text": "Unused endpoint: POST /api/mandat-signed"}, "properties": {"repobilityId": "6ba4d2177ee7e376", "scanner": "scanner-primary", "fingerprint": "74b47f46448c13b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}