π 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
- Immediate: None required β no new Critical/High actionable security findings; all high RGS findings are closed or confirmed false-positives.
- 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.
- 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.
- 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).
- Prevention: Keep the recurring-finding dedup index in cache-memory to avoid reopening closed RGS issues.
Next Steps
References:
Generated by π Static Analysis Report Β· 299.9 AIC Β· β 29 AIC Β· β 10K Β· β·
π 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
secret_verification_resultexpression error across 69 files)Findings by Tool
Clustered Findings by Tool and Type
Poutine Supply Chain Findings
untrusted_checkout_execgithub_action_from_unverified_creator_usedpr_runs_on_self_hostedAll
untrusted_checkout_exechits are suppressed via# poutine:ignorein the generated lock files (intentional for the workflow-call smoke tests).unverified_creatorare informational notes on legitimately SHA-pinned actions.Actionlint Linting Issues
[expression]propertysecret_verification_resultnot defined[shellcheck]SC2016 (single quotes suppress expansion)[shellcheck]SC2086 (unquoted variable)[shellcheck]SC2038 (find + xargs)[shellcheck]SC2034 / SC2328 / SC2327 / SC2188 / SC2129 / SC2005Shellcheck 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.
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_resultundefined property (actionlint[expression])if:referencesneeds.<job>.outputs.secret_verification_resultif:condition referencesneeds.*.outputs.secret_verification_result, but that output is not declared in the producing job'soutputs:map (theneedsobject type listscomment_id,engine_id,model,lockdown_check_failed, ... but notsecret_verification_result).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.Fix Suggestion for
secret_verification_resultundefined propertyIssue: actionlint
[expression]βproperty "secret_verification_result" is not defined in object typeSeverity: error
Affected Workflows: 69
Prompt to Copilot Agent:
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, 1253visual-regression-checker.lock.yml: lines 520, 863daily-byok-ollama-test.lock.yml: lines 475, 491docs-noob-tester.lock.yml: line 564daily-multi-device-docs-tester.lock.yml: line 582RGS-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 512daily-byok-ollama-test.lock.yml: line 461RGS-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_associationguard into theirpre_activationjob (fix #29481); runner-guard does not recognize the gh-aw activation-gate shape.Actionlint shellcheck breakdown
find -print0 | xargs -0Runner-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:pre_activation, fix fix(rgs-004): add author_association guard to pre_activation jobs for comment-triggered workflowsΒ #29481). Skip.const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_safe_outputs_tools.cjs'); await main();, a trusted checked-in gh-aw script load, not an obfuscated payload/IOC. Skip.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
New / Changed
Resolved / Reduced
Recommendations
secret_verification_resultis declared in joboutputs(69 actionlint errors) β this is the largest actionable cluster and a guard-reliability concern.# shellcheck disable=SC2016where single-quoting is intentional, or quote correctly where not.pre_activationauthor_association guard andgenerate_safe_outputs_tools.cjsscaffolding, to eliminate the RGS-004/RGS-018 false-positive noise (312 of 322 high findings).Next Steps
secret_verification_resultundefined-output in the gh-aw generator, then recompile (69 workflows)References: