{"data":{"skill":{"slug":"alexmacapple-synthese-multi-llm","name":"synthese-multi-llm","icon":"📦","repo":"https://github.com/Alexmacapple/Synthese-Council/tree/main/skills/synthese-multi-llm","status":"approved","author":"Alexmacapple","authorVersion":null,"skillstoreRevision":1},"audit":{"id":"c8e8421d-74f1-47e7-ab9c-8f6da7612ade","skill_id":"bdadc5d1-75ac-4fb5-9cf6-6acadb73456d","version":9,"content_hash":"v3:7db9b9f06e0ab79c575b58bc48c4d8dc9849f424:6612b1d697a6116cfddad794a9975a30cecf65b957d3ca1d2707654c45799031:65b39ac8b29a2aab22b42c565199512c8d3b8f2cdc7ea3ca18e4a7487d681be9:736b696c6c732f616c65786d61636170706c652f73796e74686573652d6d756c74692d6c6c6d:8815c18ce3fd879a3b7319271819b402","risk_level":"high","is_blocked":false,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":"confirmation_required","manual_install_policy":"allowed","summary":"The skill orchestrates multiple LLM backends and includes Python scripts, shell wrappers, network calls, environment-based API credentials, subprocess execution, and local audit/cache file writes. Static analysis produced many high-severity blocker matches, but most weak-cryptography and Markdown backtick alerts are false positives caused by French documentation text, PRD references, tables, and formatting. Confirmed risks are operational rather than obviously malicious: external CLI/API invocation, HTTP requests, environment secret handling, and filesystem writes. No net-new prompt-injection or malicious semantic finding was identified from the available static evidence.","remediation":[{"issue":"External commands and shell wrappers execute model backends and HTTP calls.","severity":"high","suggestion":"Keep command arguments structured, avoid shell=True, document exactly which CLIs are invoked, and require user confirmation before running wrappers against untrusted input."},{"issue":"API credentials are read from environment variables and passed to model providers.","severity":"high","suggestion":"Do not log secrets, keep placeholder keys out of executable examples, and clearly instruct users to store provider keys only in their local environment or secret manager."},{"issue":"The skill writes cache, trail, and Markdown output files.","severity":"medium","suggestion":"Ensure output directories are user-controlled or constrained to the project workspace, and document cleanup expectations for generated audit trails."}],"risk_factor_evidence":[{"factor":"env_access","evidence":[{"file":"references/configuration.md","line_end":128,"line_start":128},{"file":"references/troubleshooting.md","line_end":64,"line_start":64},{"file":"references/troubleshooting.md","line_end":69,"line_start":69},{"file":"references/troubleshooting.md","line_end":75,"line_start":75},{"file":"scripts/backends/anthropic_backend.py","line_end":108,"line_start":108},{"file":"scripts/backends/anthropic_backend.py","line_end":314,"line_start":314},{"file":"scripts/backends/anthropic_backend.py","line_end":108,"line_start":108},{"file":"scripts/backends/anthropic_backend.py","line_end":314,"line_start":314},{"file":"scripts/backends/anthropic_backend.py","line_end":9,"line_start":9},{"file":"scripts/backends/anthropic_backend.py","line_end":64,"line_start":64},{"file":"scripts/backends/anthropic_backend.py","line_end":65,"line_start":65},{"file":"scripts/backends/anthropic_backend.py","line_end":77,"line_start":77},{"file":"scripts/backends/anthropic_backend.py","line_end":85,"line_start":85},{"file":"scripts/backends/anthropic_backend.py","line_end":89,"line_start":89},{"file":"scripts/backends/anthropic_backend.py","line_end":106,"line_start":106},{"file":"scripts/backends/anthropic_backend.py","line_end":108,"line_start":108},{"file":"scripts/backends/anthropic_backend.py","line_end":116,"line_start":116},{"file":"scripts/backends/anthropic_backend.py","line_end":121,"line_start":121},{"file":"scripts/backends/anthropic_backend.py","line_end":135,"line_start":135},{"file":"scripts/backends/anthropic_backend.py","line_end":140,"line_start":140},{"file":"scripts/backends/anthropic_backend.py","line_end":170,"line_start":170},{"file":"scripts/backends/anthropic_backend.py","line_end":314,"line_start":314},{"file":"scripts/backends/anthropic_backend.py","line_end":315,"line_start":315},{"file":"scripts/backends/anthropic_backend.py","line_end":316,"line_start":316},{"file":"scripts/backends/anthropic_backend.py","line_end":319,"line_start":319},{"file":"scripts/backends/cli_backend.py","line_end":151,"line_start":151},{"file":"scripts/backends/cli_backend.py","line_end":275,"line_start":275},{"file":"scripts/backends/cli_backend.py","line_end":276,"line_start":276},{"file":"scripts/backends/cli_backend.py","line_end":277,"line_start":277},{"file":"scripts/config.py","line_end":514,"line_start":514},{"file":"scripts/config.py","line_end":533,"line_start":533},{"file":"scripts/convergence.py","line_end":376,"line_start":376},{"file":"scripts/synthese.py","line_end":1692,"line_start":1692},{"file":"scripts/synthese.py","line_end":1711,"line_start":1711},{"file":"scripts/synthese.py","line_end":1713,"line_start":1713},{"file":"scripts/synthese.py","line_end":1714,"line_start":1714},{"file":"scripts/synthese.py","line_end":1715,"line_start":1715},{"file":"scripts/synthese.py","line_end":2115,"line_start":2115},{"file":"scripts/synthese.py","line_end":2616,"line_start":2616},{"file":"scripts/synthese.py","line_end":3128,"line_start":3128},{"file":"scripts/synthese.py","line_end":3449,"line_start":3449},{"file":"scripts/synthese.py","line_end":3491,"line_start":3491},{"file":"scripts/synthese.py","line_end":1159,"line_start":1159},{"file":"scripts/synthese.py","line_end":1765,"line_start":1765},{"file":"wrappers/claude_wrapper.sh","line_end":9,"line_start":9},{"file":"wrappers/claude_wrapper.sh","line_end":23,"line_start":23},{"file":"wrappers/claude_wrapper.sh","line_end":24,"line_start":24},{"file":"wrappers/claude_wrapper.sh","line_end":42,"line_start":42},{"file":"wrappers/README.md","line_end":16,"line_start":16},{"file":"wrappers/README.md","line_end":45,"line_start":45}]},{"factor":"scripts","evidence":[{"file":"scripts/backends/__init__.py","line_end":26,"line_start":22},{"file":"scripts/backends/__init__.py","line_end":35,"line_start":30},{"file":"scripts/backends/__init__.py","line_end":46,"line_start":41},{"file":"scripts/synthese.py","line_end":96,"line_start":93},{"file":"scripts/synthese.py","line_end":118,"line_start":113},{"file":"scripts/synthese.py","line_end":132,"line_start":129},{"file":"scripts/synthese.py","line_end":142,"line_start":139},{"file":"scripts/synthese.py","line_end":152,"line_start":149},{"file":"scripts/synthese.py","line_end":163,"line_start":159}]},{"factor":"external_commands","evidence":[{"file":"scripts/backends/cli_backend.py","line_end":109,"line_start":109},{"file":"scripts/sanitize.py","line_end":42,"line_start":27},{"file":"scripts/sanitize.py","line_end":42,"line_start":42},{"file":"scripts/sanitize.py","line_end":180,"line_start":180},{"file":"scripts/sanitize.py","line_end":41,"line_start":28},{"file":"scripts/sanitize.py","line_end":41,"line_start":41},{"file":"scripts/sanitize.py","line_end":42,"line_start":27},{"file":"scripts/synthese.py","line_end":1229,"line_start":1229},{"file":"scripts/synthese.py","line_end":1317,"line_start":1317},{"file":"scripts/synthese.py","line_end":2851,"line_start":2851},{"file":"scripts/synthese.py","line_end":2890,"line_start":2890},{"file":"SKILL.md","line_end":32,"line_start":20},{"file":"SKILL.md","line_end":36,"line_start":32},{"file":"SKILL.md","line_end":38,"line_start":36},{"file":"SKILL.md","line_end":54,"line_start":38},{"file":"SKILL.md","line_end":70,"line_start":54},{"file":"SKILL.md","line_end":76,"line_start":70},{"file":"SKILL.md","line_end":77,"line_start":76},{"file":"SKILL.md","line_end":78,"line_start":77},{"file":"SKILL.md","line_end":79,"line_start":78},{"file":"SKILL.md","line_end":80,"line_start":79},{"file":"SKILL.md","line_end":81,"line_start":80},{"file":"SKILL.md","line_end":82,"line_start":81},{"file":"SKILL.md","line_end":83,"line_start":82},{"file":"SKILL.md","line_end":84,"line_start":83},{"file":"SKILL.md","line_end":98,"line_start":84},{"file":"SKILL.md","line_end":115,"line_start":98},{"file":"SKILL.md","line_end":146,"line_start":115},{"file":"SKILL.md","line_end":157,"line_start":146},{"file":"SKILL.md","line_end":159,"line_start":157},{"file":"SKILL.md","line_end":175,"line_start":159},{"file":"SKILL.md","line_end":185,"line_start":175},{"file":"SKILL.md","line_end":191,"line_start":185},{"file":"SKILL.md","line_end":195,"line_start":191},{"file":"SKILL.md","line_end":198,"line_start":195},{"file":"SKILL.md","line_end":202,"line_start":198},{"file":"SKILL.md","line_end":205,"line_start":202},{"file":"wrappers/claude_wrapper.sh","line_end":37,"line_start":37},{"file":"wrappers/claude_wrapper.sh","line_end":50,"line_start":40},{"file":"wrappers/claude_wrapper.sh","line_end":1,"line_start":1},{"file":"wrappers/ollama_wrapper.sh","line_end":37,"line_start":37},{"file":"wrappers/ollama_wrapper.sh","line_end":46,"line_start":40},{"file":"wrappers/ollama_wrapper.sh","line_end":1,"line_start":1},{"file":"wrappers/README.md","line_end":57,"line_start":57},{"file":"wrappers/README.md","line_end":142,"line_start":142}]},{"factor":"network","evidence":[{"file":"scripts/config.py","line_end":382,"line_start":382},{"file":"scripts/synthese.py","line_end":836,"line_start":836},{"file":"scripts/synthese.py","line_end":848,"line_start":848},{"file":"scripts/synthese.py","line_end":1162,"line_start":1162},{"file":"SKILL.md","line_end":219,"line_start":219},{"file":"wrappers/claude_wrapper.sh","line_end":20,"line_start":20},{"file":"wrappers/ollama_wrapper.sh","line_end":13,"line_start":13},{"file":"wrappers/ollama_wrapper.sh","line_end":19,"line_start":19},{"file":"wrappers/README.md","line_end":96,"line_start":96},{"file":"wrappers/README.md","line_end":97,"line_start":97}]},{"factor":"filesystem","evidence":[{"file":"scripts/config.py","line_end":7,"line_start":7},{"file":"scripts/config.py","line_end":168,"line_start":168},{"file":"scripts/config.py","line_end":7,"line_start":7},{"file":"scripts/config.py","line_end":168,"line_start":168},{"file":"scripts/synthese.py","line_end":326,"line_start":326},{"file":"scripts/synthese.py","line_end":362,"line_start":362},{"file":"scripts/synthese.py","line_end":374,"line_start":374},{"file":"scripts/synthese.py","line_end":708,"line_start":708},{"file":"scripts/synthese.py","line_end":2680,"line_start":2680},{"file":"scripts/synthese.py","line_end":2716,"line_start":2716},{"file":"wrappers/ollama_wrapper.sh","line_end":30,"line_start":30}]}],"critical_findings":[],"high_findings":[{"title":"Generic API/secret keys","locations":[{"file":"references/configuration.md","line_end":128,"line_start":128}],"confidence":0.91,"description":"| `ANTHROPIC_API_KEY` | Clé API pour backend Anthropic direct |","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"references/troubleshooting.md","line_end":64,"line_start":64}],"confidence":0.91,"description":"### \"ANTHROPIC_API_KEY non défini\"","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"references/troubleshooting.md","line_end":69,"line_start":69}],"confidence":0.89,"description":"1. Exporter la variable : `export ANTHROPIC_API_KEY=\"sk-ant-...\"`","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The documentation includes a placeholder API key format; it is not a real secret but confirms API-key handling guidance."},{"title":"Generic API/secret keys","locations":[{"file":"references/troubleshooting.md","line_end":75,"line_start":75}],"confidence":0.91,"description":"1. Vérifier la clé : `echo $ANTHROPIC_API_KEY | head -c 20`","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":9,"line_start":9}],"confidence":0.91,"description":"- ANTHROPIC_API_KEY: Clé API (env var ou config)","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":64,"line_start":64}],"confidence":0.91,"description":"- ANTHROPIC_API_KEY env var","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":65,"line_start":65}],"confidence":0.91,"description":"- ou api_key dans le constructeur","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":77,"line_start":77}],"confidence":0.91,"description":"api_key: Optional[str] = None,","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":85,"line_start":85}],"confidence":0.91,"description":"api_key: Clé API (ou ANTHROPIC_API_KEY env var)","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":89,"line_start":89}],"confidence":0.91,"description":"self._api_key = api_key","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":106,"line_start":106}],"confidence":0.91,"description":"def api_key(self) -> Optional[str]:","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":108,"line_start":108}],"confidence":0.91,"description":"return self._api_key or os.getenv(\"ANTHROPIC_API_KEY\")","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":116,"line_start":116}],"confidence":0.91,"description":"- ANTHROPIC_API_KEY défini","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":121,"line_start":121}],"confidence":0.91,"description":"if not self.api_key:","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":135,"line_start":135}],"confidence":0.89,"description":"export ANTHROPIC_API_KEY=\"sk-ant-...\"","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The documentation includes a placeholder API key format; it is not a real secret but confirms API-key handling guidance."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":140,"line_start":140}],"confidence":0.89,"description":"api_key: \"sk-ant-...\"","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The documentation includes a placeholder API key format; it is not a real secret but confirms API-key handling guidance."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":170,"line_start":170}],"confidence":0.91,"description":"self._client = anthropic.Anthropic(api_key=self.api_key)","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":314,"line_start":314}],"confidence":0.91,"description":"api_key = os.getenv(\"ANTHROPIC_API_KEY\")","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":315,"line_start":315}],"confidence":0.91,"description":"if not api_key:","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":316,"line_start":316}],"confidence":0.91,"description":"return False, \"ANTHROPIC_API_KEY non défini\"","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":319,"line_start":319}],"confidence":0.91,"description":"masked_key = api_key[:10] + \"...\" + api_key[-4:] if len(api_key) > 14 else \"***\"","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Hidden file in home directory","locations":[{"file":"scripts/config.py","line_end":7,"line_start":7}],"confidence":0.88,"description":"2. ~/.synthese-council/config.yaml (global utilisateur)","review_kind":"capability","source_category":"filesystem","source_severity":"high","confidence_reasoning":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection."},{"title":"Hidden file in home directory","locations":[{"file":"scripts/config.py","line_end":168,"line_start":168}],"confidence":0.88,"description":"2. ~/.synthese-council/config.yaml - global utilisateur","review_kind":"capability","source_category":"filesystem","source_severity":"high","confidence_reasoning":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection."},{"title":"Hex-encoded characters","locations":[{"file":"scripts/sanitize.py","line_end":35,"line_start":35}],"confidence":0.72,"description":"\"\\x00\",   # Null byte","review_kind":"security","source_category":"obfuscation","source_severity":"high","confidence_reasoning":"The source contains hex-style escape sequences or encoded characters; this is confirmed as encoded content, though not necessarily malicious by itself."},{"title":"Hex-encoded characters","locations":[{"file":"scripts/sanitize.py","line_end":177,"line_start":177}],"confidence":0.72,"description":"result = result.replace(\"\\x00\", \"\")","review_kind":"security","source_category":"obfuscation","source_severity":"high","confidence_reasoning":"The source contains hex-style escape sequences or encoded characters; this is confirmed as encoded content, though not necessarily malicious by itself."},{"title":"Hex-encoded characters","locations":[{"file":"scripts/sanitize.py","line_end":199,"line_start":199}],"confidence":0.72,"description":"result = text.replace(\"\\x00\", \"\")","review_kind":"security","source_category":"obfuscation","source_severity":"high","confidence_reasoning":"The source contains hex-style escape sequences or encoded characters; this is confirmed as encoded content, though not necessarily malicious by itself."},{"title":"Hex-encoded characters","locations":[{"file":"scripts/sanitize.py","line_end":202,"line_start":202}],"confidence":0.72,"description":"result = re.sub(r'[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]', '', result)","review_kind":"security","source_category":"obfuscation","source_severity":"high","confidence_reasoning":"The source contains hex-style escape sequences or encoded characters; this is confirmed as encoded content, though not necessarily malicious by itself."},{"title":"Python subprocess.run","locations":[{"file":"scripts/synthese.py","line_end":1229,"line_start":1229}],"confidence":0.9,"description":"result = subprocess.run(","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"The code calls subprocess.run, confirming external process execution behavior that should be reviewed for argument safety."},{"title":"Python subprocess.run","locations":[{"file":"scripts/synthese.py","line_end":1317,"line_start":1317}],"confidence":0.9,"description":"result = subprocess.run(","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"The code calls subprocess.run, confirming external process execution behavior that should be reviewed for argument safety."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/synthese.py","line_end":1159,"line_start":1159}],"confidence":0.91,"description":"\"  1. Définir ANTHROPIC_API_KEY pour utiliser l'API Anthropic\\n\"","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"scripts/synthese.py","line_end":1765,"line_start":1765}],"confidence":0.91,"description":"log(\"║  2. Ou définir ANTHROPIC_API_KEY (fallback)                  ║\")","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"wrappers/claude_wrapper.sh","line_end":9,"line_start":9}],"confidence":0.91,"description":"#   - ANTHROPIC_API_KEY défini","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"wrappers/claude_wrapper.sh","line_end":23,"line_start":23}],"confidence":0.91,"description":"if [ -z \"$ANTHROPIC_API_KEY\" ]; then","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"wrappers/claude_wrapper.sh","line_end":24,"line_start":24}],"confidence":0.91,"description":"echo \"Erreur: ANTHROPIC_API_KEY non défini\" >&2","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"wrappers/claude_wrapper.sh","line_end":42,"line_start":42}],"confidence":0.91,"description":"-H \"x-api-key: $ANTHROPIC_API_KEY\" \\","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"sudo privilege escalation","locations":[{"file":"wrappers/README.md","line_end":142,"line_start":142}],"confidence":0.86,"description":"sudo apt install curl","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"The documentation includes a sudo installation command; it is user-facing install guidance rather than automatic privilege escalation."},{"title":"Generic API/secret keys","locations":[{"file":"wrappers/README.md","line_end":16,"line_start":16}],"confidence":0.91,"description":"| `claude_wrapper.sh` | Claude (API) | `ANTHROPIC_API_KEY`, curl |","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Generic API/secret keys","locations":[{"file":"wrappers/README.md","line_end":45,"line_start":45}],"confidence":0.89,"description":"export ANTHROPIC_API_KEY=\"sk-ant-...\"","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The documentation includes a placeholder API key format; it is not a real secret but confirms API-key handling guidance."},{"title":"Generic API/secret keys","locations":[{"file":"wrappers/README.md","line_end":115,"line_start":115}],"confidence":0.91,"description":"| `ANTHROPIC_API_KEY` | Clé API Anthropic | - |","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."}],"medium_findings":[{"title":"Unix shell invocation","locations":[{"file":"scripts/backends/cli_backend.py","line_end":109,"line_start":109}],"confidence":0.94,"description":"#!/bin/bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The file contains a shell shebang or shell script example, confirming shell execution content."},{"title":"Hidden file access","locations":[{"file":"scripts/config.py","line_end":7,"line_start":7}],"confidence":0.88,"description":"2. ~/.synthese-council/config.yaml (global utilisateur)","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection."},{"title":"Hidden file access","locations":[{"file":"scripts/config.py","line_end":168,"line_start":168}],"confidence":0.88,"description":"2. ~/.synthese-council/config.yaml - global utilisateur","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection."},{"title":"Shell command substitution","locations":[{"file":"scripts/sanitize.py","line_end":41,"line_start":28}],"confidence":0.93,"description":"\"$(\",     # Command substitution","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior."},{"title":"Shell command substitution","locations":[{"file":"scripts/sanitize.py","line_end":41,"line_start":41}],"confidence":0.93,"description":"r\"\\$\\(.*\\)\",           # $(...) command substitution","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior."},{"title":"Python file write/append","locations":[{"file":"scripts/synthese.py","line_end":708,"line_start":708}],"confidence":0.88,"description":"with open(cache_path, \"w\", encoding=\"utf-8\") as f:","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection."},{"title":"Python file write/append","locations":[{"file":"scripts/synthese.py","line_end":2680,"line_start":2680}],"confidence":0.88,"description":"with open(trail_file, \"w\", encoding=\"utf-8\") as f:","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection."},{"title":"Python file write/append","locations":[{"file":"scripts/synthese.py","line_end":2716,"line_start":2716}],"confidence":0.88,"description":"with open(md_file, \"w\", encoding=\"utf-8\") as f:","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection."},{"title":"Shell command substitution","locations":[{"file":"wrappers/claude_wrapper.sh","line_end":37,"line_start":37}],"confidence":0.93,"description":"ESCAPED_PROMPT=$(echo \"$PROMPT\" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().str","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior."},{"title":"Shell command substitution","locations":[{"file":"wrappers/claude_wrapper.sh","line_end":50,"line_start":40}],"confidence":0.93,"description":"RESPONSE=$(curl -s -X POST \"$API_URL\" \\","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior."},{"title":"Unix shell invocation","locations":[{"file":"wrappers/claude_wrapper.sh","line_end":1,"line_start":1}],"confidence":0.94,"description":"#!/bin/bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The file contains a shell shebang or shell script example, confirming shell execution content."},{"title":"Shell command substitution","locations":[{"file":"wrappers/ollama_wrapper.sh","line_end":37,"line_start":37}],"confidence":0.93,"description":"ESCAPED_PROMPT=$(echo \"$PROMPT\" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().str","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior."},{"title":"Shell command substitution","locations":[{"file":"wrappers/ollama_wrapper.sh","line_end":46,"line_start":40}],"confidence":0.93,"description":"RESPONSE=$(curl -s -X POST \"$HOST/api/generate\" \\","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior."},{"title":"Unix shell invocation","locations":[{"file":"wrappers/ollama_wrapper.sh","line_end":1,"line_start":1}],"confidence":0.94,"description":"#!/bin/bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The file contains a shell shebang or shell script example, confirming shell execution content."},{"title":"Unix shell invocation","locations":[{"file":"wrappers/README.md","line_end":57,"line_start":57}],"confidence":0.94,"description":"#!/bin/bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The file contains a shell shebang or shell script example, confirming shell execution content."}],"low_findings":[{"title":"Python getenv function","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":108,"line_start":108}],"confidence":0.91,"description":"return self._api_key or os.getenv(\"ANTHROPIC_API_KEY\")","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Python getenv function","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":314,"line_start":314}],"confidence":0.91,"description":"api_key = os.getenv(\"ANTHROPIC_API_KEY\")","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"getenv function call","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":108,"line_start":108}],"confidence":0.91,"description":"return self._api_key or os.getenv(\"ANTHROPIC_API_KEY\")","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"getenv function call","locations":[{"file":"scripts/backends/anthropic_backend.py","line_end":314,"line_start":314}],"confidence":0.91,"description":"api_key = os.getenv(\"ANTHROPIC_API_KEY\")","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Python environment access","locations":[{"file":"scripts/backends/cli_backend.py","line_end":151,"line_start":151}],"confidence":0.91,"description":"env = os.environ.copy()","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk."},{"title":"Configuration library","locations":[{"file":"scripts/backends/cli_backend.py","line_end":275,"line_start":275}],"confidence":0.82,"description":"command=config.get(\"command\", cli_name),","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/backends/cli_backend.py","line_end":276,"line_start":276}],"confidence":0.82,"description":"args=config.get(\"args\", []),","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/backends/cli_backend.py","line_end":277,"line_start":277}],"confidence":0.82,"description":"env=config.get(\"env\", {})","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Hardcoded URL","locations":[{"file":"scripts/config.py","line_end":382,"line_start":382}],"confidence":0.88,"description":"lines.append(\"# Voir documentation: https://github.com/...\")","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation."},{"title":"Configuration library","locations":[{"file":"scripts/config.py","line_end":514,"line_start":514}],"confidence":0.82,"description":"custom_roles = config.get(\"expert_roles\", {})","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/config.py","line_end":533,"line_start":533}],"confidence":0.82,"description":"return config.get(\"default_cadrage\", DEFAULT_CONFIG[\"default_cadrage\"]).copy()","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/convergence.py","line_end":376,"line_start":376}],"confidence":0.82,"description":"backend = config.get(\"convergence\", {}).get(\"backend\", \"hybrid\")","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Python HTTP libraries","locations":[{"file":"scripts/synthese.py","line_end":836,"line_start":836}],"confidence":0.88,"description":"requests.RequestException: Si erreur réseau","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation."},{"title":"Python HTTP libraries","locations":[{"file":"scripts/synthese.py","line_end":848,"line_start":848}],"confidence":0.88,"description":"response = requests.get(url, headers=headers, timeout=timeout)","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation."},{"title":"Hardcoded URL","locations":[{"file":"scripts/synthese.py","line_end":1162,"line_start":1162}],"confidence":0.88,"description":"\"Documentation: https://github.com/your-repo/synthese-council#installation\"","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation."},{"title":"Configuration library","locations":[{"file":"scripts/synthese.py","line_end":1692,"line_start":1692}],"confidence":0.82,"description":"self.retry_config = self.config.get(\"retry\", DEFAULT_RETRY_CONFIG)","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/synthese.py","line_end":1711,"line_start":1711}],"confidence":0.82,"description":"cache_config = self.config.get(\"cache\", {})","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/synthese.py","line_end":1713,"line_start":1713}],"confidence":0.82,"description":"enabled=cache_config.get(\"enabled\", True),","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/synthese.py","line_end":1714,"line_start":1714}],"confidence":0.82,"description":"default_ttl=cache_config.get(\"ttl\", 3600),","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/synthese.py","line_end":1715,"line_start":1715}],"confidence":0.82,"description":"cache_dir=Path(cache_config.get(\"directory\", \".cache/synthese\")) if cache_config.get(\"directory\") el","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/synthese.py","line_end":2115,"line_start":2115}],"confidence":0.82,"description":"weights = self.config.get(\"convergence_weights\", None)","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/synthese.py","line_end":2616,"line_start":2616}],"confidence":0.82,"description":"timeout=self.config.get(\"timeout\", 300),","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/synthese.py","line_end":3128,"line_start":3128}],"confidence":0.82,"description":"if council.config.get(\"enable_trail\", True):","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/synthese.py","line_end":3449,"line_start":3449}],"confidence":0.82,"description":"sources = config.get(\"_sources\", [\"default\"])","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Configuration library","locations":[{"file":"scripts/synthese.py","line_end":3491,"line_start":3491}],"confidence":0.82,"description":"sources = config.get(\"_sources\", [\"default\"])","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths."},{"title":"Hardcoded URL","locations":[{"file":"SKILL.md","line_end":219,"line_start":219}],"confidence":0.88,"description":"Inspiré de [Council](https://github.com/bacoco/Council-board-skill) par bacoco et du concept [LLM Co","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation."},{"title":"Hardcoded URL","locations":[{"file":"wrappers/claude_wrapper.sh","line_end":20,"line_start":20}],"confidence":0.88,"description":"API_URL=\"https://api.anthropic.com/v1/messages\"","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation."},{"title":"Hardcoded URL","locations":[{"file":"wrappers/ollama_wrapper.sh","line_end":13,"line_start":13}],"confidence":0.88,"description":"#   - OLLAMA_HOST: URL du serveur (défaut: http://localhost:11434)","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation."},{"title":"Hardcoded URL","locations":[{"file":"wrappers/ollama_wrapper.sh","line_end":19,"line_start":19}],"confidence":0.88,"description":"HOST=\"${OLLAMA_HOST:-http://localhost:11434}\"","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation."},{"title":"Standard device file access","locations":[{"file":"wrappers/ollama_wrapper.sh","line_end":30,"line_start":30}],"confidence":0.88,"description":"if ! curl -s --connect-timeout 2 \"$HOST/api/tags\" > /dev/null 2>&1; then","review_kind":"capability","source_category":"filesystem","source_severity":"low","confidence_reasoning":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection."},{"title":"Python HTTP libraries","locations":[{"file":"wrappers/README.md","line_end":96,"line_start":96}],"confidence":0.88,"description":"response = requests.post(","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation."},{"title":"Hardcoded URL","locations":[{"file":"wrappers/README.md","line_end":97,"line_start":97}],"confidence":0.88,"description":"\"https://api.example.com/generate\",","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation."}],"dangerous_patterns":[],"files_scanned":21,"total_lines":8591,"audit_model":"claude","audited_at":"2026-07-09T01:14:10.54+00:00","created_at":"2026-07-16T12:37:25.705969+00:00","static_findings":[{"id":"blocker:references/cadrage.md:7:weak-cryptographic-algorithm","file":"references/cadrage.md","pattern":"Weak cryptographic algorithm","snippet":"Une synthèse sans cadrage est un résumé hors contexte. Le même texte peut donner des synthèses radic","category":"blocker","line_end":7,"severity":"high","line_start":7},{"id":"blocker:references/cadrage.md:59:weak-cryptographic-algorithm","file":"references/cadrage.md","pattern":"Weak cryptographic algorithm","snippet":"**Attention** : Une longueur trop courte force à des choix qui peuvent créer des glissements.","category":"blocker","line_end":59,"severity":"high","line_start":59},{"id":"blocker:references/cadrage.md:71:weak-cryptographic-algorithm","file":"references/cadrage.md","pattern":"Weak cryptographic algorithm","snippet":"| Neutre | Équilibre des positions | Médiation |","category":"blocker","line_end":71,"severity":"high","line_start":71},{"id":"env_access:references/configuration.md:128:generic-api-secret-keys","file":"references/configuration.md","pattern":"Generic API/secret keys","snippet":"| `ANTHROPIC_API_KEY` | Clé API pour backend Anthropic direct |","category":"env_access","line_end":128,"severity":"high","line_start":128},{"id":"blocker:references/configuration.md:65:weak-cryptographic-algorithm","file":"references/configuration.md","pattern":"Weak cryptographic algorithm","snippet":"| `cache.ttl` | 3600 | Durée de vie des entrées (secondes) |","category":"blocker","line_end":65,"severity":"high","line_start":65},{"id":"blocker:references/configuration.md:89:weak-cryptographic-algorithm","file":"references/configuration.md","pattern":"Weak cryptographic algorithm","snippet":"## Rôles des experts","category":"blocker","line_end":89,"severity":"high","line_start":89},{"id":"blocker:references/configuration.md:131:weak-cryptographic-algorithm","file":"references/configuration.md","pattern":"Weak cryptographic algorithm","snippet":"| `SYNTHESE_TRAIL_DIR` | Override du répertoire des trails |","category":"blocker","line_end":131,"severity":"high","line_start":131},{"id":"blocker:references/configuration.md:135:weak-cryptographic-algorithm","file":"references/configuration.md","pattern":"Weak cryptographic algorithm","snippet":"- [troubleshooting.md](troubleshooting.md) - Résolution des problèmes","category":"blocker","line_end":135,"severity":"high","line_start":135},{"id":"blocker:references/configuration.md:36:system-reconnaissance","file":"references/configuration.md","pattern":"System reconnaissance","snippet":"| `convergence.semantic_weight` | 0.7 | Poids du score sémantique en mode hybrid |","category":"blocker","line_end":36,"severity":"low","line_start":36},{"id":"blocker:references/configuration.md:37:system-reconnaissance","file":"references/configuration.md","pattern":"System reconnaissance","snippet":"| `convergence.lexical_weight` | 0.3 | Poids du score lexical en mode hybrid |","category":"blocker","line_end":37,"severity":"low","line_start":37},{"id":"blocker:references/glissements.md:1:weak-cryptographic-algorithm","file":"references/glissements.md","pattern":"Weak cryptographic algorithm","snippet":"# Catalogue des glissements sémantiques","category":"blocker","line_end":1,"severity":"high","line_start":1},{"id":"blocker:references/glissements.md:12:weak-cryptographic-algorithm","file":"references/glissements.md","pattern":"Weak cryptographic algorithm","snippet":"- Source : \"simplification des procédures\"","category":"blocker","line_end":12,"severity":"high","line_start":12},{"id":"blocker:references/glissements.md:39:weak-cryptographic-algorithm","file":"references/glissements.md","pattern":"Weak cryptographic algorithm","snippet":"**Définition** : Effacer des nuances ou des réserves.","category":"blocker","line_end":39,"severity":"high","line_start":39},{"id":"blocker:references/glissements.md:52:weak-cryptographic-algorithm","file":"references/glissements.md","pattern":"Weak cryptographic algorithm","snippet":"- Source : \"malgré les progrès, des défis persistent\"","category":"blocker","line_end":52,"severity":"high","line_start":52},{"id":"blocker:references/metrics.md:5:weak-cryptographic-algorithm","file":"references/metrics.md","pattern":"Weak cryptographic algorithm","snippet":"Le skill expose des métriques pour le monitoring opérationnel et l'optimisation des performances.","category":"blocker","line_end":5,"severity":"high","line_start":5},{"id":"blocker:references/metrics.md:26:weak-cryptographic-algorithm","file":"references/metrics.md","pattern":"Weak cryptographic algorithm","snippet":"| Warning | `0.1 <= hit_rate < 0.3` | Vérifier la diversité des prompts |","category":"blocker","line_end":26,"severity":"high","line_start":26},{"id":"blocker:references/metrics.md:60:weak-cryptographic-algorithm","file":"references/metrics.md","pattern":"Weak cryptographic algorithm","snippet":"| `reasons` | list[str] | Raisons des retries |","category":"blocker","line_end":60,"severity":"high","line_start":60},{"id":"blocker:references/metrics.md:115:weak-cryptographic-algorithm","file":"references/metrics.md","pattern":"Weak cryptographic algorithm","snippet":"## Export des métriques","category":"blocker","line_end":115,"severity":"high","line_start":115},{"id":"blocker:references/metrics.md:146:weak-cryptographic-algorithm","file":"references/metrics.md","pattern":"Weak cryptographic algorithm","snippet":"2. **Suivi des retries** : Des retries fréquents sur un modèle suggèrent un problème","category":"blocker","line_end":146,"severity":"high","line_start":146},{"id":"env_access:references/troubleshooting.md:64:generic-api-secret-keys","file":"references/troubleshooting.md","pattern":"Generic API/secret keys","snippet":"### \"ANTHROPIC_API_KEY non défini\"","category":"env_access","line_end":64,"severity":"high","line_start":64},{"id":"env_access:references/troubleshooting.md:69:generic-api-secret-keys","file":"references/troubleshooting.md","pattern":"Generic API/secret keys","snippet":"1. Exporter la variable : `export ANTHROPIC_API_KEY=\"sk-ant-...\"`","category":"env_access","line_end":69,"severity":"high","line_start":69},{"id":"env_access:references/troubleshooting.md:75:generic-api-secret-keys","file":"references/troubleshooting.md","pattern":"Generic API/secret keys","snippet":"1. Vérifier la clé : `echo $ANTHROPIC_API_KEY | head -c 20`","category":"env_access","line_end":75,"severity":"high","line_start":75},{"id":"blocker:references/troubleshooting.md:3:weak-cryptographic-algorithm","file":"references/troubleshooting.md","pattern":"Weak cryptographic algorithm","snippet":"Guide de résolution des problèmes courants.","category":"blocker","line_end":3,"severity":"high","line_start":3},{"id":"blocker:references/troubleshooting.md:106:weak-cryptographic-algorithm","file":"references/troubleshooting.md","pattern":"Weak cryptographic algorithm","snippet":"**Symptôme** : Les modèles produisent des analyses très divergentes.","category":"blocker","line_end":106,"severity":"high","line_start":106},{"id":"blocker:references/troubleshooting.md:116:weak-cryptographic-algorithm","file":"references/troubleshooting.md","pattern":"Weak cryptographic algorithm","snippet":"3. Utiliser `--mode critique` pour analyse détaillée des divergences","category":"blocker","line_end":116,"severity":"high","line_start":116},{"id":"blocker:references/troubleshooting.md:136:weak-cryptographic-algorithm","file":"references/troubleshooting.md","pattern":"Weak cryptographic algorithm","snippet":"**Symptôme** : Le Gardien signale des glissements sémantiques.","category":"blocker","line_end":136,"severity":"high","line_start":136},{"id":"blocker:references/troubleshooting.md:138:weak-cryptographic-algorithm","file":"references/troubleshooting.md","pattern":"Weak cryptographic algorithm","snippet":"**Explication** : Des termes ont été substitués ou le sens a été altéré.","category":"blocker","line_end":138,"severity":"high","line_start":138},{"id":"blocker:references/troubleshooting.md:220:weak-cryptographic-algorithm","file":"references/troubleshooting.md","pattern":"Weak cryptographic algorithm","snippet":"- [modes.md](modes.md) - Détail des modes de synthèse","category":"blocker","line_end":220,"severity":"high","line_start":220},{"id":"blocker:references/troubleshooting.md:72:system-reconnaissance","file":"references/troubleshooting.md","pattern":"System reconnaissance","snippet":"### \"Authentication failed\" / \"Invalid API key\"","category":"blocker","line_end":72,"severity":"low","line_start":72},{"id":"scripts:scripts/backends/__init__.py:22:dynamic-import-expression","file":"scripts/backends/__init__.py","pattern":"Dynamic import() expression","snippet":"from .base import (","category":"scripts","line_end":26,"severity":"medium","line_start":22},{"id":"scripts:scripts/backends/__init__.py:30:dynamic-import-expression","file":"scripts/backends/__init__.py","pattern":"Dynamic import() expression","snippet":"from .anthropic_backend import (","category":"scripts","line_end":35,"severity":"medium","line_start":30},{"id":"scripts:scripts/backends/__init__.py:41:dynamic-import-expression","file":"scripts/backends/__init__.py","pattern":"Dynamic import() expression","snippet":"from .cli_backend import (","category":"scripts","line_end":46,"severity":"medium","line_start":41},{"id":"env_access:scripts/backends/anthropic_backend.py:108:python-getenv-function","file":"scripts/backends/anthropic_backend.py","pattern":"Python getenv function","snippet":"return self._api_key or os.getenv(\"ANTHROPIC_API_KEY\")","category":"env_access","line_end":108,"severity":"low","line_start":108},{"id":"env_access:scripts/backends/anthropic_backend.py:314:python-getenv-function","file":"scripts/backends/anthropic_backend.py","pattern":"Python getenv function","snippet":"api_key = os.getenv(\"ANTHROPIC_API_KEY\")","category":"env_access","line_end":314,"severity":"low","line_start":314},{"id":"env_access:scripts/backends/anthropic_backend.py:108:getenv-function-call","file":"scripts/backends/anthropic_backend.py","pattern":"getenv function call","snippet":"return self._api_key or os.getenv(\"ANTHROPIC_API_KEY\")","category":"env_access","line_end":108,"severity":"low","line_start":108},{"id":"env_access:scripts/backends/anthropic_backend.py:314:getenv-function-call","file":"scripts/backends/anthropic_backend.py","pattern":"getenv function call","snippet":"api_key = os.getenv(\"ANTHROPIC_API_KEY\")","category":"env_access","line_end":314,"severity":"low","line_start":314},{"id":"env_access:scripts/backends/anthropic_backend.py:9:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"- ANTHROPIC_API_KEY: Clé API (env var ou config)","category":"env_access","line_end":9,"severity":"high","line_start":9},{"id":"env_access:scripts/backends/anthropic_backend.py:64:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"- ANTHROPIC_API_KEY env var","category":"env_access","line_end":64,"severity":"high","line_start":64},{"id":"env_access:scripts/backends/anthropic_backend.py:65:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"- ou api_key dans le constructeur","category":"env_access","line_end":65,"severity":"high","line_start":65},{"id":"env_access:scripts/backends/anthropic_backend.py:77:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"api_key: Optional[str] = None,","category":"env_access","line_end":77,"severity":"high","line_start":77},{"id":"env_access:scripts/backends/anthropic_backend.py:85:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"api_key: Clé API (ou ANTHROPIC_API_KEY env var)","category":"env_access","line_end":85,"severity":"high","line_start":85},{"id":"env_access:scripts/backends/anthropic_backend.py:89:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"self._api_key = api_key","category":"env_access","line_end":89,"severity":"high","line_start":89},{"id":"env_access:scripts/backends/anthropic_backend.py:106:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"def api_key(self) -> Optional[str]:","category":"env_access","line_end":106,"severity":"high","line_start":106},{"id":"env_access:scripts/backends/anthropic_backend.py:108:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"return self._api_key or os.getenv(\"ANTHROPIC_API_KEY\")","category":"env_access","line_end":108,"severity":"high","line_start":108},{"id":"env_access:scripts/backends/anthropic_backend.py:116:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"- ANTHROPIC_API_KEY défini","category":"env_access","line_end":116,"severity":"high","line_start":116},{"id":"env_access:scripts/backends/anthropic_backend.py:121:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"if not self.api_key:","category":"env_access","line_end":121,"severity":"high","line_start":121},{"id":"env_access:scripts/backends/anthropic_backend.py:135:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"export ANTHROPIC_API_KEY=\"sk-ant-...\"","category":"env_access","line_end":135,"severity":"high","line_start":135},{"id":"env_access:scripts/backends/anthropic_backend.py:140:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"api_key: \"sk-ant-...\"","category":"env_access","line_end":140,"severity":"high","line_start":140},{"id":"env_access:scripts/backends/anthropic_backend.py:170:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"self._client = anthropic.Anthropic(api_key=self.api_key)","category":"env_access","line_end":170,"severity":"high","line_start":170},{"id":"env_access:scripts/backends/anthropic_backend.py:314:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"api_key = os.getenv(\"ANTHROPIC_API_KEY\")","category":"env_access","line_end":314,"severity":"high","line_start":314},{"id":"env_access:scripts/backends/anthropic_backend.py:315:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"if not api_key:","category":"env_access","line_end":315,"severity":"high","line_start":315},{"id":"env_access:scripts/backends/anthropic_backend.py:316:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"return False, \"ANTHROPIC_API_KEY non défini\"","category":"env_access","line_end":316,"severity":"high","line_start":316},{"id":"env_access:scripts/backends/anthropic_backend.py:319:generic-api-secret-keys","file":"scripts/backends/anthropic_backend.py","pattern":"Generic API/secret keys","snippet":"masked_key = api_key[:10] + \"...\" + api_key[-4:] if len(api_key) > 14 else \"***\"","category":"env_access","line_end":319,"severity":"high","line_start":319},{"id":"sensitive:scripts/backends/base.py:226:certificate-key-files","file":"scripts/backends/base.py","pattern":"Certificate/key files","snippet":"return list(cls._backends.keys())","category":"sensitive","line_end":226,"severity":"high","line_start":226},{"id":"blocker:scripts/backends/base.py:94:weak-cryptographic-algorithm","file":"scripts/backends/base.py","pattern":"Weak cryptographic algorithm","snippet":"- Présence des dépendances (packages)","category":"blocker","line_end":94,"severity":"high","line_start":94},{"id":"blocker:scripts/backends/base.py:150:weak-cryptographic-algorithm","file":"scripts/backends/base.py","pattern":"Weak cryptographic algorithm","snippet":"Registre des backends disponibles.","category":"blocker","line_end":150,"severity":"high","line_start":150},{"id":"blocker:scripts/backends/base.py:206:weak-cryptographic-algorithm","file":"scripts/backends/base.py","pattern":"Weak cryptographic algorithm","snippet":"Liste des backends dont is_available() == True","category":"blocker","line_end":206,"severity":"high","line_start":206},{"id":"blocker:scripts/backends/base.py:221:weak-cryptographic-algorithm","file":"scripts/backends/base.py","pattern":"Weak cryptographic algorithm","snippet":"Liste les noms des backends enregistrés.","category":"blocker","line_end":221,"severity":"high","line_start":221},{"id":"blocker:scripts/backends/base.py:224:weak-cryptographic-algorithm","file":"scripts/backends/base.py","pattern":"Weak cryptographic algorithm","snippet":"Liste des noms","category":"blocker","line_end":224,"severity":"high","line_start":224},{"id":"external_commands:scripts/backends/cli_backend.py:109:unix-shell-invocation","file":"scripts/backends/cli_backend.py","pattern":"Unix shell invocation","snippet":"#!/bin/bash","category":"external_commands","line_end":109,"severity":"medium","line_start":109},{"id":"env_access:scripts/backends/cli_backend.py:151:python-environment-access","file":"scripts/backends/cli_backend.py","pattern":"Python environment access","snippet":"env = os.environ.copy()","category":"env_access","line_end":151,"severity":"low","line_start":151},{"id":"env_access:scripts/backends/cli_backend.py:275:configuration-library","file":"scripts/backends/cli_backend.py","pattern":"Configuration library","snippet":"command=config.get(\"command\", cli_name),","category":"env_access","line_end":275,"severity":"low","line_start":275},{"id":"env_access:scripts/backends/cli_backend.py:276:configuration-library","file":"scripts/backends/cli_backend.py","pattern":"Configuration library","snippet":"args=config.get(\"args\", []),","category":"env_access","line_end":276,"severity":"low","line_start":276},{"id":"env_access:scripts/backends/cli_backend.py:277:configuration-library","file":"scripts/backends/cli_backend.py","pattern":"Configuration library","snippet":"env=config.get(\"env\", {})","category":"env_access","line_end":277,"severity":"low","line_start":277},{"id":"blocker:scripts/backends/cli_backend.py:3:weak-cryptographic-algorithm","file":"scripts/backends/cli_backend.py","pattern":"Weak cryptographic algorithm","snippet":"PRD-008 Story 8.3: Support des CLI wrappers personnalisés.","category":"blocker","line_end":3,"severity":"high","line_start":3},{"id":"network:scripts/config.py:382:hardcoded-url","file":"scripts/config.py","pattern":"Hardcoded URL","snippet":"lines.append(\"# Voir documentation: https://github.com/...\")","category":"network","line_end":382,"severity":"low","line_start":382},{"id":"filesystem:scripts/config.py:7:hidden-file-in-home-directory","file":"scripts/config.py","pattern":"Hidden file in home directory","snippet":"2. ~/.synthese-council/config.yaml (global utilisateur)","category":"filesystem","line_end":7,"severity":"high","line_start":7},{"id":"filesystem:scripts/config.py:168:hidden-file-in-home-directory","file":"scripts/config.py","pattern":"Hidden file in home directory","snippet":"2. ~/.synthese-council/config.yaml - global utilisateur","category":"filesystem","line_end":168,"severity":"high","line_start":168},{"id":"filesystem:scripts/config.py:7:hidden-file-access","file":"scripts/config.py","pattern":"Hidden file access","snippet":"2. ~/.synthese-council/config.yaml (global utilisateur)","category":"filesystem","line_end":7,"severity":"medium","line_start":7},{"id":"filesystem:scripts/config.py:168:hidden-file-access","file":"scripts/config.py","pattern":"Hidden file access","snippet":"2. ~/.synthese-council/config.yaml - global utilisateur","category":"filesystem","line_end":168,"severity":"medium","line_start":168},{"id":"env_access:scripts/config.py:514:configuration-library","file":"scripts/config.py","pattern":"Configuration library","snippet":"custom_roles = config.get(\"expert_roles\", {})","category":"env_access","line_end":514,"severity":"low","line_start":514},{"id":"env_access:scripts/config.py:533:configuration-library","file":"scripts/config.py","pattern":"Configuration library","snippet":"return config.get(\"default_cadrage\", DEFAULT_CONFIG[\"default_cadrage\"]).copy()","category":"env_access","line_end":533,"severity":"low","line_start":533},{"id":"blocker:scripts/config.py:103:weak-cryptographic-algorithm","file":"scripts/config.py","pattern":"Weak cryptographic algorithm","snippet":"\"description\": \"Activer la sauvegarde des trails\"","category":"blocker","line_end":103,"severity":"high","line_start":103},{"id":"blocker:scripts/config.py:113:weak-cryptographic-algorithm","file":"scripts/config.py","pattern":"Weak cryptographic algorithm","snippet":"\"description\": \"Liste des modèles à utiliser\"","category":"blocker","line_end":113,"severity":"high","line_start":113},{"id":"blocker:scripts/config.py:127:weak-cryptographic-algorithm","file":"scripts/config.py","pattern":"Weak cryptographic algorithm","snippet":"\"description\": \"Configuration des rôles experts\"","category":"blocker","line_end":127,"severity":"high","line_start":127},{"id":"blocker:scripts/config.py:183:weak-cryptographic-algorithm","file":"scripts/config.py","pattern":"Weak cryptographic algorithm","snippet":"\"\"\"Retourne une copie des valeurs par défaut.\"\"\"","category":"blocker","line_end":183,"severity":"high","line_start":183},{"id":"blocker:scripts/config.py:318:weak-cryptographic-algorithm","file":"scripts/config.py","pattern":"Weak cryptographic algorithm","snippet":"# Vérification des éléments de liste","category":"blocker","line_end":318,"severity":"high","line_start":318},{"id":"blocker:scripts/config.py:435:weak-cryptographic-algorithm","file":"scripts/config.py","pattern":"Weak cryptographic algorithm","snippet":"lines.append(\"# Rôles des experts (personnalisable)\")","category":"blocker","line_end":435,"severity":"high","line_start":435},{"id":"env_access:scripts/convergence.py:376:configuration-library","file":"scripts/convergence.py","pattern":"Configuration library","snippet":"backend = config.get(\"convergence\", {}).get(\"backend\", \"hybrid\")","category":"env_access","line_end":376,"severity":"low","line_start":376},{"id":"sensitive:scripts/convergence.py:238:certificate-key-files","file":"scripts/convergence.py","pattern":"Certificate/key files","snippet":"all_words = set(counter_a.keys()) | set(counter_b.keys())","category":"sensitive","line_end":238,"severity":"high","line_start":238},{"id":"blocker:scripts/convergence.py:30:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"\"le\", \"la\", \"les\", \"l\", \"un\", \"une\", \"des\", \"du\", \"de\", \"d\",","category":"blocker","line_end":30,"severity":"high","line_start":30},{"id":"blocker:scripts/convergence.py:32:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"\"à\", \"au\", \"aux\", \"de\", \"du\", \"des\", \"en\", \"dans\", \"sur\", \"sous\",","category":"blocker","line_end":32,"severity":"high","line_start":32},{"id":"blocker:scripts/convergence.py:68:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"2. Remplacement des apostrophes par des espaces","category":"blocker","line_end":68,"severity":"high","line_start":68},{"id":"blocker:scripts/convergence.py:71:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"5. Filtrage des stop words et tokens courts","category":"blocker","line_end":71,"severity":"high","line_start":71},{"id":"blocker:scripts/convergence.py:119:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"n: Taille des n-grams (1=unigrams, 2=bigrams, etc.)","category":"blocker","line_end":119,"severity":"high","line_start":119},{"id":"blocker:scripts/convergence.py:185:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"n: Taille des n-grams","category":"blocker","line_end":185,"severity":"high","line_start":185},{"id":"blocker:scripts/convergence.py:284:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"weights: Poids des métriques (optionnel)","category":"blocker","line_end":284,"severity":"high","line_start":284},{"id":"blocker:scripts/convergence.py:359:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"contents: Liste des contenus à comparer","category":"blocker","line_end":359,"severity":"high","line_start":359},{"id":"blocker:scripts/convergence.py:360:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"weights: Poids des métriques (optionnel)","category":"blocker","line_end":360,"severity":"high","line_start":360},{"id":"blocker:scripts/convergence.py:442:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"Liste des mots-clés les plus fréquents","category":"blocker","line_end":442,"severity":"high","line_start":442},{"id":"blocker:scripts/convergence.py:502:weak-cryptographic-algorithm","file":"scripts/convergence.py","pattern":"Weak cryptographic algorithm","snippet":"\"On observe des changements technologiques\"","category":"blocker","line_end":502,"severity":"high","line_start":502},{"id":"blocker:scripts/pedagogy.py:50:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"║  4. La SYNTHÈSE finale (convergence des perspectives)        ║","category":"blocker","line_end":50,"severity":"high","line_start":50},{"id":"blocker:scripts/pedagogy.py:63:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"│  Le même texte donne des synthèses différentes selon :      │","category":"blocker","line_end":63,"severity":"high","line_start":63},{"id":"blocker:scripts/pedagogy.py:91:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"│  Les 3 experts ont des FOCUS différents :                   │","category":"blocker","line_end":91,"severity":"high","line_start":91},{"id":"blocker:scripts/pedagogy.py:133:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"│  Un seul point de vue peut manquer des nuances ou           │","category":"blocker","line_end":133,"severity":"high","line_start":133},{"id":"blocker:scripts/pedagogy.py:134:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"│  introduire des biais involontaires.                        │","category":"blocker","line_end":134,"severity":"high","line_start":134},{"id":"blocker:scripts/pedagogy.py:141:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"│  Chaque expert évalue les analyses des autres :             │","category":"blocker","line_end":141,"severity":"high","line_start":141},{"id":"blocker:scripts/pedagogy.py:153:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"│  ⚠️ CONTRÔLE DES GLISSEMENTS                               │","category":"blocker","line_end":153,"severity":"high","line_start":153},{"id":"blocker:scripts/pedagogy.py:161:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"│    Confondre des termes proches mais distincts              │","category":"blocker","line_end":161,"severity":"high","line_start":161},{"id":"blocker:scripts/pedagogy.py:188:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"│  • La similitude des analyses produites                     │","category":"blocker","line_end":188,"severity":"high","line_start":188},{"id":"blocker:scripts/pedagogy.py:190:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"│  • La cohérence des structures proposées                    │","category":"blocker","line_end":190,"severity":"high","line_start":190},{"id":"blocker:scripts/pedagogy.py:217:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"│  ✓ Intègre les CONVERGENCES des 3 experts                  │","category":"blocker","line_end":217,"severity":"high","line_start":217},{"id":"blocker:scripts/pedagogy.py:255:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"# EXPLICATIONS DES EXPERTS","category":"blocker","line_end":255,"severity":"high","line_start":255},{"id":"blocker:scripts/pedagogy.py:310:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"# EXPLICATIONS DES COUCHES","category":"blocker","line_end":310,"severity":"high","line_start":310},{"id":"blocker:scripts/pedagogy.py:353:weak-cryptographic-algorithm","file":"scripts/pedagogy.py","pattern":"Weak cryptographic algorithm","snippet":"Affiche des explications contextuelles à chaque étape","category":"blocker","line_end":353,"severity":"high","line_start":353},{"id":"blocker:scripts/retry.py:8:weak-cryptographic-algorithm","file":"scripts/retry.py","pattern":"Weak cryptographic algorithm","snippet":"- Classification automatique des erreurs retryables","category":"blocker","line_end":8,"severity":"high","line_start":8},{"id":"blocker:scripts/retry.py:41:weak-cryptographic-algorithm","file":"scripts/retry.py","pattern":"Weak cryptographic algorithm","snippet":"# CLASSIFICATION DES ERREURS (Story 4.3)","category":"blocker","line_end":41,"severity":"high","line_start":41},{"id":"blocker:scripts/retry.py:259:weak-cryptographic-algorithm","file":"scripts/retry.py","pattern":"Weak cryptographic algorithm","snippet":"\"\"\"Résumé textuel des métriques.\"\"\"","category":"blocker","line_end":259,"severity":"high","line_start":259},{"id":"external_commands:scripts/sanitize.py:27:ruby-shell-backtick-execution","file":"scripts/sanitize.py","pattern":"Ruby/shell backtick execution","snippet":"\"`\",      # Command substitution","category":"external_commands","line_end":42,"severity":"medium","line_start":27},{"id":"external_commands:scripts/sanitize.py:42:ruby-shell-backtick-execution","file":"scripts/sanitize.py","pattern":"Ruby/shell backtick execution","snippet":"r\"`[^`]+`\",            # `...` command substitution","category":"external_commands","line_end":42,"severity":"medium","line_start":42},{"id":"external_commands:scripts/sanitize.py:180:ruby-shell-backtick-execution","file":"scripts/sanitize.py","pattern":"Ruby/shell backtick execution","snippet":"result = result.replace(\"`\", \"\\\\`\")","category":"external_commands","line_end":180,"severity":"medium","line_start":180},{"id":"external_commands:scripts/sanitize.py:28:shell-command-substitution","file":"scripts/sanitize.py","pattern":"Shell command substitution","snippet":"\"$(\",     # Command substitution","category":"external_commands","line_end":41,"severity":"medium","line_start":28},{"id":"external_commands:scripts/sanitize.py:41:shell-command-substitution","file":"scripts/sanitize.py","pattern":"Shell command substitution","snippet":"r\"\\$\\(.*\\)\",           # $(...) command substitution","category":"external_commands","line_end":41,"severity":"medium","line_start":41},{"id":"external_commands:scripts/sanitize.py:27:template-literal-with-command-substitution","file":"scripts/sanitize.py","pattern":"Template literal with command substitution","snippet":"\"`\",      # Command substitution","category":"external_commands","line_end":42,"severity":"medium","line_start":27},{"id":"obfuscation:scripts/sanitize.py:35:hex-encoded-characters","file":"scripts/sanitize.py","pattern":"Hex-encoded characters","snippet":"\"\\x00\",   # Null byte","category":"obfuscation","line_end":35,"severity":"high","line_start":35},{"id":"obfuscation:scripts/sanitize.py:177:hex-encoded-characters","file":"scripts/sanitize.py","pattern":"Hex-encoded characters","snippet":"result = result.replace(\"\\x00\", \"\")","category":"obfuscation","line_end":177,"severity":"high","line_start":177},{"id":"obfuscation:scripts/sanitize.py:199:hex-encoded-characters","file":"scripts/sanitize.py","pattern":"Hex-encoded characters","snippet":"result = text.replace(\"\\x00\", \"\")","category":"obfuscation","line_end":199,"severity":"high","line_start":199},{"id":"obfuscation:scripts/sanitize.py:202:hex-encoded-characters","file":"scripts/sanitize.py","pattern":"Hex-encoded characters","snippet":"result = re.sub(r'[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]', '', result)","category":"obfuscation","line_end":202,"severity":"high","line_start":202},{"id":"blocker:scripts/sanitize.py:2:weak-cryptographic-algorithm","file":"scripts/sanitize.py","pattern":"Weak cryptographic algorithm","snippet":"Module de sanitisation des entrées pour Synthèse Council.","category":"blocker","line_end":2,"severity":"high","line_start":2},{"id":"blocker:scripts/sanitize.py:3:weak-cryptographic-algorithm","file":"scripts/sanitize.py","pattern":"Weak cryptographic algorithm","snippet":"PRD-008 Story 8.4: Validation et nettoyage des entrées utilisateur.","category":"blocker","line_end":3,"severity":"high","line_start":3},{"id":"blocker:scripts/sanitize.py:5:weak-cryptographic-algorithm","file":"scripts/sanitize.py","pattern":"Weak cryptographic algorithm","snippet":"Ce module fournit des fonctions pour valider et nettoyer les entrées","category":"blocker","line_end":5,"severity":"high","line_start":5},{"id":"blocker:scripts/sanitize.py:54:weak-cryptographic-algorithm","file":"scripts/sanitize.py","pattern":"Weak cryptographic algorithm","snippet":"\"\"\"Erreur de validation des entrées.\"\"\"","category":"blocker","line_end":54,"severity":"high","line_start":54},{"id":"blocker:scripts/sanitize.py:144:weak-cryptographic-algorithm","file":"scripts/sanitize.py","pattern":"Weak cryptographic algorithm","snippet":"# Vérifier la longueur des champs","category":"blocker","line_end":144,"severity":"high","line_start":144},{"id":"blocker:scripts/sanitize.py:147:weak-cryptographic-algorithm","file":"scripts/sanitize.py","pattern":"Weak cryptographic algorithm","snippet":"return False, f\"Les clés du cadrage doivent être des chaînes\"","category":"blocker","line_end":147,"severity":"high","line_start":147},{"id":"blocker:scripts/sanitize.py:150:weak-cryptographic-algorithm","file":"scripts/sanitize.py","pattern":"Weak cryptographic algorithm","snippet":"return False, f\"Les valeurs du cadrage doivent être des chaînes (champ: {key})\"","category":"blocker","line_end":150,"severity":"high","line_start":150},{"id":"blocker:scripts/sanitize.py:296:weak-cryptographic-algorithm","file":"scripts/sanitize.py","pattern":"Weak cryptographic algorithm","snippet":"Liste des patterns détectés","category":"blocker","line_end":296,"severity":"high","line_start":296},{"id":"scripts:scripts/synthese.py:93:dynamic-import-expression","file":"scripts/synthese.py","pattern":"Dynamic import() expression","snippet":"from config import (","category":"scripts","line_end":96,"severity":"medium","line_start":93},{"id":"scripts:scripts/synthese.py:113:dynamic-import-expression","file":"scripts/synthese.py","pattern":"Dynamic import() expression","snippet":"from retry import (","category":"scripts","line_end":118,"severity":"medium","line_start":113},{"id":"scripts:scripts/synthese.py:129:dynamic-import-expression","file":"scripts/synthese.py","pattern":"Dynamic import() expression","snippet":"from pedagogy import (","category":"scripts","line_end":132,"severity":"medium","line_start":129},{"id":"scripts:scripts/synthese.py:139:dynamic-import-expression","file":"scripts/synthese.py","pattern":"Dynamic import() expression","snippet":"from convergence import (","category":"scripts","line_end":142,"severity":"medium","line_start":139},{"id":"scripts:scripts/synthese.py:149:dynamic-import-expression","file":"scripts/synthese.py","pattern":"Dynamic import() expression","snippet":"from backends import (","category":"scripts","line_end":152,"severity":"medium","line_start":149},{"id":"scripts:scripts/synthese.py:159:dynamic-import-expression","file":"scripts/synthese.py","pattern":"Dynamic import() expression","snippet":"from sanitize import (","category":"scripts","line_end":163,"severity":"medium","line_start":159},{"id":"external_commands:scripts/synthese.py:1229:python-subprocess-run","file":"scripts/synthese.py","pattern":"Python subprocess.run","snippet":"result = subprocess.run(","category":"external_commands","line_end":1229,"severity":"high","line_start":1229},{"id":"external_commands:scripts/synthese.py:1317:python-subprocess-run","file":"scripts/synthese.py","pattern":"Python subprocess.run","snippet":"result = subprocess.run(","category":"external_commands","line_end":1317,"severity":"high","line_start":1317},{"id":"external_commands:scripts/synthese.py:2851:ruby-shell-backtick-execution","file":"scripts/synthese.py","pattern":"Ruby/shell backtick execution","snippet":"output.append(f\"| Session | `{session.session_id}` |\")","category":"external_commands","line_end":2851,"severity":"medium","line_start":2851},{"id":"external_commands:scripts/synthese.py:2890:ruby-shell-backtick-execution","file":"scripts/synthese.py","pattern":"Ruby/shell backtick execution","snippet":"output.append(f\"*Trail : `synthese_trails/{session.session_id}.json`*\")","category":"external_commands","line_end":2890,"severity":"medium","line_start":2890},{"id":"network:scripts/synthese.py:836:python-http-libraries","file":"scripts/synthese.py","pattern":"Python HTTP libraries","snippet":"requests.RequestException: Si erreur réseau","category":"network","line_end":836,"severity":"low","line_start":836},{"id":"network:scripts/synthese.py:848:python-http-libraries","file":"scripts/synthese.py","pattern":"Python HTTP libraries","snippet":"response = requests.get(url, headers=headers, timeout=timeout)","category":"network","line_end":848,"severity":"low","line_start":848},{"id":"network:scripts/synthese.py:1162:hardcoded-url","file":"scripts/synthese.py","pattern":"Hardcoded URL","snippet":"\"Documentation: https://github.com/your-repo/synthese-council#installation\"","category":"network","line_end":1162,"severity":"low","line_start":1162},{"id":"filesystem:scripts/synthese.py:326:node-js-fs-operations","file":"scripts/synthese.py","pattern":"Node.js fs operations","snippet":"valid_refs.append(f\"§{ref}\")","category":"filesystem","line_end":326,"severity":"medium","line_start":326},{"id":"filesystem:scripts/synthese.py:362:node-js-fs-operations","file":"scripts/synthese.py","pattern":"Node.js fs operations","snippet":"valid_refs.append(f\"S:{source_name}§{para_num}\")","category":"filesystem","line_end":362,"severity":"medium","line_start":362},{"id":"filesystem:scripts/synthese.py:374:node-js-fs-operations","file":"scripts/synthese.py","pattern":"Node.js fs operations","snippet":"valid_refs.append(f\"§{ref}\")","category":"filesystem","line_end":374,"severity":"medium","line_start":374},{"id":"filesystem:scripts/synthese.py:708:python-file-write-append","file":"scripts/synthese.py","pattern":"Python file write/append","snippet":"with open(cache_path, \"w\", encoding=\"utf-8\") as f:","category":"filesystem","line_end":708,"severity":"medium","line_start":708},{"id":"filesystem:scripts/synthese.py:2680:python-file-write-append","file":"scripts/synthese.py","pattern":"Python file write/append","snippet":"with open(trail_file, \"w\", encoding=\"utf-8\") as f:","category":"filesystem","line_end":2680,"severity":"medium","line_start":2680},{"id":"filesystem:scripts/synthese.py:2716:python-file-write-append","file":"scripts/synthese.py","pattern":"Python file write/append","snippet":"with open(md_file, \"w\", encoding=\"utf-8\") as f:","category":"filesystem","line_end":2716,"severity":"medium","line_start":2716},{"id":"env_access:scripts/synthese.py:1692:configuration-library","file":"scripts/synthese.py","pattern":"Configuration library","snippet":"self.retry_config = self.config.get(\"retry\", DEFAULT_RETRY_CONFIG)","category":"env_access","line_end":1692,"severity":"low","line_start":1692},{"id":"env_access:scripts/synthese.py:1711:configuration-library","file":"scripts/synthese.py","pattern":"Configuration library","snippet":"cache_config = self.config.get(\"cache\", {})","category":"env_access","line_end":1711,"severity":"low","line_start":1711},{"id":"env_access:scripts/synthese.py:1713:configuration-library","file":"scripts/synthese.py","pattern":"Configuration library","snippet":"enabled=cache_config.get(\"enabled\", True),","category":"env_access","line_end":1713,"severity":"low","line_start":1713},{"id":"env_access:scripts/synthese.py:1714:configuration-library","file":"scripts/synthese.py","pattern":"Configuration library","snippet":"default_ttl=cache_config.get(\"ttl\", 3600),","category":"env_access","line_end":1714,"severity":"low","line_start":1714},{"id":"env_access:scripts/synthese.py:1715:configuration-library","file":"scripts/synthese.py","pattern":"Configuration library","snippet":"cache_dir=Path(cache_config.get(\"directory\", \".cache/synthese\")) if cache_config.get(\"directory\") el","category":"env_access","line_end":1715,"severity":"low","line_start":1715},{"id":"env_access:scripts/synthese.py:2115:configuration-library","file":"scripts/synthese.py","pattern":"Configuration library","snippet":"weights = self.config.get(\"convergence_weights\", None)","category":"env_access","line_end":2115,"severity":"low","line_start":2115},{"id":"env_access:scripts/synthese.py:2616:configuration-library","file":"scripts/synthese.py","pattern":"Configuration library","snippet":"timeout=self.config.get(\"timeout\", 300),","category":"env_access","line_end":2616,"severity":"low","line_start":2616},{"id":"env_access:scripts/synthese.py:3128:configuration-library","file":"scripts/synthese.py","pattern":"Configuration library","snippet":"if council.config.get(\"enable_trail\", True):","category":"env_access","line_end":3128,"severity":"low","line_start":3128},{"id":"env_access:scripts/synthese.py:3449:configuration-library","file":"scripts/synthese.py","pattern":"Configuration library","snippet":"sources = config.get(\"_sources\", [\"default\"])","category":"env_access","line_end":3449,"severity":"low","line_start":3449},{"id":"env_access:scripts/synthese.py:3491:configuration-library","file":"scripts/synthese.py","pattern":"Configuration library","snippet":"sources = config.get(\"_sources\", [\"default\"])","category":"env_access","line_end":3491,"severity":"low","line_start":3491},{"id":"env_access:scripts/synthese.py:1159:generic-api-secret-keys","file":"scripts/synthese.py","pattern":"Generic API/secret keys","snippet":"\"  1. Définir ANTHROPIC_API_KEY pour utiliser l'API Anthropic\\n\"","category":"env_access","line_end":1159,"severity":"high","line_start":1159},{"id":"env_access:scripts/synthese.py:1765:generic-api-secret-keys","file":"scripts/synthese.py","pattern":"Generic API/secret keys","snippet":"log(\"║  2. Ou définir ANTHROPIC_API_KEY (fallback)                  ║\")","category":"env_access","line_end":1765,"severity":"high","line_start":1765},{"id":"sensitive:scripts/synthese.py:1790:certificate-key-files","file":"scripts/synthese.py","pattern":"Certificate/key files","snippet":"roles = list(self.expert_roles.keys())","category":"sensitive","line_end":1790,"severity":"high","line_start":1790},{"id":"sensitive:scripts/synthese.py:3243:certificate-key-files","file":"scripts/synthese.py","pattern":"Certificate/key files","snippet":"choices=list(CADRAGE_TEMPLATES.keys()),","category":"sensitive","line_end":3243,"severity":"high","line_start":3243},{"id":"blocker:scripts/synthese.py:168:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"# PRD-018: Import des extracteurs optionnels","category":"blocker","line_end":168,"severity":"high","line_start":168},{"id":"blocker:scripts/synthese.py:205:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"PRD-019: Permet de créer des références vérifiables vers le texte source.","category":"blocker","line_end":205,"severity":"high","line_start":205},{"id":"blocker:scripts/synthese.py:390:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"valid_refs: Liste des références valides","category":"blocker","line_end":390,"severity":"high","line_start":390},{"id":"blocker:scripts/synthese.py:392:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"max_excerpt_len: Longueur max des extraits","category":"blocker","line_end":392,"severity":"high","line_start":392},{"id":"blocker:scripts/synthese.py:437:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"PRD-020: Support des templates de cadrage.","category":"blocker","line_end":437,"severity":"high","line_start":437},{"id":"blocker:scripts/synthese.py:631:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"# CACHE DES RÉPONSES (PRD-024)","category":"blocker","line_end":631,"severity":"high","line_start":631},{"id":"blocker:scripts/synthese.py:759:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"PRD-018: Support des fichiers PDF via pdfplumber.","category":"blocker","line_end":759,"severity":"high","line_start":759},{"id":"blocker:scripts/synthese.py:794:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"PRD-018: Support des fichiers Word via python-docx.","category":"blocker","line_end":794,"severity":"high","line_start":794},{"id":"blocker:scripts/synthese.py:825:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"PRD-018: Support des URLs via requests + BeautifulSoup.","category":"blocker","line_end":825,"severity":"high","line_start":825},{"id":"blocker:scripts/synthese.py:959:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"sources: Liste des sources chargées","category":"blocker","line_end":959,"severity":"high","line_start":959},{"id":"blocker:scripts/synthese.py:1153:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"PRD-008 Story 8.1: Gestion gracieuse des erreurs de configuration.","category":"blocker","line_end":1153,"severity":"high","line_start":1153},{"id":"blocker:scripts/synthese.py:1206:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"# Destination des logs (stdout par défaut, stderr si sortie structurée)","category":"blocker","line_end":1206,"severity":"high","line_start":1206},{"id":"blocker:scripts/synthese.py:1268:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"PRD-008: Support des backends natifs (Anthropic, etc.)","category":"blocker","line_end":1268,"severity":"high","line_start":1268},{"id":"blocker:scripts/synthese.py:1272:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"Liste des backends disponibles","category":"blocker","line_end":1272,"severity":"high","line_start":1272},{"id":"blocker:scripts/synthese.py:1730:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"log(\"║           VÉRIFICATION DES MODÈLES                           ║\")","category":"blocker","line_end":1730,"severity":"high","line_start":1730},{"id":"blocker:scripts/synthese.py:1830:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"Génère des personas experts adaptés au document (PRD-017).","category":"blocker","line_end":1830,"severity":"high","line_start":1830},{"id":"blocker:scripts/synthese.py:1850:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"2. Génère 3 personas d'experts avec des angles complémentaires","category":"blocker","line_end":1850,"severity":"high","line_start":1850},{"id":"blocker:scripts/synthese.py:1868:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"log(f\"⚠ Génération personas échouée, utilisation des défauts\")","category":"blocker","line_end":1868,"severity":"high","line_start":1868},{"id":"blocker:scripts/synthese.py:1903:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"log(\"\\n─── GÉNÉRATION DES PERSONAS ───\")","category":"blocker","line_end":1903,"severity":"high","line_start":1903},{"id":"blocker:scripts/synthese.py:2077:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"Voici les analyses et critiques des experts:","category":"blocker","line_end":2077,"severity":"high","line_start":2077},{"id":"blocker:scripts/synthese.py:2147:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"# EXECUTION PARALLÈLE DES ROUNDS (Story 2.2)","category":"blocker","line_end":2147,"severity":"high","line_start":2147},{"id":"blocker:scripts/synthese.py:2256:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"with_refs: Inclure des références [§N] aux passages sources","category":"blocker","line_end":2256,"severity":"high","line_start":2256},{"id":"blocker:scripts/synthese.py:2481:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"# Afficher résumé des retries si pertinent","category":"blocker","line_end":2481,"severity":"high","line_start":2481},{"id":"blocker:scripts/synthese.py:2946:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"# PRD-018: Récupération des sources (fichiers, URLs, texte)","category":"blocker","line_end":2946,"severity":"high","line_start":2946},{"id":"blocker:scripts/synthese.py:2999:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"# Construction des overrides CLI (PRD-003)","category":"blocker","line_end":2999,"severity":"high","line_start":2999},{"id":"blocker:scripts/synthese.py:3152:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"# PRD-026: Affichage des métriques détaillées","category":"blocker","line_end":3152,"severity":"high","line_start":3152},{"id":"blocker:scripts/synthese.py:3238:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"help=\"Inclure des références [§N] aux passages sources (PRD-019)\"","category":"blocker","line_end":3238,"severity":"high","line_start":3238},{"id":"blocker:scripts/synthese.py:3269:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"help=\"Désactiver le cache des réponses (PRD-024)\"","category":"blocker","line_end":3269,"severity":"high","line_start":3269},{"id":"blocker:scripts/synthese.py:3274:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"help=\"Vider le cache des réponses\"","category":"blocker","line_end":3274,"severity":"high","line_start":3274},{"id":"blocker:scripts/synthese.py:3515:weak-cryptographic-algorithm","file":"scripts/synthese.py","pattern":"Weak cryptographic algorithm","snippet":"print(\"║           VÉRIFICATION DES CLI                               ║\")","category":"blocker","line_end":3515,"severity":"high","line_start":3515},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":32,"severity":"medium","line_start":20},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":36,"severity":"medium","line_start":32},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":38,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":54,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:54:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":70,"severity":"medium","line_start":54},{"id":"external_commands:SKILL.md:70:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":76,"severity":"medium","line_start":70},{"id":"external_commands:SKILL.md:76:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `--mode` | standard, rapide, critique, pedagogique | standard |","category":"external_commands","line_end":77,"severity":"medium","line_start":76},{"id":"external_commands:SKILL.md:77:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `--destinataire` | Public cible | interactif |","category":"external_commands","line_end":78,"severity":"medium","line_start":77},{"id":"external_commands:SKILL.md:78:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `--finalite` | Objectif de la synthèse | interactif |","category":"external_commands","line_end":79,"severity":"medium","line_start":78},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `--longueur` | Longueur souhaitée | 10-15 lignes |","category":"external_commands","line_end":80,"severity":"medium","line_start":79},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `--ton` | Registre de langue | accessible |","category":"external_commands","line_end":81,"severity":"medium","line_start":80},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `--niveau` | Expertise attendue | intermédiaire |","category":"external_commands","line_end":82,"severity":"medium","line_start":81},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `--timeout` | Timeout par modèle (secondes) | 300 |","category":"external_commands","line_end":83,"severity":"medium","line_start":82},{"id":"external_commands:SKILL.md:83:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `--no-trail` | Désactive la sauvegarde | false |","category":"external_commands","line_end":84,"severity":"medium","line_start":83},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `--json` | Sortie JSON structurée | false |","category":"external_commands","line_end":98,"severity":"medium","line_start":84},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":115,"severity":"medium","line_start":98},{"id":"external_commands:SKILL.md:115:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":146,"severity":"medium","line_start":115},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Chaque session génère un fichier JSON dans `synthese_trails/` contenant :","category":"external_commands","line_end":157,"severity":"medium","line_start":146},{"id":"external_commands:SKILL.md:157:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":159,"severity":"medium","line_start":157},{"id":"external_commands:SKILL.md:159:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":175,"severity":"medium","line_start":159},{"id":"external_commands:SKILL.md:175:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Timeout adaptatif par modèle (défaut: 5 minutes). Configurable via `--timeout`.","category":"external_commands","line_end":185,"severity":"medium","line_start":175},{"id":"external_commands:SKILL.md:185:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":191,"severity":"medium","line_start":185},{"id":"external_commands:SKILL.md:191:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":195,"severity":"medium","line_start":191},{"id":"external_commands:SKILL.md:195:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":198,"severity":"medium","line_start":195},{"id":"external_commands:SKILL.md:198:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":202,"severity":"medium","line_start":198},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":205,"severity":"medium","line_start":202},{"id":"network:SKILL.md:219:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Inspiré de [Council](https://github.com/bacoco/Council-board-skill) par bacoco et du concept [LLM Co","category":"network","line_end":219,"severity":"low","line_start":219},{"id":"blocker:SKILL.md:3:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"description: Synthèse co-fabriquée par un conseil de 3 LLMs (Claude, Gemini, Codex). Ce skill devrai","category":"blocker","line_end":3,"severity":"high","line_start":3},{"id":"blocker:SKILL.md:14:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"Ce skill orchestre trois modèles IA avec des rôles experts distincts pour produire une synthèse robu","category":"blocker","line_end":14,"severity":"high","line_start":14},{"id":"blocker:SKILL.md:18:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"### Installation des CLI","category":"blocker","line_end":18,"severity":"high","line_start":18},{"id":"blocker:SKILL.md:106:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"├─ Détection des divergences","category":"blocker","line_end":106,"severity":"high","line_start":106},{"id":"blocker:SKILL.md:111:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"├─ Consolidation des analyses","category":"blocker","line_end":111,"severity":"high","line_start":111},{"id":"blocker:SKILL.md:112:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"├─ Résolution des divergences","category":"blocker","line_end":112,"severity":"high","line_start":112},{"id":"blocker:SKILL.md:114:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"└─ Mention des points de dissensus","category":"blocker","line_end":114,"severity":"high","line_start":114},{"id":"blocker:SKILL.md:138:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"Focus sur la détection des glissements. Utile pour vérifier une synthèse existante.","category":"blocker","line_end":138,"severity":"high","line_start":138},{"id":"blocker:SKILL.md:212:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"| [troubleshooting.md](references/troubleshooting.md) | Guide de résolution des problèmes |","category":"blocker","line_end":212,"severity":"high","line_start":212},{"id":"blocker:SKILL.md:214:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"| [couches-semiotiques.md](references/couches-semiotiques.md) | Détail des 4 couches d'analyse |","category":"blocker","line_end":214,"severity":"high","line_start":214},{"id":"blocker:SKILL.md:215:weak-cryptographic-algorithm","file":"SKILL.md","pattern":"Weak cryptographic algorithm","snippet":"| [glissements.md](references/glissements.md) | Catalogue des glissements sémantiques courants |","category":"blocker","line_end":215,"severity":"high","line_start":215},{"id":"blocker:synthese.config.yaml:19:weak-cryptographic-algorithm","file":"synthese.config.yaml","pattern":"Weak cryptographic algorithm","snippet":"# Activer la sauvegarde des trails","category":"blocker","line_end":19,"severity":"high","line_start":19},{"id":"blocker:synthese.config.yaml:22:weak-cryptographic-algorithm","file":"synthese.config.yaml","pattern":"Weak cryptographic algorithm","snippet":"# Répertoire de sauvegarde des trails","category":"blocker","line_end":22,"severity":"high","line_start":22},{"id":"blocker:synthese.config.yaml:28:weak-cryptographic-algorithm","file":"synthese.config.yaml","pattern":"Weak cryptographic algorithm","snippet":"# Rôles des experts (personnalisable)","category":"blocker","line_end":28,"severity":"high","line_start":28},{"id":"external_commands:wrappers/claude_wrapper.sh:37:shell-command-substitution","file":"wrappers/claude_wrapper.sh","pattern":"Shell command substitution","snippet":"ESCAPED_PROMPT=$(echo \"$PROMPT\" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().str","category":"external_commands","line_end":37,"severity":"medium","line_start":37},{"id":"external_commands:wrappers/claude_wrapper.sh:40:shell-command-substitution","file":"wrappers/claude_wrapper.sh","pattern":"Shell command substitution","snippet":"RESPONSE=$(curl -s -X POST \"$API_URL\" \\","category":"external_commands","line_end":50,"severity":"medium","line_start":40},{"id":"external_commands:wrappers/claude_wrapper.sh:1:unix-shell-invocation","file":"wrappers/claude_wrapper.sh","pattern":"Unix shell invocation","snippet":"#!/bin/bash","category":"external_commands","line_end":1,"severity":"medium","line_start":1},{"id":"network:wrappers/claude_wrapper.sh:20:hardcoded-url","file":"wrappers/claude_wrapper.sh","pattern":"Hardcoded URL","snippet":"API_URL=\"https://api.anthropic.com/v1/messages\"","category":"network","line_end":20,"severity":"low","line_start":20},{"id":"env_access:wrappers/claude_wrapper.sh:9:generic-api-secret-keys","file":"wrappers/claude_wrapper.sh","pattern":"Generic API/secret keys","snippet":"#   - ANTHROPIC_API_KEY défini","category":"env_access","line_end":9,"severity":"high","line_start":9},{"id":"env_access:wrappers/claude_wrapper.sh:23:generic-api-secret-keys","file":"wrappers/claude_wrapper.sh","pattern":"Generic API/secret keys","snippet":"if [ -z \"$ANTHROPIC_API_KEY\" ]; then","category":"env_access","line_end":23,"severity":"high","line_start":23},{"id":"env_access:wrappers/claude_wrapper.sh:24:generic-api-secret-keys","file":"wrappers/claude_wrapper.sh","pattern":"Generic API/secret keys","snippet":"echo \"Erreur: ANTHROPIC_API_KEY non défini\" >&2","category":"env_access","line_end":24,"severity":"high","line_start":24},{"id":"env_access:wrappers/claude_wrapper.sh:42:generic-api-secret-keys","file":"wrappers/claude_wrapper.sh","pattern":"Generic API/secret keys","snippet":"-H \"x-api-key: $ANTHROPIC_API_KEY\" \\","category":"env_access","line_end":42,"severity":"high","line_start":42},{"id":"external_commands:wrappers/ollama_wrapper.sh:37:shell-command-substitution","file":"wrappers/ollama_wrapper.sh","pattern":"Shell command substitution","snippet":"ESCAPED_PROMPT=$(echo \"$PROMPT\" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().str","category":"external_commands","line_end":37,"severity":"medium","line_start":37},{"id":"external_commands:wrappers/ollama_wrapper.sh:40:shell-command-substitution","file":"wrappers/ollama_wrapper.sh","pattern":"Shell command substitution","snippet":"RESPONSE=$(curl -s -X POST \"$HOST/api/generate\" \\","category":"external_commands","line_end":46,"severity":"medium","line_start":40},{"id":"external_commands:wrappers/ollama_wrapper.sh:1:unix-shell-invocation","file":"wrappers/ollama_wrapper.sh","pattern":"Unix shell invocation","snippet":"#!/bin/bash","category":"external_commands","line_end":1,"severity":"medium","line_start":1},{"id":"network:wrappers/ollama_wrapper.sh:13:hardcoded-url","file":"wrappers/ollama_wrapper.sh","pattern":"Hardcoded URL","snippet":"#   - OLLAMA_HOST: URL du serveur (défaut: http://localhost:11434)","category":"network","line_end":13,"severity":"low","line_start":13},{"id":"network:wrappers/ollama_wrapper.sh:19:hardcoded-url","file":"wrappers/ollama_wrapper.sh","pattern":"Hardcoded URL","snippet":"HOST=\"${OLLAMA_HOST:-http://localhost:11434}\"","category":"network","line_end":19,"severity":"low","line_start":19},{"id":"filesystem:wrappers/ollama_wrapper.sh:30:standard-device-file-access","file":"wrappers/ollama_wrapper.sh","pattern":"Standard device file access","snippet":"if ! curl -s --connect-timeout 2 \"$HOST/api/tags\" > /dev/null 2>&1; then","category":"filesystem","line_end":30,"severity":"low","line_start":30},{"id":"external_commands:wrappers/README.md:57:unix-shell-invocation","file":"wrappers/README.md","pattern":"Unix shell invocation","snippet":"#!/bin/bash","category":"external_commands","line_end":57,"severity":"medium","line_start":57},{"id":"external_commands:wrappers/README.md:142:sudo-privilege-escalation","file":"wrappers/README.md","pattern":"sudo privilege escalation","snippet":"sudo apt install curl","category":"external_commands","line_end":142,"severity":"high","line_start":142},{"id":"network:wrappers/README.md:96:python-http-libraries","file":"wrappers/README.md","pattern":"Python HTTP libraries","snippet":"response = requests.post(","category":"network","line_end":96,"severity":"low","line_start":96},{"id":"network:wrappers/README.md:97:hardcoded-url","file":"wrappers/README.md","pattern":"Hardcoded URL","snippet":"\"https://api.example.com/generate\",","category":"network","line_end":97,"severity":"low","line_start":97},{"id":"env_access:wrappers/README.md:16:generic-api-secret-keys","file":"wrappers/README.md","pattern":"Generic API/secret keys","snippet":"| `claude_wrapper.sh` | Claude (API) | `ANTHROPIC_API_KEY`, curl |","category":"env_access","line_end":16,"severity":"high","line_start":16},{"id":"env_access:wrappers/README.md:45:generic-api-secret-keys","file":"wrappers/README.md","pattern":"Generic API/secret keys","snippet":"export ANTHROPIC_API_KEY=\"sk-ant-...\"","category":"env_access","line_end":45,"severity":"high","line_start":45},{"id":"env_access:wrappers/README.md:115:generic-api-secret-keys","file":"wrappers/README.md","pattern":"Generic API/secret keys","snippet":"| `ANTHROPIC_API_KEY` | Clé API Anthropic | - |","category":"env_access","line_end":115,"severity":"high","line_start":115},{"id":"blocker:wrappers/README.md:3:weak-cryptographic-algorithm","file":"wrappers/README.md","pattern":"Weak cryptographic algorithm","snippet":"Ce dossier contient des exemples de scripts wrapper pour intégrer différents LLMs avec Synthèse Coun","category":"blocker","line_end":3,"severity":"high","line_start":3},{"id":"obfuscation:scripts/synthese.py:1:heuristic-multiple-bracket-chains-8-jsfuck-obfus","file":"scripts/synthese.py","pattern":"[HEURISTIC] Multiple bracket chains (8) - JSFuck/obfuscation pattern","snippet":"())[, ())[, ())}","category":"obfuscation","line_end":1,"severity":"high","line_start":1}],"finding_verdicts":[{"id":"blocker:references/cadrage.md:7:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/cadrage.md:59:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/cadrage.md:71:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"env_access:references/configuration.md:128:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"blocker:references/configuration.md:65:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/configuration.md:89:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/configuration.md:131:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/configuration.md:135:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/configuration.md:36:system-reconnaissance","reason":"No system reconnaissance command or host inspection is evidenced in the snippet; the match appears to be generic text.","verdict":"false_positive","confidence":0.86},{"id":"blocker:references/configuration.md:37:system-reconnaissance","reason":"No system reconnaissance command or host inspection is evidenced in the snippet; the match appears to be generic text.","verdict":"false_positive","confidence":0.86},{"id":"blocker:references/glissements.md:1:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/glissements.md:12:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/glissements.md:39:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/glissements.md:52:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/metrics.md:5:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/metrics.md:26:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/metrics.md:60:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/metrics.md:115:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/metrics.md:146:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"env_access:references/troubleshooting.md:64:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:references/troubleshooting.md:69:generic-api-secret-keys","reason":"The documentation includes a placeholder API key format; it is not a real secret but confirms API-key handling guidance.","verdict":"confirmed","severity":"medium","confidence":0.89},{"id":"env_access:references/troubleshooting.md:75:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"blocker:references/troubleshooting.md:3:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/troubleshooting.md:106:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/troubleshooting.md:116:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/troubleshooting.md:136:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/troubleshooting.md:138:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/troubleshooting.md:220:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:references/troubleshooting.md:72:system-reconnaissance","reason":"No system reconnaissance command or host inspection is evidenced in the snippet; the match appears to be generic text.","verdict":"false_positive","confidence":0.86},{"id":"scripts:scripts/backends/__init__.py:22:dynamic-import-expression","reason":"The snippets show ordinary Python import statements or comments, not dynamic import() execution.","verdict":"false_positive","confidence":0.91},{"id":"scripts:scripts/backends/__init__.py:30:dynamic-import-expression","reason":"The snippets show ordinary Python import statements or comments, not dynamic import() execution.","verdict":"false_positive","confidence":0.91},{"id":"scripts:scripts/backends/__init__.py:41:dynamic-import-expression","reason":"The snippets show ordinary Python import statements or comments, not dynamic import() execution.","verdict":"false_positive","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:108:python-getenv-function","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:314:python-getenv-function","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:108:getenv-function-call","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:314:getenv-function-call","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:9:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:64:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:65:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:77:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:85:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:89:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:106:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:108:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:116:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:121:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:135:generic-api-secret-keys","reason":"The documentation includes a placeholder API key format; it is not a real secret but confirms API-key handling guidance.","verdict":"confirmed","severity":"medium","confidence":0.89},{"id":"env_access:scripts/backends/anthropic_backend.py:140:generic-api-secret-keys","reason":"The documentation includes a placeholder API key format; it is not a real secret but confirms API-key handling guidance.","verdict":"confirmed","severity":"medium","confidence":0.89},{"id":"env_access:scripts/backends/anthropic_backend.py:170:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:314:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:315:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:316:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/anthropic_backend.py:319:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"sensitive:scripts/backends/base.py:226:certificate-key-files","reason":"The snippets reference ordinary dictionary keys, choices, or role names, not certificate/key files or private key material.","verdict":"false_positive","confidence":0.88},{"id":"blocker:scripts/backends/base.py:94:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/backends/base.py:150:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/backends/base.py:206:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/backends/base.py:221:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/backends/base.py:224:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:scripts/backends/cli_backend.py:109:unix-shell-invocation","reason":"The file contains a shell shebang or shell script example, confirming shell execution content.","verdict":"confirmed","confidence":0.94},{"id":"env_access:scripts/backends/cli_backend.py:151:python-environment-access","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/backends/cli_backend.py:275:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/backends/cli_backend.py:276:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/backends/cli_backend.py:277:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"blocker:scripts/backends/cli_backend.py:3:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"network:scripts/config.py:382:hardcoded-url","reason":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation.","verdict":"confirmed","confidence":0.88},{"id":"filesystem:scripts/config.py:7:hidden-file-in-home-directory","reason":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection.","verdict":"confirmed","confidence":0.88},{"id":"filesystem:scripts/config.py:168:hidden-file-in-home-directory","reason":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection.","verdict":"confirmed","confidence":0.88},{"id":"filesystem:scripts/config.py:7:hidden-file-access","reason":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection.","verdict":"confirmed","confidence":0.88},{"id":"filesystem:scripts/config.py:168:hidden-file-access","reason":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection.","verdict":"confirmed","confidence":0.88},{"id":"env_access:scripts/config.py:514:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/config.py:533:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"blocker:scripts/config.py:103:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/config.py:113:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/config.py:127:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/config.py:183:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/config.py:318:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/config.py:435:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"env_access:scripts/convergence.py:376:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"sensitive:scripts/convergence.py:238:certificate-key-files","reason":"The snippets reference ordinary dictionary keys, choices, or role names, not certificate/key files or private key material.","verdict":"false_positive","confidence":0.88},{"id":"blocker:scripts/convergence.py:30:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/convergence.py:32:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/convergence.py:68:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/convergence.py:71:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/convergence.py:119:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/convergence.py:185:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/convergence.py:284:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/convergence.py:359:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/convergence.py:360:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/convergence.py:442:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/convergence.py:502:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:50:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:63:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:91:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:133:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:134:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:141:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:153:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:161:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:188:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:190:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:217:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:255:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:310:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/pedagogy.py:353:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/retry.py:8:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/retry.py:41:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/retry.py:259:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:scripts/sanitize.py:27:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:scripts/sanitize.py:42:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:scripts/sanitize.py:180:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:scripts/sanitize.py:28:shell-command-substitution","reason":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior.","verdict":"confirmed","confidence":0.93},{"id":"external_commands:scripts/sanitize.py:41:shell-command-substitution","reason":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior.","verdict":"confirmed","confidence":0.93},{"id":"external_commands:scripts/sanitize.py:27:template-literal-with-command-substitution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"obfuscation:scripts/sanitize.py:35:hex-encoded-characters","reason":"The source contains hex-style escape sequences or encoded characters; this is confirmed as encoded content, though not necessarily malicious by itself.","verdict":"confirmed","severity":"low","confidence":0.72},{"id":"obfuscation:scripts/sanitize.py:177:hex-encoded-characters","reason":"The source contains hex-style escape sequences or encoded characters; this is confirmed as encoded content, though not necessarily malicious by itself.","verdict":"confirmed","severity":"low","confidence":0.72},{"id":"obfuscation:scripts/sanitize.py:199:hex-encoded-characters","reason":"The source contains hex-style escape sequences or encoded characters; this is confirmed as encoded content, though not necessarily malicious by itself.","verdict":"confirmed","severity":"low","confidence":0.72},{"id":"obfuscation:scripts/sanitize.py:202:hex-encoded-characters","reason":"The source contains hex-style escape sequences or encoded characters; this is confirmed as encoded content, though not necessarily malicious by itself.","verdict":"confirmed","severity":"low","confidence":0.72},{"id":"blocker:scripts/sanitize.py:2:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/sanitize.py:3:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/sanitize.py:5:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/sanitize.py:54:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/sanitize.py:144:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/sanitize.py:147:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/sanitize.py:150:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/sanitize.py:296:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"scripts:scripts/synthese.py:93:dynamic-import-expression","reason":"The snippets show ordinary Python import statements or comments, not dynamic import() execution.","verdict":"false_positive","confidence":0.91},{"id":"scripts:scripts/synthese.py:113:dynamic-import-expression","reason":"The snippets show ordinary Python import statements or comments, not dynamic import() execution.","verdict":"false_positive","confidence":0.91},{"id":"scripts:scripts/synthese.py:129:dynamic-import-expression","reason":"The snippets show ordinary Python import statements or comments, not dynamic import() execution.","verdict":"false_positive","confidence":0.91},{"id":"scripts:scripts/synthese.py:139:dynamic-import-expression","reason":"The snippets show ordinary Python import statements or comments, not dynamic import() execution.","verdict":"false_positive","confidence":0.91},{"id":"scripts:scripts/synthese.py:149:dynamic-import-expression","reason":"The snippets show ordinary Python import statements or comments, not dynamic import() execution.","verdict":"false_positive","confidence":0.91},{"id":"scripts:scripts/synthese.py:159:dynamic-import-expression","reason":"The snippets show ordinary Python import statements or comments, not dynamic import() execution.","verdict":"false_positive","confidence":0.91},{"id":"external_commands:scripts/synthese.py:1229:python-subprocess-run","reason":"The code calls subprocess.run, confirming external process execution behavior that should be reviewed for argument safety.","verdict":"confirmed","confidence":0.9},{"id":"external_commands:scripts/synthese.py:1317:python-subprocess-run","reason":"The code calls subprocess.run, confirming external process execution behavior that should be reviewed for argument safety.","verdict":"confirmed","confidence":0.9},{"id":"external_commands:scripts/synthese.py:2851:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:scripts/synthese.py:2890:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"network:scripts/synthese.py:836:python-http-libraries","reason":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation.","verdict":"confirmed","confidence":0.88},{"id":"network:scripts/synthese.py:848:python-http-libraries","reason":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation.","verdict":"confirmed","confidence":0.88},{"id":"network:scripts/synthese.py:1162:hardcoded-url","reason":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation.","verdict":"confirmed","confidence":0.88},{"id":"filesystem:scripts/synthese.py:326:node-js-fs-operations","reason":"The snippets are Python list append operations involving reference strings, not Node.js filesystem APIs.","verdict":"false_positive","confidence":0.9},{"id":"filesystem:scripts/synthese.py:362:node-js-fs-operations","reason":"The snippets are Python list append operations involving reference strings, not Node.js filesystem APIs.","verdict":"false_positive","confidence":0.9},{"id":"filesystem:scripts/synthese.py:374:node-js-fs-operations","reason":"The snippets are Python list append operations involving reference strings, not Node.js filesystem APIs.","verdict":"false_positive","confidence":0.9},{"id":"filesystem:scripts/synthese.py:708:python-file-write-append","reason":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection.","verdict":"confirmed","confidence":0.88},{"id":"filesystem:scripts/synthese.py:2680:python-file-write-append","reason":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection.","verdict":"confirmed","confidence":0.88},{"id":"filesystem:scripts/synthese.py:2716:python-file-write-append","reason":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection.","verdict":"confirmed","confidence":0.88},{"id":"env_access:scripts/synthese.py:1692:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/synthese.py:1711:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/synthese.py:1713:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/synthese.py:1714:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/synthese.py:1715:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/synthese.py:2115:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/synthese.py:2616:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/synthese.py:3128:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/synthese.py:3449:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/synthese.py:3491:configuration-library","reason":"The code reads runtime configuration values, confirming configurable behavior that can affect execution, cache, timeout, or output paths.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/synthese.py:1159:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:scripts/synthese.py:1765:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"sensitive:scripts/synthese.py:1790:certificate-key-files","reason":"The snippets reference ordinary dictionary keys, choices, or role names, not certificate/key files or private key material.","verdict":"false_positive","confidence":0.88},{"id":"sensitive:scripts/synthese.py:3243:certificate-key-files","reason":"The snippets reference ordinary dictionary keys, choices, or role names, not certificate/key files or private key material.","verdict":"false_positive","confidence":0.88},{"id":"blocker:scripts/synthese.py:168:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:205:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:390:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:392:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:437:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:631:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:759:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:794:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:825:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:959:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:1153:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:1206:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:1268:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:1272:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:1730:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:1830:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:1850:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:1868:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:1903:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:2077:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:2147:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:2256:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:2481:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:2946:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:2999:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:3152:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:3238:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:3269:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:3274:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:scripts/synthese.py:3515:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:54:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:70:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:76:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:77:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:78:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:83:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:115:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:157:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:159:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:175:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:185:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:191:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:195:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:198:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","reason":"The match is Markdown/code formatting or a Python string containing backticks, not executable shell backtick evaluation.","verdict":"false_positive","confidence":0.93},{"id":"network:SKILL.md:219:hardcoded-url","reason":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation.","verdict":"confirmed","confidence":0.88},{"id":"blocker:SKILL.md:3:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:14:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:18:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:106:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:111:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:112:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:114:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:138:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:212:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:214:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:215:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:synthese.config.yaml:19:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:synthese.config.yaml:22:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"blocker:synthese.config.yaml:28:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:wrappers/claude_wrapper.sh:37:shell-command-substitution","reason":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior.","verdict":"confirmed","confidence":0.93},{"id":"external_commands:wrappers/claude_wrapper.sh:40:shell-command-substitution","reason":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior.","verdict":"confirmed","confidence":0.93},{"id":"external_commands:wrappers/claude_wrapper.sh:1:unix-shell-invocation","reason":"The file contains a shell shebang or shell script example, confirming shell execution content.","verdict":"confirmed","confidence":0.94},{"id":"network:wrappers/claude_wrapper.sh:20:hardcoded-url","reason":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation.","verdict":"confirmed","confidence":0.88},{"id":"env_access:wrappers/claude_wrapper.sh:9:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:wrappers/claude_wrapper.sh:23:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:wrappers/claude_wrapper.sh:24:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:wrappers/claude_wrapper.sh:42:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"external_commands:wrappers/ollama_wrapper.sh:37:shell-command-substitution","reason":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior.","verdict":"confirmed","confidence":0.93},{"id":"external_commands:wrappers/ollama_wrapper.sh:40:shell-command-substitution","reason":"The shell wrapper uses command substitution to process prompts and capture curl responses, confirming shell execution behavior.","verdict":"confirmed","confidence":0.93},{"id":"external_commands:wrappers/ollama_wrapper.sh:1:unix-shell-invocation","reason":"The file contains a shell shebang or shell script example, confirming shell execution content.","verdict":"confirmed","confidence":0.94},{"id":"network:wrappers/ollama_wrapper.sh:13:hardcoded-url","reason":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation.","verdict":"confirmed","confidence":0.88},{"id":"network:wrappers/ollama_wrapper.sh:19:hardcoded-url","reason":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation.","verdict":"confirmed","confidence":0.88},{"id":"filesystem:wrappers/ollama_wrapper.sh:30:standard-device-file-access","reason":"The matched location performs or documents filesystem access, including writes, hidden paths, or device-file redirection.","verdict":"confirmed","confidence":0.88},{"id":"external_commands:wrappers/README.md:57:unix-shell-invocation","reason":"The file contains a shell shebang or shell script example, confirming shell execution content.","verdict":"confirmed","confidence":0.94},{"id":"external_commands:wrappers/README.md:142:sudo-privilege-escalation","reason":"The documentation includes a sudo installation command; it is user-facing install guidance rather than automatic privilege escalation.","verdict":"confirmed","severity":"medium","confidence":0.86},{"id":"network:wrappers/README.md:96:python-http-libraries","reason":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation.","verdict":"confirmed","confidence":0.88},{"id":"network:wrappers/README.md:97:hardcoded-url","reason":"The matched location contains HTTP client usage or a fixed URL, confirming network-capable behavior or network documentation.","verdict":"confirmed","confidence":0.88},{"id":"env_access:wrappers/README.md:16:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"env_access:wrappers/README.md:45:generic-api-secret-keys","reason":"The documentation includes a placeholder API key format; it is not a real secret but confirms API-key handling guidance.","verdict":"confirmed","severity":"medium","confidence":0.89},{"id":"env_access:wrappers/README.md:115:generic-api-secret-keys","reason":"The matched location reads, checks, documents, or transmits environment-based API credentials, confirming environment access risk.","verdict":"confirmed","confidence":0.91},{"id":"blocker:wrappers/README.md:3:weak-cryptographic-algorithm","reason":"The matched text is documentation, French wording, PRD references, headings, or table text rather than a cryptographic primitive or weak crypto usage.","verdict":"false_positive","confidence":0.96},{"id":"obfuscation:scripts/synthese.py:1:heuristic-multiple-bracket-chains-8-jsfuck-obfus","reason":"The heuristic snippet is not valid executable JavaScript obfuscation in this Python skill context and appears to be a scanner artifact.","verdict":"false_positive","confidence":0.84}],"semantic_findings":[],"subject_marketplace_commit_sha":"7db9b9f06e0ab79c575b58bc48c4d8dc9849f424","subject_content_hash":"6612b1d697a6116cfddad794a9975a30cecf65b957d3ca1d2707654c45799031","subject_tree_hash":"65b39ac8b29a2aab22b42c565199512c8d3b8f2cdc7ea3ca18e4a7487d681be9","subject_plugin_path":"skills/alexmacapple/synthese-multi-llm","audit_payload_hash":"8815c18ce3fd879a3b7319271819b402","confirmed_risk_level":null,"scanner_version":null,"policy_version":null,"subject":{"marketplaceCommitSha":"7db9b9f06e0ab79c575b58bc48c4d8dc9849f424","contentHash":"6612b1d697a6116cfddad794a9975a30cecf65b957d3ca1d2707654c45799031","treeHash":"65b39ac8b29a2aab22b42c565199512c8d3b8f2cdc7ea3ca18e4a7487d681be9","pluginPath":"skills/alexmacapple/synthese-multi-llm","auditPayloadHash":"8815c18ce3fd879a3b7319271819b402"},"scannerVersion":null,"policyVersion":null},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"not_attestable","url":null,"status":null,"reason":"confirmed_risk_level does not match the canonical trust resolver"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"high","confirmedFindingCount":4,"capabilityReviewCount":82,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"confirmation_required","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":true}}