-
Notifications
You must be signed in to change notification settings - Fork 0
fix(ci): lint modern Actions schemas safely #1247
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
seonghobae
merged 7 commits into
fix/scheduler-actions-read-token
from
fix/actionlint-modern-schema-compat
Aug 23, 2026
Merged
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
ed8bfd9
fix(ci): lint modern Actions schemas safely
seonghobae 07da88d
Merge branch 'fix/scheduler-actions-read-token' into fix/actionlint-m…
seonghobae 6e7eb39
fix(ci): preserve multiline workflow diagnostics
seonghobae b421f46
test(ci): bound Ruby runtime coverage
seonghobae e7816e9
Merge remote-tracking branch 'refs/remotes/origin/fix/scheduler-actio…
seonghobae 46f3e72
fix(ci): preserve deterministic workflow evidence
seonghobae 570eca6
Merge remote-tracking branch 'origin/fix/scheduler-actions-read-token…
seonghobae File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| # Actionlint modern-schema and large-shell compatibility | ||
|
|
||
| Decision date: **2026-08-22** | ||
|
|
||
| ## Incident | ||
|
|
||
| The write-capable PR autofix worker validates every workflow it changes with | ||
| `actionlint`. Two upstream gaps can make that fail or stall even when GitHub | ||
| accepts the workflow. | ||
|
|
||
| 1. GitHub Actions supports `queue: max` for concurrency groups, while released | ||
| actionlint 1.7.12 still reports that key as invalid. Upstream pull request | ||
| 654 tracks schema support. | ||
| 2. Actionlint can deadlock while sending a workflow `run` block larger than a | ||
| pipe buffer to its ShellCheck subprocess. Upstream issue 712 reproduces the | ||
| boundary at 64 KiB. The central OpenCode review workflow contains larger | ||
| trusted shell blocks, so an autofix touching it can wait indefinitely. | ||
|
|
||
| These are linter transport/schema gaps, not reasons to remove workflow schema | ||
| validation or shell analysis. | ||
|
|
||
| ## Decision | ||
|
|
||
| Keep actionlint as the schema, expression, and Pyflakes validator, but disable | ||
| only its ShellCheck subprocess integration with `-shellcheck=`. The trusted | ||
| `lint_github_workflows.rb` boundary uses Ruby's standard-library Psych parser to | ||
| read the same YAML scalar values, reproduces actionlint 1.7.12's workflow/job/ | ||
| runner/step shell precedence, expression normalization, implicit shell setup, | ||
| and narrow rule exclusions, and invokes the installed ShellCheck against unique | ||
| regular temporary files. It parses ShellCheck JSON, restores the workflow job | ||
| and step identity in every diagnostic, preserves findings as a failing status, | ||
| and fails closed on malformed output or a missing executable. | ||
|
|
||
| The autofix worker ignores only actionlint's exact released-schema diagnostic | ||
| for the concurrency `queue` key. Before linting, it rejects every changed | ||
| workflow whose `queue` value is not exactly `max`; therefore the compatibility | ||
| exception cannot admit an invented queue mode. | ||
|
|
||
| This is a temporary compatibility boundary. Remove the queue diagnostic | ||
| exception after an actionlint release containing pull request 654 is pinned. | ||
| Remove the stdin spool only after issue 712 is fixed and a greater-than-64-KiB | ||
| regression passes directly through the pinned actionlint/ShellCheck pair. | ||
|
|
||
| ## Verification | ||
|
|
||
| - A greater-than-64-KiB synthetic shell program reaches the delegated | ||
| ShellCheck executable through a regular file, without content loss. | ||
| - Bash, sh, Windows/PowerShell, Python, workflow defaults, and GitHub expression | ||
| normalization retain actionlint's effective-shell behavior. | ||
| - ShellCheck findings, malformed result JSON, actionlint failures, and invalid | ||
| concurrency queue values all fail closed with actionable workflow context. | ||
| - The offline Python-only coverage sandbox records the Ruby subprocess | ||
| contracts as unavailable instead of failing with `FileNotFoundError`; the | ||
| hosted quality job, whose runner includes Ruby, executes those contracts and | ||
| the real all-workflow lint command. | ||
|
|
||
| ## References | ||
|
|
||
| GitHub. (2026, May 7). *GitHub Actions concurrency groups now allow larger | ||
| queues*. https://github.blog/changelog/2026-05-07-github-actions-concurrency-groups-now-allow-larger-queues/ | ||
|
|
||
| Murai, R. (2025). *Support queue: max in concurrency* [Pull request #654]. | ||
| GitHub. https://github.com/rhysd/actionlint/pull/654 | ||
|
|
||
| Murai, R. (2026). *Shellcheck integration deadlocks for run blocks greater than | ||
| 64 KiB* [Issue #712]. GitHub. https://github.com/rhysd/actionlint/issues/712 |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.