Skip to content

ci: convert self-references to self-repository syntax - #16

Open
arcuru-bot wants to merge 4 commits into
arcuru:mainfrom
arcuru-bot:feat/self-repository-syntax
Open

ci: convert self-references to self-repository syntax#16
arcuru-bot wants to merge 4 commits into
arcuru:mainfrom
arcuru-bot:feat/self-repository-syntax

Conversation

@arcuru-bot

Copy link
Copy Markdown
Contributor

Summary

Converts this repository's self-references from SHA-pinned absolute
arcuru/actions/.github/actions/...@<sha> uses: values to GitHub's $/
self-repository syntax, which resolves to the repository being run at the exact
commit being run. A reusable workflow's steps execute against the caller's
workspace, so a relative ./ path could never reach these actions; before this
change the version a consumer pinned and the action version it actually ran
were two facts kept aligned by hand. $/ makes them the same fact, and retires
the updater/audit bookkeeping that grew around the old arrangement.

The two linter blockers that originally parked this branch are now resolved:

  • zizmor parses $/ as of v1.29.0 (2026-08-01); actions-audit.yml now
    pins 1.29.0. (1.30.0 is still prerelease-only — 1.30.0-rc1 — so it is not
    used.)
  • actionlint (v1.7.12) still rejects $/, so ci.yml lints every workflow
    in one pass with a scoped -ignore that suppresses only the $/ parse error
    while still flagging a genuinely malformed uses: value.

Workflows in this diff (go live on merge)

This PR touches .github/workflows/ and .github/actions/**/action.yml;
merging it is the moment they go live:

  • .github/workflows/actions-audit.yml
  • .github/workflows/actions-update.yml
  • .github/workflows/cargo-update.yml
  • .github/workflows/ci.yml
  • .github/workflows/flake-update.yml
  • .github/workflows/security-audit.yml
  • .github/workflows/self-syntax-probe.yml
  • .github/workflows/update-hold.yml
  • .github/actions/self-syntax-probe/action.yml
  • .github/actions/self-syntax-probe/nested/action.yml

Not verified: ubicloud support

The self-syntax-probe workflow has not been run. It cannot run from this
fork: its job is gated if: github.repository_owner == 'arcuru', and the
ubicloud runner labels (ubicloud-standard-2, ubicloud-standard-2-arm) exist
only for the arcuru owner, so a fork run would queue forever. It will only
exercise once this branch/workflow is on arcuru/actions — by pushing the
branch there, or by merging this PR.

$/ requires runner agent 2.336.0 or newer. Hosted runners get that on
GitHub's schedule, but ubicloud ships its own images and refreshes them monthly
after the fact, so hosted support says nothing about ubicloud support — and
every consumer of this repository runs on ubicloud. That is the one unproven
assumption here, and whether to merge ahead of confirming ubicloud support is
the call to make.

arcuru and others added 4 commits August 15, 2026 23:50
actionlint rejects any runner label it does not recognise, and the consumer
repositories this repo serves run on ubicloud rather than hosted runners. The
label list has to exist here before a workflow in this repo can name one.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
`$/<path>` resolves to the running workflow's own repository at the exact
commit being run, and needs runner agent 2.336.0 or newer. Hosted runners
follow GitHub's own release schedule; ubicloud builds its own images and
refreshes them monthly after the fact, so hosted support does not imply
ubicloud support — and every consumer of this repository runs on ubicloud.
Both are probed, x64 and arm64 separately, since they are separate images.

The probe asserts on a marker propagated out of a nested reference rather than
on the step merely succeeding: a reference that resolves to nothing would
otherwise read as a pass, and nested composition is precisely the shape the
conversion depends on. It also checks out nothing, so a `$/` that secretly
required a workspace would fail here.

actionlint cannot parse `$/` and rejects the file wholesale, so ci.yml excludes
it by name. That is the entire available remedy — the rejection happens during
parsing, before `-ignore` could filter anything — and it is why this must not
reach main yet: zizmor cannot parse it either, and unlike actionlint it audits
the tree as a whole and aborts, taking the daily security audit with it.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
This repository's workflows reached its own composite actions absolutely,
pinned to a SHA on main, because a reusable workflow's steps execute against
the caller's workspace and a relative path cannot reach them. That made the
version a consumer pinned and the action version it actually ran two separate
facts held together by hand: a caller on v0.2.1 ran whichever setup-nix commit
happened to be hardcoded inside v0.2.1. `$/` makes them one fact — it resolves
to the repository being run, at the commit being run.

Most of this diff is removal. The updater no longer needs to leave these
references alone lest bumping one manufacture the drift the next run finds; the
audit no longer needs to compare action content against the tree to answer a
question the syntax now answers; and the ref-version-mismatch suppression
covering six whole files goes, which un-masks the third-party pins those
entries had been suppressing as collateral.

scan-pins learns `$/` as a first-class reference with `ref_kind: self`, exempt
from every upstream check but still scanned and counted. Emitting nothing would
be the more obvious change and the wrong one: verify-pins reports a reference
that disappears, so a silently-dropped `$/` is exactly how a change swapping it
back for a mutable `@main` would pass. Reverting one locally still reports it as
unpinned, which is the property worth having.

DO NOT MERGE YET. zizmor cannot parse `$/` through v1.28.0 — it aborts with "no
audit was performed" for the whole tree, while building the model and so beyond
the reach of any ignore rule, which would take the zizmor half of the daily
security audit with it. actionlint rejects it too, so CI is red on this branch
by design: suppressing it would mean excluding six of twelve workflows from
linting, which is a worse trade than waiting. The probe commit answers the
runner-support question in the meantime; this waits on the linters.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
zizmor 1.29.0 parses `$/` self-references, so the audit bumps off the
1.28.0 that aborted on them (1.30.0 is still prerelease-only). actionlint
1.7.12 still rejects the syntax, so ci.yml stops excluding the probe
workflow and lints every workflow with a scoped `-ignore` that suppresses
only the `$/` parse error; a genuinely malformed `uses:` value is still
caught. Drop the now-false "excluded from actionlint" note in the probe
workflow and the README "Blocked" callout.
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.

2 participants