Repository navigation
CI integrity M2: swap the required actionlint step to kjanat/actionlint v1.17.0 (hosted parity 25/25) - #476
Merged
seathatflowsinourveins merged 5 commits intoSep 29, 2026
Conversation
…7.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]>
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]>
…em 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]>
…nat-swap-20260928
…-register the 8 changed paths Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
seathatflowsinourveins
deleted the
claude/actionlint-kjanat-swap-20260928
branch
September 29, 2026 02:01
seathatflowsinourveins
added a commit
that referenced
this pull request
Sep 29, 2026
…d, CodeQL M4 retitled, skills-trial window row) (#478) Changes only foundation gate rows in the shared hot file state.json (lane:shared, trading ack needed); bumps recorded_at_utc and re-registers state.json. Co-authored-by: Scout <scout@local> Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Scope
This PR carries out step 3 of integrity plan move M2. The required
validatejob's actionlint step moves fromrhysd/actionlint1.7.12 tokjanat/actionlintv1.17.0, and the non-requiredactionlint-successortrial job added in #449 is removed.lane:foundation. It changes no shared hot file's content;manifests/evidence.jsonis only re-registered..github/workflows/validate.yml: the required step uses the trial job's download → sha256 →-version→-colorpattern. The verifier confirmed the run block is equal apart from the directory name. The trial job is deleted.catalog-freshness.ymlpin row,catalogs/foundation/automation.jsonactionlint entry and thedocs/github-automation.mdinstall and attestation procedure all move to kjanat 1.17.0. Three present-tense statements that "the pinned actionlint rejectsqueue" are reworded as dated statements; behaviour is unchanged.evidence/artifacts/actionlint-successor-swap-20260928/. It records hosted parity, a fresh attestation check and the local negative control, with the fixture kept as text.observability/grand-dashboard/state.json, which is a shared hot file; its row update is a separatelane:sharedPR. The sealedci-supply-chainlandscape verdict (catalogs/landscape/foundation.jsonlayers[11]) still names rhysd and changes only through a sealed re-record (F-LT-1). Dated records stay as written.SOTA sources
2da2ceb4points to commit08bb2c4f0d039744455b87aef1c647fb8b66d37b. The assetactionlint_1.17.0_linux_amd64.tar.gzhas sha256620abd485a12b6ab1125b844a876414e1d5bd2af8a3125b27f82b01d0d9d6e5a. The install and attestation steps come from itsdocs/install.mdL124-134 at v1.17.0 (gh attestation verify -R kjanat/actionlint …).011a6d15(2026-04-19), and rhysd (the author) inactive. Any active forks? rhysd/actionlint#719 is still open. The upstream-stale record is incatalogs/foundation/automation.json(validate: non-required kjanat/actionlint 1.17.0 parity job beside the pinned 1.7.12 (rhysd upstream inactive) #449).evidence/artifacts/actionlint-successor-parity-20260927/, left unedited. Swap criterion: hosted parity matching that local zero-difference result (automation.json, validate: non-required kjanat/actionlint 1.17.0 parity job beside the pinned 1.7.12 (rhysd upstream inactive) #449).Evidence-class table
validate.ymlpush runs on main, b60d518 → f021926. The required rhysd step and the kjanat trial job both succeeded in every run. The verifier re-sampled 5 runs, and GPT-6 matched all 25 against GitHub.gh attestation verify -R kjanat/actionlintexits 0. The same archive checked with-R rhysd/actionlintexits 1 (404), so the check discriminates.fixtures/nc.yml.txt: zizmor exits 0; kjanat exits 1 withproperty "missing" is not defined, with and without shellcheck.Still pending, as the receipt says: this PR's hosted run, which the checks below close; a hosted negative control, not run because it would need
--no-verifyor a test edit; evidence that the hosted shellcheck rule ran; and the PyYAML parser cross-check.Local commands run
python3 -m unittest tests.test_workflow_hardening tests.test_catalog_freshness_pins tests.test_adoption_docs_consistency tests.test_catalog_freshness_propose: exit 0,OK (skipped=3).python3 scripts/validate.py: exit 0,"receipts": 165, "status": "passed".component_matrix.py --checkandnew_host_grand_list.py --checkboth exit 0.validate.ymlswapped,tests.test_catalog_freshness_pinsfails with'1.7.12' != '1.17.0', and passes after the pin row changes.Decision record
Plan move M2 (the integrity plan) authorizes the swap once the hosted job matches the local zero-difference result, per the
automation.jsonselection note from #449. The overturn condition: rhysd resumes releases, or GitHub ships an official workflow linter CLI. Either candidate is compared by the 2026-09-27 parity method before the pin changes.Host evidence
None needed. This is a CI gate change, and the hosted evidence is GitHub's.
Checklist
codex exec -s read-only -m gpt-6-astra -c model_reasoning_effort=max), which returned MERGE with no findings. The one repair round addressed all four low findings in399020a0.348d3163), and the hot-file registration is the last commit.🤖 Generated with Claude Code