Skip to content

validate: non-required kjanat/actionlint 1.17.0 parity job beside the pinned 1.7.12 (rhysd upstream inactive) - #449

Merged
seathatflowsinourveins merged 7 commits into
mainfrom
claude/actionlint-successor-parity-20260927
Sep 28, 2026
Merged

seathatflowsinourveins merged 7 commits into
mainfrom
claude/actionlint-successor-parity-20260927

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator

Scope

  • Adds a non-required actionlint-successor job that runs kjanat/actionlint v1.17.0 beside the required, pinned rhysd/actionlint 1.7.12. It also replaces the "Maintained" claim in catalogs/foundation/automation.json with the dated staleness facts: no rhysd commit since 2026-04-19, and issue Fix skills lifecycle gates and retain skills qualification evidence #719 "rhysd (the author) inactive" is open.
  • The required gate, .github/main-ruleset.json and catalog-freshness.yml are unchanged. The swap to the new pin waits for hosted parity, and the freshness row is coordinated with a peer session.
  • Base commit: ba1700ad; main merged in at f508ffba per the docs/lanes.md hot-file protocol.
  • Lane: lane:foundation.
  • Owned paths:
    • .github/workflows/validate.yml
    • catalogs/foundation/automation.json
    • tests/test_workflow_hardening.py (if touched)
    • evidence/artifacts/actionlint-successor-parity-20260927/
    • manifests/evidence.json

SOTA sources

Evidence-class table

Claim Evidence class Command / receipt
Both archives verified before execution (digest, attestation signer, immutability); 4 negative controls fail local_integration evidence/artifacts/actionlint-successor-parity-20260927/
0 diagnostics from both binaries on all 18 workflows, with and without shellcheck 0.9.0; 0 unexplained differences local_integration same receipt, parity table
Upgrade differences classified on fixtures (relocated columns, removed 1.7.12 false positives, new true positives, default-on cache policies) synthetic fixture set in the receipt
Hosted first run of the successor job, and zizmor online audits over the changed validate.yml pending: this PR's CI —

Local commands run

$ gh attestation verify actionlint_1.17.0_linux_amd64.tar.gz --repo kjanat/actionlint   # signer release.yml@refs/tags/v1.17.0
exit 0 (negative controls: wrong digest / wrong source-ref / wrong repo / wrong identity -> exit 1)
$ python3 -m unittest tests.test_workflow_hardening ; python3 scripts/validate.py
OK ; passed

Decision record

The staleness facts are dated in catalogs/foundation/automation.json and in the receipt.

  • Swap criterion: hosted parity matches the local zero-difference result.
  • Overturn: rhysd resumes releases, or GitHub ships an official linter CLI.
  • Selection risk, recorded: a single-maintainer, AI-assisted fork that made 12 releases in 26 days.

Review

  • Claude evidence-reviewer and security-reviewer: no changes needed. Minor residuals are recorded in the receipt. The new binary pin is not yet in catalog-freshness; it gets added at swap time.
  • Cross-family GPT-6 review (codex exec -s read-only -m gpt-6-astra, effort max, on 6a5f8487, 2026-09-28): changes-needed.
    • P2: compare.py paired diagnostics by set membership, so duplicates vanished.
    • P3: the fixture-coverage claim was overstated. Reworded and new-false-positive diagnostics have no fixture.
    • P3: the verification-order claim contradicted the recorded timing.
  • Repair round (8cfbdeaa, a06851f5):
    • Pairing now uses collections.Counter multisets.
    • Re-running over the six retained pairs reproduced every recorded figure. None of the inputs contains a duplicated diagnostic.
    • Both claims were narrowed.
    • A Claude stack-verifier re-ran the reviewer's probes: pass.
    • A follow-up commit gives the commit-author tally its own observation time (02:21:31Z) and its scope (commits since 2026-08-07).
  • Residuals: no committed regression test covers the duplicate case, and the hosted run of the successor job is still to be observed on this head.

Checklist

  • Actions SHA-pinned; top-level permissions: contents: read; harden-runner in audit mode; persist-credentials: false.
  • No secrets; no new required secret.
  • No paid hosting.
  • Peer files preserved.

🤖 Generated with Claude Code

Scout and others added 2 commits September 27, 2026 22:45
… pinned 1.7.12

rhysd/actionlint has had no commit on main since 2026-04-19 (none since
2026-06-29), its latest release is still v1.7.12, and issue #719 ("rhysd
(the author) inactive") is open. Add a non-required actionlint-successor
job that runs the immutable, attested kjanat/actionlint v1.17.0 release with
the same download, sha256sum --check and -version/-color pattern as the
required 1.7.12 step, harden-runner in audit mode first, contents: read,
persist-credentials: false and the same SHA-pinned actions. The required
validate job and .github/main-ruleset.json are unchanged.

Local parity (evidence/artifacts/actionlint-successor-parity-20260927/):
both binaries exit 0 with no diagnostics on the 18 workflows at ba1700a and
on this branch, with and without the runner's shellcheck 0.9.0. Fixtures
taken from rhysd v1.7.12 docs/checks.md and the v1.17.0 release notes
classify the upgrade's differences (relocated shellcheck columns, removed
1.7.12 false positives, new true positives, default-on cache policies).
automation.json replaces the actionlint entry's "Maintained" claim with the
dated staleness facts; the selection stays 1.7.12.

SOTA sources: kjanat/actionlint v1.17.0 (commit 08bb2c4f; SLSA provenance
from .github/workflows/release.yml@refs/tags/v1.17.0; CHANGELOG.md and
release notes), rhysd/actionlint v1.7.12 (914e7df2; docs/checks.md),
actions/runner-images images/ubuntu/Ubuntu2404-Readme.md (c9dd57c6),
zizmor 1.30.1.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Register the new receipt files and re-register .github/workflows/validate.yml
and catalogs/foundation/automation.json through host_receipts.register_file,
per the docs/lanes.md hot-file protocol (shared hot file in the branch's last
commit). component_matrix.py --write and new_host_grand_list.py --write left
their generated reports unchanged; scripts/validate.py passes.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Sep 28, 2026
Scout and others added 5 commits September 28, 2026 03:19
… verification-order claims

Repairs the three findings of the cross-family GPT-6 review of #449.

1. compare.py (P2): messages at one (filepath, line, column, kind) key
   were matched by membership, so a duplicated diagnostic vanished (new
   copy) or was counted twice as identical (old copy). They are now
   paired as multisets: Counter & keeps min(old, new) copies, Counter -
   keeps only positive differences, and elements() repeats each message
   by its count. Source: Python docs, collections.Counter,
   https://docs.python.org/3/library/collections.html#collections.Counter
   Reviewer probe: identical=1, only_new=0 before; identical=1,
   only_new=1 after. Reverse probe (old 2 copies, new 1): identical=2
   before; identical=1, only_old=1 after. compare.py has no self-check or
   fixture test to extend.
   Re-run over the six retained report pairs in <scratch> at
   2026-09-28T07:16:23Z: every pairing count is unchanged, each output is
   byte-identical to that run's recorded compare.json, and the fixture
   outputs are byte-identical to fixture-compare-*.json (the membership
   revision reproduces the same files from the same inputs). Recorded as
   receipt.json parity.compare_rerun; classification figures unchanged.

2. Fixture coverage (P3): claim_boundary and the README claimed an
   example of every class, but classification.rows has fixtures == 0 for
   "reworded" and "new false positive" (the receipt's own rows). Both
   now name the five exercised classes and the two without a fixture.

3. Verification order (P3): verification.order said every check preceded
   binary execution, while the receipt's window_utc.note places the
   attestation-count query after parity_end. The order now lists only
   checks with retained output dated before extraction (02:05:48Z) and
   the first -version output (02:05:54Z): the first pass in
   verification.window_utc (verify-start.txt/verify-end.txt), then
   02:04:35Z-02:05:29Z tag lookups, release.yml at the signer digest,
   identity-pinned re-verifies and the four negative controls (retained
   output modification times). The 1.17.0 attestation count (output
   dated 02:17:41Z) and the untimed gh release view read, 1.7.12
   attestation count and shellcheck chain are not claimed as preceding
   execution. The README heading and window sentence now match.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
The Order bullet added in the previous commit read "every table row
except Immutable release, the tag lookup and the four negative
controls finished before ...", which parses as if the tag lookup and
the negative controls were exceptions. It now states what is not
claimed first, then lists the three groups that did finish before the
first binary run, matching receipt.json verification.order (the
repair's source: retained output modification times, 02:04:35Z to
02:05:29Z, before extraction at 02:05:48Z and the first -version
output at 02:05:54Z). README.md re-registered in manifests/evidence.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…e protocol

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
The upstream_status block's observed_at_utc (02:03:12Z) also covered the kjanat
commit-author tally, whose source (gh api --paginate .../commits?since=2026-08-07,
kjanat-commits-since-fork.json) was fetched at 2026-09-28T02:21:31Z. The tally now
carries its own observed_at_utc, the README source line says so, and "242 of 253"
names its scope (default-branch commits dated since 2026-08-07) in the README and
claim_boundary. Residual from the repair-round verifier; the upstream figures are
unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…e protocol

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@seathatflowsinourveins
seathatflowsinourveins merged commit b60d518 into main Sep 28, 2026
25 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the claude/actionlint-successor-parity-20260927 branch September 28, 2026 08:28
seathatflowsinourveins added a commit that referenced this pull request Sep 29, 2026
…nt v1.17.0 (hosted parity 25/25) (#476)

* validate: swap the required actionlint step to kjanat/actionlint v1.17.0 (M2 step 3)

The required validate job's actionlint step now downloads kjanat/actionlint
v1.17.0 with the trial job's URL, pinned digest, sha256sum --check, extract
and -version/-color pattern, still after zizmor, and the non-required
actionlint-successor trial job is removed. The job keeps the workflow-level
contents: read, harden-runner in audit mode first and persist-credentials:
false.

On every push run of validate.yml on main from b60d518 (#449) through
f021926 (#469), 25 of 25, the trial job and the rhysd 1.7.12 step both
succeeded (actionlint exit 0: no diagnostics). A fresh local run of the
documented procedure verified the archive digest, the release checksums file
and gh attestation verify -R kjanat/actionlint (exit 0; a wrong-repository
control exits 1), and 1.17.0 reports 0 diagnostics on this branch's 20
workflows with and without shellcheck 0.9.0-1.

catalog-freshness.yml's pin row, automation.json's actionlint interface
(six lines, 2026-09-27 note kept as history) and docs/github-automation.md's
install and attestation procedure (same line count) follow the pin. The
present-tense claims that the pinned actionlint rejects concurrency `queue`
are reworded as dated statements; no behaviour changes, and the propose-job
concurrency assertion is unchanged.

Receipt: evidence/artifacts/actionlint-successor-swap-20260928/.

SOTA sources: kjanat/actionlint v1.17.0 (immutable release; annotated tag
2da2ceb4 -> commit 08bb2c4f; SLSA provenance signed by
.github/workflows/release.yml@refs/tags/v1.17.0; docs/install.md lines
124-134, docs/usage.md lines 275-284, CHANGELOG.md lines 13 and 238),
rhysd/actionlint v1.7.12 (docs/usage.md lines 181-190), zizmor 1.30.1
(.github/requirements-ci.txt).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* evidence: register the actionlint successor swap receipt

Register the two new receipt files and re-register validate.yml,
catalog-freshness.yml, automation.json, docs/github-automation.md and
tests/test_catalog_freshness_propose.py through host_receipts.register_file,
per the docs/lanes.md hot-file protocol (shared hot file in the branch's last
commit). As in #449, the receipt is hash-listed in files[] with no receipts[]
entry. component_matrix.py --check and new_host_grand_list.py --check passed
unchanged, so neither --write ran; python3 scripts/validate.py exits 0.

SOTA sources: docs/lanes.md hot-file protocol; scripts/host_receipts.py
register_file; precedent b60d518 (#449).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* actionlint swap receipt: record the local negative control, narrow item 1, date the procedure's rhysd-era results (review repair)

- receipt/README: local_negative_control (fixture fixtures/nc.yml.txt, zizmor 0, kjanat exit 1 with and without shellcheck);
  trial item 1 is closed except the shellcheck sub-claim; hosted negative control and hosted shellcheck evidence stay pending,
  with the reason (no --no-verify, no test edit); dated-records citation widened to docs/catalog-provenance.md L133-189.
- docs/github-automation.md: one appended sentence (no new line) dating the 2026-09-20/21 results to rhysd v1.7.12's procedure.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* Hot-file registration after merging main (docs/lanes.md protocol): re-register the 8 changed paths

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

---------

Co-authored-by: Scout <scout@local>
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant