Skip to content

[static-analysis] Report - 2026-07-22 #47198

Description

@github-actions

🔍 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 -->

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