Skip to content

ci: keep public repo gates on hosted runners - #11

Merged
will-wang-opus merged 1 commit into
mainfrom
willw-0817--public-repo-hosted-runner
Aug 17, 2026
Merged

ci: keep public repo gates on hosted runners#11
will-wang-opus merged 1 commit into
mainfrom
willw-0817--public-repo-hosted-runner

Conversation

@will-wang-opus

Copy link
Copy Markdown
Contributor

What & why

This repo is public. Two of its gates were broken by assumptions that only hold for our private repos.

1. actions-pinned-check never ran. The job declared runs-on: opus-runner-standard, a self-hosted runner. It has never once been assigned a runner in this repo — every run sat queued with runner_name="" until GitHub auto-cancelled it at the 24h ceiling (run 31613024589, run 31847701356). The identical gate finished in 8 seconds when it ran on ubuntu-latest (run 31595196968).

Beyond the hang, a public repo should not target self-hosted runners at all: a pull request from a fork runs untrusted code, and a self-hosted runner would execute it on our own infrastructure with whatever state the previous job left behind. This is GitHub's documented guidance. The gate is shell-only — a grep over .github/** — so it needs nothing a hosted runner lacks.

2. check-pr-basics failed on every PR. thehanimo/pr-title-checker was fetching pull_request_title.json through the GitHub contents API, which this job cannot reach. The file lives in this repo and the job already checks it out, so local_configuration_path reads the same config straight off the working tree. LABEL.name is empty in the config, which short-circuits the action's label calls, so that fetch was its only API call — the gate is now self-contained.

Verified locally against this branch: the pinned-actions grep reports all uses: refs SHA-pinned, and test_pr_title.py passes.

AI coding brief

  • Original request: Get the check gate running on this repo — it had been queuing for 24h and dying without executing a step — and keep the public repo off self-hosted runners.
  • Manual interventions: An earlier attempt routed the gate through a shared composite action while keeping the self-hosted runner; that was reverted (ci: unblock pinned-actions gate and pr title check #10 closed) once it was clear the runner, not the gate's implementation, was the problem.
  • Retro: "The check is failing" and "the check never started" look identical in the PR UI but have nothing in common — reading runner_name and the queued→cancelled timestamps off the jobs API separates them in one call and would have skipped the first attempt entirely. Worth stating a repo's visibility up front too: public vs private is what made both of these defaults wrong.

actions-pinned-check declared runs-on: opus-runner-standard and was never
assigned a runner in this repo -- every run queued until GitHub cancelled
it at 24h. The same gate completes in 8s on ubuntu-latest. A public repo
should not target self-hosted runners regardless: a fork PR runs untrusted
code, and the gate is shell-only, so a hosted runner is sufficient.

check-pr-basics was reading its config through the contents API, which the
job cannot reach. The file is in this repo and already checked out, so read
it from the working tree instead.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@will-wang-opus
will-wang-opus merged commit a260397 into main Aug 17, 2026
3 checks passed
@will-wang-opus
will-wang-opus deleted the willw-0817--public-repo-hosted-runner branch August 17, 2026 18:09
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