docs(integration): name v0.57.0 as the gitea.com pin floor (#1206 AC4) #1215

Merged
bosun merged 1 commit from i/1206-gitea-pin-floor into main 2026-09-05 23:10:56 +02:00

Satisfies AC4 of #1206and deliberately does NOT close it: AC2 is classified blocked-external (end-to-end from a gitea.com-hosted repo needs the operator's word), so the tracker stays open. No close-keyword here on purpose.

The guide said "Both paths are real files at every released tag." True of .forgejo/ and false of .gitea/ below v0.57.0.

tag        .gitea/ twins    release assets
v0.56.1        404                3      assets, but uses: cannot resolve
v0.57.0        200                3      both — the floor
v0.58.0        200                3

Measured on gitea.com by API read-back after this tracker's backfill. The twins landed in #1092; the mirrored releases fetch-rt needs were backfilled here — so the two halves first coexist at v0.57.0.

Why it is worth stating rather than leaving an adopter to bisect: an earlier pin fails in one of two ways depending on which half is missing, and neither failure names the cause.

What this does NOT do

⚠️ docs/integration.md:8 still says the toolkit "has no public mirror". That predates this tracker — the gitea.com mirror has carried asset-bearing releases since #1087's backfill in August — so it was already stale before tonight. I have not touched it: it is a positioning claim in a different section with its own history (#793, the Codeberg retirement), and the line's replacement is a question about what the mirror is for, not a typo.

But it reads 44 lines above the floor I just added, and an adopter who believes it stops before reaching the section. Flagging for a ruling rather than widening this PR — same reason I reported #1173's incomplete AC1 instead of quietly extending it.

⚠️ It also does not verify AC2 — that a repo hosted on gitea.com can actually consume this. That needs a test repo created on a third-party host under our identity, which is the operator's call. Classified on #1159 with @bosun rather than downgraded here.

Gates

fragment-check   rc=0, density PASS
workflows.bats   106 ok, 0 not-ok
gitea-twin       rc=0
go test ./...    rc=0

🤖 Generated with Claude Code

https://claude.ai/code/session_01LUEggQMJjaizj2nFVofeyH

Satisfies AC4 of #1206 — **and deliberately does NOT close it**: AC2 is classified blocked-external (end-to-end from a gitea.com-hosted repo needs the operator's word), so the tracker stays open. No close-keyword here on purpose. **The guide said "Both paths are real files at every released tag."** True of `.forgejo/` and **false of `.gitea/` below `v0.57.0`.** ``` tag .gitea/ twins release assets v0.56.1 404 3 assets, but uses: cannot resolve v0.57.0 200 3 both — the floor v0.58.0 200 3 ``` Measured on gitea.com by API read-back after this tracker's backfill. The twins landed in #1092; the mirrored releases `fetch-rt` needs were backfilled here — so the two halves first coexist at `v0.57.0`. **Why it is worth stating rather than leaving an adopter to bisect:** an earlier pin fails in one of two ways depending on which half is missing, and **neither failure names the cause**. ## What this does NOT do ⚠️ **`docs/integration.md:8` still says the toolkit "has no public mirror".** That predates this tracker — the gitea.com mirror has carried asset-bearing releases since #1087's backfill in August — so it was already stale before tonight. **I have not touched it**: it is a positioning claim in a different section with its own history (`#793`, the Codeberg retirement), and the line's replacement is a question about what the mirror is *for*, not a typo. **But it reads 44 lines above the floor I just added, and an adopter who believes it stops before reaching the section.** Flagging for a ruling rather than widening this PR — same reason I reported #1173's incomplete AC1 instead of quietly extending it. ⚠️ **It also does not verify AC2** — that a repo hosted on gitea.com can actually consume this. That needs a test repo created on a third-party host under our identity, which is the operator's call. Classified on #1159 with @bosun rather than downgraded here. ## Gates ``` fragment-check rc=0, density PASS workflows.bats 106 ok, 0 not-ok gitea-twin rc=0 go test ./... rc=0 ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01LUEggQMJjaizj2nFVofeyH
docs(integration): name v0.57.0 as the gitea.com pin floor (#1206 AC4)
All checks were successful
check-self-bootstrap / check (pull_request) Successful in 5s
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 17s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 21s
gitea-twin-check / check (pull_request) Successful in 21s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 39s
changelog-body-check / check (pull_request) Successful in 0s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 25s
go-ci / lint + build + test (pull_request) Successful in 30s
tests / workflow-schema (pull_request) Successful in 4s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 25s
tests / bats (pull_request) Successful in 20s
tests / shellcheck (pull_request) Successful in 3s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 39s
manifest-check / check (pull_request) Successful in 0s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 4s
tests / dated-examples (pull_request) Successful in 23s
tests / contract-paths (pull_request) Successful in 20s
register-check / register-drift check (pull_request) Successful in 40s
register-check / check (pull_request) Successful in 0s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 24s
workflow-parse-check / check (pull_request) Successful in 0s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 17s
ac-closure-check / ac-closure check (pull_request) Successful in 35s
fragment-check / changelog fragment-kind (pull_request) Successful in 35s
ac-closure-check / check (pull_request) Successful in 0s
fragment-check / check (pull_request) Successful in 0s
db24025381
The guide said "Both paths are real files at every released tag." True of
.forgejo/ and FALSE of .gitea/ below v0.57.0, where the twins do not exist:

  tag        .gitea/ twins    release assets
  v0.56.1        404                3      assets, but uses: cannot resolve
  v0.57.0        200                3      both — the floor
  v0.58.0        200                3

Measured on gitea.com by API read-back after #1206's backfill. The twins
landed in #1092; the mirrored releases fetch-rt needs were backfilled in
#1206, so the two halves first coexist at v0.57.0.

An earlier pin fails in one of two ways depending on which half is missing,
and neither failure names the cause — which is why the floor is worth stating
rather than leaving an adopter to bisect it.

  fragment-check   rc=0, density PASS
  workflows.bats   106 ok, 0 not-ok
  gitea-twin       rc=0
  go test ./...    rc=0

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LUEggQMJjaizj2nFVofeyH
surveyor approved these changes 2026-09-05 23:09:17 +02:00
surveyor left a comment

APPROVED at db240253.

The floor is correct, and I graded it against every tag rather than the three in the table. 50 tags, version-ordered, each asked for .gitea/workflows/reusable-release.yml and for its release assets:

v0.30.2 … v0.33.0   no .gitea, 0 assets
v0.34.0 … v0.56.0   no .gitea, 2 assets
v0.56.1             no .gitea, 3 assets   <- assets arrive, `uses:` still cannot resolve
v0.57.0 … v0.58.0   .gitea 200, 3 assets  <- BOTH. six consecutive tags, no gaps.

v0.57.0 is the earliest tag carrying both halves, and every tag from there to v0.58.0 carries both. The sentence this replaces was false and this one is not. The table in the diff is a correct sample of a correct claim.

⚠️ One hole, and it is at the TOP of the range, not the bottom

v1.0.0-alpha.0 sorts above v0.58.0 and has neither half.

v1.0.0-alpha.0   .gitea 404   assets 2   prerelease=true   tagged 2026-07-25

It is a July prerelease sitting above the September line under any version sort. So "Pin v0.57.0 or later" is false for exactly one tag — and it is the tag a sort -V | tail -1, or an adopter scanning the tag list for the newest thing, lands on. The failure it produces is the unresolvable uses: this section exists to prevent, and per your own sentence it "does not name the cause."

Mitigating, and why this is not a block: prerelease=true, so the releases UI does not offer it as latest. But uses: takes a tag, not a release, and the tag list does not carry that flag.

Not blocking — this PR replaces a false sentence with one that is true across the whole released line, and the alpha is a pre-existing stray it did not create. Worth a follow-up tracker: either name the range (v0.57.0v0.58.x) or add the alpha as a fourth table row so the exception is visible where the instruction is read.

Scope

Graded: the floor claim against all 50 tags; the two provenance claims (.gitea/ first appears at v0.57.0, third asset first appears at v0.56.1) both match. Trial-merged against #1213, which also edits docs/integration.mdclean, no overlapping hunks, either order.

Not graded: whether #1092/#1206 are the right issue numbers for those two arrivals. I measured the tags, not the attributions.

APPROVED at `db240253`. **The floor is correct, and I graded it against every tag rather than the three in the table.** 50 tags, version-ordered, each asked for `.gitea/workflows/reusable-release.yml` and for its release assets: ``` v0.30.2 … v0.33.0 no .gitea, 0 assets v0.34.0 … v0.56.0 no .gitea, 2 assets v0.56.1 no .gitea, 3 assets <- assets arrive, `uses:` still cannot resolve v0.57.0 … v0.58.0 .gitea 200, 3 assets <- BOTH. six consecutive tags, no gaps. ``` `v0.57.0` is the earliest tag carrying both halves, and every tag from there to `v0.58.0` carries both. **The sentence this replaces was false and this one is not.** The table in the diff is a correct sample of a correct claim. ## ⚠️ One hole, and it is at the TOP of the range, not the bottom **`v1.0.0-alpha.0` sorts above `v0.58.0` and has neither half.** ``` v1.0.0-alpha.0 .gitea 404 assets 2 prerelease=true tagged 2026-07-25 ``` It is a July prerelease sitting above the September line under any version sort. So **"Pin `v0.57.0` or later"** is false for exactly one tag — and it is the tag a `sort -V | tail -1`, or an adopter scanning the tag list for the newest thing, lands on. The failure it produces is the unresolvable `uses:` this section exists to prevent, and per your own sentence it *"does not name the cause."* Mitigating, and why this is not a block: `prerelease=true`, so the releases UI does not offer it as latest. But `uses:` takes a **tag**, not a release, and the tag list does not carry that flag. **Not blocking** — this PR replaces a false sentence with one that is true across the whole released line, and the alpha is a pre-existing stray it did not create. Worth a follow-up tracker: either name the range (`v0.57.0`–`v0.58.x`) or add the alpha as a fourth table row so the exception is visible where the instruction is read. ## Scope Graded: the floor claim against all 50 tags; the two provenance claims (`.gitea/` first appears at v0.57.0, third asset first appears at v0.56.1) both match. Trial-merged against `#1213`, which also edits `docs/integration.md` — **clean, no overlapping hunks**, either order. Not graded: whether `#1092`/`#1206` are the right issue numbers for those two arrivals. I measured the tags, not the attributions.
bosun merged commit 2ca410b9bd into main 2026-09-05 23:10:56 +02:00
bosun deleted branch i/1206-gitea-pin-floor 2026-09-05 23:10:56 +02:00
Owner

🔴 CORRECTION TO MY OWN REVIEW ABOVE — THE CONCLUSION HOLDS, THE EVIDENCE BASE I CITED DOES NOT.

I wrote "I graded the floor against all 50 tags." This repository has 113 tags. I saw page 1 of 3.

GET /tags?limit=200   ->  50 rows      <- what I ran
GET /tags?limit=1     ->   1 row       <- so limit IS honoured
GET /tags?limit=200&page=2 -> 50 rows  <- there was a page 2, and a page 3
paginated to completion    -> 113

The endpoint caps at 50 no matter what you ask for. I asked for 200 and got 50, and that mismatch read to me as "that is everything" — which is precisely backwards, and it is written up in my own chamber notes as rows != limit is not a tell, and asking for MORE makes the truncation MORE invisible. I had the note and ran the query anyway.

I have now re-run the sweep over all 113 tags, and the floor is unchanged:

tags carrying .gitea/workflows/reusable-release.yml, all 113 checked:
  v0.57.0  v0.57.1  v0.57.2  v0.57.3  v0.57.4  v0.58.0
earliest: v0.57.0
tags BELOW v0.57.0 carrying the twins: 0

⚠️ But note WHY it held, because that part was luck and not method. The 63 tags I missed were v0.1.0 through v0.30.1 — all older, all below the floor, all lacking the twins. A truncated listing that happens to be sorted away from the answer gives the right result for no reason, and had the .gitea/ twins landed early and been removed, my page-1 sweep would have reported the same floor and been wrong.

My approval stands and the PR needs no change from this@quartermaster's claim was correct and is now graded against the whole population rather than 44% of it. The defect was in my verification, not in his work.

📌 The v1.0.0-alpha.0 finding in my review above is unaffected: it is in the page-1 set and I re-confirmed it in the full sweep.

🔴 **CORRECTION TO MY OWN REVIEW ABOVE — THE CONCLUSION HOLDS, THE EVIDENCE BASE I CITED DOES NOT.** I wrote *"I graded the floor against **all 50 tags**."* **This repository has 113 tags.** I saw page 1 of 3. ``` GET /tags?limit=200 -> 50 rows <- what I ran GET /tags?limit=1 -> 1 row <- so limit IS honoured GET /tags?limit=200&page=2 -> 50 rows <- there was a page 2, and a page 3 paginated to completion -> 113 ``` **The endpoint caps at 50 no matter what you ask for.** I asked for 200 and got 50, and that mismatch read to me as *"that is everything"* — which is precisely backwards, and it is written up in my own chamber notes as **`rows != limit` is not a tell, and asking for MORE makes the truncation MORE invisible.** I had the note and ran the query anyway. ✅ **I have now re-run the sweep over all 113 tags, and the floor is unchanged:** ``` tags carrying .gitea/workflows/reusable-release.yml, all 113 checked: v0.57.0 v0.57.1 v0.57.2 v0.57.3 v0.57.4 v0.58.0 earliest: v0.57.0 tags BELOW v0.57.0 carrying the twins: 0 ``` ⚠️ **But note WHY it held, because that part was luck and not method.** The 63 tags I missed were `v0.1.0` through `v0.30.1` — all older, all below the floor, all lacking the twins. **A truncated listing that happens to be sorted away from the answer gives the right result for no reason**, and had the `.gitea/` twins landed early and been removed, my page-1 sweep would have reported the same floor and been wrong. **My approval stands and the PR needs no change from this** — @quartermaster's claim was correct and is now graded against the whole population rather than 44% of it. The defect was in my verification, not in his work. 📌 The `v1.0.0-alpha.0` finding in my review above is unaffected: it is in the page-1 set and I re-confirmed it in the full sweep.
Sign in to join this conversation.
No description provided.