Skip to content

docs: drop the "leg" metaphor, correct SR-1's PR lookup - #93

Merged
fengmk2 merged 2 commits into
mainfrom
docs/terminology-and-sr1
Aug 10, 2026
Merged

docs: drop the "leg" metaphor, correct SR-1's PR lookup#93
fengmk2 merged 2 commits into
mainfrom
docs/terminology-and-sr1

Conversation

@fengmk2

@fengmk2 fengmk2 commented Aug 10, 2026

Copy link
Copy Markdown
Member

Two related cleanups, both prompted by voidzero-dev/vite-plus#2397.

"leg" was jargon I invented

"Trusted leg" and "build leg" carry no meaning for a reader who was not in the design conversation. Replaced throughout the RFC, docs, action and worker comments with plain descriptions: the build workflow and the publishing workflow. Where trust was the point, the property is now stated rather than encoded in a name.

Left one untouched: a pre-existing "arm64 QEMU leg", where leg means a matrix leg and is the normal term.

SR-1 named an endpoint that does not work for forks

This is the more important half. SR-1 said:

resolve the PR number from head_sha via GET /repos/{repo}/commits/{head_sha}/pulls

Following that cost a production outage. listPullRequestsAssociatedWithCommit returns empty for a fork PR's head commit while working correctly for a same-repo one:

commit result
same-repo PR head returns the PR
fork PR head empty

So it passes every test reachable before the workflow is on the default branch, and fails for the only case this whole design exists for. workflow_run.pull_requests is fork-blind in the same way, which is precisely what makes the commit endpoint look like the alternative.

SR-1 now says to resolve by head repository and branch, to check the head sha separately so the failure distinguishes "no such PR" from "the PR moved on", and records the general rule:

Anything keyed on a fork's commit is suspect; the PR number, the run id, and the head branch are all base-repo facts and are not.

I kept the wrong version described rather than silently deleting it, because the next implementer will otherwise reach for the same endpoint for the same reason I did. docs/ci-setup.md gets the short form.

The SR-1 anchor is renamed to match; all cross-references updated and verified to resolve.

206 tests pass, typecheck clean, no action-bundle drift (comments are stripped).

Two related cleanups.

"Trusted leg" and "build leg" were my own coinage and mean nothing to a
reader who was not in the design conversation. Replaced throughout the RFC,
docs, action and worker comments with plain descriptions: the build workflow
and the publishing workflow. Where trust was the point I now state the
property rather than encode it in a name.

SR-1 told the implementer to resolve the PR from `head_sha` via
`GET /repos/{repo}/commits/{head_sha}/pulls`. That is wrong, and following it
cost a production outage: the endpoint returns EMPTY for a fork PR's head
commit while working correctly for a same-repo one, so it passes every test
reachable before the workflow reaches the default branch and fails for the
only case this design exists for. `workflow_run.pull_requests` is fork-blind
the same way, which is exactly what makes the commit endpoint look like the
alternative.

SR-1 now says to resolve by head repository and branch, to check the head sha
separately so the failure distinguishes "no such PR" from "the PR moved on",
and records the general rule: anything keyed on a fork's commit is suspect,
while the PR number, the run id and the head branch are base-repo facts and
are not. Kept the wrong version described rather than deleted, since the next
implementer will otherwise reach for the same endpoint. docs/ci-setup.md gets
the short form.

Renamed the SR-1 anchor to match; all cross-references updated and checked.
fengmk2 added a commit to voidzero-dev/vite-plus that referenced this pull request Aug 10, 2026
Two fixes to `main`, both found by the first real runs of the publishing
workflow. It could not be exercised before merge, because `workflow_run`
only fires for workflow files already on the default branch.

**First, the good news: the design works.** PR #2328 published end to
end through the new path with an OIDC token, no admin token involved.
`authorize`, `Pkg Preview`, and the sticky comment all succeeded, and
`commit.a7180fa85c06fad48` is on the bridge:

```
commit.a7180fa85c06fad48 | pr: .../pull/2328 | at: 2026-08-10T07:35:31.617Z
```

## 1. Fork PRs could not be resolved at all

#2391 (from `liangmiQwQ`) failed in `authorize` with `no open PR of
voidzero-dev/vite-plus has head c7e51be…` while that PR was open with
exactly that head.

`listPullRequestsAssociatedWithCommit` returns **empty** for a fork PR's
head commit. Confirmed against the live API:

| commit | result |
| --- | --- |
| #2387 head (same-repo) | returns `#2387` |
| #2391 head (fork) | **empty** |

So it worked for every case reachable before merge and failed for the
only case this feature exists for. `workflow_run.pull_requests` is empty
for forks too, which is what sent me to the commit endpoint originally —
I swapped one fork-blind source for another.

Now resolves via `pulls?state=open&head=<head_owner>:<head_branch>`,
both GitHub-signed payload fields. The head-sha match is a separate step
so the message distinguishes "no such PR" from "the PR moved on":

```
fork PR 2391 (real failure) -> OK: #2391 labeled=true fork=true
stale head                  -> FAIL: PR #2391 now at c7e51be, built 0000000
no such branch              -> FAIL: no open PR from liangmiQwQ:does-not-exist
```

I re-checked the rest of the publishing workflow for the same blind
spot. Everything else keys off the PR number or the run id, which are
base-repo objects and fork-safe: the post-approval `pulls.get` re-check
returns correct state, head and labels for #2391, and the artifact
download and the `listWorkflowRunArtifacts` precondition both see that
run's 148MB `bridge-packages`.

## 2. The Docker gha cache broke the image push

```
#14 exporting to GitHub Actions Cache
#14 ERROR: error writing layer blob: failed to reserve cache
#13 exporting to image ... CANCELED
```

The cache export is fatal to the build, so it cancelled the push. I
added this in the cleanup pass; it broke the job it was meant to speed
up, and #2328's npm preview published while its Docker image did not.

Reverted rather than repaired. Making it work needs `actions: write` on
the one job that installs and executes the preview package, which is the
job SR-5 says to keep unprivileged, and this was the only `type=gha`
usage in the repo so there was no working precedent. It was saving
60-90s of apt on a path that already waits on a human approval measured
in minutes to days.

## 3. Terminology

"Trusted leg" and "build leg" were my own coinage and meant nothing to a
reader who was not in the design conversation. The two workflows are now
described as **the build workflow** and **the publishing workflow**, and
where trust was the point the property is stated rather than encoded in
a name.

This also surfaced something worth fixing later: `publish-preview.yml`
is named "Publish preview build" and no longer publishes anything.
Renaming it is the real fix, but the publishing workflow matches it by
`name:`, so that has to be a coordinated change. The header says so
outright for now.

The same terminology fix for the RFC and bridge docs is
voidzero-dev/pkg-pr-registry-bridge#93, which also corrects SR-1 for the
fork-blind endpoint above.

## After merging

Re-label #2391 to get the first genuine fork preview.
@fengmk2
fengmk2 merged commit 4afb3a8 into main Aug 10, 2026
4 checks passed
@fengmk2
fengmk2 deleted the docs/terminology-and-sr1 branch August 10, 2026 08:28
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