π Static Analysis Report - 2026-06-30
Analysis Summary
- Tools Used: zizmor, poutine, actionlint, runner-guard
- Total Findings: 1387
- Workflows Scanned: 257
- Workflows Affected: ~200 (mostly by-design gh-aw patterns)
- Compilation: β
257 workflow(s) compiled, 0 errors, 182 warnings
Findings by Tool
| Tool |
Total |
Critical |
High |
Medium |
Low |
Info |
| zizmor (security) |
553 |
0 |
0 |
1 |
288 |
264 |
| poutine (supply chain) |
22 |
0 |
0 |
10 err |
1 |
11 note |
| actionlint (linting) |
482 |
β |
β |
β |
β |
β |
| runner-guard (taint) |
330 |
0 |
319 |
11 |
β |
β |
No new GitHub issues created. All 319 high-severity runner-guard findings are flat vs. yesterday with an identical rule+file mix, and every (rule + file) combination already has a closed static-analysis issue. Per the dedup policy (closed issue for same rule+file β skip), 0 new issues / 0 comments. zizmor High = 0 for the 13th+ consecutive day.
Clustered Findings by Tool and Type
Zizmor Security Findings (553)
| Issue Type |
Severity |
Count |
Notes |
| template-injection |
Informational |
263 |
Step-name ${{ }} expansion in generated steps (by design) |
| adhoc-packages |
Low |
258 |
CLI installs (npm install, AWF/SDK binaries) β by design |
| obfuscation |
Low |
30 |
${{ '' }} empty-string placeholders in emitted env |
| excessive-permissions |
Medium |
1 |
Single workflow (long-standing, dependabot-repair) |
| superfluous-actions |
Informational |
1 |
β |
Poutine Supply Chain Findings (22)
| Issue Type |
Severity |
Count |
Affected |
| untrusted_checkout_exec |
error |
10 |
smoke-workflow-call(-with-inputs) β all carry poutine:ignore |
| github_action_from_unverified_creator_used |
note |
8 |
hippo-embed (safedep/pmg), smoke-codex, etc. |
| unverified_script_exec |
note |
3 |
ollama/trufflehog `curl |
| pr_runs_on_self_hosted |
warning |
1 |
β |
Actionlint Linting Issues (482)
| Issue Type |
Count |
Notes |
| syntax-check |
426 |
unexpected key "queue" for "concurrency" β bundled actionlint doesn't know gh-aw queue extension (known FP) |
| shellcheck |
37 |
SC2016 single-quote expansion in emitted scripts |
| expression |
18 |
Genuine: needs.*.outputs.* references undefined properties (see fix below) |
| permissions |
1 |
β |
π actionlint dropped β755 (1237 β 482): the SC2086/SC2016 shellcheck spike from 2026-06-29 (792 β 37) was reverted/fixed. Big improvement.
Runner-Guard Taint Analysis Findings (330)
| Rule ID |
Name |
Severity |
Count |
Affected Workflows |
| RGS-004 |
Comment-Triggered Workflow Without Author Authorization Check |
high |
302 |
q (121), dev-hawk (92), ai-moderator (89) |
| RGS-012 |
Secret Exfiltration via Outbound HTTP Request |
high |
11 |
daily-model-inventory (4), daily-byok-ollama-test (3), visual-regression-checker (2), docs-noob-tester (1), daily-multi-device-docs-tester (1) |
| RGS-018 |
Suspicious Payload Execution Pattern |
high |
6 |
smoke-codex, smoke-claude, daily-sentrux-report, daily-cli-performance, daily-byok-ollama-test, copilot-setup-steps.yml |
| 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 |
| RGS-007 |
Unpinned Third-Party Action Using Mutable Tag |
medium |
1 |
publish-safe-outputs-node.yml |
Issues created this run: none. Dedup search confirmed closed issues already exist for every high rule+file: RGS-004 (#30077, #30284, #29694, #29460...), RGS-012 (#35652, #30776, #30079, #33477, #28488, #30947...), RGS-018 (#35653, #33476, #30532, #29461, #28154...). All are framework-level FPs: the comment-triggered agentic workflows (q/dev-hawk/ai-moderator) do gate on author association via the gh-aw pre_activation/membership check; RGS-012/018 fire on legitimate CLI installers and docs servers.
Top Priority Issue
1. actionlint [expression] β undefined needs.*.outputs.* properties
- Tool: actionlint
- Count: 18 (across 8 lock files)
- Severity: error (the only genuinely fixable, non-FP cluster this scan)
- Affected: approach-validator (3), skillet (3), ace-editor, daily-cache-strategy-analyzer, daily-caveman-optimizer, daily-doc-healer, smoke-workflow-call (4), smoke-workflow-call-with-inputs (4)
- Description: The emitter produces
${{ needs.<job>.outputs.<prop> }} referencing a job id / output key that isn't declared β activation vs pre_activation name mismatch (9), and undeclared workflow_* outputs on reusable workflow_call lock files (8).
- Impact: actionlint flags these as undefined-property errors; in CI they could surface as empty interpolations rather than the intended job output.
Fix Suggestion for actionlint [expression] undefined property
Issue: needs.<job>.outputs.<prop> references a job id/output that doesn't type-check
Severity: error
Affected Workflows: 8 lock files (18 occurrences)
Prompt to Copilot Agent:
You are fixing actionlint `[expression]` errors emitted by the gh-aw compiler.
Rule: actionlint expression β "property <x> is not defined in object type {...}"
These appear in GENERATED .lock.yml files, so the fix belongs in the Go emitter that
produces the `${{ needs.*.outputs.* }}` expressions, NOT in the .lock.yml itself.
Two clusters to fix:
1. activation name mismatch: consuming steps reference `needs.activation.outputs.activated`
(or `.pre_activation`) but the producing job is named `pre_activation` and/or the
referenced output key isn't in that job's `outputs:` map. Make the `needs.<id>` job id
and the output key match the producing job exactly, and ensure the producing job
declares every referenced output.
Affected: approach-validator, ace-editor, daily-cache-strategy-analyzer,
daily-caveman-optimizer, daily-doc-healer, skillet.
2. reusable workflow_call: smoke-workflow-call(.with-inputs) reference
`needs.*.outputs.workflow_file_path|workflow_ref|workflow_repository|workflow_sha`
that are never declared as job outputs. Declare these keys in the producing job's
`outputs:` block before any downstream reference.
Before:
```yaml
needs: [pre_activation]
steps:
- run: echo "${{ needs.activation.outputs.activated }}" # undefined job + key
After:
needs: [pre_activation]
steps:
- run: echo "${{ needs.pre_activation.outputs.activated }}"
# and the producing job declares:
pre_activation:
outputs:
activated: ${{ steps.x.outputs.activated }}
Verify by recompiling and confirming actionlint reports 0 [expression] errors for the
affected lock files.
<details>
<summary>All findings detail (by tool)</summary>
**zizmor** (553): template-injection 263 Β· adhoc-packages 258 Β· obfuscation 30 Β· excessive-permissions 1 (Medium) Β· superfluous-actions 1. High = 0.
**poutine** (22): untrusted_checkout_exec 10 (all `poutine:ignore`-annotated) Β· github_action_from_unverified_creator_used 8 Β· unverified_script_exec 3 Β· pr_runs_on_self_hosted 1.
**actionlint** (482): syntax-check 426 (`queue` concurrency FP) Β· shellcheck 37 (SC2016) Β· expression 18 (genuine) Β· permissions 1.
**runner-guard** (330): high 319 (RGS-004 302, RGS-012 11, RGS-018 6) Β· medium 11 (RGS-005 8, RGS-019 2, RGS-007 1).
</details>
### Historical Trends
| Date | zizmor | poutine | actionlint | runner-guard | Total |
|------|--------|---------|------------|--------------|-------|
| 2026-06-27 | 541 | 22 | 778 | 330 | 1671 |
| 2026-06-28 | 552 | 22 | 787 | 330 | 1691 |
| 2026-06-29 | 552 | 22 | 1237 | 330 | 2141 |
| **2026-06-30** | **553** | **22** | **482** | **330** | **1387** |
- **Total: 2141 β 1387 (β754, β35%)** β driven entirely by actionlint shellcheck normalizing (792 β 37).
- **zizmor**: +1 (adhoc-packages 257 β 258, one workflow added a CLI install). High = 0, 13th+ consecutive clean day.
- **poutine / runner-guard**: completely flat, identical rule+file mix.
#### New Issues
None β no new rule types appeared.
#### Resolved Issues
The actionlint SC2086/SC2016 shellcheck regression (792 findings on 2026-06-29) is resolved (β755).
### Recommendations
1. **Immediate**: None β 0 unaddressed Critical/High security findings; all high runner-guard findings are reviewed framework FPs with closed issues.
2. **Short-term**: Fix the 18 actionlint `[expression]` undefined-property errors in the emitter (see fix prompt) β the only genuine, fixable cluster.
3. **Long-term**: Teach the bundled actionlint about the gh-aw `queue` concurrency extension to clear the 426 syntax-check FPs (the single largest noise source).
4. **Prevention**: Keep monitoring the shellcheck emitter to prevent another SC2086/SC2016 spike like 2026-06-29.
### Next Steps
- [ ] Apply the emitter fix for actionlint `[expression]` undefined `needs.*.outputs.*` (8 lock files)
- [ ] Suppress/teach actionlint the `queue` concurrency key (426 FPs)
- [ ] No action needed on runner-guard high findings (all reviewed, closed, framework FPs)
- [ ] Continue daily trend tracking
**References:**
- [Β§28423720204](https://github.com/github/gh-aw/actions/runs/28423720204)
> Generated by [π Static Analysis Report](https://github.com/github/gh-aw/actions/runs/28423720204) Β· 223.2 AIC Β· β 33.6 AIC Β· β 10K Β· [β·](https://github.com/search?q=repo%3Agithub%2Fgh-aw+is%3Aissue+%22gh-aw-workflow-call-id%3A+github%2Fgh-aw%2Fstatic-analysis-report%22&type=issues)
> - [x] expires <!-- gh-aw-expires: 2026-07-07T06:13:27.784Z --> on Jul 6, 2026, 10:13 PM UTC-08:00
<!-- gh-aw-agentic-workflow: Static Analysis Report, engine: claude, model: agent, id: 28423720204, workflow_id: static-analysis-report, run: https://github.com/github/gh-aw/actions/runs/28423720204 -->
<!-- gh-aw-workflow-id: static-analysis-report -->
<!-- gh-aw-workflow-call-id: github/gh-aw/static-analysis-report -->
π Static Analysis Report - 2026-06-30
Analysis Summary
Findings by Tool
Clustered Findings by Tool and Type
Zizmor Security Findings (553)
${{ }}expansion in generated steps (by design)npm install, AWF/SDK binaries) β by design${{ '' }}empty-string placeholders in emitted envPoutine Supply Chain Findings (22)
poutine:ignoreActionlint Linting Issues (482)
unexpected key "queue" for "concurrency"β bundled actionlint doesn't know gh-awqueueextension (known FP)needs.*.outputs.*references undefined properties (see fix below)Runner-Guard Taint Analysis Findings (330)
Issues created this run: none. Dedup search confirmed closed issues already exist for every high rule+file: RGS-004 (#30077, #30284, #29694, #29460...), RGS-012 (#35652, #30776, #30079, #33477, #28488, #30947...), RGS-018 (#35653, #33476, #30532, #29461, #28154...). All are framework-level FPs: the comment-triggered agentic workflows (q/dev-hawk/ai-moderator) do gate on author association via the gh-aw
pre_activation/membership check; RGS-012/018 fire on legitimate CLI installers and docs servers.Top Priority Issue
1. actionlint
[expression]β undefinedneeds.*.outputs.*properties${{ needs.<job>.outputs.<prop> }}referencing a job id / output key that isn't declared βactivationvspre_activationname mismatch (9), and undeclaredworkflow_*outputs on reusableworkflow_calllock files (8).Fix Suggestion for actionlint
[expression]undefined propertyIssue:
needs.<job>.outputs.<prop>references a job id/output that doesn't type-checkSeverity: error
Affected Workflows: 8 lock files (18 occurrences)
Prompt to Copilot Agent:
After:
Verify by recompiling and confirming actionlint reports 0
[expression]errors for theaffected lock files.