Skip to content

actionlint: repo-wide findings outside the mcpx workflow set (jules concurrency.queue, SC2129, SC2016/SC2086 in run blocks) #2845

Closed

Description

@dezren39

Found by queue task 3291 (lane E) while landing the #1996 mcpx lint leg (PR #2718). Running actionlint repo-wide (which #1996 does NOT ask for — it assigns actionlint the mcpx workflow set) reports findings in workflows outside that set. The mcpx leg was therefore scoped to .github/workflows/mcpx*.yml with shellcheck -S warning; these repo-wide findings are filed here instead of being fixed inside the #1996 slice (same treatment as the golangci findings -> #2836).

Findings (actionlint from nixpkgs, run 2026-10-30 on main @ merged PR #2718 head):

  • .github/workflows/jules-daily-codebase-ideation.yml:25, jules-daily-flake-sync.yml:27, jules.yml:54,87,121 — syntax-check: unexpected key "queue" for "concurrency" section (expected "cancel-in-progress", "group"). Either the workflows use a concurrency key this actionlint does not know, or the key is invalid — needs a verdict against current GitHub Actions schema + the pinned actionlint version.
  • .github/workflows/flake-inputs-update.yml:139 — SC2129 style: multiple redirects to the same file in one run block.
  • .github/workflows/main-broken.yml:97 — SC2016 info x2 (expressions in single quotes inside a run block).
  • .github/workflows/mcpx-docs.yml:114 — SC2016 info. (In the mcpx glob, but info-level; the leg runs shellcheck at -S warning.)
  • Stress steps in mcpx.yml (from main) — SC2086 info x5: intentional word splitting (go test $unit, -shuffle=$seed, for d in $(...)); quoting would break them. If a repo-wide actionlint leg is ever wanted, these need explicit # shellcheck disable=SC2086 annotations with justification, not quotes.

Acceptance: a decision on the jules concurrency.queue keys (fix workflows or pin/upgrade actionlint and re-check), and either fixes or explicit waivers (actionlint.yaml ignore patterns / shellcheck directives) for the rest — or a documented wontfix with the reasoning on this issue.

Acceptance criteria

  • Each repo-wide actionlint finding outside the mcpx workflow set has a verdict: fixed, or confirmed as a false positive of the pinned actionlint version against the current GitHub Actions schema (the jules*.yml / jules.yml concurrency.queue keys first)
  • flake-inputs-update.yml SC2129 and the SC2016 info findings in main-broken.yml / mcpx-docs.yml are fixed or explicitly dispositioned as intentional
  • The intentional SC2086 word-splitting sites in mcpx.yml stress steps are annotated/dispositioned so a repo-wide actionlint run is clean or carries only documented suppressions
  • The mcpx testing: every formatter and linter in the CI matrix, pinned by the flake (and run the plugin's bun test) #1996 mcpx lint leg's scope (mcpx*.yml, shellcheck -S warning) is unchanged by this work

Activity

  1. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Intake review

    Fleet monitor intake pass (protocol §5). Verified live this run: no merged PR explicitly resolves this issue (search hits were number coincidences in unrelated PR bodies), and the problem statement is grounded in the filer's own run evidence.

    Related: Related: issue #1996 / PR #2718 (the mcpx lint leg that surfaced these), issue #2836 (the golangci sibling follow-up from the same leg).

    Notes / risks / suggested approach: The jules concurrency.queue keys need a schema verdict first — if the key is genuinely invalid, those workflows may be silently running without the intended queueing, which would raise the priority. The shellcheck items are style/info and low risk. Suggested approach: verdict on concurrency.queue against the current Actions schema + pinned actionlint, then batch the trivial SC fixes.

  2. added
    kind/ciCI/CD pipelines, workflows, and build automation
    source/queue-workerFiled or worked by the queue/worker pilot
    priority/lowNice to have; do when convenient
    effort/sSmall: expected under 2 hours of work
    area/ciCI/CD pipelines, workflows, and build automation (area)
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 30, 2026
  3. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    Triage (queue task 7995, repo-health-code-pilot) — still live, with a split verdict: the concurrency.queue findings are a tool false positive; the shellcheck findings are real but style/info and mostly intentional.

    Fresh run at main 1e3763fa (2026-11-03), actionlint 1.7.12 from current nixpkgs, -shellcheck "shellcheck" (all severities):

    Finding (original) State at main Verdict
    jules-daily-codebase-ideation.yml:25, jules.yml:51,84,118 — concurrency.queue Still reported (jules-daily-flake-sync's copy is gone — that half is already resolved) False positive of the pinned tool. GitHub's workflow-syntax reference documents concurrency.queue with single (default) / max (up to 100 pending) — verified on docs.github.com 2026-11-03. queue: max is valid; actionlint 1.7.12 (current nixpkgs) has not picked the key up. No workflow change.
    flake-inputs-update.yml:140 — SC2129 style Still live Real, trivial. The "Decide the outcome" step writes $GITHUB_OUTPUT with three separate echo >> calls; group them in one { ...; } >> "$GITHUB_OUTPUT".
    main-broken.yml:97 — SC2016 info ×2 Still live Intentional literal: jq/gh --jq programs in single quotes. Disposition as false positive via a # shellcheck disable=SC2016 directive, not by quoting.
    mcpx-docs.yml:108 — SC2016 info Still live (line shifted from 114) Same: single-quoted nix expression / literal program. Directive, not quoting.
    mcpx.yml:311 SC2016, mcpx.yml:462 SC2086 ×4, mcpx.yml:526 SC2086, mcpx-test.yml:108 SC2086 Still live; mcpx-test.yml:108 is new (not in the original list) Intentional word splitting (go test $unit, -shuffle=$seed, for d in $(...)) — quoting would break them. The #1996 leg runs shellcheck -S warning, so info/style never gate today. Disposition as annotations with justification if a repo-wide info-level leg is ever wanted.

    Scoped fix path (one effort/s PR, 4 files, no behaviour change):

    1. flake-inputs-update.yml — group the three $GITHUB_OUTPUT writes (SC2129).
    2. Add # shellcheck disable=SC2016 / disable=SC2086 directives with a one-line justification at the 9 intentional sites above (main-broken.yml, mcpx-docs.yml, mcpx.yml ×3 blocks, mcpx-test.yml).
    3. For a repo-wide leg only: waive the queue key (an actionlint.yaml ignore scoped to jules*.yml/jules.yml, message unexpected key "queue" for "concurrency" section) until actionlint ships support — an upstream bump is the real fix. The mcpx testing: every formatter and linter in the CI matrix, pinned by the flake (and run the plugin's bun test) #1996 mcpx leg's scope (mcpx*.yml, -S warning) must stay unchanged, per the issue's own acceptance.

    Ordering / blockers: none — this is independent of any other queue work and needs no access. Left open with status/triaged so the small annotation fix can be queued when priority/low comes up; if the repo decides not to add a repo-wide info-level leg, the dispositions above are the documented wontfix the issue's acceptance allows.

  4. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    status/triagedTriaged and routed (see agent note)
    and removed on Nov 3, 2026
  5. 20 remaining items

  6. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    Picked up as queue task 8626 on lane bf419306-c4ef-470f-a553-beabf93239de. Checkpointed before further action. No files were changed.

  7. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    Parked task 8626 for 20 minutes after the queue helper could not resolve its project URL during heartbeat; the documented fallback was used only to record the park. No code was changed. Fresh GitHub state shows the issue remains open and is currently assigned to dezren39; revalidate ownership and helper health before resuming.

  8. added
    queue/claimedQueue worker lifecycle state
    and removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    on Nov 4, 2026
  9. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    task 8626 picked up by lane code-g (direct execution lane). Issue #2845 verified OPEN, no hard-stop labels, no open PR owns this work. Applying the scoped actionlint fix from triage task 8616 (SC2129 grouping + justified shellcheck directives; concurrency.queue findings are a pinned-tool false positive and will not be "fixed" by editing workflows).

  10. added 2 commits that reference this issue on Nov 4, 2026
  11. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    task 8626 done (lane code-g): PR #5341 MERGED (merge sha 8331a77); issue #2845 auto-closed. Evidence: actionlint 1.7.12 -shellcheck shellcheck went from 15 findings on main (SC2129 x1, SC2016 x4, SC2086 x6, concurrency.queue x4) to 0 on the branch, verified in a fresh clone. The concurrency.queue findings were silenced only via the scoped ignore in .github/actionlint.yaml — the jules workflows were not edited.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area/ciCI/CD pipelines, workflows, and build automation (area)effort/sSmall: expected under 2 hours of workkind/ciCI/CD pipelines, workflows, and build automationmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/lowNice to have; do when convenientsource/queue-workerFiled or worked by the queue/worker pilottask/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions