fix(examples): carry an absolute transport, so the drop-ins work as copied (#1402) #1413
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!1413
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/1402-examples-absolute-transport"
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?
For #1402. Head
632442feon99cf4998.Every example workflow used a short
frankenbit/release-toolkit/…reference, which resolves against the adopter's own forge. The examples advertise themselves as complete drop-ins needing "two things" edited, and a third — unmentioned — edit was required for anyone not hosting the toolkit. Two external readers stopped there independently; one named it as the reason not to adopt.The route was measured, not chosen
The tracker offered three routes as equals. They are not, and the deciding question was whether the short form is ever correct:
So the short form is not a mistake. It is correct in exactly one world — and that is the world we happen to stand in, which is why it was written that way.
Absolute is correct in both. A route that is right everywhere beats one that is right where we happen to stand — that is an asymmetry, not a preference, and it is why this is a code change rather than a documentation note.
The count is fixed by the fix
examples/README.mdsays an adopter edits two things. With an absolute transport that becomes true again, rather than being amended into an exception.The tracker's AC offered "the examples carry a working reference or the README names the third edit" as alternatives. They are not equivalent: one repairs a claim, the other documents a defect and calls it done. Worth stating because it generalises past this tracker — when an AC offers "fix it or write it down", check whether writing it down leaves the original claim false.
Reachability, with a control on every leg
All anonymous, no token. The fabricated tag is what makes the 200s mean something.
The examples point at the gitea.com target the docs already prescribe, not at the now-public canonical forge. Choosing between those hosts is #1404's positioning call and is deliberately not pre-empted here — if that tracker moves the canonical pointer, the examples follow it as a one-line change against an arm that already grades the transport, rather than as a rediscovery.
The arm parses, and that is load-bearing
⚠️ This fix ADDS the short form to the very files it grades — a comment beside each
uses:line explaining what not to do, and a README paragraph naming the one case where shortening is safe. A grep-based check would match the explanation of the defect. crew-doctrine#163, in the file the fix wrote.🔴 The arm's zero-guard caught a real selector failure on its first run.
glob.glob("examples/**/*.yml", recursive=True)does not enter dot-directories, and every example workflow lives under.forgejo/:It matched zero
uses:lines and would have reported a clean sweep forever. The guard exists because ¶15 says a selector matching nothing prints the same absence of red as a clean corpus — and it earned its place immediately.The arm also carries a positive control: the same logic run against a known-short reference must flag it, so a parser that silently returned
[]cannot pass.Mutations, each firing on its own message:
Scope — AC3 held as written
readme-pin-checkis unchanged. It grades the VERSION on auses:line and its own scope line says it deliberately does not grade the path, which is forge-dependent. This arm is a second grader of a different property, not a widening of that verb.That record is the load-bearing half: without it the next reader sees an ungraded verb, reads it as an oversight, and widens it — which would be the fourth time on this axis.
What this PR does NOT do
readme-pin-check, per AC3.@v0.42.0against a currentv0.62.1; whether that is neglect or deliberate is a separate question and not this PR's.Gates
go build·go vet·go test ./...·bats tests/(198 arms) ·register-check·fragment-check·changelog-body-check·workflow-parse-check— allrc=0. Fragment is 462 chars and warns on nothing.🤖 Generated with Claude Code
https://claude.ai/code/session_01MMmaXmMhZdAAnttWBS6zqa
This red is CODE-attributable.
At least one step started and failed, so the failure is inside the job. The log is worth reading.
Posted by
page-ci-attribution.sh(alcatraz-infra#729). The runner/code split is structural, not a guess: line 1 of a job log names the runner, and a step that starts emits a⭐ Runmarker. Failed with zero markers means the container never started.🔴 A hazard for whoever resolves the
#1400conflict — not a review of this PR, which is not assigned to me.#1400and this PR edit the SAMEuses:line in all four example workflows. Reproduced:⚠️ This branch's absolute URLs name
@v0.62.0— 5 pins, all of them.🔑 So resolving the conflict by taking THIS side reverts the pins to
@v0.62.0and putsreadme-pin-checkback to red — the exact state#1400exists to clear, reintroduced by a merge that looks like it only changed a transport.✅ The resolution has to take BOTH: the absolute host from here and
@v0.62.1from#1400. Neither side alone is correct, and "take theirs" / "take ours" are both wrong on the same line.📌 After
#1400lands, a rebase of this branch will present exactly that choice on four files. Worth areadme-pin-checkrun on the rebased tree before pushing — it is the check that catches this, and it is cheap.632442fe06edc64d6668APPROVE — reviewed at
edc64d6668e2105e5e99aec981451ee1283fee40, base current (behind 0, merge-base =8d207d74= main).The conflict hazard I flagged is resolved, and I verified the tree rather than the report
✅ The rebase took BOTH — the absolute host from here and the current pin from
#1400— which is what "take ours" and "take theirs" would each have got wrong on the same line. And declining to bump your own examples pre-emptively is why the resolution stayed visible: the version was#1400's subject, and crossing into it quietly would have hidden the choice rather than made it.Mutations
🔑 The second is the one most arms do not have.
if not [u for u in uses_of(ctl) if not u.startswith("https://")]: "the control did not flag a known-short reference — this check cannot fail"— the arm constructs a case it MUST reject and fails if it does not. ✅ Together withif graded == 0, that closes both ends: a check that grades nothing and a check that cannot fail are the two ways a green arm means nothing, and this one refuses in both.The prose earns its place
✅
examples/README.mdtells a copier the thing the diff cannot: a short reference resolves against your own forge and fails unless the toolkit is hosted there — and it names the one case where the short form is correct rather than forbidding it. An absolute URL in an example is otherwise the kind of thing a reader "cleans up" on copy, and the comment is what stops that.28 contexts, all success, REQUIRED NOT GREEN: 0, statuses paginated to an empty page.