You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Daily static analysis scan of all agentic workflow files using zizmor, poutine, and actionlint. All 153 workflows compiled successfully with zero structural failures. However, actionlint identified 719 issues across the entire workflow fleet, predominantly false-positive-style linting findings in compiled .lock.yml artifacts.
Tools Used: zizmor, poutine, actionlint (v1.7.11, with shellcheck & pyflakes)
Description: Workflows reference needs.pre_activation.outputs.activated and needs.pre_activation.outputs.matched_command in env blocks, but the pre_activation job's outputs: schema only declares activated, not matched_command. In some workflows, the pre_activation job doesn't exist at all (the job is named activation instead), causing actionlint to flag all references as undefined.
Impact: These are false positives at runtime — the env vars default to empty strings safely. However, they indicate a systemic inconsistency in how the compiler emits pre_activation job output references across different workflow patterns.
Description: Workflows use curl | sh or curl | bash patterns which download and execute scripts from the internet without verifying integrity. This is a supply chain risk.
Impact: If the remote script is compromised, arbitrary code executes in the runner. Should be replaced with verified download + hash check + execute pattern.
Reference: (woodruffw.github.io/redacted)
Fix Suggestion for pre_activation Undefined Outputs (Highest Count)
Issue: Expression errors — matched_command not declared in pre_activation outputs schema Severity: Error (actionlint) Affected: 242 occurrences across all compiled workflows
Prompt to Copilot Agent:
You are fixing a systemic linting issue identified by actionlint in compiled GitHub Actions workflow files (.lock.yml).
**Vulnerability**: Missing output declaration in `pre_activation` job schema
**Rule**: actionlint [expression] - property not defined in object type
**Reference**: https://github.com/rhysd/actionlint/blob/main/docs/checks.md#check-syntax-expression
**Current Issue**:
The `pre_activation` job declares only `activated` in its `outputs:` block, but downstream jobs reference both `needs.pre_activation.outputs.activated` AND `needs.pre_activation.outputs.matched_command`. Actionlint correctly flags `matched_command` as undefined in the output schema.
Additionally, some workflows use an `activation` job (not `pre_activation`) but still reference `needs.pre_activation.outputs.*`, causing actionlint to report the entire `pre_activation` key as undefined.
**Required Fix**:
In the compiler/template that generates `.lock.yml` files:
1. When a `pre_activation` job is included, ensure ALL outputs that downstream jobs may reference are declared in the job's `outputs:` block.
2. Add `matched_command` to the `pre_activation` job outputs declaration.
**Example**:
Before:
```yaml
pre_activation:
runs-on: ubuntu-slim
outputs:
activated: $\{\{ steps.check_membership.outputs.is_team_member == 'true' }}
steps:
...
```
After:
```yaml
pre_activation:
runs-on: ubuntu-slim
outputs:
activated: $\{\{ steps.check_membership.outputs.is_team_member == 'true' }}
matched_command: $\{\{ steps.check_activation.outputs.matched_command || '' }}
steps:
...
```
3. For workflows where the job is named `activation` (not `pre_activation`), either:
- Rename `activation` to `pre_activation` for consistency, OR
- Update all downstream `needs.pre_activation.outputs.*` references to `needs.activation.outputs.*`
The source of truth is the `.md` workflow files and the compiler template in the `actions/` directory. Fix the template rather than patching individual `.lock.yml` files, since those are generated artifacts.
Compiler Warnings (24 total)
View Compiler-Level Warnings
Warning Type
Count
Details
Fixed schedule time
8
Workflows use fixed cron times; fuzzy scheduling recommended to avoid thundering herd
Experimental features
7
Workflows use rate-limit or safe-inputs experimental features
Unresolved action versions
7
Dynamic version resolution failed; hardcoded pins used as fallback
This is the first scan — establishing baseline metrics.
Metric
2026-02-20 (Baseline)
Workflows scanned
153
Actionlint issues
719
Zizmor findings
8
Poutine findings
0
Future scans will compare against this baseline to track regression or improvement.
Recommendations
Immediate: Investigate the pre_activation job output schema gap in the workflow compiler template. Adding matched_command to the declared outputs would eliminate 242 expression errors across all workflows.
Short-term: Address unverified_script_exec zizmor findings in copilot-setup-steps.yml and daily-copilot-token-report by replacing curl | bash with a verified download pattern (download → checksum verify → execute).
Short-term: Fix SC2086 (unquoted $GITHUB_OUTPUT) in the cache-memory check script template — quote the variable: echo "has_content=true" >> "$GITHUB_OUTPUT".
Long-term: The SC2129 and SC1003 shellcheck findings are generated by compiler templates. Updating the shell script generation in the compiler would fix all 325 occurrences simultaneously.
Prevention: All three tools (zizmor, poutine, actionlint) are already integrated into the CI pipeline. Consider creating a tracked issue for the pre_activation output schema fix to reduce the actionlint error count from 719 toward 0 over time.
Next Steps
Fix pre_activation job outputs schema to include matched_command in compiler template
Review and fix curl | bash patterns in setup scripts (zizmor unverified_script_exec)
Quote $GITHUB_OUTPUT in cache-memory check scripts (SC2086)
Track actionlint count as a metric in future scans to measure progress
Update this report weekly via the static-analysis-report workflow
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
Analysis Summary
Daily static analysis scan of all agentic workflow files using zizmor, poutine, and actionlint. All 153 workflows compiled successfully with zero structural failures. However, actionlint identified 719 issues across the entire workflow fleet, predominantly false-positive-style linting findings in compiled
.lock.ymlartifacts.Findings by Tool
Clustered Findings by Tool and Type
Actionlint Linting Issues (719 total)
Category breakdown:
Shellcheck Findings:
{ cmd1; cmd2; } >> fileinstead of individual redirectsExpression Findings (undefined properties):
pre_activationmatched_commandmatched_commandoutput not declared inpre_activationjob outputs schemaprecomputeprecomputejob not in scope for the referencing stepcheck_ci_statuscheck_ci_statusjob outputs not in scopereleasereleasejob outputs not in scopeoutputoutputnot definedZizmor Security Findings (8 total — all info severity)
unverified_script_execcopilot-setup-steps.yml,daily-copilot-token-report.lock.ymlgithub_action_from_unverified_creator_usedunpinnable_actiondaily-perf-improver/build-steps/action.yml,daily-test-improver/coverage-steps/action.ymlPoutine Supply Chain Findings
No findings. Poutine scan completed clean.
Top Priority Issues
1. Expression:
pre_activation/matched_commandundefined outputs (242 total)pre_activation) + 34 (matched_command) = 242 occurrencesneeds.pre_activation.outputs.activatedandneeds.pre_activation.outputs.matched_commandin env blocks, but thepre_activationjob'soutputs:schema only declaresactivated, notmatched_command. In some workflows, thepre_activationjob doesn't exist at all (the job is namedactivationinstead), causing actionlint to flag all references as undefined.pre_activationjob output references across different workflow patterns.2. SC2129 — Individual redirects instead of grouped redirect (167 occurrences)
create_prompt_first.shinvocation blocks)>> fileredirects instead of grouping them with{ cmd1; cmd2; } >> file.3. SC1003 — Single-quote escaping (158 occurrences)
4. SC2086 — Unquoted variables (130 occurrences)
$GITHUB_OUTPUTreferenced without double quotes inecho "has_content=true" >> $GITHUB_OUTPUT.5. Zizmor:
unverified_script_exec— curl | bash patterns (4 occurrences)copilot-setup-steps.yml,daily-copilot-token-report.lock.ymlcurl | shorcurl | bashpatterns which download and execute scripts from the internet without verifying integrity. This is a supply chain risk.Fix Suggestion for
pre_activationUndefined Outputs (Highest Count)Issue: Expression errors —
matched_commandnot declared inpre_activationoutputs schemaSeverity: Error (actionlint)
Affected: 242 occurrences across all compiled workflows
Prompt to Copilot Agent:
Compiler Warnings (24 total)
View Compiler-Level Warnings
rate-limitorsafe-inputsexperimental featurescopilotengine doesn't supportweb-searchtoolexample-permissions-warning.mdmissingcontents: write,issues: write,pull-requests: writeUnresolved actions that used hardcoded pins:
actions/github-script@v7→ pinned tov7.1.0actions/setup-node@v6→ pinned tov6.2.0actions/setup-go@v6→ pinned tov6.2.0actions/setup-go@v5→ pinned tov5.6.0actions/checkout@v6→ pinned tov6.0.2docker/setup-buildx-action@v3→ pinned tov3.12.0docker/build-push-action@v6→ pinned tov6.19.2anchore/sbom-action@v0→ pinned tov0.22.2docker/login-action@v3→ pinned tov3.7.0docker/metadata-action@v5→ pinned tov5.10.0Historical Trends
This is the first scan — establishing baseline metrics.
Future scans will compare against this baseline to track regression or improvement.
Recommendations
Immediate: Investigate the
pre_activationjob output schema gap in the workflow compiler template. Addingmatched_commandto the declared outputs would eliminate 242 expression errors across all workflows.Short-term: Address
unverified_script_execzizmor findings incopilot-setup-steps.ymlanddaily-copilot-token-reportby replacingcurl | bashwith a verified download pattern (download → checksum verify → execute).Short-term: Fix SC2086 (unquoted
$GITHUB_OUTPUT) in the cache-memory check script template — quote the variable:echo "has_content=true" >> "$GITHUB_OUTPUT".Long-term: The SC2129 and SC1003 shellcheck findings are generated by compiler templates. Updating the shell script generation in the compiler would fix all 325 occurrences simultaneously.
Prevention: All three tools (zizmor, poutine, actionlint) are already integrated into the CI pipeline. Consider creating a tracked issue for the
pre_activationoutput schema fix to reduce the actionlint error count from 719 toward 0 over time.Next Steps
pre_activationjob outputs schema to includematched_commandin compiler templatecurl | bashpatterns in setup scripts (zizmorunverified_script_exec)$GITHUB_OUTPUTin cache-memory check scripts (SC2086)static-analysis-reportworkflowReferences:
Beta Was this translation helpful? Give feedback.
All reactions