diff --git a/security/reports/README.md b/security/reports/README.md
new file mode 100644
index 0000000..604f1e5
--- /dev/null
+++ b/security/reports/README.md
@@ -0,0 +1,9 @@
+# Security HTML reports
+
+Tracked outputs from the multi-scanner CVE automation:
+
+- `cve-report.html` — consolidated scanner status and findings
+- `human-review.html` — FIX/IGNORE recommendations for items that need code or process changes
+
+Machine-readable JSON/SBOM artifacts are written to the `security-reports/` directory (ignored by Git) locally via `make security-scan`.
+OpenVEX acceptances live in `security/vex/fastworkflow.openvex.json`.
diff --git a/security/reports/cve-report.html b/security/reports/cve-report.html
new file mode 100644
index 0000000..d2c96b7
--- /dev/null
+++ b/security/reports/cve-report.html
@@ -0,0 +1,87 @@
+
+
+
+
+
+ Executive summary
+
+
1Python advisory (diskcache)
+
0Fixable via pyproject.toml
+
0Open Python vulns after OpenVEX
+
24Proxy-image High/Critical rows (not product)
+
+ Easy third-party package bumps: none. Full OSV sweep of 141 locked PyPI packages found only diskcache==5.6.3, and PyPI still has no patched release (latest remains 5.6.3). Existing floors in pyproject.toml already cover prior CVE sets (litellm, multipart, starlette, cryptography, etc.). v2.31.0 dependency graph change (speedict→sqlite3 stdlib) introduced no new PyPI advisories.
+
+
+ Scanner run status
+
+ | Tool | Status | Notes |
+
+| Syft | OK | SBOM generated from poetry.lock (JSON/table/SPDX) |
+| Trivy | OK | FS/lockfile scan: 1 MEDIUM (diskcache), suppressed via OpenVEX → 0 open |
+| Grype | OK | SBOM scan: 1 MEDIUM (diskcache); with OpenVEX → 0 matches (1 ignoredMatch) |
+| osv-scanner | OK | poetry.lock: 1 MEDIUM (diskcache / CVE-2025-69872 / PYSEC-2026-2447); no fixed version |
+| pip-audit | OK | PyPI advisory service reports clean (OSV/GHSA still flag diskcache; service lag). Corroborates no other PyPI vulns. |
+| Snyk | SKIPPED | SNYK_TOKEN not configured (CLI v1.1306.3 installed) |
+| Docker Scout | SKIPPED | Docker Hub login required for scout CLI (plugin v1.24.0 installed) |
+| Dockle | OK (proxy image) | python:3.13-slim-bookworm — CIS-DI-0001 (WARN), CIS-DI-0005 (INFO), CIS-DI-0006 (INFO), CIS-DI-0008 (INFO); no first-party Dockerfile |
+| Dive | OK (proxy image) | python:3.13-slim-bookworm efficiency≈96.8651%; repo has no first-party Dockerfile |
+
+
+
+
+ Python / poetry.lock findings (pre-VEX)
+
+ | CVE / ID | Package | Version | Severity | Fixed in | Summary | Detected by |
+ | CVE-2025-69872 | diskcache | 5.6.3 | MEDIUM | None (no release) | DiskCache has unsafe pickle deserialization | osv-scanner, trivy, grype |
+
+ With security/vex/fastworkflow.openvex.json, Trivy and Grype report a clean poetry.lock. See human-review report for Fix/Ignore decision.
+
+
+ Proxy image High/Critical (python:3.13-slim-bookworm)
+ Included because Dockle/Dive/Scout/image scanners require an image and this repo has no Dockerfile. These are distro CVEs in a stand-in base image — not shipped by fastWorkflow. Image tag updated to Python 3.13 to match the v2.31.0 runtime floor.
+ Severity totals — Critical: 6 rows / 6 unique CVEs; High: 18 rows / 8 unique CVEs
+
+ | Sev | ID | Package | Installed | Fixed | Title |
+
+| CRITICAL | CVE-2023-45853 | zlib1g | 1:1.2.13.dfsg-1 | — | zlib: integer overflow and resultant heap-based buffer overflow in zipOpenNewFileInZip4_6 |
| CRITICAL | CVE-2025-7458 | libsqlite3-0 | 3.40.1-2+deb12u2 | — | sqlite: SQLite integer overflow |
| CRITICAL | CVE-2026-13221 | perl-base | 5.36.0-7+deb12u3 | — | Perl versions through 5.43.9 produce silently incorrect regular expres ... |
| CRITICAL | CVE-2026-42496 | perl-base | 5.36.0-7+deb12u3 | — | perl-archive-tar: perl-archive-tar: Path traversal via crafted symlinks allows arbitrary file access |
| CRITICAL | CVE-2026-57433 | perl-base | 5.36.0-7+deb12u3 | — | Storable versions before 3.41 for Perl have a signed integer overflow ... |
| CRITICAL | CVE-2026-8376 | perl-base | 5.36.0-7+deb12u3 | — | perl: Perl: Heap buffer overflow when compiling regular expressions on 32-bit builds |
| HIGH | CVE-2025-69720 | libncursesw6 | 6.4-4 | — | ncurses: ncurses: Buffer overflow vulnerability may lead to arbitrary code execution. |
| HIGH | CVE-2026-41992 | gzip | 1.12-1 | — | GNU gzip contains a global buffer overflow vulnerability in the LZH de ... |
| HIGH | CVE-2026-42497 | perl-base | 5.36.0-7+deb12u3 | — | perl-Archive-Tar: perl-Archive-Tar: Arbitrary file modification via crafted hardlinks during archive |
| HIGH | CVE-2026-48962 | perl-base | 5.36.0-7+deb12u3 | — | perl-IO-Compress: perl-IO-Compress: Arbitrary code execution via attacker-controlled output glob |
| HIGH | CVE-2026-53615 | bsdutils | 1:2.38.1-5+deb12u3 | — | [Integer Overflow or Wraparound in libblkid/src/partitions/dos.c] |
| HIGH | CVE-2026-54369 | libacl1 | 2.3.1-3 | — | acl: Symlink traversal privilege escalation via libacl functions |
| HIGH | CVE-2026-57432 | perl-base | 5.36.0-7+deb12u3 | — | perl: Perl: Information disclosure via integer overflow in pack/unpack operations |
| HIGH | CVE-2026-9538 | perl-base | 5.36.0-7+deb12u3 | — | perl-Archive-Tar: perl-Archive-Tar: Denial of Service via crafted tar header with large entry size |
+
+
+
+
+ Artifacts
+ Machine-readable outputs (gitignored): security-reports/ — syft/grype/trivy/osv-scanner/dockle/dive JSON+text. Tracked OpenVEX: security/vex/fastworkflow.openvex.json. Human-review HTML: security/reports/human-review.html.
+
+
+
+
diff --git a/security/reports/human-review.html b/security/reports/human-review.html
new file mode 100644
index 0000000..ad028f2
--- /dev/null
+++ b/security/reports/human-review.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+ IGNORE
+ Unsafe pickle deserialization in DiskCache
+ ID: CVE-2025-69872 / GHSA-w8v5-vhqr-4h9v / PYSEC-2026-2447
+ Component: diskcache 5.6.3 (transitive via dspy)
+ Why a code / process change (not pyproject alone)
+ No patched PyPI release exists (latest still 5.6.3 as of 2026-08-09 00:03 UTC). A pyproject.toml bump cannot remediate. Mitigation would require application changes (disable DSPy disk cache, relocate/harden cache dir permissions, or wait for upstream non-pickle default).
+ Rationale
+ Already documented in security/vex/fastworkflow.openvex.json as not_affected with justification vulnerable_code_cannot_be_controlled_by_adversary. Exploitation requires write access to the process-local DSPy cache directory; remote API/MCP clients cannot write that path. An adversary who can write as the service user already has equivalent privilege to pickle RCE. Re-evaluate if cache directory is shared across trust boundaries or world-writable. When upstream ships a fix, add a floor constraint in pyproject.toml.
+
+
+ IGNORE
+ 6 Critical / 8 High unique CVEs on proxy scan image
+ ID: Proxy base image OS CVEs (Trivy on python:3.13-slim-bookworm)
+ Component: Debian bookworm packages in python:3.13-slim-bookworm (not shipped by this repo)
+ Why a code / process change (not pyproject alone)
+ This repository has no Dockerfile. Image CVEs are in distro packages (perl, libc, sqlite, etc.) and cannot be fixed via pyproject.toml. Remediation would mean publishing and maintaining a hardened runtime image, then refreshing base tags / applying distro patches.
+ Rationale
+ fastWorkflow is distributed as a PyPI package, not a container image. Proxy image scan was performed only to exercise Dockle/Dive/Trivy-image as required by the automation. Do not treat these OS CVEs as product vulnerabilities until a first-party image is published. If/when a Dockerfile is added, pin a maintained base and rebuild on distro security updates. Note: proxy image was updated from 3.12 to 3.13-slim-bookworm to align with the Python 3.13+ requirement from PR #61.
+
+
+ IGNORE
+ Container runs as root; no HEALTHCHECK; content trust unset
+ ID: Dockle CIS-DI-0001 (and related INFO findings)
+ Component: python:3.13-slim-bookworm proxy image
+ Why a code / process change (not pyproject alone)
+ Requires Dockerfile USER/HEALTHCHECK instructions and deployment content-trust policy — not addressable in pyproject.toml.
+ Rationale
+ Findings apply to the proxy base image used for scanner coverage, not a shipped fastWorkflow image. Track as image-hardening requirements when a first-party Dockerfile is introduced.
+
+
+ pyproject.toml easy-fix outcome
+ No third-party package vulnerability in the locked graph had a fixed version available on PyPI. Therefore this PR does not change dependency pins for CVE remediation. Prior release work (through v2.31.0) already raised floors for litellm, python-multipart, starlette, cryptography, aiohttp, urllib3, requests, setuptools, and related packages. The PR #61 speedict→sqlite3 migration removed a third-party dependency and did not introduce new PyPI advisories.
+ Optional follow-ups (not done here): add SNYK_TOKEN / Docker Hub auth for Scout; publish a first-party runtime Dockerfile if container CVEs should become product backlog. Refresh after merge of PR #61 (v2.31.0).
+
+
+
+
diff --git a/security/vex/fastworkflow.openvex.json b/security/vex/fastworkflow.openvex.json
index 28ed460..4441b8f 100644
--- a/security/vex/fastworkflow.openvex.json
+++ b/security/vex/fastworkflow.openvex.json
@@ -3,8 +3,8 @@
"@id": "https://github.com/radiantlogicinc/fastworkflow/security/vex/fastworkflow.openvex.json",
"author": "fastworkflow maintainers