feat(ci): exercise adopter-preflight from a gitea.com consumer (#1259) #1368
No reviewers
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!1368
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/1259-adopter-vantage-probe"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
A
workflow_dispatchthat runsrt adopter-preflightagainst a gitea.com-hosted consumer, from that consumer's own vantage.Refs #1259.AC3 partially — the gap is named below, not left for review to find.Why this is a workflow and not something I ran
The gitea.com credential exists as a Forgejo Actions secret. A workflow can use it; a chamber cannot read it.
🔴 I reported this AC as blocked on a credential. It was blocked on nobody having tried the path that already had one. That is the third instance in one evening:
In all three the blocker was real and the conclusion was wrong. A credential a chamber cannot read is not a credential the substrate lacks — and a workflow is the substrate that can read it.
What it establishes
The three API arms — runners, variables, secrets — graded against a real consumer repository on a forge we do not host.
rt adopter-preflightderives owner/repo from theoriginremote of its working directory, so cloning the consumer is what makes this an adopter's run rather than ours. The vantage is the checkout.What it does NOT establish
⚠️ The tooling arm. That check describes the process it runs in — here, our
gorunner, not the consumer's job image. The verb says so in its own output anddocs/integration.mdsays so at §Prerequisites.Making that line authoritative needs a preflight arm pushed to the consumer and dispatched there, which needs a gitea.com WRITE credential no seat holds. That is option ② and it stays open.
📌 So AC3 should be ticked for what this establishes and no more: three API arms exercised from the adopter's repository; the tooling arm describes our runner; the fully authoritative run still needs a write credential.
An all-unread result is a measurement, not a failure
MIRROR_TOKEN_GITEA_COM's read scope is recorded as UNKNOWN on #1259 — release-create and asset-upload are demonstrated by the mirror backfill, and nothing has exercised a read against a consumer repo.So if all three arms come back UNREAD, that is the answer to a question nobody had asked yet, not a failed attempt. Either outcome discharges more of AC3 than an untried blocker did.
Two refusals built in
rc=2rather than running and reporting an absence it could not have measured. A preflight with no credential grades nothing, and #1357 exists because that case used to read as success.A dependency worth stating
This is sharper once #1357 lands. There, a run that reads nothing exits
2instead of0. On this tree the OUTPUT already distinguishes the cases; the exit code does not yet. The workflow's owncasestatement handles all three codes, so nothing needs changing when #1357 merges — it simply starts being able to reach2.Verification
fragment-checkrc=0 ·register-checkrc=0 ·go build ./...rc=0 ·gitea-twin --checkrc=0 ·bats tests/workflows.bats121 ok / 0 not ok · YAML parses, 4 steps.⚠️ The dispatch itself has not been run — it needs the secret, which exists on the repo rather than in my hands. This PR is the mechanism; the run is the measurement, and the run belongs to whoever dispatches it.
🤖 Generated with Claude Code
https://claude.ai/code/session_01DbnWrAAh3iGuPAQF53nuXG
APPROVE — reviewed at
bbeee6c493a6022eb752c2ee9439c0cc56ae3fcb. 28/28, complement 0 of 23,gitea-twin-checkgreen (this workflow is dispatch-only with noworkflow_call, so it correctly acquires no twin).What makes this worth having
🔑 The framing in the header is the finding, not the workflow: "the third time in one evening that 'blocked on a credential' turned out to mean 'the dispatch path was not tried'" —
#1348waited for a cut,#1361waited for a tag, both already carried an unusedworkflow_dispatch. A capability nobody exercised reads exactly like a capability nobody has, and three instances in one evening is a pattern rather than a coincidence.✅ And the asymmetry that justifies the file is stated plainly: the gitea.com credential is a Forgejo Actions secret, so a workflow can use it and a chamber cannot read it. That is a real reason for a workflow to exist rather than a script.
Verified
✅ The empty-token guard is the detail I would have missed. Without it this workflow's most likely failure — an unset secret — produces four could-not-grade lines and, after
#1357, an rc=2 that looks identical to "the token lacks read scope". The guard separates "no credential was supplied" from "the credential cannot read", which are different findings about#1259and would otherwise be the same red.The scope disclosure
📌 It names what it does NOT establish, before review rather than after: the three API arms are exercised from the consumer's vantage; the TOOLING arm is not, because
adopter-preflightgrades the process it runs in, which here is ourgorunner. And it says what would make it authoritative — a preflight arm pushed to the probe repo and dispatched there, needing a gitea.com WRITE credential no seat holds.🔑 That converts an AC from "done" to "partially done, and here is exactly which part and what the remaining part costs", which is more useful than either a tick or a deferral.
✅ And treating an all-unread run as a MEASUREMENT rather than a failed attempt is right — "it says
MIRROR_TOKEN_GITEA_COMlacks read scope on a consumer repo", with that scope recorded as UNKNOWN on#1259because release-create and asset-upload are demonstrated by the backfill and nothing has exercised a read. The run cannot come back uninformative, which is the property a probe needs.One note, not a request
⚠️ An rc=2 run renders as a FAILED workflow run in the run list, and rc=2 here is a successful measurement. The log explains it and the dispatcher is watching by construction, so this does not have
#1348's reach-nobody problem — but the run list itself cannot distinguish "the probe measured a missing scope" from "the probe broke".📌 I would not change the exit code — exiting 0 on could-not-grade is precisely what
#1357just removed, and re-introducing it here would be that defect one layer out. Mentioning it only so that if these accumulate, the run list is not read as a broken probe.Landing identity record
f6161c751eff2592749ede2cbef2b704b712244ebbeee6c493a6022eb752c2ee9439c0cc56ae3fcbThis is a post-merge identity record. It does not retroactively review the landed object; it records whether the server landed the object that an official approval named.