Skip to content

[static-analysis] Report - 2026-07-21Β #46985

Description

@github-actions

πŸ” Static Analysis Report - 2026-07-21

Daily scan of 260 agentic workflows with zizmor, poutine, actionlint, and runner-guard. Findings are stable vs recent scans β€” every high-severity runner-guard finding maps to an already-closed same-rule+file issue or an established framework false-positive, so no new issues were created. The only movement is actionlint shellcheck rising +10 (all SC2016).

Analysis Summary

  • Tools Used: zizmor, poutine, actionlint, runner-guard
  • Total Findings: 476 (462 informational/known + 14 net actionable review items)
  • Workflows Scanned: 260
  • Workflows Affected: ~110 (mostly the recurring secret_verification_result expression error across 69 files)

Findings by Tool

Tool Total Critical High Medium Low/Note
zizmor (security) 0 0 0 0 0
poutine (supply chain) 20 0 0 1 19
actionlint (linting) 124 - - - -
runner-guard (taint) 332 0 322 10 0

zizmor note: The scan log shows only the Running zizmor security scanner on 260 files banner immediately followed by the poutine banner, with no zizmor summary emitted β€” a recurring anomaly since ~2026-07-05 (historically zizmor reported ~70). Likely zizmor output not captured this run; the untrusted_checkout_exec / pr_runs_on_self_hosted / unverified_creator findings below are attributed to poutine.

Clustered Findings by Tool and Type

Poutine Supply Chain Findings

Issue Type Severity Count Affected Workflows
untrusted_checkout_exec error 10 smoke-workflow-call.lock.yml, smoke-workflow-call-with-inputs.lock.yml (5 each)
github_action_from_unverified_creator_used note 9 astral-sh & other pinned third-party actions (mcp-inspector, dataflow-pr-discussion-dataset, ...)
pr_runs_on_self_hosted warning 1 smoke-copilot-arm.lock.yml

All untrusted_checkout_exec hits are suppressed via # poutine:ignore in the generated lock files (intentional for the workflow-call smoke tests). unverified_creator are informational notes on legitimately SHA-pinned actions.

Actionlint Linting Issues

Issue Type Count Affected Workflows
[expression] property secret_verification_result not defined 69 69 workflows (see fix suggestion below)
[shellcheck] SC2016 (single quotes suppress expansion) 35 23 lock files
[shellcheck] SC2086 (unquoted variable) 7 β€”
[shellcheck] SC2038 (find + xargs) 6 β€”
[shellcheck] SC2034 / SC2328 / SC2327 / SC2188 / SC2129 / SC2005 6 β€”

Shellcheck total rose 45 β†’ 55 vs 2026-07-20, driven entirely by SC2016 25 β†’ 35 (+10).

Runner-Guard Taint Analysis Findings

Runner-Guard did not emit a numeric score/grade line in this run's output.

Rule ID Name Severity Count Affected Workflows
RGS-004 Comment-Triggered Workflow Without Author Authorization Check high 308 q.lock.yml (124), dev-hawk.lock.yml (94), ai-moderator.lock.yml (90)
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.yml (1)
RGS-019 Step Output Interpolated in run Block medium 2 windows-cli-integration.yml, error-message-lint.yml

Issues created: none. Every high-severity finding maps to a closed same-rule+file issue or an established framework false-positive (see Runner-Guard Analysis below). No open file-specific RGS issues exist to comment on.

Top Priority Issue

1. secret_verification_result undefined property (actionlint [expression])

  • Tool: actionlint
  • Count: 69 (largest actionable cluster, stable since 2026-07-18)
  • Severity: error (compile-level lint)
  • Affected: 69 workflows β€” every workflow whose activation if: references needs.<job>.outputs.secret_verification_result
  • Description: A job if: condition references needs.*.outputs.secret_verification_result, but that output is not declared in the producing job's outputs: map (the needs object type lists comment_id, engine_id, model, lockdown_check_failed, ... but not secret_verification_result).
  • Impact: actionlint treats it as an undefined-property error. The if: expression evaluates the missing property to an empty string, so the guard silently degrades rather than gating as intended β€” a correctness/security-guard reliability concern in the gh-aw compiler output.
  • Reference: https://github.com/rhysd/actionlint/blob/main/docs/checks.md#type-checks-for-expression-syntax

Fix Suggestion for secret_verification_result undefined property

Issue: actionlint [expression] β€” property "secret_verification_result" is not defined in object type
Severity: error
Affected Workflows: 69

Prompt to Copilot Agent:

You are fixing an actionlint expression error emitted across 69 compiled gh-aw
workflows in github/gh-aw.

Rule: actionlint [expression] type-check
Docs: https://github.com/rhysd/actionlint/blob/main/docs/checks.md#type-checks-for-expression-syntax

Current Issue:
Activation jobs contain an `if:` condition that reads
`needs.<job>.outputs.secret_verification_result`, but the referenced job never
declares `secret_verification_result` in its `outputs:` block. actionlint reports:

  property "secret_verification_result" is not defined in object type
  {comment_id: string; engine_id: string; lockdown_check_failed: string;
   model: string; oauth_token_check_failed: string; ...}

Because the property is undefined at runtime it resolves to the empty string,
so any guard depending on it does not gate as intended.

This is compiler-generated output (.lock.yml). Do NOT hand-edit the 69 lock
files β€” fix the GENERATOR in pkg/workflow so recompilation is correct, then
recompile.

Required Fix (choose whichever matches the generator's intent):
1. If the guard IS meant to exist: add `secret_verification_result` to the
   emitted `outputs:` map of the producing job (the same job that already emits
   `lockdown_check_failed` / `oauth_token_check_failed`), wired to the step that
   computes it, e.g.:
     outputs:
       secret_verification_result: ${{ steps.<verify_step>.outputs.result }}
2. If the guard is obsolete: remove the `needs.*.outputs.secret_verification_result`
   reference from the generated `if:` condition entirely.

Example (before, in the generated job outputs):
    outputs:
      lockdown_check_failed: ${{ steps.check_lockdown.outputs.failed }}
      oauth_token_check_failed: ${{ steps.check_oauth.outputs.failed }}

Example (after, option 1):
    outputs:
      lockdown_check_failed: ${{ steps.check_lockdown.outputs.failed }}
      oauth_token_check_failed: ${{ steps.check_oauth.outputs.failed }}
      secret_verification_result: ${{ steps.verify_secret.outputs.result }}

After changing the generator, run the workflow recompilation and confirm
actionlint reports zero `[expression]` errors for secret_verification_result
across all 69 workflows.

All Findings Details

Runner-Guard high-severity findings β€” file/line map

RGS-012 Secret Exfiltration via Outbound HTTP Request (high)

  • daily-model-inventory.lock.yml: lines 499, 1085, 1189, 1253
  • visual-regression-checker.lock.yml: lines 520, 863
  • daily-byok-ollama-test.lock.yml: lines 475, 491
  • docs-noob-tester.lock.yml: line 564
  • daily-multi-device-docs-tester.lock.yml: line 582

RGS-018 Suspicious Payload Execution Pattern (high)

  • smoke-claude.lock.yml: line 1307 β€” framework FP (require('.../generate_safe_outputs_tools.cjs'); main())
  • daily-cli-performance.lock.yml: line 792 β€” framework FP (same scaffolding)
  • daily-sentrux-report.lock.yml: line 512
  • daily-byok-ollama-test.lock.yml: line 461

RGS-004 Comment-Triggered Without Author Authorization (high) β€” 308 findings across q.lock.yml (124), dev-hawk.lock.yml (94), ai-moderator.lock.yml (90). Framework false-positive: these workflows compile an author_association guard into their pre_activation job (fix #29481); runner-guard does not recognize the gh-aw activation-gate shape.

Actionlint shellcheck breakdown
Code Count Meaning
SC2016 35 Expressions won't expand in single quotes (usually intentional in heredocs)
SC2086 7 Double-quote to prevent globbing/word-splitting
SC2038 6 Use find -print0 | xargs -0
SC2034 2 Variable appears unused
SC2328/SC2327 2 Command substitution / redirection nuance
SC2188/SC2129/SC2005 3 Redirect-without-command / repeated redirects / useless echo

Runner-Guard Analysis

Runner-guard reported 332 findings (322 high, 10 medium), consistent with 2026-07-19/20. Per the deduplication policy, each high finding was matched against existing [static-analysis] issues (open + closed) by rule ID + affected file:

Result: 0 new issues, 0 comments β€” no open file-specific RGS issue exists to comment on, and every finding is either already closed or a confirmed false-positive.

Historical Trends

  • Previous Scan: 2026-07-20 (Β§29720019343) β€” total 469
  • Current Scan: 2026-07-21 (Β§29804491567) β€” total 476
  • Change: +7 (+1.5%)
Tool 2026-07-20 2026-07-21 Ξ”
zizmor 0 0 0
poutine 20 20 0
actionlint 114 124 +10
runner-guard 335 332 βˆ’3

New / Changed

  • actionlint shellcheck SC2016 +10 (25 β†’ 35) β€” new single-quote-expansion warnings in recently regenerated lock files.

Resolved / Reduced

  • runner-guard RGS-004 310 β†’ 308, RGS-007 (1, unverified) no longer present.

Recommendations

  1. Immediate: None required β€” no new Critical/High actionable security findings; all high RGS findings are closed or confirmed false-positives.
  2. Short-term: Fix the generator so secret_verification_result is declared in job outputs (69 actionlint errors) β€” this is the largest actionable cluster and a guard-reliability concern.
  3. Short-term: Investigate the SC2016 +10 uptick in newly regenerated lock files; add # shellcheck disable=SC2016 where single-quoting is intentional, or quote correctly where not.
  4. Long-term: Teach runner-guard (or add a suppression manifest) to recognize the gh-aw pre_activation author_association guard and generate_safe_outputs_tools.cjs scaffolding, to eliminate the RGS-004/RGS-018 false-positive noise (312 of 322 high findings).
  5. Prevention: Keep the recurring-finding dedup index in cache-memory to avoid reopening closed RGS issues.

Next Steps

  • Fix secret_verification_result undefined-output in the gh-aw generator, then recompile (69 workflows)
  • Triage SC2016 +10 shellcheck uptick
  • Consider a runner-guard suppression manifest for gh-aw framework patterns (RGS-004 activation guard, RGS-018 scaffolding)
  • No action on RGS-012/RGS-018/RGS-004 β€” already closed or confirmed false-positives

References:

Generated by πŸ“Š Static Analysis Report Β· 299.9 AIC Β· βŒ– 29 AIC Β· ⊞ 10K Β· β—·

  • expires on Jul 27, 2026, 9:51 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