diff --git a/docs/research/2026-09-13-scanning-vestigial-review.md b/docs/research/2026-09-13-scanning-vestigial-review.md new file mode 100644 index 00000000..fbfc1e3d --- /dev/null +++ b/docs/research/2026-09-13-scanning-vestigial-review.md @@ -0,0 +1,61 @@ +# Scanning-pipeline correction — September 13, 2026 + +Scope: issue #632, the linked workflow's job dependencies, aggregate gate and +interpretation of the performance table, plus its adjacent universal action-pinning claim. This is a bounded correction to the +October 6, 2025 article, not a complete archive or gist re-audit. The original URL +and publication date remain; `lastUpdate` and a visible correction identify this +review date. No gist or mirror was edited. + +## Canonical source inspection + +Read the complete canonical workflow through GitHub's gist API at all three +published revisions. Gist creation is November 1, 2025, after the article date; +that establishes artifact availability, not the date its underlying code was +first written or evidence of fabricated experience. + +| Revision | Gist commit date | Gate observed | +| --- | --- | --- | +| [bf17f1a](https://gist.github.com/williamzujkowski/8185611a406dd91806f37d51778cdd16/bf17f1a749c35b88bdc1a1f5d77748dd1daaf63c) | 2025-11-01 | Echo plus comments, no result evaluation. | +| [a2ef3b7](https://gist.github.com/williamzujkowski/8185611a406dd91806f37d51778cdd16/a2ef3b7e0e070a7bbc4cf9a669ec0d9937e10c44) | 2026-08-18 | Reads each `needs` result; fails unless every result is `success`. | +| [b8c467b](https://gist.github.com/williamzujkowski/8185611a406dd91806f37d51778cdd16/b8c467be7577d2280bc2f5fea388cb9109555121) | 2026-08-23 | Same aggregate result evaluation. | + +Both follower jobs declare `needs: dependency-scan` and do not depend on each +other. The final gate needs all three and uses `if: always()`. The gate checks job +status, not SARIF contents, so it cannot add a failure policy to an advisory +scanner. Checked this reading against GitHub's +[job dependency documentation](https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-jobs#defining-prerequisite-jobs) +and [expression documentation](https://docs.github.com/en/actions/reference/workflows-and-actions/expressions#always). + +The current revision pins all three scanner actions but retains +`actions/checkout@v4` and `github/codeql-action/upload-sarif@v3`. The article now +states those exceptions and recommends pinning them; no gist changes were made. + +No workflow was executed as a benchmark or scanner evaluation. The corrected +article labels its echo example as historical, names when the working gate was +present, and describes OSV first followed by potentially overlapping Grype/Trivy. + +## Timing interpretation + +The three initial values sum to `45 + 150 + 195 = 390` seconds. The listed optimized +values sum to `12 + 35 + 70 = 117` seconds. The reduction in that sum is +`(390 - 117) / 390 = 0.70`. These are recomputed arithmetic, not new measurements. +The old 120-second total did not match its rows. + +Searched the repository's research records and gist/script paths for the article, +scanner timings and retained benchmark records. No supporting timing logs were +found. The article now explicitly labels the historical measurements and runner +provenance unverified, including the adjacent claimed optimization savings. +Neither sum nor slowest-scanner duration determines real workflow latency. +No new end-to-end duration is asserted from the dependency graph. + +## Review coverage + +Read and applied canonical `blog-artifact-check` and `blog-argument-shape` +procedures. Corrected orchestration/gate claims are supported by source inspection; +the timing table is retained as explicitly unverified historical figures with +corrected arithmetic. No claim of full-post publication readiness or verification +of unrelated scanner flags, other gists, historical anecdotes or measurements. + +Root performs independent review before merge. Build result is recorded in the +PR. No new tests were authored for this prose correction; the website build is +the relevant mechanical check. diff --git a/src/posts/2025-10-06-automated-security-scanning-pipeline.md b/src/posts/2025-10-06-automated-security-scanning-pipeline.md index 8d238776..70ad20ff 100644 --- a/src/posts/2025-10-06-automated-security-scanning-pipeline.md +++ b/src/posts/2025-10-06-automated-security-scanning-pipeline.md @@ -2,6 +2,7 @@ author: William Zujkowski date: 2025-10-06 +lastUpdate: 2026-09-13 description: Build automated security scanning pipelines with Grype, OSV, and Trivy—integrate vulnerability detection into CI/CD workflows with actionable reporting. title: Automated Security Scanning Pipeline with Grype and OSV tags: @@ -14,7 +15,9 @@ tags: ## The Dependency That Haunted Me -I built an automated security pipeline that scans every commit with Grype, OSV-Scanner, and Trivy. Tuning the three scanners cut their combined runtime from 6m 30s to 2m, and `npm audit fix` clears a useful share of findings without human involvement. Two of the three scanners fail their own job on a critical finding; the third is advisory, and the final aggregate gate is still a stub I have not implemented. +I built an automated security pipeline that scans every commit with Grype, OSV-Scanner, and Trivy. OSV runs first; Grype and Trivy can run alongside each other after that job succeeds. The final gate checks the three job results, while each scanner still needs its own failure policy. `npm audit fix` clears a useful share of findings without human involvement. + +**Correction, September 13, 2026:** The linked workflow already had a working aggregate gate by [August 18, 2026](https://gist.github.com/williamzujkowski/8185611a406dd91806f37d51778cdd16/a2ef3b7e0e070a7bbc4cf9a669ec0d9937e10c44). This article still called it a stub and described conflicting job orders. Those descriptions are corrected below. The timing table contains sums of listed scanner durations, not verified end-to-end workflow measurements. **Why it matters:** Last year, I deployed a "simple" web app to my homelab. Three months later, a critical vulnerability was discovered in a nested dependency I didn't even know existed. The vulnerable code ran there for months before a scanner told me. Hope is not a security strategy. @@ -52,7 +55,7 @@ I built an automated security pipeline that scans every commit with Grype, OSV-S -Today, every commit to my repositories is automatically scanned for vulnerabilities. Here's how I built it — including the part that is not finished. +Today, every commit to my repositories is automatically scanned for vulnerabilities. The workflow below shows how the scanning jobs are connected. ## Tool Selection and Comparison @@ -82,7 +85,7 @@ I installed all three scanners on my Ubuntu 22.04 homelab server. The process to ### Complete Scan Workflow -The pipeline orchestrates three scanners in parallel with a final quality gate: +The workflow runs OSV first, then makes the Grype and Trivy jobs eligible to run in parallel. A final gate checks all three job results: