QVAC-18608 infra: add qvac-collabora to label-gate trusted defaults#2115
Merged
Conversation
f1413c9 to
84e1dc1
Compare
Add `qvac-collabora` to the default `teams` input of the `label-gate` composite action so that Collabora-authored PRs (e.g. #2088 from @zoq) do not deauthorise on every `synchronize` event from the PR author. Without this team, every force-push from a Collabora contributor on a `verified`-labelled PR triggers the action's "synchronize from non-trusted sender" path, which strips the label and denies. The operational result is that CI stops re-running on each push until an internal Tether engineer manually re-applies the label, which has been slowing down Collabora's iteration loop and was raised as a blocker on PR #2088. `qvac-collabora` is the broad Collabora contributor team; everyone who ships against this repo from Collabora's side is in it, so a single entry is sufficient to unblock the synchronize path. No companion `-merge` tier is added — the existing `qvac-internal-merge` / `-release` teams continue to gate the merge / release flows on the Tether side. The action's policy logic is unchanged; only the default team list grows. All 58 existing tests pass. Updates the supporting docs (`docs/ci/TEAMS.md`, `docs/ci/LABELS.md`, `label-gate/README.md`) and the `devops-why-my-pr-not` diagnostic skill so the new trusted set is discoverable. Co-authored-by: Cursor <cursoragent@cursor.com>
84e1dc1 to
6d8ba37
Compare
gianni-cor
approved these changes
May 19, 2026
Contributor
Tier-based Approval Status |
tamer-hassan-tether
approved these changes
May 19, 2026
Collaborator
Author
|
/review |
Proletter
added a commit
that referenced
this pull request
May 24, 2026
…2115) Add `qvac-collabora` to the default `teams` input of the `label-gate` composite action so that Collabora-authored PRs (e.g. #2088 from @zoq) do not deauthorise on every `synchronize` event from the PR author. Without this team, every force-push from a Collabora contributor on a `verified`-labelled PR triggers the action's "synchronize from non-trusted sender" path, which strips the label and denies. The operational result is that CI stops re-running on each push until an internal Tether engineer manually re-applies the label, which has been slowing down Collabora's iteration loop and was raised as a blocker on PR #2088. `qvac-collabora` is the broad Collabora contributor team; everyone who ships against this repo from Collabora's side is in it, so a single entry is sufficient to unblock the synchronize path. No companion `-merge` tier is added — the existing `qvac-internal-merge` / `-release` teams continue to gate the merge / release flows on the Tether side. The action's policy logic is unchanged; only the default team list grows. All 58 existing tests pass. Updates the supporting docs (`docs/ci/TEAMS.md`, `docs/ci/LABELS.md`, `label-gate/README.md`) and the `devops-why-my-pr-not` diagnostic skill so the new trusted set is discoverable.
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.
🎯 What problem does this PR solve?
verifiedauthorisation on everysynchronizeevent, even after a Tether engineer reviews and labels them. CI silently stops running until somebody re-applies the label by hand, which is currently blocking Collabora's iteration loop and was raised as a blocker in Slack.qvac-collaborais not inlabel-gate's default trustedteamsinput. The action'ssynchronizepolicy denies (and tries to strip) the label on any push from a non-trusted actor — by design, to prevent authorisation inheriting across content changes from an untrusted contributor. That policy is correct, but it should treat Collabora as trusted.📝 How does it solve it?
qvac-collaborato the defaultteamsinput of.github/actions/label-gate/action.yml. This is Collabora's broad contributor team, and every Collabora engineer shipping against this repo is in it, so a single entry is sufficient to unblock thesynchronizepath.-mergecompanion tier. The Tether-side merge / release gates (qvac-internal-merge,qvac-internal-release) continue to govern the merge flow;label-gateonly governs CI authorisation, and "trusted enough to keep CI running on your own PRs" is the right semantic for the broaderqvac-collaboramembership.teams:are unaffected.docs/ci/TEAMS.md,docs/ci/LABELS.md,label-gate/README.md) and thedevops-why-my-pr-notdiagnostic skill so the trusted set is discoverable from anywhere a developer might look.🧪 How was it tested?
node --test .github/actions/label-gate/test/*.test.mjs→ 58 / 58 pass. The test fixtures hard-code their ownTEAMSconstant rather than reading the action default, so policy coverage is unaffected by the addition.Verified the YAML is valid and the new default parses to the expected 4-entry list.
Confirmed
qvac-collaboraexists in thetethertoorg and that @zoq (PR [DRAFT] QVAC b8828 #2088 author) isstate=active:gh api orgs/tetherto/teams/qvac-collabora/memberships/zoq # {"state":"active","role":"member",...}So after this PR merges,
synchronizeevents from him on a labelled PR will be considered trusted and the gate will keep the label in place.No workflow files touched, so
actionlintover.github/workflows/**is unchanged.actionlintdoes not consume composite-action manifests under.github/actions/**/action.yml.🔗 Context
label-gateimplementation: QVAC-18608 (PRs QVAC-18608 infra: add .github/actions/label-gate (Node 20) #1968, QVAC-18608 fix(label-gate): preserve hyphens in input env-var names #1973, QVAC-18608 fix(label-gate): strip label when non-trusted user applies it #1978, QVAC-18608 fix: trust repository_dispatch events in label-gate #1995).synchronizeevents from@zoqon May 18 (11:53, 12:05, 21:34, 22:06 UTC) each causing the gate to deny — confirming the diagnosis.🐛 Known follow-up — strip 403
While debugging this issue I also observed that the action's strip call returned
HTTP 403 (DELETE /repos/tetherto/qvac/issues/2088/labels/verified)on PR #2088's untrustedsynchronizeevents. Per the action's exit policy, an unhandled API error is treated as hard misconfiguration → the gate job goes red rather than silently denying. That is a separate issue from this PR (it's about thePAT_TOKENnot having sufficient permission to delete a label on a base-repo PR triggered from a fork) and would still bite us for any genuinely untrusted contributor.After this PR lands, Collabora pushes will no longer trip the strip path (zoq is now trusted), but the latent PAT-permission issue remains. I'll open a follow-up to triage the
PAT_TOKENscope and ensureDELETE /repos/.../issues/{n}/labels/{name}succeeds, so we don't continue to fail loudly on legitimately-untrusted PRs. Required scopes that need to be granted on the PAT (or a replacement GitHub App installation token):repo+read:org, SSO-authorised fortetherto.tetherto, repotetherto/qvac):Issues: Write,Pull requests: Write,Contents: Read,Metadata: Read, and org-levelMembers: Read.