Skip to content

Lint the workflows with the kjanat actionlint fork (issue #1698) - #1722

Merged
fametrano merged 12 commits into
mainfrom
actionlint-fork-1698
Oct 14, 2026
Merged

fametrano merged 12 commits into
mainfrom
actionlint-fork-1698

Conversation

@fametrano

Copy link
Copy Markdown
Member

The maintainer decided on 2026-10-14 that every tree moves to the kjanat/actionlint fork.

What it does

Evidence

The head is 1361ad4, twelve commits on 818d84d, signed and signed off. It was rebased once, after #1721, to keep both BACKLOG rows.

Reviews. Ten fresh reviewers asked for changes, and every finding was fixed. An eleventh cleared 1361ad4 on its first read. It checked:

  • each actionlint claim against the fork binary;
  • the pin, against git ls-remote and pre-commit's autoupdate.py;
  • the BACKLOG row, against every tree's live config.

Mutations. Reverting the hook fails the new test. Narrowing the non-fork clause fails a test as well, for each of six narrowings.

Gates on the head, under the gate lock at memory pressure 1:

🤖 Generated with Claude Code

fametrano and others added 12 commits October 14, 2026 18:03
The maintainer decided on 2026-10-14 that every tree lints its workflows
with the kjanat/actionlint fork, as btclib does. The fork parses the
`uses: $/...` that zizmor's self-repository audit recommends, and
rhysd/actionlint does not. The cost is a Go build in pre-commit.

Section 4 names the fork's `actionlint-shellcheck` hook, why, and what it
costs. This tree's `.pre-commit-config.yaml` takes it from btclib's
pinned commit and lists it in `ci: skip`, as btclib does, the build
running past pre-commit.ci's time limit.

The fork reports `cache-call-unrestricted` on the `claude-review` job.
`.github/actionlint.yaml` silences it for that one file until ISS 1717
adds `cache-mode: none` to the job, which must be its own pull request.

`test_the_gate_lints_workflows_with_the_actionlint_fork` reads section 4's
rule off every tree. No tree but btclib and this one takes the fork yet,
so `BACKLOG` excuses the others under ISS 1698; each port deletes its
name from the row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
#1698)

The pin is the sha of the fork's annotated tag, not a commit, so the
README, the test and its messages say so. The first commit's body calls
it a commit; the squash corrects that.

links.yml said the actionlint hook rejects the `$/` form. The fork parses
it; the reason that stands is zizmor's finding, declined on the line
(ISS 1144).

The `ci:` template in section 4 lists `actionlint-shellcheck` in `skip`,
and its paragraph gives the reason, so the bullet no longer repeats it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
`PIN` matches any forty hex characters, so it cannot tell a tag's object
from a commit, and yaml drops the `# frozen:` comment. Section 4 says the
`rev` is a sha; the tag-object detail stays in the config's comment.

`PIN`'s docstring says what `autoupdate` writes in each case. The
module's docstring counts the three hooks whose pins are read. The `ci:`
paragraph in section 4 no longer has an ambiguous pronoun.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
…ssue #1698)

pre-commit.ci builds the hook's Go environment, then the run fails with
`timeout after 180 seconds` (btclib-org/btclib PR 2634). Section 4 says
the run outlasts the limit, not the build.

In the `ci:` block of the config, the reason for the skip now stands
beside uv-lock's, before what the skip costs, as in btclib. The first
commit's body repeats the build claim; the squash corrects it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
…1698)

Section 4 gave the reason mypy is skipped twice, in the `ci:` paragraph
and in the mypy bullet. The bullet now points at the skip and the
paragraph keeps the reason.

The zizmor comment no longer calls btclib-org/btclib#1563 the migration:
it has been closed since 2026-10-12.

`PIN` serves `check-changelog` and the actionlint hook, and the test's
docstring says the pin is a sha, which is all `PIN` checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
Each sentence in the tree that claims what actionlint accepts, types,
parses or allows was run against the fork binary. Four were false or
partial and are corrected:

- reusable-os-suite.yml listed the calling-job keys as the whole list;
  the fork also allows `cache-mode`, `strategy` and `concurrency`.
- reusable-changes.yml said the undeclared-output read is refused only
  where the caller calls by path; the fork refuses it for `$/` too.
- workflows_test.py called `./` the one shape actionlint types.
- the `ci:` paragraph and the zizmor comment repeated what the lint
  workflow paragraph and the actionlint comment already say.

`tests/hooks_test.py` names the pins it reads instead of counting them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
`actionlint_departures` reported only a missing fork hook, so a gate that
added the fork and kept the `actionlint-py` stanza passed. It now reports
that stanza too, and a test feeds it the two-hook gate. With the clause
removed, that test fails.

Section 4 states the `ci:` skip once, naming the two hooks.

The reason `uses: ./` stays is now cited: workflows_test.py reads `$/` as
an unpinned action (ISS 1720). The config says rhysd/actionlint#732 is
unmerged. `callee`'s docstring drops an aside.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
The previous commit left a doc line of 84 columns, which ruff refuses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
…sue #1698)

`actionlint_departures` now reports every hook whose repository names
actionlint and is not the fork, upstream's included, and a test feeds it
the upstream hook beside the fork. With the clause narrowed back to the
Python packaging, that test fails.

`ACTIONLINT_REFUSED` no longer says the stanza was carried in the past:
gates carry it today. The test's docstring points at section 4 for the
reason, and section 4 says upstream does not parse `$/`. The `ci:`
paragraph is rewrapped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
…1698)

The control test's docstring said the check reads "the packaging it
replaced", which is history. The module docstring repeated what `PIN`'s
docstring says about the pins held to a sha. The findings no longer say
"still", and the id's docstring no longer restates the hook's role.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
The docstrings of `actionlint_departures` and its control test said it
catches every departure. They now list what it reports: a gate without
the fork, a fork hook off its id or pin, and an actionlint hook taken
from any other repository. The control test drops "old" from its name and
its variable, and the stanza literal no longer says "still".

The config's comment on the fork no longer repeats zizmor's `$/`
recommendation, which the zizmor comment gives.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
… ids (issue #1698)

btclib-node takes the fork now (kjanat/actionlint, `actionlint-shellcheck`),
so its cell passes and a strict expected failure would turn it red. The
other names in the row were read from each tree's live config and still
take the Python packaging.

The control test gives the upstream hook a different id, as rhysd/actionlint
offers (`actionlint-system`), and adds a hook from a third repository, so
that a check narrowed by id or by repository name fails it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ferdinando Ametrano <ferdinando@ametrano.net>
@fametrano
fametrano merged commit 54d2f10 into main Oct 14, 2026
6 of 8 checks passed
@fametrano
fametrano deleted the actionlint-fork-1698 branch October 14, 2026 16:32
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