Static analysis for GitHub Actions (and more)
This report summarizes scanner evidence for zizmorcore/zizmor, a Rust project with 6,848 GitHub stars. SynthScan examined 100,886 lines of code across 638 source files, recording 161 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 1.8 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 159 finding(s).
Are imports declared and package/API names verified? 0 finding(s).
Are wrappers, guards, and repeated structures necessary? 6 finding(s).
Which changes need focused human review? 161 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 161 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …-models/tests/sample-dependabot/v2/sigstore-python.yml | 1 | # https://github.com/sigstore/sigstore-python/blob/e0168a781b87d059fde05dfdfe0ce82e564ce095/.github/dependabot.yml | COMMENT |
| LOW | …models/tests/sample-workflows/pip-audit-scorecards.yml | 1 | # https://github.com/pypa/pip-audit/blob/1fd67af0653a8e66b9470adab2e408a435632f19/.github/workflows/scorecards.yml | COMMENT |
| LOW | …sts/sample-workflows/mhils-workflows-python-deploy.yml | 1 | # https://raw.githubusercontent.com/mhils/workflows/0d7c124ffff22d26be111477a3ed9fadd853a6db/.github/workflows/python-de | COMMENT |
| LOW | …sts/sample-workflows/mhils-workflows-python-deploy.yml | 21 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | COMMENT |
| LOW | …actions-models/tests/sample-workflows/pip-api-test.yml | 1 | # https://github.com/di/pip-api/blob/60691ed6bdc0c213253593de869bff1cf9195b81/.github/workflows/test.yml | COMMENT |
| LOW | …actions-models/tests/sample-workflows/pip-audit-ci.yml | 1 | # https://github.com/pypa/pip-audit/blob/1fd67af0653a8e66b9470adab2e408a435632f19/.github/workflows/ci.yml | COMMENT |
| LOW | …s/tests/sample-workflows/jazzband-tablib-docs-lint.yml | 1 | # https://raw.githubusercontent.com/jazzband/tablib/dcab406c553fc8b3c2e0aef955e9e8adea0590d8/.github/workflows/docs-lint | COMMENT |
| LOW | …/sample-workflows/adafruit-circuitpython-run-tests.yml | 1 | # https://github.com/adafruit/circuitpython/blob/24a8927d0ce1d77addd584bf809ab73cb0386e75/.github/workflows/run-tests.ym | COMMENT |
| LOW | …/sample-workflows/adafruit-circuitpython-run-tests.yml | 81 | # - name: Build native modules | COMMENT |
| LOW | …s/sample-workflows/homebrew-core-dispatch-rebottle.yml | 1 | # https://github.com/Homebrew/homebrew-core/blob/8b4101be35fb7053e2026edcf1f7d218a5ac3379/.github/workflows/dispatch-reb | COMMENT |
| LOW | …le-workflows/vil02-puzzle_generator-check_examples.yml | 1 | # https://raw.githubusercontent.com/vil02/puzzle_generator/e2c864ef2985743a648a35b2313eb9dd4592bd18/.github/workflows/ch | COMMENT |
| LOW | …ions-models/tests/sample-workflows/guacsec-guac-ci.yml | 1 | # https://github.com/guacsec/guac/blob/85868eadbf6a287f9bf5f47d355ff944080d3845/.github/workflows/ci.yaml | COMMENT |
| LOW | …/sample-workflows/homebrew-core-automerge-triggers.yml | 1 | # https://github.com/Homebrew/homebrew-core/blob/ac74cb3f7dbdb2da2200886d5e740de124bab861/.github/workflows/automerge-tr | COMMENT |
| LOW | …ts/sample-workflows/letsencrypt-boulder-boulder-ci.yml | 41 | # When set to true, GitHub cancels all in-progress jobs if any matrix job fails. Default: true | COMMENT |
| LOW | …ample-workflows/gh-action-sigstore-python-selftest.yml | 1 | # https://github.com/sigstore/gh-action-sigstore-python/blob/b3690e3a279c94669b1e9e4e1e29317cdc7a52d5/.github/workflows/ | COMMENT |
| LOW | …b-actions-models/tests/sample-actions/setup-python.yml | 1 | # https://github.com/actions/setup-python/blob/e9d6f990972a57673cdb72ec29e19d42ba28880f/action.yml | COMMENT |
| LOW | …els/tests/sample-actions/gh-action-sigstore-python.yml | 1 | # https://github.com/sigstore/gh-action-sigstore-python/blob/b3690e3a279c94669b1e9e4e1e29317cdc7a52d5/action.yml | COMMENT |
| LOW | …models/tests/sample-actions/gh-action-pypi-publish.yml | 1 | # https://github.com/pypa/gh-action-pypi-publish/blob/2f6f737ca5f74c637829c0f5c3acd0e29ea5e8bf/action.yml | COMMENT |
| LOW | crates/github-actions-models/src/action.rs | 1 | //! Data models for GitHub Actions action definitions. | COMMENT |
| LOW | crates/github-actions-models/src/action.rs | 41 | pub required: Option<bool>, | COMMENT |
| LOW | crates/github-actions-models/src/action.rs | 81 | COMMENT | |
| LOW | crates/github-actions-models/src/action.rs | 121 | /// An optional boolean or expression that, if `true`, prevents the job from failing when | COMMENT |
| LOW | crates/github-actions-models/src/action.rs | 161 | COMMENT | |
| LOW | crates/github-actions-models/src/common.rs | 41 | } | COMMENT |
| LOW | crates/github-actions-models/src/common.rs | 61 | /// Read access. | COMMENT |
| LOW | crates/github-actions-models/src/lock/mod.rs | 1 | //! Data models for GitHub Actions workflow lockfiles. | COMMENT |
| LOW | crates/github-actions-models/src/workflow/job.rs | 161 | COMMENT | |
| LOW | crates/github-actions-models/src/workflow/event.rs | 1 | //! Workflow events. | COMMENT |
| LOW | crates/github-actions-models/src/workflow/event.rs | 261 | #[derive(Deserialize, Serialize, Debug)] | COMMENT |
| LOW | crates/github-actions-models/src/workflow/mod.rs | 41 | /// | COMMENT |
| LOW | crates/github-actions-models/src/workflow/mod.rs | 61 | /// | COMMENT |
| LOW | crates/github-actions-models/src/dependabot/v2.rs | 1 | //! "v2" Dependabot models. | COMMENT |
| LOW | crates/github-actions-models/src/dependabot/v2.rs | 161 | /// and dependencies. | COMMENT |
| LOW | crates/github-actions-models/src/dependabot/v2.rs | 201 | pub target_branch: Option<String>, | COMMENT |
| LOW | crates/github-actions-models/src/dependabot/v2.rs | 341 | /// These are, inexplicably, not [`UpdateType`] variants. | COMMENT |
| LOW | crates/github-actions-expressions/src/lib.rs | 21 | mod parser; | COMMENT |
| LOW | crates/github-actions-expressions/src/lib.rs | 41 | /// A human-readable description of the error. | COMMENT |
| LOW | crates/github-actions-expressions/src/lib.rs | 421 | } | COMMENT |
| LOW | crates/github-actions-expressions/src/lib.rs | 701 | impl<'src> Expr<'src> { | COMMENT |
| LOW | crates/github-actions-expressions/src/identifier.rs | 1 | //! Identifiers. | COMMENT |
| LOW | crates/github-actions-expressions/src/call.rs | 1 | //! Representation of function calls in GitHub Actions expressions. | COMMENT |
| LOW | crates/github-actions-expressions/src/call.rs | 21 | /// `contains(haystack, needle)` | COMMENT |
| LOW | crates/github-actions-expressions/src/context.rs | 1 | //! Parsing and matching APIs for GitHub Actions expressions | COMMENT |
| LOW | crates/github-actions-expressions/src/context.rs | 101 | Expr::Index(idx) => match &idx.inner { | COMMENT |
| LOW | crates/github-actions-expressions/src/context.rs | 141 | COMMENT | |
| LOW | crates/zizmor-dev/src/lib.rs | 361 | } | COMMENT |
| LOW | crates/subfeature/src/lib.rs | 1 | //! Subfeature handling and manipulation APIs. | COMMENT |
| LOW | crates/subfeature/src/lib.rs | 41 | COMMENT | |
| LOW | crates/subfeature/src/lib.rs | 61 | // replacing all whitespace with `\\s+`. | COMMENT |
| LOW | crates/yamlpath/src/lib.rs | 1 | //! Comment and format-preserving YAML path routes. | COMMENT |
| LOW | crates/yamlpath/src/lib.rs | 201 | /// The user's input YAML is malformed. | COMMENT |
| LOW | crates/yamlpath/src/lib.rs | 221 | MissingChild(String, String), | COMMENT |
| LOW | crates/yamlpath/src/lib.rs | 241 | /// bar: | COMMENT |
| LOW | crates/yamlpath/src/lib.rs | 441 | _node: node, | COMMENT |
| LOW | crates/yamlpath/src/lib.rs | 661 | } | COMMENT |
| LOW | crates/yamlpath/src/lib.rs | 681 | self.query_node(route, QueryMode::Pretty).map(|n| n.into()) | COMMENT |
| LOW | crates/yamlpath/src/lib.rs | 721 | COMMENT | |
| LOW | crates/yamlpath/src/lib.rs | 741 | /// neighbor, so the surrounding flow collection stays well-formed. A | COMMENT |
| LOW | crates/yamlpath/src/lib.rs | 1021 | /// span, meaning that leading whitespace for the start point is not | COMMENT |
| LOW | crates/yamlpath/src/lib.rs | 1061 | // nodes and extract all comment nodes in the line range for the | COMMENT |
| 78 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/yamlpath/src/lib.rs | 902 | /// robust against arbitrary nesting of flow and block collections. | COMMENT |
| MEDIUM | …ion/test-data/unpinned-images/docker-action/action.yml | 12 | # to see a comprehensive list of all environment variables that can be passed | COMMENT |
| MEDIUM | …s/zizmor/tests/integration/audit/template_injection.rs | 898 | # All expressions are replaced and environment variables are created in a single comprehensive fix | COMMENT |
| MEDIUM | …s/zizmor/tests/integration/audit/template_injection.rs | 918 | # All expressions are replaced and environment variables are created in a single comprehensive fix | COMMENT |
| MEDIUM | crates/zizmor/src/audit/impostor_commit.rs | 44 | /// Definitely an impostor. | COMMENT |
| MEDIUM | crates/zizmor/src/audit/impostor_commit.rs | 46 | /// Definitely not an impostor. | COMMENT |
| MEDIUM | crates/zizmor/src/audit/impostor_commit.rs | 207 | // Our logic is a little nuanced here: we have two fast paths, and we want to try | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …tions-models/tests/sample-dependabot/homebrew-core.yml | 3 | # This file is synced from the `.github` repository, do not modify it directly. | COMMENT |
| MEDIUM | …ons-models/tests/sample-workflows/zizmor-issue-650.yml | 7 | # This file is maintained in https://github.com/WeblateOrg/meta/ | COMMENT |
| MEDIUM | crates/tree-sitter-iter/src/lib.rs | 59 | env: &env_vars # Define the anchor on first use | CODE |
| MEDIUM | crates/yamlpath/tests/testcases/anchors-basic.yml | 4 | env: &env_vars # Define the anchor on first use | CODE |
| MEDIUM | crates/zizmor/tests/integration/e2e/collect.rs | 163 | # This file is machine-generated by `gh actions-lock`. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/zizmor/src/utils.rs | 462 | /// NOTE: This function assumes that you pass it an `env`-prefixed | COMMENT |
| LOW | crates/zizmor/src/audit/mod.rs | 446 | /// NOTE: This method takes the audit's own identifier as an argument, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | support/codeql-injection-sinks.py | 180 | except Exception as e: | CODE |
| LOW | support/codeql-injection-sinks.py | 201 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | support/codeql-injection-sinks.py | 42 | CODE | |
| LOW | support/sync-expression-tests.py | 33 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bench/test_bench_online.py | 51 | def test_zizmor_online_collect_workflows_fast_path(benchmark): | CODE |
| LOW | docs/snippets/render-trophies.py | 41 | def normalize_and_sort_in_place() -> list[str]: | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …sts/sample-workflows/mhils-workflows-python-deploy.yml | 25 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …tests/integration/test-data/issue-612-repro/action.yml | 26 | # Check if the author is either dependabot or pre-commit.ci. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | support/sync-expression-tests.py | 75 | CODE |