Repository navigation
fix(ci): unmask security scans and verify every download - #148
Merged
Merged
Conversation
Four PRs from the math learnings triage: unmask and checksum the scans, fix the release workflow, pin tool installs, keep builds in the repo. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Snyk Code cannot ignore single findings from the repo, so .snyk excludes the two files whose three LOW findings were false positives. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Snyk Code reports an env var reaching open() as path traversal, and the Snyk step now blocks. The scan functions take the directory as a parameter instead. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Any curl/wget line is a download; a variable or http:// URL is flagged. The checksum must name the downloaded path as a whole token, not a substring. A sha256sum -c under if, !, ||, && or ; cannot fail the step and does not count. The used-before-checksum suppression is per download, not per block. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
The comment strip in check_block had no test; removing it left the suite green. A comment naming curl must not count as a download. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg
This was referenced Oct 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
PR A of the CI and release hardening plan (
docs/superpowers/plans/2026-10-27-ci-release-hardening.md, spec R1-R4).continue-on-erroris removed from the gitleaks and Snyk steps, so the requiredSecret ScanandSnyk Security Scanchecks report what the tools find.SNYK_TOKENwas unset until 2026-10-27, so every Snyk run had failed authentication behind the mask..snykexcludestests/test_automerge_bot_hold.pyandscripts/test_metrics.py, whose three LOW Snyk Code findings were false positives. Snyk Code cannot ignore a single finding from a repo file (only via the web UI), so this is the path-exclusion fallback the spec approved.cli/latest) and mdbook 0.5.3 (was piped intotar) now download to a file, passsha256sum -cagainst the publisher's digest, and check the installed version.tests/test_continue_on_error.pyfails on anycontinue-on-errornot in itsALLOWEDlist (or listed but gone, or unrecognised spellings).tests/test_workflow_downloads.pyfails on anycurl/wgetwithout a pinned https URL, an output file and a fail-capable checksum before use.Test Plan
make test: nextest 1145 passed; pytest 119 passed (42 in the two new modules)main'sci.yml(the two masks; the three unpinned downloads)check_block(0 divergences)Secret ScanandSnyk Security Scanpass unmasked; Snyk log showsOpen issues: 0; install steps printOKfromsha256sum -cscripts/and.claude/scripts/, untouchedCode review
reviewed-sha: c761064
diff-hash: 3ba680acd9d68d5b78a9e72ba06ac9b9bd8c602b35ec53244d490406e255d31c
reviewers: 5/5
Round 1 (cbfca98): 5/5 reviewers, two informational findings on
tests/test_continue_on_error.pydocstrings (fixed in fc4fa16). Security-review then found env-var-to-open()in both new test modules (Snyk Code path-traversal shape, now blocking); fixed in 97a53d8.Round 2 (97a53d8): 5/5 reviewers. Required, all fixed in 7e84a47: a
curl/wgetwith no literal https URL was skipped; the checksum matched the path as a substring; asha256sum -cthat cannot fail the step counted as verification; a "used before checksum" problem suppressed a later download's missing checksum.Round 3 (verification, 1 reviewer, bug lens; the other four lenses were clean twice on unchanged ground): two further bypasses fixed in 90c1647 (a comment or echoed text counted as the checksum;
./-relative output paths unmatched) plus the|| exit 1false positive.Round 4 (verification): every fix holds; 5 of 6 line mutations killed. The surviving mutant (comment strip) is now covered by b8d2900, mutation-checked.
Round 5 (verification of later test-only commits: empty-input tests, the C901 split of
check_block, a docstring line): no issues; old vs newcheck_blockagree on 8 hand-built cases and 200,000 fuzzed blocks.Informational
Commit CHANGELOGALLOWEDreason is a schedule note, not a safety reason; PR B removes the entry with the step.sha256sum -c - 2>&1,--check, here-strings,$TMPvs${TMP},cd && ...,apt-get install curl). None occurs in the workflows; the module docstring states the expected download form.RESOLVED: 9 fixed, 0 kept
Spec alignment (2026-10-27)
Findings
versionas MAJOR.MINOR.PATCH against both Cargo.toml files, check for an existing tag and the refs/heads/main ref, ahead of other steps. release.yml does not appear in the diff.git merge-base <previous tag> HEADappears.cargo install, and no test enforcingtool: <name>@<X.Y.Z>/fallback: none.make installtarget writing to ${XDG_BIN_HOME:-$HOME/.local/bin}/etch.Reviewed
Verifications
🤖 Generated with Claude Code
https://claude.ai/code/session_019xRsBqwrPLVSCJ1hXnhotg