fix(deps): SCA hardening — close every fixable dep vuln, lift coverage to 90.5 % - #387
Merged
Conversation
Cre-eD
requested review from
Laboratory,
smecsia and
universe-ops
as code owners
August 21, 2026 07:27
This was referenced Aug 21, 2026
Semgrep Scan ResultsRepository:
Scanned at 2026-08-21 13:04 UTC |
Security Scan ResultsRepository:
Scanned at 2026-08-21 13:05 UTC |
📊 Statement coverageMeasured on the documented included set (see
Baseline: |
smecsia
approved these changes
Aug 21, 2026
universe-ops
approved these changes
Aug 21, 2026
Cre-eD
force-pushed
the
fix/sca-vulnerable-deps
branch
from
August 21, 2026 13:02
c1abeda to
2966551
Compare
…old bar it claimed
OpenSSF Scorecard's Vulnerabilities check reported three advisories. All
three land on dev-tool-only modules pulled in through tools.go, and all
three are fixable upstream, so they are fixed rather than VEX'd:
golang.org/x/mod v0.38.0 -> v0.40.0 GO-2026-6179, GO-2026-6180 (HIGH)
github.com/cilium/ebpf v0.11.0 -> v0.22.0 GO-2026-6238 (LOW)
Neither could be fixed by bumping its parent: gofumpt v0.11.0 (latest)
still requires x/mod v0.38.0, and delve v1.27.1 (latest) still requires
ebpf v0.11.0. `go list -deps ./...` links zero packages from either
module into anything we ship, but a non-breaking upstream fix exists, and
VEX is for findings that cannot be fixed.
osv-scanner and trivy fs both go from 3 findings to 0.
The ebpf bump has fallout worth calling out. ebpf v0.22.0 names
honnef.co/go/tools v0.7.0 in its own go.mod, MVS raises it, and
golangci-lint v1.64.8 does not compile against v0.7.0's analysis API --
it panics mid-run ("typedness: panic during analysis: interface
conversion: interface {} is nil, not *buildir.IR") and exits 7, failing
the lint step in branch.yaml / push.yaml. ebpf needs staticcheck for ITS
CI, not for anything we compile, and a require line loses to ebpf's, so
honnef is pinned back with a replace directive. Dependabot #385 makes the
same ebpf bump and would have broken lint on main on its own.
Images, all four rebuilt with --no-cache and rescanned:
caddy 11 HIGH + 1 MEDIUM -> 1 MEDIUM
cloud-helpers 8 HIGH -> 0
github-actions 17 HIGH -> unchanged (Google's gcloud binaries)
kubectl 14 HIGH + 3 MEDIUM -> unchanged (upstream kubectl binary)
caddy: the pinned 2.11.4-builder digest shipped Go 1.26.5 and the tag has
since been rebuilt with Go 1.26.7. Since xcaddy in the builder stage
produces the binary COPY --from=builder puts into the runtime image, the
builder's toolchain IS the shipped stdlib -- refreshing the digest alone
closed 8 stdlib CVEs. Three xcaddy --replace directives lift Caddy's own
vendored x/net, x/text and grpc past CVE-2026-46600, CVE-2026-56852 and
GHSA-hrxh-6v49-42gf. --replace and not --with, because --with also writes
a blank import and none of those modules has a package at its root.
cloud-helpers: every finding was in /usr/local/bin/aws-lambda-rie, the
base image's local-testing Runtime Interface Emulator. /lambda-entrypoint.sh
execs it only when AWS_LAMBDA_RUNTIME_API is unset, and our ENTRYPOINT
replaces that script outright, so it never runs -- and the debug path that
does use a RIE (welder run debug-aws-cloud-helpers) is runOn: host and uses
the host's copy. Deleting it is the fix, not a suppression. Image now
scans clean and the binary still starts.
Deferred: cel-go 0.28.1 -> 0.29.0 (MEDIUM, GHSA-gcjh-h69q-9w9g) inside
the caddy binary. v0.29.0 renames interpreter.Interpretable to
InterpretableV2 and Caddy 2.11.4's celmatcher.go does not compile against
it -- an upstream code change. Reachability and the closing condition are
recorded in a caddy.Dockerfile comment so the next digest refresh does not
silently add it to the --replace list and break the build.
Documented unfixable, each measured rather than assumed: kubectl's own
binary (pinned digest and current latest are both v1.36.3 with identical
findings, so the pin is left alone), the gcloud SDK binaries (579.0.0 and
581.0.0 both ship gcloud-crc32c built with go1.26.5, so bumping the pin
buys nothing), and the lambda base digest, which is deliberately NOT
refreshed because the currently-tagged one is worse (30 HIGH vs 8).
VEX: all three statements re-triaged against the current tree with fresh
evidence, none flipped, document bumped to version 4. No new suppression
was added anywhere -- no .trivyignore, no new VEX statement, no new
osv-scanner.toml entry.
Coverage: docs/TESTING.md claimed the Gold-tier test_statement_coverage90
criterion was Met. It was not -- the main baseline reads 89.6%. Seven test
files take the included set to 90.5% and the doc now carries the number so
the next drift is visible.
The largest single gap was pkg/security/tools/cosigntest at 0%: Go
attributes coverage per test binary and that package is a harness consumed
only by other packages' tests. Excluding it would have cleared the number
and been wrong -- it generates a /bin/sh script whose quoting,
cross-process counter and stream selection three retry suites silently
depend on, so a break there turns those suites green for the wrong reason.
It gets tests instead, driven through tools.ExecCommand (the function
signing.RunCosignWithRetry actually calls) so stdout and stderr stay
separated the way they do in production.
Also fixes two staticcheck SA1012 findings (never pass a nil Context) that
surface on this branch but not on main, in the cases asserting
lookupTriggeringEvents short-circuits before any AWS call -- they now pass
an already-cancelled context, so a regression fails with context.Canceled
instead of reaching the network.
Signed-off-by: Dmitrii Creed <creeed22@gmail.com>
Cre-eD
force-pushed
the
fix/sca-vulnerable-deps
branch
from
August 21, 2026 13:04
2966551 to
cc6000c
Compare
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
Closes every fixable dependency vulnerability in the repo across all severities, and lifts included-set statement coverage over the Gold-tier bar it was documented as already meeting.
VulnerabilitiesGO-2026-6238,GO-2026-6179,GO-2026-6180)osv-scannerongo.modtrivy fssimplecontainer/caddyimagesimplecontainer/cloud-helpersimagesimplecontainer/github-actionsimagesimplecontainer/kubectlimageDeferred: 1 (cel-go, needs an upstream Caddy code change). Documented unfixable: 4 classes, all upstream-owned binaries.
The Scorecard
Vulnerabilitiescheck was the trigger, and all three advisories it reported land on dev-tool-only dependencies (delveandgofumptviatools.go) —go list -deps ./...links zero packages from either module into anything we ship. They are still fixed rather than VEX'd, because a fix exists upstream and is non-breaking; VEX is for findings that cannot be fixed.Fixed
Go modules
golang.org/x/modGO-2026-6179/CVE-2026-56865— tlog tile verification bypassgolang.org/x/modGO-2026-6180/CVE-2026-56864— unauthenticated hashes honoured insumdb.Lookupgithub.com/cilium/ebpfGO-2026-6238/CVE-2026-10722/GHSA-xhgw-qwwf-pg32— integer overflow in BTF parsingNeither could be fixed by bumping its parent:
mvdan.cc/gofumptv0.11.0 (latest) still requiresx/modv0.38.0, andgo-delve/delvev1.27.1 (latest) still requirescilium/ebpfv0.11.0. Both are therefore raised by an explicit indirect requirement.MVS collateral, no advisory of its own, listed for review completeness:
golang.org/x/cryptov0.54.0 → v0.55.0 ·golang.org/x/netv0.57.0 → v0.58.0 ·golang.org/x/textv0.40.0 → v0.41.0 ·golang.org/x/toolsv0.48.0 → v0.49.0 ·golang.org/x/exp/typeparams·golang.org/x/telemetry·github.com/sirupsen/logrusv1.9.3 → v1.9.4caddy.Dockerfile— 11 HIGH closedTwo independent causes, both fixed:
198d47e→4bdeabce(same2.11.4-buildertag, rebuilt 2026-08-20). The pinned digest carried Go 1.26.5; the current one carries Go 1.26.7. Sincexcaddy buildin the builder stage produces the binary thatCOPY --from=builderputs into the runtime image, the builder's toolchain is the shipped binary's stdlib — this alone closed 8 stdlib CVEs (CVE-2026-33818,-39821,-46600,-56853,-56858,-56859,-56860,-56862). Runtime digest refreshed alongside it (844f60b6→df7f1c2f) so builder and runtime stay on the same tag push.xcaddy --replacedirectives lifting Caddy 2.11.4's own vendored deps pastCVE-2026-46600(x/net→ v0.58.0),CVE-2026-56852(x/text→ v0.41.0) andGHSA-hrxh-6v49-42gf(grpc→ v1.82.1).--replaceand not--with:--withalso writes a blank import, and none of these modules has a package at its module root, so it fails withcannot find module providing package.The Dockerfile's existing build-time gates (
caddy version | grep,caddy list-modules | grepforrate_limitandstorage.gcs) all still pass, so a silently dropped plugin or a version skew would have failed the build.cloud-helpers.aws.Dockerfile— 8 HIGH closed, image now cleanEvery finding in this image came from
/usr/local/bin/aws-lambda-rie, the base image's local-testing Runtime Interface Emulator: 9 MB of Go that AWS builds with an older toolchain (Go 1.26.5 at the pinned digest → 8 HIGH, all fixed in Go ≥ 1.26.6).It is not reachable in this image.
/lambda-entrypoint.shexecs it only whenAWS_LAMBDA_RUNTIME_APIis unset, and ourENTRYPOINT ["/cloud-helpers"]replaces that script outright. Nothing links it and no workflow invokes it —welder run debug-aws-cloud-helpersisrunOn: hostand uses the host'saws-lambda-rie, not the image's copy. So it is deleted, which is a fix rather than a suppression.What this removes is
docker run --entrypoint /lambda-entrypoint.sh <image> /cloud-helpers; the welder task is the supported path. Verified after the change: the image scans clean and/cloud-helpersstill starts (it exits with the expected "did you pass SIMPLE_CONTAINER_CLOUD_HELPER_TYPE" error).honnef.co/go/toolspinned to v0.6.1 viareplacecilium/ebpfv0.22.0 nameshonnef.co/go/toolsv0.7.0 in its owngo.mod, so MVS raises it.golangci-lintv1.64.8 does not compile against v0.7.0's analysis API and panics mid-run, exit 7:That fails the
golangci-lint runstep inbranch.yaml/push.yaml/branch-preview.yaml. ebpf needs staticcheck for its CI, not for any code we compile, and v0.22.0 is the fix forGO-2026-6238so it cannot be held back — and arequireline loses to ebpf's, so onlyreplacepins it.honnef.co/go/toolsv0.6.1 carries no advisories (checked against osv.dev). Removal condition is in the go.mod comment: golangci-lint v2 builds against v0.7.x, but that is a separate migration (module path rename +.golangci.ymlschema change).This is the reason to supersede Dependabot #385 rather than merge it — #385 makes exactly this bump and would have broken lint on
mainon its own.Deferred (breaking change, needs upstream)
GHSA-gcjh-h69q-9w9g—github.com/google/cel-gov0.28.1 → v0.29.0, MEDIUM, inside the shippedcaddybinary.Not a version bump: v0.29.0 renames
interpreter.InterpretabletoInterpretableV2, and Caddy 2.11.4'smodules/caddyhttp/celmatcher.godoes not compile against it. Verified by attempting it:Reachability: cel-go backs Caddy's
expressionrequest matcher. SC's generated Caddyfiles never emitexpression(0 occurrences across the Caddyfile templates inpkg/clouds/pulumi/kubernetes/), so the CEL evaluator is only reachable if a consumer writes one by hand intolbConfig.extraHelpers/siteExtraHelpers. Closing condition: a Caddy release that adopts cel-go ≥ 0.29.0 — then drop this note and rebuild. Deliberately called out in acaddy.Dockerfilecomment so the next digest refresh does not silently add it to the--replacelist and break the build.Documented unfixable (upstream-owned binaries, no action available)
alpine/kubectl→/usr/local/bin/kubectl— 8 HIGHstdlib@v1.26.5, 5 HIGH + 3 MEDIUMx/net@v0.49.0, 1 HIGHx/text@v0.33.0. kubectl is built by the Kubernetes release process; we cannot rebuild it. Refreshing the digest gains nothing and was measured, not assumed: the pinned digest5d380d18and the currentlatest(dae26110, = tag1.36.3) are both kubectl v1.36.3 and produce identical finding counts, so the pin is left alone rather than churned. The Dockerfile'sapk upgradealready clears all OS-package findings (0 alpine findings on a fresh build). Closing condition: a Kubernetes patch release rebuilt with Go ≥ 1.26.6, then refresh the digest.github-actions— 8 HIGH ingcloud-crc32c(stdlib@v1.26.5) and 9 HIGH ingke-gcloud-auth-plugin(8 ×stdlib@v1.26.5+x/text@v0.38.0/CVE-2026-56852). That is the image's entire finding set: base OS packages scan 0 androot/github-actionsscans 0.gke-gcloud-auth-pluginis fetched bygcloud components installat build time, so it is already the freshest version Google publishes. Bumping the pin does not help, also measured rather than assumed:GCLOUD_VERSION579.0.0 (pinned) and 581.0.0 (latest) both shipgcloud-crc32cbuilt with go1.26.5 (go versionon the extracted binaries). The pin stays at 579.0.0 and itsGCLOUD_SHA256was re-verified correct against a fresh download. Reachability:gcloud-crc32cis a checksum helper forgcloud storage/ gsutil transfers, and no SC code path shells out to either (0 matches forgsutilacrosspkg/; GCP static-site uploads go through the Pulumi SDK'sstorage.BucketObject). Not deleted the way the Lambda RIE was, because a consumer-authored deploy hook can invokegcloud storage, so the execute path is not provably empty. Candidate for an image-scope VEX statement once this repo has a convention for one — todayvex/openvex.jsoncovers Go-module advisories only.public.ecr.aws/lambda/provided:al2023digest is deliberately NOT refreshed. The currently-tagged digest is worse than the pinned one: 30 HIGH vs 8. Anyone rebasing a Dependabot docker-digest bump onto this image should check the scan before taking it.GO-2026-5932(golang.org/x/crypto/openpgpunmaintained) — unchangednot_affected, re-triaged below.VEX re-triage
All three statements in
vex/openvex.jsonre-checked against the current tree this pass; document bumped toversion: 4,timestamp: 2026-08-21. No statement flipped, and each was re-confirmed with fresh evidence rather than carried forward by default:GO-2022-0635(aws-sdk-go v1 s3crypto)not_affected/component_not_presentgo.modandgo.sum;go mod why -mstill reports "main module does not need";go list -m allstill resolves v1.55.8 only through a transitivego.mod.GO-2022-0646(same module)not_affected/component_not_presentGO-2026-5932(x/crypto/openpgp)not_affected/vulnerable_code_not_presentgo list -buildvcs=false -deps ./...still links 24x/cryptopackages and 0openpgppackages; OpenPGP still goes throughProtonMail/go-crypto; no fix event upstream (introduced: 0, permanent "unmaintained" notice). Impact statement updated for thex/cryptov0.54.0 → v0.55.0 bump in this PR.osv-scanner.tomlneeds no change: its single mirrored entry (GO-2026-5932) is still the only one of the three that osv-scanner actually reports, and it still filters correctly (Filtered 1 vulnerability from output). No new suppressions were added anywhere — no.trivyignore, no new VEX statement, no newIgnoredVulnsentry.Coverage: 89.6 % → 90.5 %
docs/TESTING.mdclaimed the Gold-tiertest_statement_coverage90criterion was Met. It was not: themainbaseline artifact readsincluded=89.6, reproduced exactly locally. This PR closes the gap and makes the doc honest — the status column now carries the number, so the next drift is visible.The included set is 5,975 statements, so 90 % needed 29 more covered statements. Seven test files add ~60, all of them exercising real logic with assertions that fail on a real regression rather than padding the denominator:
pkg/security/tools/cosigntest/cosigntest_test.go(new, 208 lines)pkg/clouds/gcloud/auth_test.goReadSecretsProviderConfigmust reject a badkeyRotationPeriodat read time (4 shapes), and must ignore it whenprovision: false. This is the contract the function's own comment describes: an already-provisioned secrets-provider stack is skipped by the provisioner, so a provisioner-only check never runs and a bad value would surface at a DR rebuild. PlusEffectiveNoncurrentVersionRetentionDays— nil means "apply the 30-day default", explicit zero means "disable the rule"; collapsing the two would silently drop the rollback horizon on every state bucket that never set the field.pkg/clouds/compose/compose_test.gocomposeFilePathmust re-rootworkingDironto the file's own directory (relative build contexts resolve againstworkingDir, so honouring the caller's would point them at the wrong tree);${VAR}interpolation must still read the process env underSkipResolveEnvironment; a missing file must not return a half-built project.pkg/clouds/fs/fs_state_test.goinit()'s two registrations, asserted throughapi.ReadProvisionerFieldConfig— the same lookup the descriptor reader uses. A typo'd key or a reader wired to the wrong struct otherwise only shows up asunknown provisioner field config typeat read time.pkg/clouds/docker/types_test.goRegistryRequiresAuthgates whether an imagePullSecret is generated at all: username-without-password must read as "no auth" rather than produce a half-formed secret, while both-present-but-empty must still count as "auth requested" so the deploy fails on a bad credential instead of silently pulling anonymously.pkg/clouds/cloudflare/cloudflare_test.goReadRegistrarConfighappy + error path, including thatdnsRecordssurvives the yaml round-tripConvertConfigperforms.pkg/clouds/mongodb/mongodb_test.goReadAtlasConfighappy + error path, with the*float64/*intfields asserted specifically: they distinguish "unset" from "explicitly zero" and must survive the round-trip, and unset ones must stay nil so downstream defaults apply.Why
cosigntestgot tests instead of an exclusionpkg/security/tools/cosigntestwas the single largest uncovered block in the included set (42 statements, 0 %) because Go attributes coverage per test binary, and this package is a harness consumed only by other packages' tests (pkg/security/provenance,pkg/security/sbom).Adding it to the
pkg/util/test/*exclusion category would have been the cheap way to clear the number, and it would have been wrong. The 0 % is a real gap: the package generates a/bin/shscript, and three retry suites silently depend on its shell quoting, its cross-process invocation counter, and which stream it writes the Rekor conflict marker to. A break there turns those suites green for the wrong reason. So the new tests drive the stub throughtools.ExecCommand— the exact functionsigning.RunCosignWithRetrycalls — so stdout and stderr stay separated the way they do in production, and they include:ConflictOnStdoutcase asserting stderr is non-empty but does not contain the marker, so a stdout-classification bug cannot pass because the marker leaked onto both streams;FailStderrbody containing a single quote — the exact input that broke an earlier harness by terminating the generated script early;shellQuoteround-tripped through/bin/shitself, including a metacharacter payload, because string equality alone would not catch a quoting form the shell re-splits or expands;DelayEachvsDelayFirstasserted per invocation, which is what distinguishes a fresh per-attempt timeout from one budget shared across attempts;RekorConflictStderrchecked against the[POST /api/v1/log/entries][409]shape the retry classifier actually anchors on, so a drifted fixture cannot quietly stop exercising the retry path.docs/TESTING.mdrecords why it is not excluded, next to the exclusion table.Also in this PR
pkg/clouds/aws/helpers/ct_enrichment_test.go— twostaticcheckSA1012findings (never pass a nilContext) that surface on this branch but not onmain. Fixed properly rather than silenced: the cases assert thatlookupTriggeringEventsshort-circuits before any AWS call, so they now pass an already-cancelled context instead ofnil— a regression that stops short-circuiting fails withcontext.Canceledinstead of reaching the network.Pre-existing lint drift, deliberately left alone:
golangci-lint run --fix(the exact CI invocation) rewrites 19 unrelated files onmaintoday —gciimport ordering plus missinggoheaderSPDX headers inpkg/api/secrets/ciphers/x25519.go,x25519_test.goandpkg/clouds/pulumi/aws/permissions_boundary.go. CI is green because--fixrepairs them in the workspace and never commits them. Worth a separate cleanup PR; folding 19 files of import churn into an SCA diff would only make this one harder to review.Dependabot reconciliation
bump github.com/cilium/ebpf 0.11.0 → 0.22.0bump caddy from 198d47e to c7ae802caddytags were rebuilt 2026-08-20 and this PR pins the resulting digests directly (4bdeabcebuilder /df7f1c2fruntime), so #382 conflicts and targets an older push.github-actions group, #381reecetech/version-increment, #378node 22-alpine → 26-alpine.github/dependabot.yml; no overlap with this diff.Open Dependabot alerts: 1 (
github.com/cilium/ebpf, LOW, fix 0.22.0). Closes automatically once this lands onmain. The twox/modadvisories never opened an alert — Dependabot did not surface them — which is precisely why the Scorecard / osv-scanner / trivy cross-check matters and why alert state alone is not the source of truth..github/dependabot.ymlneeds no change: both language ecosystems (gomodat/,pipat/docs) and both version ecosystems (docker,github-actions) are already configured.Evidence
Source scans, before → after
Image scans — built locally from this branch vs from origin/main
Both sides built from the same Dockerfiles at the same moment, so this is apples to apples rather than a comparison against the published
:latesttags (which lag the current Dockerfiles and are much worse — caddy 178 findings, cloud-helpers 72, github-actions 151, kubectl 92; the next release build closes that gap regardless).All four images rebuilt with
docker build --no-cache. That matters: a first pass reported 48 phantompython3findings ingithub-actionsbecause BuildKit reused a cachedapk update && apk upgrade && apk addlayer (the layers came into the local store from pulling the published image for the "before" scan), so the image keptpython3 3.14.5-r0whilealpine v3.24/mainalready served3.14.7-r1. Fresh builds — and CI runners — install the current package. Worth knowing before trusting any local image scan in this repo.Coverage
Test plan
go build ./...— passes (locally with-p 2; thepulumi-gcp/pulumi-awsSDK packages want several GB per compile process, so full parallelism OOMs on a 19 GB machine).go test ./...— passes except one pre-existing, environment-only failure:TestDetectRootDir/WithDetectRootDir_errors_when_no_git_repo_is_found_above_cwd. It asserts thatWithDetectRootDir()errors when no git repo exists abovecwd, and this machine has a.gitabove every temp dir (/home/creed/.git, plus a stray/tmp/.gitfrom an unrelated worktree). Untouched by this PR — no file underpkg/api/git/is in the diff — and CI runners have neither, soRun testsshould be green.golangci-lint run --fix --timeout 20m(the CI invocation) — exit 0.bin/gofumpt -l— clean on every file in this diff.go buildof all fivetools.gotargets against the bumped deps —dlv(the risky one:cilium/ebpfv0.11.0 → v0.22.0 is a 11-minor jump and delve pins the old one),gofumpt,golangci-lint,mockery,go-jsonschema— all build.docker buildofcaddy.Dockerfile,cloud-helpers.aws.Dockerfile,kubectl.Dockerfile,github-actions.Dockerfile— all succeed, with the in-Dockerfile smoke tests (caddy version, plugin greps,pulumi version,gcloud version, gke-auth-plugin presence,aws --version,scsymlink) passing.govulncheck -mode=source ./...— not run locally: it peaks around 13.5 GB RSS on this module. Thegovulncheckworkflow gates this PR and scans unconditionally on a Go-touching diff, which this is.CI on this PR
All checks green:
Build Setup (clean, tools, schemas, lint, fmt),Run tests,govulncheck (reachability-aware),Analyze Go (go)/ CodeQL,security / SBOM + Dependency Scan,security / Secret Scan,semgrep,Measure statement coverage, all fiveBuild *jobs, andFuzz HMAC cache parse path.Two notes for anyone reading the run history:
TestDetectRootDirfails on my machine but passes inRun tests, exactly as expected — the assertion needs a temp dir with no git repo above it, and this laptop has one above every temp dir. Nothing underpkg/api/git/is in the diff.Fuzz HMAC cache parse pathfailed on the first attempt and passed on re-run. It was not a discovered crash:FuzzCacheGetPathreportedcontext deadline exceededat exactly the 30.10 s-fuzztimeboundary and no crash corpus was written (No files were found with the provided path: pkg/security/testdata/fuzz/), which is Go's fuzz coordinator missing its shutdown grace period on a loaded runner. Reproduced locally on this branch at 2.1 M execs —PASS, no corpus. Nothing inpkg/securityitself is in the diff; the only addition is a test in thepkg/security/tools/cosigntestsubpackage, whichpkg/securitydoes not import.The Scorecard
Vulnerabilitiescheck itself cannot run here —scorecard.ymltriggers onpushtomain, the weekly cron, andbranch_protection_rule, and the check queries osv.dev against the default branch. It clears on the nextmainpush after merge. The same scanner (osv-scanner scan source --lockfile=go.mod, withosv-scanner.tomlapplied) is what reports 0 in the evidence above.