🔍 Static Analysis Report - 2026-07-22
Analysis Summary
- Tools Used: zizmor, poutine, actionlint, runner-guard
- Total Findings: 997 (zizmor 0 · poutine 20 · actionlint 644 · runner-guard 333)
- Workflows Scanned: 260
- Workflows Affected: 260 (all lock files hit by a new actionlint regression)
Headline: actionlint findings spiked 124 → 644 overnight due to a new compiler regression: property "mount-mcp-clis" is not defined appears 520 times across all 260 lock files. Runner-guard, poutine, and zizmor are otherwise unchanged from 2026-07-21.
Findings by Tool
| Tool |
Total |
Critical |
High |
Medium |
Low |
| zizmor (security) |
0 |
0 |
0 |
0 |
0 |
| poutine (supply chain) |
20 |
0 |
10 |
1 |
01 |
| actionlint (linting) |
644 |
- |
- |
- |
- |
| runner-guard (taint analysis) |
333 |
0 |
322 |
11 |
0 |
1 poutine also emitted 9 [note]-level unverified-creator infos (counted in the 20).
⚠️ zizmor anomaly: the scanner printed only its "Running zizmor..." banner immediately followed by poutine's banner, with no summary block — output was not captured this run. Recurring since 2026-07-16.
Clustered Findings by Tool and Type
Zizmor Security Findings
No findings emitted (see anomaly note above).
Poutine Supply Chain Findings
| Issue Type |
Severity |
Count |
Affected Workflows |
untrusted_checkout_exec |
error/high |
10 |
smoke-workflow-call, smoke-workflow-call-with-inputs (5 each) |
github_action_from_unverified_creator_used |
note |
9 |
hippo-embed, mcp-inspector, copilot-setup-steps, daily-elixir-credo-snippet-audit, dataflow-pr-discussion-dataset, super-linter, smoke-codex, link-check (×2) |
pr_runs_on_self_hosted |
warning |
1 |
smoke-copilot-arm |
All suppressed via poutine:ignore in generated lock files or are [note]-level trusted creators (safedep/pmg, astral-sh, erlef, super-linter). Identical to 2026-07-21.
Actionlint Linting Issues
| Issue Type |
Count |
Affected Workflows |
[expression] property mount-mcp-clis not defined 🆕 |
520 |
all 260 lock files (2× each) |
[expression] property secret_verification_result not defined |
69 |
69 lock files (stable regression) |
[shellcheck] SC2016 |
35 |
multiple |
[shellcheck] SC2086 |
7 |
multiple |
[shellcheck] SC2038 |
6 |
multiple |
[shellcheck] SC2034 / SC2328 / SC2327 / SC2188 / SC2129 / SC2005 |
7 |
multiple |
Runner-Guard Taint Analysis Findings
Runner-Guard Score: not emitted this run (no score/grade line in 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 |
| RGS-007 |
Unpinned Third-Party Action Using Mutable Tag 🆕 |
medium |
1 |
publish-safe-outputs-node.yml |
Issues created: none — all high RGS findings map to CLOSED same-rule+file issues (verified #35652 CLOSED for RGS-012/byok-ollama) or are established framework false-positives; no OPEN static-analysis issues exist to comment on. RGS-007 is medium (below the high/critical threshold). See Runner-Guard Analysis below.
Top Priority Issues
1. actionlint: mount-mcp-clis undefined-property regression (NEW)
- Tool: actionlint
- Count: 520 (across all 260 lock files)
- Severity: error
- Affected: every compiled
.lock.yml
- Description: Lock files reference
${{ steps.mount-mcp-clis.outputs.mcp-cli-servers-list }} (env GH_AW_MCP_CLI_SERVERS_LIST) in a job/step scope where no step with id: mount-mcp-clis is visible — the step is emitted later or in a different job than the reference.
- Impact: This is a gh-aw compiler emission bug, not a per-workflow defect. It floods actionlint output (5× noise increase), masking real linting signal. No runtime failure, but it indicates the generator emits a
steps.* reference outside the step's scope.
- Reference: https://github.com/rhysd/actionlint/blob/main/docs/checks.md#check-syntax-expression
2. runner-guard RGS-004: comment-triggered workflows (high, 308)
- Tool: runner-guard · Severity: high · Affected: q, dev-hawk, ai-moderator
- Impact: Flags comment-triggered workflows with secret access lacking an author-authorization check. Framework false-positive: gh-aw compiles an
author_association guard into pre-activation jobs; already tracked via CLOSED umbrella issues.
Fix Suggestion for actionlint mount-mcp-clis undefined property
Issue: [expression] property "mount-mcp-clis" is not defined (actionlint check-syntax-expression)
Severity: error
Affected Workflows: 260 (all lock files, 520 occurrences)
Prompt to Copilot Agent:
You are fixing an actionlint expression error that appears 520 times across all 260
generated .lock.yml workflow files in github/gh-aw.
Rule: actionlint check-syntax-expression
Docs: https://github.com/rhysd/actionlint/blob/main/docs/checks.md#check-syntax-expression
Current Issue:
Every compiled lock file contains, twice, an env assignment like:
GH_AW_MCP_CLI_SERVERS_LIST: ${{ steps.mount-mcp-clis.outputs.mcp-cli-servers-list }}
but the step that defines `id: mount-mcp-clis` is emitted later in the file / in a
different job than the reference. actionlint therefore reports:
property "mount-mcp-clis" is not defined in object type {check-lock-file: ...; setup: ...}
because no step with that id is visible in the referencing job's `steps` context.
This is a COMPILER EMISSION bug — do NOT hand-edit the generated .lock.yml files.
Required Fix:
1. In the gh-aw Go compiler / workflow templates, grep for `mount-mcp-clis` and
`mcp-cli-servers-list` to find where the step and the reference are generated.
2. Ensure the `mount-mcp-clis` step is emitted in the SAME job and BEFORE every step
that references `steps.mount-mcp-clis.outputs.mcp-cli-servers-list`. If the value is
needed across jobs, promote it to a job-level `output` and consume it via
`needs.<job>.outputs.mcp_cli_servers_list` instead of `steps.*`.
3. Recompile all workflows and re-run actionlint; confirm the 520 errors are cleared and
the actionlint total returns to ~124.
Example:
Before (reference precedes/outside the step's scope):
```yaml
env:
GH_AW_MCP_CLI_SERVERS_LIST: ${{ steps.mount-mcp-clis.outputs.mcp-cli-servers-list }}
# ... step with id: mount-mcp-clis defined later or in another job ...
After (step precedes the reference in the same job):
- name: Mount MCP CLIs
id: mount-mcp-clis
run: ... # sets output mcp-cli-servers-list
- name: Create prompt
env:
GH_AW_MCP_CLI_SERVERS_LIST: ${{ steps.mount-mcp-clis.outputs.mcp-cli-servers-list }}
### All Findings Details
<details>
<summary><b>Detailed Findings by Category</b></summary>
#### actionlint — expression (589)
- **`mount-mcp-clis` not defined** (520): lines ~269 & ~351 of each lock file reference `steps.mount-mcp-clis.outputs.mcp-cli-servers-list`; step `id: mount-mcp-clis` at ~line 787 (out of scope). New today.
- **`secret_verification_result` not defined** (69): an `if:` condition references an undeclared job output. Stable regression since 2026-07-18.
#### actionlint — shellcheck (55)
SC2016 (35, unquoted-`$`-in-single-quotes), SC2086 (7, unquoted vars), SC2038 (6, find-piped-to-xargs), SC2034 (2), + SC2328/SC2327/SC2188/SC2129/SC2005 (1 each). Unchanged from 2026-07-21.
#### poutine (20)
`untrusted_checkout_exec` ×10 on smoke-workflow-call{,-with-inputs} (suppressed via `poutine:ignore`); `github_action_from_unverified_creator_used` ×9 (`[note]`); `pr_runs_on_self_hosted` ×1 (smoke-copilot-arm).
#### runner-guard (333)
RGS-004 ×308 (q/dev-hawk/ai-moderator), RGS-012 ×10, RGS-018 ×4, RGS-005 ×8, RGS-019 ×2, RGS-007 ×1. All high findings are framework FPs or map to closed issues (see below).
</details>
### Runner-Guard Analysis
Runner-guard reported **333 findings (322 high, 11 medium)** — essentially identical to 2026-07-19..21. Applying deduplication (rule ID + affected file, open **and** closed issues):
- **RGS-004** (high, 308 — q, dev-hawk, ai-moderator): framework false-positive. gh-aw compiles an `author_association` authorization guard into pre-activation jobs; runner-guard doesn't model that indirection. Tracked via CLOSED umbrella issues (#28156 / #29694 / #30284).
- **RGS-012** (high, 10 — 5 files): all map to CLOSED same-rule+file issues (verified #35652 CLOSED for daily-byok-ollama-test; #30079/#30776/#30947/#28626/#28488/#33477 per prior scans). Outbound HTTP in secret-bearing jobs is expected in these scheduled test/report workflows.
- **RGS-018** (high, 4): daily-sentrux-report → CLOSED #46532; daily-byok-ollama-test → CLOSED #35653; smoke-claude & daily-cli-performance → trusted gh-aw MCP-scaffolding FP (finding lands on `const {main}=require('.../generate_safe_outputs_tools.cjs'); await main();`, checked-in scaffolding, not an IOC).
- **RGS-005** (medium, 8) / **RGS-019** (medium, 2) / **RGS-007** (medium, 1): below the high/critical issue threshold. RGS-007 (publish-safe-outputs-node.yml, unpinned mutable tag) reappeared today after being absent on 2026-07-21.
**Result: 0 new issues, 0 comments** — no OPEN static-analysis issues exist to comment on (label search empty), and every high finding maps to a CLOSED issue or an established framework false-positive.
### Historical Trends
| Metric | 2026-07-21 | 2026-07-22 | Change |
|--------|-----------|-----------|--------|
| zizmor | 0 | 0 | 0 |
| poutine | 20 | 20 | 0 |
| actionlint | 124 | **644** | **+520 (+419%)** |
| runner-guard | 332 | 333 | +1 |
#### New Issues
- 🆕 actionlint `mount-mcp-clis` undefined property (520) — new compiler regression affecting all lock files.
- 🆕 runner-guard RGS-007 (1, medium) reappeared on publish-safe-outputs-node.yml.
#### Resolved Issues
- None resolved; the `secret_verification_result` (69) and shellcheck (55) regressions persist unchanged.
### Recommendations
1. **Immediate**: Fix the gh-aw compiler so `mount-mcp-clis` is emitted in-scope before its references (see fix prompt) — this clears 520 of 644 actionlint errors and restores linting signal.
2. **Short-term**: Address the stable `secret_verification_result` undeclared-output regression (69) and the SC2016/SC2086 shellcheck warnings (42).
3. **Long-term**: Investigate why zizmor emits no summary (recurring since 2026-07-16) so its coverage isn't silently lost.
4. **Prevention**: Add an actionlint gate on compiled lock files in CI to catch scope-of-reference regressions before merge.
### Next Steps
- [ ] Fix compiler emission of `steps.mount-mcp-clis` reference (top priority)
- [ ] Resolve `secret_verification_result` undeclared job output
- [ ] Restore zizmor output capture
- [ ] Review RGS-007 unpinned tag on publish-safe-outputs-node.yml
- [ ] Add actionlint check on lock files to CI
**References:**
- [§29894227749](https://github.com/github/gh-aw/actions/runs/29894227749)
- [§29804491567](https://github.com/github/gh-aw/actions/runs/29804491567)
> Generated by [📊 Static Analysis Report](https://github.com/github/gh-aw/actions/runs/29894227749) · age00 226.8 AIC · ⌖ 35.4 AIC · ⊞ 9.9K · [◷](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-29T05:49:05.522Z --> on Jul 28, 2026, 9:49 PM UTC-08:00
<!-- gh-aw-agentic-workflow: Static Analysis Report, engine: claude, model: agent, id: 29894227749, workflow_id: static-analysis-report, run: https://github.com/github/gh-aw/actions/runs/29894227749 -->
<!-- gh-aw-workflow-id: static-analysis-report -->
<!-- gh-aw-workflow-call-id: github/gh-aw/static-analysis-report -->
🔍 Static Analysis Report - 2026-07-22
Analysis Summary
Findings by Tool
1 poutine also emitted 9
[note]-level unverified-creator infos (counted in the 20).Clustered Findings by Tool and Type
Zizmor Security Findings
No findings emitted (see anomaly note above).
Poutine Supply Chain Findings
untrusted_checkout_execgithub_action_from_unverified_creator_usedpr_runs_on_self_hostedAll suppressed via
poutine:ignorein generated lock files or are[note]-level trusted creators (safedep/pmg, astral-sh, erlef, super-linter). Identical to 2026-07-21.Actionlint Linting Issues
[expression]propertymount-mcp-clisnot defined 🆕[expression]propertysecret_verification_resultnot defined[shellcheck]SC2016[shellcheck]SC2086[shellcheck]SC2038[shellcheck]SC2034 / SC2328 / SC2327 / SC2188 / SC2129 / SC2005Runner-Guard Taint Analysis Findings
Runner-Guard Score: not emitted this run (no score/grade line in output).
Issues created: none — all high RGS findings map to CLOSED same-rule+file issues (verified #35652 CLOSED for RGS-012/byok-ollama) or are established framework false-positives; no OPEN static-analysis issues exist to comment on. RGS-007 is medium (below the high/critical threshold). See Runner-Guard Analysis below.
Top Priority Issues
1. actionlint:
mount-mcp-clisundefined-property regression (NEW).lock.yml${{ steps.mount-mcp-clis.outputs.mcp-cli-servers-list }}(envGH_AW_MCP_CLI_SERVERS_LIST) in a job/step scope where no step withid: mount-mcp-clisis visible — the step is emitted later or in a different job than the reference.steps.*reference outside the step's scope.2. runner-guard RGS-004: comment-triggered workflows (high, 308)
author_associationguard into pre-activation jobs; already tracked via CLOSED umbrella issues.Fix Suggestion for actionlint
mount-mcp-clisundefined propertyIssue:
[expression] property "mount-mcp-clis" is not defined(actionlint check-syntax-expression)Severity: error
Affected Workflows: 260 (all lock files, 520 occurrences)
Prompt to Copilot Agent:
After (step precedes the reference in the same job):