Skip to content

[static-analysis] Report - 2026-07-20 #46721

Description

@github-actions

🔍 Static Analysis Report - 2026-07-20

Analysis Summary

  • Tools Used: zizmor, poutine, actionlint, runner-guard
  • Total Findings: 469
  • Workflows Scanned: 258
  • Workflows Affected: ~80 (mostly generated .lock.yml files)
  • Net change vs 2026-07-19: 0 — totals are identical across all four tools.

Findings by Tool

Tool Total Critical High Medium Low/Info
zizmor (security) 0 0 0 0 0
poutine (supply chain) 20 0 10 1 9
actionlint (linting) 114 - - - -
runner-guard (taint analysis) 335 0 324 11 0

⚠️ zizmor anomaly: the compile output contains only the Running zizmor security scanner on 258 files banner with no findings or summary before the poutine banner. This is a recurring capture anomaly (historical zizmor counts were ~72, once 919). Treated as 0 captured, not a verified clean result.

Clustered Findings by Tool and Type

Runner-Guard Taint Analysis Findings

Runner-Guard Score: not emitted in this run's output.

Rule ID Name Severity Count Affected Workflows
RGS-004 Comment-Triggered Workflow Without Author Authorization Check high 310 q (124), dev-hawk (94), ai-moderator (92)
RGS-012 Secret Exfiltration via Outbound HTTP Request high 10 daily-model-inventory (4), visual-regression-checker (2), daily-byok-ollama-test (2), docs-noob-tester (1), daily-multi-device-docs-tester (1)
RGS-018 Suspicious Payload Execution Pattern high 4 smoke-claude, daily-sentrux-report, daily-cli-performance, daily-byok-ollama-test
RGS-005 Excessive Permissions on Untrusted Trigger medium 8 ai-moderator (4), q (3), agentic_commands (1)
RGS-019 Step Output Interpolated in run Block medium 2 windows-cli-integration, error-message-lint
RGS-007 Unpinned Third-Party Action Using Mutable Tag medium 1 publish-safe-outputs-node

Issues created: none. All high-severity runner-guard findings are unchanged from 2026-07-19 and each maps to a closed issue for the same rule+file, or is an established framework false-positive (see Runner-Guard Analysis below).

Actionlint Linting Issues (114)

Issue Type Count Notes
[expression] undefined secret_verification_result 69 Real codegen regression — if: references an undeclared needs.*.outputs field (69 distinct workflows)
[shellcheck] SC2016 (expressions in single quotes) 25
[shellcheck] SC2086 (unquoted variable) 7
[shellcheck] SC2038 (find/xargs) 6
[shellcheck] SC2034 / SC2005 / SC2129 / SC2188 / SC2327 / SC2328 6 2 + 1×4

Poutine Supply Chain Findings (20)

Rule ID Severity Count Affected Workflows
untrusted_checkout_exec error (high) 10 smoke-workflow-call.lock.yml (5), smoke-workflow-call-with-inputs.lock.yml (5)
github_action_from_unverified_creator_used note (info) 9 link-check (2), copilot-setup-steps, daily-elixir-credo-snippet-audit, dataflow-pr-discussion-dataset, hippo-embed, mcp-inspector, smoke-codex, super-linter
pr_runs_on_self_hosted warning (medium) 1 smoke-copilot-arm.lock.yml

Zizmor Security Findings

No findings captured (see anomaly note above).

Top Priority Issues

1. actionlint [expression] — undefined secret_verification_result (real, actionable)

2. RGS-004 — Comment-Triggered Workflow Without Author Authorization (310, framework FP)

Fix Suggestion for actionlint [expression] secret_verification_result

Issue: if: conditions reference an undeclared job output secret_verification_result
Severity: error (expression)
Affected Workflows: 69 generated .lock.yml files

Prompt to Copilot Agent:

You are fixing a code generation bug in the gh-aw compiler that produces
invalid GitHub Actions workflows flagged by actionlint:

  error: [expression] property "secret_verification_result" is not defined
  in object type {...}   (in an `if:` condition)

The generated `.lock.yml` job has an `if:` guard referencing
`needs.<job>.outputs.secret_verification_result`, but the producing job never
declares that output. Fix the Go generator in pkg/workflow (search for
"secret_verification_result" and for where the consuming job's `if:` is emitted).

Do EITHER of the following consistently:
  1. Declare the output on the producing job:
       outputs:
         secret_verification_result: ${{ steps.<step>.outputs.result }}
     and set it in the step that performs secret verification; OR
  2. If secret verification was intentionally removed, delete the dangling
     `if:` reference from the consuming job.

Then recompile all workflows and confirm actionlint reports 0 [expression]
errors:
  <compile> 2>&1 | grep -c 'secret_verification_result'   # must be 0

Do not hand-edit individual .lock.yml files — they are generated. Fix the
generator, regenerate, and add a compiler unit test asserting that any emitted
`needs.*.outputs.secret_verification_result` reference has a matching `outputs:`
declaration.

Runner-Guard Analysis

Runner-guard produced 335 findings (324 high, 11 medium) — identical to 2026-07-19. Per the deduplication policy (skip closed same-rule+file issues; comment on open ones; create only genuinely new findings), 0 issues were created and 0 comments added this run:

Per-finding dedup decisions

Framework-level dedup for these recurring RGS-* findings is already tracked by closed issues #31043 and #31254.

All Findings Details

Actionlint — 69 workflows with undefined secret_verification_result (sample)

ab-testing-advisor, agent-performance-analyzer, archie, architecture-guardian, artifacts-summary, auto-triage-issues, brave, breaking-change-checker, ci-coach, cli-consistency-checker, code-scanning-fixer, copilot-centralization-drilldown, ... (69 total, all generated .lock.yml)

Each occurrence is an if: guard at column ~241 referencing needs.<job>.outputs.secret_verification_result.

Poutine untrusted_checkout_exec (10, suppressed pattern)
  • smoke-workflow-call.lock.yml: lines 318, 333, 348, 456, 461
  • smoke-workflow-call-with-inputs.lock.yml: lines 315, 330, 345, 456, 461

These sit next to # poutine:ignore untrusted_checkout_exec suppression comments in the generated smoke-test workflows and are compiler-generated save_base_github_folders.sh steps — expected in these call-target smoke tests.

Historical Trends

Date zizmor poutine actionlint runner-guard Total
2026-07-16 n/a 20 112 335
2026-07-17 n/a 20 113 335
2026-07-18 0 20 113 335 468
2026-07-19 0 20 114 335 469
2026-07-20 0 20 114 335 469
  • Change vs previous scan: 0 (identical across all tools).
  • New issue types: none.
  • Resolved issue types: none.
  • Actionlint has been slowly creeping up (109 → 114 over the past week), driven by the stable 69 secret_verification_result regression plus incremental shellcheck SC2016 additions.

Recommendations

  1. Immediate: No new Critical/High actionable security issues — all high runner-guard findings are closed-dup or framework false-positives.
  2. Short-term: Fix the actionlint secret_verification_result codegen regression in the gh-aw generator (69 workflows). This is the single highest-value real fix and reopens the pattern from closed [static-analysis] actionlint [expression] regression: undefined secret_verification_result output in 69 workflows #44870.
  3. Long-term: Suppress/annotate the recurring framework false-positives (RGS-004 pre_activation guard, RGS-018 MCP-scaffolding require) in runner-guard config so real findings aren't buried under ~300 known-benign alerts.
  4. Prevention: Add a compiler unit test asserting every emitted needs.*.outputs.* reference has a matching outputs: declaration.

Next Steps

References:

Generated by 📊 Static Analysis Report · 318 AIC · ⌖ 35.3 AIC · ⊞ 10K ·

  • expires on Jul 26, 2026, 10:03 PM UTC-08:00

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions