Skip to content

fix(ci): lint modern Actions schemas safely - #1247

Merged
seonghobae merged 7 commits into
fix/scheduler-actions-read-tokenfrom
fix/actionlint-modern-schema-compat
Aug 23, 2026
Merged

fix(ci): lint modern Actions schemas safely#1247
seonghobae merged 7 commits into
fix/scheduler-actions-read-tokenfrom
fix/actionlint-modern-schema-compat

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Root cause

The write-capable autofix verifier invoked actionlint directly. Current actionlint 1.7.12 does not yet recognize GitHub Actions' native concurrency.queue: max schema, while its ShellCheck bridge can deadlock when a generated shell input exceeds the pipe-buffer boundary tracked in rhysd/actionlint#712. Treating either condition as a generic pass or disabling shell analysis would hide real workflow defects.

Repair

  • preserve actionlint's schema, expression, and Pyflakes validation with only the exact queue: max upstream schema gap admitted
  • run ShellCheck against regular temporary files instead of actionlint's stdin bridge
  • reject every non-max queue value and retain contextual path/line diagnostics
  • preserve newlines inside multi-line ${{ ... }} expressions so ShellCheck parsing and line diagnostics stay aligned
  • match actionlint 1.7.12's custom-shell, runner, and seven-rule ShellCheck policy exactly
  • preserve stable lavapipe adapter selection through sorted Bash pathname expansion
  • preserve find | sort failure propagation before exact-artifact checksum inventory generation
  • route the write-capable autofix verifier through the trusted central linter
  • fix latent ShellCheck findings without global suppressions
  • use only standard runner facilities already present
  • document the trust boundary, rollback, known ceiling, and APA 7 references to GitHub and upstream actionlint evidence

Exact-head verification

Head: 46f3e72110aadda14d77ae6fd56db756350c3fcc

Stacked parent: ContextualWisdomLab/.github#1231 at e594f8ca2367aa226d98fcda4c2d17b248eea76b

  • 1,396 passed, 1 skipped, 16 subtests
  • 100% statement and branch coverage: 8,373 statements / 3,234 branches
  • 100% Python docstring coverage
  • focused linter, Rust adapter, workflow-blob, and exact-artifact SBOM regressions passed
  • file-based actionlint/ShellCheck over both modified workflows passed with zero diagnostics
  • CodeGraph sync and diff hygiene passed
  • all current review threads are resolved

No workflow permission, credential source, reviewer identity, approval rule, protected-branch gate, or scanner severity was weakened. This PR remains stacked until #1231 merges; it should then be retargeted to main and revalidated on the exact resulting head.


Open in Devin Review

…odern-schema-compat

# Conflicts:
#	.github/workflows/opencode-review-dispatch.yml
#	CHANGELOG.md
#	tests/test_pr_review_autofix_nvidia_nim_contract.py
@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8223676f-0758-48a3-a33e-3119244b1d88

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

devin-ai-integration[bot]

This comment was marked as resolved.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head 07da88dc4c709670db19f347fec461cc51ebcb12.

  • Head SHA: 07da88dc4c709670db19f347fec461cc51ebcb12

  • Workflow run: 32625830639

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow (2 files)"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow (2 files)"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: actionlint-modern-schema-and-shellcheck.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: actionlint-modern-schema-and-shellcheck.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: lint_github_workflows.rb"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: lint_github_workflows.rb"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test (2 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test (2 files)"]
  R5 --> V5["targeted test run"]
Loading

@opencode-agent

opencode-agent Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: e7816e92be2cb1499e15002da019f816ace32947
  • Workflow run: 32627117455
  • Workflow attempt: 1
  • Gate result: REQUEST_CHANGES (approval step)

Pull request overview

OpenCode reviewed the current-head evidence but found unresolved reviewer or review-agent threads before approval.

Findings

1. HIGH .github/workflows/opencode-review.yml:1 - Unresolved reviewer thread blocks automated approval

  • Problem: OpenCode reached an APPROVE control result, but the approval step found unresolved, non-outdated human or review-agent thread evidence on the current pull request.
  • Root cause: Reviewer and review-agent feedback can arrive after bounded model evidence is prepared, so the approval step must re-query GitHub immediately before publishing an approval.
  • Fix: Address or resolve the listed reviewer thread(s), then re-run OpenCode on the current head.
  • Regression test: Keep the approval gate querying reviewThreads(first: 100) after model output and before create_pull_review APPROVE, including bot review agents other than OpenCode itself.

Review thread evidence

Latest unresolved reviewer thread evidence

scripts/ci/lint_github_workflows.rb line 74

  • Latest reviewer comment: @devin-ai-integration at 2026-08-23T07:46:44Z
  • Comment URL: fix(ci): lint modern Actions schemas safely #1247 (comment)
  • Comment excerpt: <!-- devin-review-comment {"id": "ANALYSIS_pr-review-job-ea9a1ea050da481b9a128341f337dae5_0001", "file_path": "scripts/ci/lint_github_workflows.rb", "start_line": 68, "end_line": 74, "side": "RIGHT", "kind": "analysis"} --> / 🔍 Shell-dialect detection parity with actionlint / 'shellcheck_dialect' (scripts/ci/lint_github_workflows.rb:68-74) matches any shell starting with 'bash ' or 'sh ', so custom shells like 'bash --noprofile --norc -e -o pipefail {0}' get ShellCheck run against them. If released actionlint extracts the shell name or gates cu

scripts/ci/lint_github_workflows.rb line 16

  • Latest reviewer comment: @devin-ai-integration at 2026-08-23T07:46:46Z
  • Comment URL: fix(ci): lint modern Actions schemas safely #1247 (comment)
  • Comment excerpt: <!-- devin-review-comment {"id": "ANALYSIS_pr-review-job-ea9a1ea050da481b9a128341f337dae5_0002", "file_path": "scripts/ci/lint_github_workflows.rb", "start_line": 16, "end_line": 16, "side": "RIGHT", "kind": "analysis"} --> / 🔍 ShellCheck exclusion codes vs actionlint defaults / The excluded codes are hardcoded (scripts/ci/lint_github_workflows.rb:16). Any code actionlint 1.7.12 excludes by default but omitted here makes the Ruby path report a finding actionlint suppresses, failing the autofix verifier on a workflow actionlint would accept. The list cannot be verified against actionl

.github/workflows/opencode-review-dispatch.yml line 1768

  • Latest reviewer comment: @devin-ai-integration at 2026-08-23T07:46:47Z
  • Comment URL: fix(ci): lint modern Actions schemas safely #1247 (comment)
  • Comment excerpt: <!-- devin-review-comment {"id": "ANALYSIS_pr-review-job-ea9a1ea050da481b9a128341f337dae5_0003", "file_path": ".github/workflows/opencode-review-dispatch.yml", "start_line": 1767, "end_line": 1768, "side": "RIGHT", "kind": "analysis"} --> / 📝 Info: GPU adapter file-selection order changed / The rewrite replaces 'ls lvp_icd*.json | head -n1' (alphabetical) with 'find ... -print -quit' (first directory-order match). When multiple 'lvp_icd*.json' files exist, a different ICD can be selected. Provisioning is best-effort, so no gate is affected, but selection

.github/workflows/exact-artifact-sbom-attestation.yml line 370

scripts/ci/lint_github_workflows.rb line 66

scripts/ci/lint_github_workflows.rb line 16

  • Latest reviewer comment: @devin-ai-integration at 2026-08-23T07:53:28Z

  • Comment URL: fix(ci): lint modern Actions schemas safely #1247 (comment)

  • Comment excerpt: <!-- devin-review-comment {"id": "ANALYSIS_pr-review-job-b0a53505905c4c52802b12f0e76f6aad_0003", "file_path": "scripts/ci/lint_github_workflows.rb", "start_line": 14, "end_line": 16, "side": "RIGHT", "kind": "analysis"} --> / 📝 Info: Queue-key suppression depends on exact actionlint message text / The '-ignore' regex 'QUEUE_DIAGNOSTIC' (lint_github_workflows.rb) suppresses actionlint

  • Result: REQUEST_CHANGES

  • Reason: unresolved reviewer or review-agent thread(s) were present before approval.

  • Head SHA: e7816e92be2cb1499e15002da019f816ace32947

  • Workflow run: 32627117455

  • Workflow attempt: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow (3 files)"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow (3 files)"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: actionlint-modern-schema-and-shellcheck.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: actionlint-modern-schema-and-shellcheck.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: lint_github_workflows.rb"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: lint_github_workflows.rb"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test (2 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test (2 files)"]
  R5 --> V5["targeted test run"]
Loading

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head 6e7eb393b309c3cf94a38325dd140df5ed5a88b2.

  • Head SHA: 6e7eb393b309c3cf94a38325dd140df5ed5a88b2

  • Workflow run: 32626287656

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow (3 files)"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow (3 files)"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: actionlint-modern-schema-and-shellcheck.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: actionlint-modern-schema-and-shellcheck.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: lint_github_workflows.rb"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: lint_github_workflows.rb"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test (2 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test (2 files)"]
  R5 --> V5["targeted test run"]
Loading

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

…ns-read-token' into fix/actionlint-modern-schema-compat

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode reviewed the current-head evidence but found unresolved reviewer or review-agent threads before approval.

Findings

1. HIGH .github/workflows/opencode-review.yml:1 - Unresolved reviewer thread blocks automated approval

  • Problem: OpenCode reached an APPROVE control result, but the approval step found unresolved, non-outdated human or review-agent thread evidence on the current pull request.
  • Root cause: Reviewer and review-agent feedback can arrive after bounded model evidence is prepared, so the approval step must re-query GitHub immediately before publishing an approval.
  • Fix: Address or resolve the listed reviewer thread(s), then re-run OpenCode on the current head.
  • Regression test: Keep the approval gate querying reviewThreads(first: 100) after model output and before create_pull_review APPROVE, including bot review agents other than OpenCode itself.

Review thread evidence

Latest unresolved reviewer thread evidence

scripts/ci/lint_github_workflows.rb line 74

  • Latest reviewer comment: @devin-ai-integration at 2026-08-23T07:46:44Z
  • Comment URL: #1247 (comment)
  • Comment excerpt: <!-- devin-review-comment {"id": "ANALYSIS_pr-review-job-ea9a1ea050da481b9a128341f337dae5_0001", "file_path": "scripts/ci/lint_github_workflows.rb", "start_line": 68, "end_line": 74, "side": "RIGHT", "kind": "analysis"} --> / 🔍 Shell-dialect detection parity with actionlint / 'shellcheck_dialect' (scripts/ci/lint_github_workflows.rb:68-74) matches any shell starting with 'bash ' or 'sh ', so custom shells like 'bash --noprofile --norc -e -o pipefail {0}' get ShellCheck run against them. If released actionlint extracts the shell name or gates cu

scripts/ci/lint_github_workflows.rb line 16

  • Latest reviewer comment: @devin-ai-integration at 2026-08-23T07:46:46Z
  • Comment URL: #1247 (comment)
  • Comment excerpt: <!-- devin-review-comment {"id": "ANALYSIS_pr-review-job-ea9a1ea050da481b9a128341f337dae5_0002", "file_path": "scripts/ci/lint_github_workflows.rb", "start_line": 16, "end_line": 16, "side": "RIGHT", "kind": "analysis"} --> / 🔍 ShellCheck exclusion codes vs actionlint defaults / The excluded codes are hardcoded (scripts/ci/lint_github_workflows.rb:16). Any code actionlint 1.7.12 excludes by default but omitted here makes the Ruby path report a finding actionlint suppresses, failing the autofix verifier on a workflow actionlint would accept. The list cannot be verified against actionl

.github/workflows/opencode-review-dispatch.yml line 1768

  • Latest reviewer comment: @devin-ai-integration at 2026-08-23T07:46:47Z
  • Comment URL: #1247 (comment)
  • Comment excerpt: <!-- devin-review-comment {"id": "ANALYSIS_pr-review-job-ea9a1ea050da481b9a128341f337dae5_0003", "file_path": ".github/workflows/opencode-review-dispatch.yml", "start_line": 1767, "end_line": 1768, "side": "RIGHT", "kind": "analysis"} --> / 📝 Info: GPU adapter file-selection order changed / The rewrite replaces 'ls lvp_icd*.json | head -n1' (alphabetical) with 'find ... -print -quit' (first directory-order match). When multiple 'lvp_icd*.json' files exist, a different ICD can be selected. Provisioning is best-effort, so no gate is affected, but selection

.github/workflows/exact-artifact-sbom-attestation.yml line 370

  • Latest reviewer comment: @devin-ai-integration at 2026-08-23T07:53:25Z
  • Comment URL: #1247 (comment)
  • Comment excerpt: <!-- devin-review-comment {"id": "ANALYSIS_pr-review-job-b0a53505905c4c52802b12f0e76f6aad_0001", "file_path": ".github/workflows/exact-artifact-sbom-attestation.yml", "start_line": 364, "end_line": 370, "side": "RIGHT", "kind": "analysis"} --> / 📝 Info: Process substitution drops find/sort failures the old pipeline caught / The rewrite from 'find | sort | while ... > SHA256SUMS' to 'mapfile -t evidence_files < <(find ... | sort)' ([exact-artifact-sbom-attestation.yml](https://github.com/contextualwisdomlab/.github/blob/b421f46411c8440f75fec545a0f65db889ce

scripts/ci/lint_github_workflows.rb line 66

scripts/ci/lint_github_workflows.rb line 16

  • Latest reviewer comment: @devin-ai-integration at 2026-08-23T07:53:28Z

  • Comment URL: #1247 (comment)

  • Comment excerpt: <!-- devin-review-comment {"id": "ANALYSIS_pr-review-job-b0a53505905c4c52802b12f0e76f6aad_0003", "file_path": "scripts/ci/lint_github_workflows.rb", "start_line": 14, "end_line": 16, "side": "RIGHT", "kind": "analysis"} --> / 📝 Info: Queue-key suppression depends on exact actionlint message text / The '-ignore' regex 'QUEUE_DIAGNOSTIC' (lint_github_workflows.rb) suppresses actionlint

  • Result: REQUEST_CHANGES

  • Reason: unresolved reviewer or review-agent thread(s) were present before approval.

  • Head SHA: e7816e92be2cb1499e15002da019f816ace32947

  • Workflow run: 32627117455

  • Workflow attempt: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow (3 files)"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow (3 files)"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: actionlint-modern-schema-and-shellcheck.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: actionlint-modern-schema-and-shellcheck.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: lint_github_workflows.rb"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: lint_github_workflows.rb"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test (2 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test (2 files)"]
  R5 --> V5["targeted test run"]
Loading

devin-ai-integration[bot]

This comment was marked as resolved.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

Open in Devin Review

Comment thread scripts/ci/lint_github_workflows.rb
@seonghobae
seonghobae merged commit 131f494 into fix/scheduler-actions-read-token Aug 23, 2026
24 of 25 checks passed
@seonghobae
seonghobae deleted the fix/actionlint-modern-schema-compat branch August 23, 2026 11:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant