# Security Audit Report — archdoc

- **Report ID:** `82722502-8136-4a0c-a8f5-511c78f7a6da`
- **Generated:** 2026-07-31T18:34:10.815787+00:00
- **Signature:** unsigned (cosign keyless signing runs in CI; Req 22.4)

## 1. Executive Summary

**Badge:** Unsafe (composite)  
**Security score:** 70.2

| Scanner | Badge |
| --- | --- |
| agent-audit-kit | Verified |
| agentshield | Verified |
| cisco-skill-scanner | Unsafe |
| nerlo-behavioral | Unsafe |
| nerlo-install-instruction | Verified |
| nerlo-multi-source | unavailable |
| osv-scanner | Caution |
| trivy | Verified |
| trivy_image | unavailable |

| Severity | Findings |
| --- | --- |
| critical | 0 |
| high | 8 |
| medium | 20 |
| low | 3 |
| informational | 3 |

archdoc is NOT recommended for integration: the scan surfaced 0 critical and 8 high-severity findings. Treat the Per-Scanner Detail section as a remediation worklist and re-scan before reconsidering.

## 2. Source Provenance

- **Repository:** https://github.com/chrisumbel/temporal-video-translator
- **Commit scanned:** `unknown`
- **License:** unknown
- **Maintainer:** unknown
- **Version:** unknown

## 3. Per-Scanner Detail

### agentshield (v1.4.0) — Verified / 100.0

No findings.

### cisco-skill-scanner (v2.0.11) — Unsafe / 14.5

- **[low] Vague skill description** — Skill description is too short (16 chars). Provide detailed explanation. (/repo/.claude/skills/diagrams/SKILL.md:None)
- **[informational] Skill does not specify a license** — Skill manifest does not include a 'license' field. Specifying a license helps users understand usage terms. (/repo/.claude/skills/diagrams/SKILL.md:None)
- **[informational] Skill does not specify a license** — Skill manifest does not include a 'license' field. Specifying a license helps users understand usage terms. (/repo/.claude/skills/archdoc/SKILL.md:None)
- **[medium] Undeclared network usage** — Skill code uses network libraries but doesn't declare network requirement (/repo/repo/README.md:None)
- **[low] Vague skill description** — Skill description is too short (16 chars). Provide detailed explanation. (/repo/SKILL.md:None)
- **[informational] Skill does not specify a license** — Skill manifest does not include a 'license' field. Specifying a license helps users understand usage terms. (/repo/SKILL.md:None)
- **[medium] Outbound network request primitives that can transmit data externally** — Pattern detected: requests.post( (/repo/tvt/ai/paragrapher.py:50)
- **[medium] Outbound network request primitives that can transmit data externally** — Pattern detected: requests.post( (/repo/tvt/ai/screenshot_selector.py:41)
- **[medium] Outbound network request primitives that can transmit data externally** — Pattern detected: requests.post( (/repo/tvt/ai/summarizer.py:40)
- **[medium] Outbound network request primitives that can transmit data externally** — Pattern detected: requests.get( (/repo/tvt/azure/ai/translate.py:40)
- **[medium] Outbound network request primitives that can transmit data externally** — Pattern detected: requests.post( (/repo/tvt/azure/ai/translate.py:62)
- **[medium] Outbound network request primitives that can transmit data externally** — Pattern detected: requests.post( (/repo/tvt/azure/ai/video_to_text.py:39)
- **[medium] Outbound network request primitives that can transmit data externally** — Pattern detected: requests.post( (/repo/tvt/azure/ai/video_to_text.py:52)
- **[high] Infinite loop without clear exit condition** — Pattern detected: while True: (/repo/tvt/azure/ai/video_to_text.py:70)
- **[medium] Outbound network request primitives that can transmit data externally** — Pattern detected: requests.get( (/repo/tvt/azure/ai/video_to_text.py:71)
- **[medium] Outbound network request primitives that can transmit data externally** — Pattern detected: requests.get( (/repo/tvt/media/downloader.py:26)
- **[high] Infinite loop without clear exit condition** — Pattern detected: while True: (/repo/tvt/temporal/activities.py:42)

### agent-audit-kit (v0.3.26) — Verified / 100.0

No findings.

### nerlo-behavioral (v0.1.0) — Unsafe / 10.0

- **[high] opt.nerlo-rules.nerlo-py-secret-to-network-egress** — A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host. (/repo/tvt/ai/summarizer.py:40)
- **[high] opt.nerlo-rules.nerlo-py-secret-to-network-egress** — A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host. (/repo/tvt/azure/ai/translate.py:40)
- **[high] opt.nerlo-rules.nerlo-py-secret-to-network-egress** — A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host. (/repo/tvt/azure/ai/translate.py:62)
- **[high] opt.nerlo-rules.nerlo-py-secret-to-network-egress** — A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host. (/repo/tvt/azure/ai/video_to_text.py:39)
- **[high] opt.nerlo-rules.nerlo-py-secret-to-network-egress** — A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host. (/repo/tvt/azure/ai/video_to_text.py:52)
- **[high] opt.nerlo-rules.nerlo-py-secret-to-network-egress** — A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host. (/repo/tvt/azure/ai/video_to_text.py:71)

### nerlo-install-instruction (v0.1.0) — Verified / 95.0

- **[medium] opt.nerlo-rules.nerlo-install-run-bundled-artifact** — Documentation instructs running or double-clicking a bundled/opaque artifact (e.g. "run resource.txt", "execute install.sh", "double-click setup.exe"). This is the FakeGit README shape, where the payload ships as a file the docs tell you to run. Verify the artifact is inspectable and expected — opaque bundled executables directed by docs warrant review. (/repo/.claude/skills/diagrams/SKILL.md:32)

### nerlo-multi-source (v0.1.0) — unavailable / n/a

No findings.

### trivy (v0.71.0) — Verified / 88.0

- **[low] flask: Flask: Information disclosure via improper caching of session data** — Flask is a web server gateway interface (WSGI) web application framework. In versions 3.1.2 and below, when the session object is accessed, Flask should set the Vary: Cookie header., resulting in a Use of Cache Containing Sensitive Information vulnerability. The logic instructs caches not to cache the response, as it may contain information specific to a logged in user. This is handled in most cases, but some forms of access such as the Python in operator were overlooked. The severity and risk d (requirements.txt:None)
- **[medium] requests: Requests vulnerable to .netrc credentials leak via malicious URLs** — Requests is a HTTP library. Due to a URL parsing issue, Requests releases prior to 2.32.4 may leak .netrc credentials to third parties for specific maliciously-crafted URLs. Users should upgrade to version 2.32.4 to receive a fix. For older versions of Requests, use of the .netrc file can be disabled with 'trust_env=False' on one's Requests Session. (requirements.txt:None)
- **[medium] requests: Requests: Security bypass due to predictable temporary file creation** — Requests is a HTTP library. Prior to version 2.33.0, the 'requests.utils.extract_zipped_paths()' utility function uses a predictable filename when extracting files from zip archives into the system temporary directory. If the target file already exists, it is reused without validation. A local attacker with write access to the temp directory could pre-create a malicious file that would be loaded in place of the legitimate one. Standard usage of the Requests library is not affected by this vulner (requirements.txt:None)

### osv-scanner (v2.3.8) — Caution / 65.0

- **[medium] PYSEC-2026-2151 — PyPI flask@3.1.2** — aliases: CVE-2026-27205, GHSA-68rp-wp8r-4726, PYSEC-2026-2151 \| CVSS: 4.3 (/repo/requirements-dev.txt:None)
- **[medium] PYSEC-2026-1845 — PyPI pytest@8.4.2** — aliases: CVE-2025-71176, GHSA-6w46-j5rx-g56g, PYSEC-2026-1845 \| CVSS: 6.8 (/repo/requirements-dev.txt:None)
- **[medium] PYSEC-2026-1872 — PyPI requests@2.32.3** — aliases: CVE-2024-47081, GHSA-9hjg-9r4m-mvj7, PYSEC-2026-1872 \| CVSS: 5.3 (/repo/requirements-dev.txt:None)
- **[medium] PYSEC-2026-2275 — PyPI requests@2.32.3** — aliases: CVE-2026-25645, GHSA-gc5v-m9x4-r6x2, PYSEC-2026-2275 \| CVSS: 5.5 (/repo/requirements-dev.txt:None)
- **[medium] PYSEC-2026-2151 — PyPI flask@3.1.2** — aliases: CVE-2026-27205, GHSA-68rp-wp8r-4726, PYSEC-2026-2151 \| CVSS: 4.3 (/repo/requirements.txt:None)
- **[medium] PYSEC-2026-1872 — PyPI requests@2.32.3** — aliases: CVE-2024-47081, GHSA-9hjg-9r4m-mvj7, PYSEC-2026-1872 \| CVSS: 5.3 (/repo/requirements.txt:None)
- **[medium] PYSEC-2026-2275 — PyPI requests@2.32.3** — aliases: CVE-2026-25645, GHSA-gc5v-m9x4-r6x2, PYSEC-2026-2275 \| CVSS: 5.5 (/repo/requirements.txt:None)

### trivy_image (v0.71.0) — unavailable / n/a

No findings.

## 4. Threat Model

Threat model synthesis has not yet run for this scan. This section is generated by the registry's LLM pipeline (Req 22.3) and will appear in the next regeneration of this report.

## 5. Audit Chain

- **Scan job:** `8ed9bf54-c96b-4e50-b59e-eccdedd71a6c`
- **Completed:** 2026-07-31T11:51:10.808876+00:00
- **Scanner base image:** `us-central1-docker.pkg.dev/nerlo-vsk-prod/nerlo/scanner-base@sha256:04d4ebff19b52711a0fc06336d25964d24b9072474ff98811e5b82af008f1b8d`
- **AI decision log entries:** 2
  - `a4da518b-56bf-4014-9f25-ea73c4be4e04`
  - `5116c1a5-afac-489d-8b85-47cfb7206dc8`

## 6. Appendix — Raw Scanner Output

```json
[
  {
    "scanner_name": "agentshield",
    "scanner_version": "1.4.0",
    "score": 100.0,
    "scanner_badge": "Verified",
    "findings": [],
    "execution_duration_seconds": 1.3844813070027158,
    "status": "complete",
    "examined": null,
    "metadata": {
      "source": "npm",
      "source_url": "https://www.npmjs.com/package/ecc-agentshield",
      "install_command": "npm install -g ecc-agentshield@1.4.0",
      "scans_performed": [
        "claude_config"
      ],
      "score_breakdown": {
        "mcp": 100,
        "hooks": 100,
        "agents": 100,
        "secrets": 100,
        "permissions": 100
      }
    },
    "display_score": 100.0,
    "display_badge": "Verified"
  },
  {
    "scanner_name": "cisco-skill-scanner",
    "scanner_version": "2.0.11",
    "score": 14.5,
    "scanner_badge": "Unsafe",
    "findings": [
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "low",
        "category": "social_engineering",
        "file_path": "/repo/.claude/skills/diagrams/SKILL.md",
        "line_number": null,
        "rule_identifier": "SOCIAL_ENG_VAGUE_DESCRIPTION",
        "title": "Vague skill description",
        "description": "Skill description is too short (16 chars). Provide detailed explanation.",
        "remediation": "Provide a clear, detailed description of what the skill does and when to use it"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "informational",
        "category": "policy_violation",
        "file_path": "/repo/.claude/skills/diagrams/SKILL.md",
        "line_number": null,
        "rule_identifier": "MANIFEST_MISSING_LICENSE",
        "title": "Skill does not specify a license",
        "description": "Skill manifest does not include a 'license' field. Specifying a license helps users understand usage terms.",
        "remediation": "Add 'license' field to SKILL.md frontmatter (e.g., MIT, Apache-2.0)"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "informational",
        "category": "policy_violation",
        "file_path": "/repo/.claude/skills/archdoc/SKILL.md",
        "line_number": null,
        "rule_identifier": "MANIFEST_MISSING_LICENSE",
        "title": "Skill does not specify a license",
        "description": "Skill manifest does not include a 'license' field. Specifying a license helps users understand usage terms.",
        "remediation": "Add 'license' field to SKILL.md frontmatter (e.g., MIT, Apache-2.0)"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "medium",
        "category": "unauthorized_tool_use",
        "file_path": "/repo/repo/README.md",
        "line_number": null,
        "rule_identifier": "TOOL_ABUSE_UNDECLARED_NETWORK",
        "title": "Undeclared network usage",
        "description": "Skill code uses network libraries but doesn't declare network requirement",
        "remediation": "Declare network usage in compatibility field or remove network calls"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "low",
        "category": "social_engineering",
        "file_path": "/repo/SKILL.md",
        "line_number": null,
        "rule_identifier": "SOCIAL_ENG_VAGUE_DESCRIPTION",
        "title": "Vague skill description",
        "description": "Skill description is too short (16 chars). Provide detailed explanation.",
        "remediation": "Provide a clear, detailed description of what the skill does and when to use it"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "informational",
        "category": "policy_violation",
        "file_path": "/repo/SKILL.md",
        "line_number": null,
        "rule_identifier": "MANIFEST_MISSING_LICENSE",
        "title": "Skill does not specify a license",
        "description": "Skill manifest does not include a 'license' field. Specifying a license helps users understand usage terms.",
        "remediation": "Add 'license' field to SKILL.md frontmatter (e.g., MIT, Apache-2.0)"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "medium",
        "category": "data_exfiltration",
        "file_path": "/repo/tvt/ai/paragrapher.py",
        "line_number": 50,
        "rule_identifier": "DATA_EXFIL_NETWORK_REQUESTS",
        "title": "Outbound network request primitives that can transmit data externally",
        "description": "Pattern detected: requests.post(",
        "remediation": "Ensure network operations are necessary and document allowed destinations"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "medium",
        "category": "data_exfiltration",
        "file_path": "/repo/tvt/ai/screenshot_selector.py",
        "line_number": 41,
        "rule_identifier": "DATA_EXFIL_NETWORK_REQUESTS",
        "title": "Outbound network request primitives that can transmit data externally",
        "description": "Pattern detected: requests.post(",
        "remediation": "Ensure network operations are necessary and document allowed destinations"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "medium",
        "category": "data_exfiltration",
        "file_path": "/repo/tvt/ai/summarizer.py",
        "line_number": 40,
        "rule_identifier": "DATA_EXFIL_NETWORK_REQUESTS",
        "title": "Outbound network request primitives that can transmit data externally",
        "description": "Pattern detected: requests.post(",
        "remediation": "Ensure network operations are necessary and document allowed destinations"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "medium",
        "category": "data_exfiltration",
        "file_path": "/repo/tvt/azure/ai/translate.py",
        "line_number": 40,
        "rule_identifier": "DATA_EXFIL_NETWORK_REQUESTS",
        "title": "Outbound network request primitives that can transmit data externally",
        "description": "Pattern detected: requests.get(",
        "remediation": "Ensure network operations are necessary and document allowed destinations"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "medium",
        "category": "data_exfiltration",
        "file_path": "/repo/tvt/azure/ai/translate.py",
        "line_number": 62,
        "rule_identifier": "DATA_EXFIL_NETWORK_REQUESTS",
        "title": "Outbound network request primitives that can transmit data externally",
        "description": "Pattern detected: requests.post(",
        "remediation": "Ensure network operations are necessary and document allowed destinations"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "medium",
        "category": "data_exfiltration",
        "file_path": "/repo/tvt/azure/ai/video_to_text.py",
        "line_number": 39,
        "rule_identifier": "DATA_EXFIL_NETWORK_REQUESTS",
        "title": "Outbound network request primitives that can transmit data externally",
        "description": "Pattern detected: requests.post(",
        "remediation": "Ensure network operations are necessary and document allowed destinations"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "medium",
        "category": "data_exfiltration",
        "file_path": "/repo/tvt/azure/ai/video_to_text.py",
        "line_number": 52,
        "rule_identifier": "DATA_EXFIL_NETWORK_REQUESTS",
        "title": "Outbound network request primitives that can transmit data externally",
        "description": "Pattern detected: requests.post(",
        "remediation": "Ensure network operations are necessary and document allowed destinations"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "high",
        "category": "resource_abuse",
        "file_path": "/repo/tvt/azure/ai/video_to_text.py",
        "line_number": 70,
        "rule_identifier": "RESOURCE_ABUSE_INFINITE_LOOP",
        "title": "Infinite loop without clear exit condition",
        "description": "Pattern detected: while True:",
        "remediation": "Add proper exit conditions or limits to loops"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "medium",
        "category": "data_exfiltration",
        "file_path": "/repo/tvt/azure/ai/video_to_text.py",
        "line_number": 71,
        "rule_identifier": "DATA_EXFIL_NETWORK_REQUESTS",
        "title": "Outbound network request primitives that can transmit data externally",
        "description": "Pattern detected: requests.get(",
        "remediation": "Ensure network operations are necessary and document allowed destinations"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "medium",
        "category": "data_exfiltration",
        "file_path": "/repo/tvt/media/downloader.py",
        "line_number": 26,
        "rule_identifier": "DATA_EXFIL_NETWORK_REQUESTS",
        "title": "Outbound network request primitives that can transmit data externally",
        "description": "Pattern detected: requests.get(",
        "remediation": "Ensure network operations are necessary and document allowed destinations"
      },
      {
        "tool_name": "cisco-skill-scanner",
        "severity": "high",
        "category": "resource_abuse",
        "file_path": "/repo/tvt/temporal/activities.py",
        "line_number": 42,
        "rule_identifier": "RESOURCE_ABUSE_INFINITE_LOOP",
        "title": "Infinite loop without clear exit condition",
        "description": "Pattern detected: while True:",
        "remediation": "Add proper exit conditions or limits to loops"
      }
    ],
    "execution_duration_seconds": 17.199760329996934,
    "status": "complete",
    "examined": {
      "unit": "skills",
      "count": 3
    },
    "metadata": {
      "source": "pypi",
      "source_url": "https://pypi.org/project/cisco-ai-skill-scanner/2.0.11/",
      "report_type": "cisco-skill-sast",
      "analyzers_used": [
        "bytecode",
        "pipeline",
        "static_analyzer"
      ],
      "skills_scanned": [
        "diagrams",
        "archdoc",
        "repo"
      ],
      "install_command": "pip install --require-hashes -r docker/scanner-base/cisco-skill-scanner/requirements.txt",
      "severity_counts": {
        "low": 2,
        "high": 2,
        "medium": 10,
        "critical": 0,
        "informational": 3
      },
      "artifact_type_policy": "claude_skill"
    },
    "display_score": 14.5,
    "display_badge": "Unsafe"
  },
  {
    "scanner_name": "agent-audit-kit",
    "scanner_version": "0.3.26",
    "score": 100.0,
    "scanner_badge": "Verified",
    "findings": [],
    "execution_duration_seconds": 3.5657429799903184,
    "status": "complete",
    "examined": {
      "unit": "files",
      "count": 52
    },
    "metadata": {
      "source": "pypi",
      "source_url": "https://pypi.org/project/agent-audit-kit/0.3.26/",
      "report_type": "agent-audit-kit-sast",
      "install_command": "pip install --require-hashes -r docker/scanner-base/agent-audit-kit/requirements.txt",
      "rules_evaluated": 211
    },
    "display_score": 100.0,
    "display_badge": "Verified"
  },
  {
    "scanner_name": "nerlo-behavioral",
    "scanner_version": "0.1.0",
    "score": 10.0,
    "scanner_badge": "Unsafe",
    "findings": [
      {
        "tool_name": "nerlo-behavioral",
        "severity": "high",
        "category": "data-exfiltration",
        "file_path": "/repo/tvt/ai/summarizer.py",
        "line_number": 40,
        "rule_identifier": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "title": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "description": "A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host.",
        "remediation": null
      },
      {
        "tool_name": "nerlo-behavioral",
        "severity": "high",
        "category": "data-exfiltration",
        "file_path": "/repo/tvt/azure/ai/translate.py",
        "line_number": 40,
        "rule_identifier": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "title": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "description": "A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host.",
        "remediation": null
      },
      {
        "tool_name": "nerlo-behavioral",
        "severity": "high",
        "category": "data-exfiltration",
        "file_path": "/repo/tvt/azure/ai/translate.py",
        "line_number": 62,
        "rule_identifier": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "title": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "description": "A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host.",
        "remediation": null
      },
      {
        "tool_name": "nerlo-behavioral",
        "severity": "high",
        "category": "data-exfiltration",
        "file_path": "/repo/tvt/azure/ai/video_to_text.py",
        "line_number": 39,
        "rule_identifier": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "title": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "description": "A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host.",
        "remediation": null
      },
      {
        "tool_name": "nerlo-behavioral",
        "severity": "high",
        "category": "data-exfiltration",
        "file_path": "/repo/tvt/azure/ai/video_to_text.py",
        "line_number": 52,
        "rule_identifier": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "title": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "description": "A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host.",
        "remediation": null
      },
      {
        "tool_name": "nerlo-behavioral",
        "severity": "high",
        "category": "data-exfiltration",
        "file_path": "/repo/tvt/azure/ai/video_to_text.py",
        "line_number": 71,
        "rule_identifier": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "title": "opt.nerlo-rules.nerlo-py-secret-to-network-egress",
        "description": "A secret / environment variable / token value flows into a network request (requests / httpx / urllib / socket). This is the postmark-mcp supply-chain exfiltration shape: a credential read from the environment is shipped off-box. Confirm the egress is expected and the value is not being exfiltrated to an attacker-controlled host.",
        "remediation": null
      }
    ],
    "execution_duration_seconds": 32.42355161999876,
    "status": "complete",
    "examined": {
      "unit": "files",
      "count": 26
    },
    "metadata": {
      "source": "nerlo-original",
      "source_url": "https://github.com/nerlo-ai/nerlo",
      "report_type": "nerlo-behavioral",
      "ruleset_path": "/opt/nerlo-rules/exfiltration.yaml",
      "ruleset_paths": [
        "/opt/nerlo-rules/exfiltration.yaml",
        "/opt/nerlo-rules/clipboard_exfiltration.yaml",
        "/opt/nerlo-rules/rce_endpoint.yaml",
        "/opt/nerlo-rules/taint_egress.yaml"
      ],
      "install_command": "pip install 'semgrep==1.97.0'",
      "severity_counts": {
        "low": 0,
        "high": 6,
        "medium": 0,
        "critical": 0,
        "informational": 0
      },
      "merged_invocation": true
    },
    "display_score": 10.0,
    "display_badge": "Unsafe"
  },
  {
    "scanner_name": "nerlo-install-instruction",
    "scanner_version": "0.1.0",
    "score": 95.0,
    "scanner_badge": "Verified",
    "findings": [
      {
        "tool_name": "nerlo-install-instruction",
        "severity": "medium",
        "category": "install-instruction-run",
        "file_path": "/repo/.claude/skills/diagrams/SKILL.md",
        "line_number": 32,
        "rule_identifier": "opt.nerlo-rules.nerlo-install-run-bundled-artifact",
        "title": "opt.nerlo-rules.nerlo-install-run-bundled-artifact",
        "description": "Documentation instructs running or double-clicking a bundled/opaque artifact (e.g. \"run resource.txt\", \"execute install.sh\", \"double-click setup.exe\"). This is the FakeGit README shape, where the payload ships as a file the docs tell you to run. Verify the artifact is inspectable and expected \u2014 opaque bundled executables directed by docs warrant review.",
        "remediation": null
      }
    ],
    "execution_duration_seconds": 32.42610286800482,
    "status": "complete",
    "examined": {
      "unit": "files",
      "count": 5
    },
    "metadata": {
      "source": "nerlo-original",
      "source_url": "https://github.com/nerlo-ai/nerlo",
      "report_type": "nerlo-install-instruction",
      "ruleset_path": "/opt/nerlo-rules/install_instructions.yaml",
      "ruleset_paths": [
        "/opt/nerlo-rules/install_instructions.yaml",
        "/opt/nerlo-rules/cursor_rules.yaml"
      ],
      "install_command": "pip install 'semgrep==1.97.0'",
      "severity_counts": {
        "low": 0,
        "high": 0,
        "medium": 1,
        "critical": 0,
        "informational": 0
      },
      "merged_invocation": true
    },
    "display_score": 95.0,
    "display_badge": "Verified"
  },
  {
    "scanner_name": "nerlo-multi-source",
    "scanner_version": "0.1.0",
    "score": 100.0,
    "scanner_badge": "Verified",
    "findings": [],
    "execution_duration_seconds": 11.014354249011376,
    "status": "not_applicable",
    "examined": null,
    "metadata": {
      "source": "nerlo-original",
      "per_source": [],
      "report_type": "nerlo-multi-source",
      "diverged_sources": [],
      "published_surfaces_scanned": 0
    },
    "display_score": null,
    "display_badge": "unavailable"
  },
  {
    "scanner_name": "trivy",
    "scanner_version": "0.71.0",
    "score": 88.0,
    "scanner_badge": "Verified",
    "findings": [
      {
        "tool_name": "trivy",
        "severity": "low",
        "category": "pip",
        "file_path": "requirements.txt",
        "line_number": null,
        "rule_identifier": "CVE-2026-27205",
        "title": "flask: Flask: Information disclosure via improper caching of session data",
        "description": "Flask is a web server gateway interface (WSGI) web application framework. In versions 3.1.2 and below, when the session object is accessed, Flask should set the Vary: Cookie header., resulting in a Use of Cache Containing Sensitive Information vulnerability. The logic instructs caches not to cache the response, as it may contain information specific to a logged in user. This is handled in most cases, but some forms of access such as the Python in operator were overlooked. The severity and risk d",
        "remediation": "Upgrade flask from 3.1.2 to 3.1.3 or later"
      },
      {
        "tool_name": "trivy",
        "severity": "medium",
        "category": "pip",
        "file_path": "requirements.txt",
        "line_number": null,
        "rule_identifier": "CVE-2024-47081",
        "title": "requests: Requests vulnerable to .netrc credentials leak via malicious URLs",
        "description": "Requests is a HTTP library. Due to a URL parsing issue, Requests releases prior to 2.32.4 may leak .netrc credentials to third parties for specific maliciously-crafted URLs. Users should upgrade to version 2.32.4 to receive a fix. For older versions of Requests, use of the .netrc file can be disabled with `trust_env=False` on one's Requests Session.",
        "remediation": "Upgrade requests from 2.32.3 to 2.32.4 or later"
      },
      {
        "tool_name": "trivy",
        "severity": "medium",
        "category": "pip",
        "file_path": "requirements.txt",
        "line_number": null,
        "rule_identifier": "CVE-2026-25645",
        "title": "requests: Requests: Security bypass due to predictable temporary file creation",
        "description": "Requests is a HTTP library. Prior to version 2.33.0, the `requests.utils.extract_zipped_paths()` utility function uses a predictable filename when extracting files from zip archives into the system temporary directory. If the target file already exists, it is reused without validation. A local attacker with write access to the temp directory could pre-create a malicious file that would be loaded in place of the legitimate one. Standard usage of the Requests library is not affected by this vulner",
        "remediation": "Upgrade requests from 2.32.3 to 2.33.0 or later"
      }
    ],
    "execution_duration_seconds": 0.6184948580048513,
    "status": "complete",
    "examined": {
      "unit": "manifests",
      "count": 1
    },
    "metadata": {
      "source": "github-releases",
      "source_url": "https://github.com/aquasecurity/trivy/releases/tag/v0.71.0",
      "report_type": "filesystem-vulnerability",
      "install_command": "curl -sfL -o /tmp/trivy.deb https://github.com/aquasecurity/trivy/releases/download/v0.71.0/trivy_0.71.0_Linux-64bit.deb && echo '<sha256>  /tmp/trivy.deb' | sha256sum -c - && dpkg -i /tmp/trivy.deb",
      "severity_counts": {
        "low": 1,
        "high": 0,
        "medium": 2,
        "critical": 0,
        "informational": 0
      },
      "manifests_scanned": [
        "requirements.txt"
      ]
    },
    "display_score": 88.0,
    "display_badge": "Verified"
  },
  {
    "scanner_name": "osv-scanner",
    "scanner_version": "2.3.8",
    "score": 65.0,
    "scanner_badge": "Caution",
    "findings": [
      {
        "tool_name": "osv-scanner",
        "severity": "medium",
        "category": "PyPI",
        "file_path": "/repo/requirements-dev.txt",
        "line_number": null,
        "rule_identifier": "PYSEC-2026-2151",
        "title": "PYSEC-2026-2151 \u2014 PyPI flask@3.1.2",
        "description": "aliases: CVE-2026-27205, GHSA-68rp-wp8r-4726, PYSEC-2026-2151 | CVSS: 4.3",
        "remediation": null
      },
      {
        "tool_name": "osv-scanner",
        "severity": "medium",
        "category": "PyPI",
        "file_path": "/repo/requirements-dev.txt",
        "line_number": null,
        "rule_identifier": "PYSEC-2026-1845",
        "title": "PYSEC-2026-1845 \u2014 PyPI pytest@8.4.2",
        "description": "aliases: CVE-2025-71176, GHSA-6w46-j5rx-g56g, PYSEC-2026-1845 | CVSS: 6.8",
        "remediation": null
      },
      {
        "tool_name": "osv-scanner",
        "severity": "medium",
        "category": "PyPI",
        "file_path": "/repo/requirements-dev.txt",
        "line_number": null,
        "rule_identifier": "PYSEC-2026-1872",
        "title": "PYSEC-2026-1872 \u2014 PyPI requests@2.32.3",
        "description": "aliases: CVE-2024-47081, GHSA-9hjg-9r4m-mvj7, PYSEC-2026-1872 | CVSS: 5.3",
        "remediation": null
      },
      {
        "tool_name": "osv-scanner",
        "severity": "medium",
        "category": "PyPI",
        "file_path": "/repo/requirements-dev.txt",
        "line_number": null,
        "rule_identifier": "PYSEC-2026-2275",
        "title": "PYSEC-2026-2275 \u2014 PyPI requests@2.32.3",
        "description": "aliases: CVE-2026-25645, GHSA-gc5v-m9x4-r6x2, PYSEC-2026-2275 | CVSS: 5.5",
        "remediation": null
      },
      {
        "tool_name": "osv-scanner",
        "severity": "medium",
        "category": "PyPI",
        "file_path": "/repo/requirements.txt",
        "line_number": null,
        "rule_identifier": "PYSEC-2026-2151",
        "title": "PYSEC-2026-2151 \u2014 PyPI flask@3.1.2",
        "description": "aliases: CVE-2026-27205, GHSA-68rp-wp8r-4726, PYSEC-2026-2151 | CVSS: 4.3",
        "remediation": null
      },
      {
        "tool_name": "osv-scanner",
        "severity": "medium",
        "category": "PyPI",
        "file_path": "/repo/requirements.txt",
        "line_number": null,
        "rule_identifier": "PYSEC-2026-1872",
        "title": "PYSEC-2026-1872 \u2014 PyPI requests@2.32.3",
        "description": "aliases: CVE-2024-47081, GHSA-9hjg-9r4m-mvj7, PYSEC-2026-1872 | CVSS: 5.3",
        "remediation": null
      },
      {
        "tool_name": "osv-scanner",
        "severity": "medium",
        "category": "PyPI",
        "file_path": "/repo/requirements.txt",
        "line_number": null,
        "rule_identifier": "PYSEC-2026-2275",
        "title": "PYSEC-2026-2275 \u2014 PyPI requests@2.32.3",
        "description": "aliases: CVE-2026-25645, GHSA-gc5v-m9x4-r6x2, PYSEC-2026-2275 | CVSS: 5.5",
        "remediation": null
      }
    ],
    "execution_duration_seconds": 3.4816047019994585,
    "status": "complete",
    "examined": {
      "unit": "manifests",
      "count": 2
    },
    "metadata": {
      "source": "github-releases",
      "source_url": "https://github.com/google/osv-scanner/releases/tag/v2.3.8",
      "report_type": "osv-vulnerability",
      "ecosystems_seen": [
        "PyPI"
      ],
      "install_command": "curl -sfL -o /usr/local/bin/osv-scanner https://github.com/google/osv-scanner/releases/download/v2.3.8/osv-scanner_linux_amd64 && echo '<sha256>  /usr/local/bin/osv-scanner' | sha256sum -c - && chmod +x /usr/local/bin/osv-scanner",
      "severity_counts": {
        "low": 0,
        "high": 0,
        "medium": 7,
        "critical": 0,
        "informational": 0
      },
      "manifests_scanned": [
        "/repo/requirements-dev.txt",
        "/repo/requirements.txt"
      ],
      "finding_id_aliases": {
        "PYSEC-2026-1845": [
          "CVE-2025-71176",
          "GHSA-6w46-j5rx-g56g"
        ],
        "PYSEC-2026-1872": [
          "CVE-2024-47081",
          "GHSA-9hjg-9r4m-mvj7",
          "CVE-2024-47081",
          "GHSA-9hjg-9r4m-mvj7"
        ],
        "PYSEC-2026-2151": [
          "CVE-2026-27205",
          "GHSA-68rp-wp8r-4726",
          "CVE-2026-27205",
          "GHSA-68rp-wp8r-4726"
        ],
        "PYSEC-2026-2275": [
          "CVE-2026-25645",
          "GHSA-gc5v-m9x4-r6x2",
          "CVE-2026-25645",
          "GHSA-gc5v-m9x4-r6x2"
        ]
      },
      "cross_scanner_correlation": {
        "only_osv": [
          "PYSEC-2026-1845"
        ],
        "only_trivy": [],
        "intersection_ids": [
          "CVE-2024-47081",
          "CVE-2026-25645",
          "CVE-2026-27205"
        ]
      }
    },
    "display_score": 65.0,
    "display_badge": "Caution"
  },
  {
    "scanner_name": "trivy_image",
    "scanner_version": "0.71.0",
    "score": 100.0,
    "scanner_badge": "Verified",
    "findings": [],
    "execution_duration_seconds": 8.131099457386881e-05,
    "status": "not_applicable",
    "examined": {
      "unit": "image_targets",
      "count": 0
    },
    "metadata": {
      "reason": "no OCI image acquired for this artifact"
    },
    "display_score": null,
    "display_badge": "unavailable"
  }
]
```
