docs: correct release token scope contract #61

Merged
andres merged 1 commit from build/60-release-token-scopes into main 2026-09-03 07:30:22 +00:00

Refs #60

Worklog

  • Correct the release workflow token-scope comment
  • Add the changelog fragment
  • Verify the exact scope wording and two-file diff boundary
  • Run the full test suite and diff hygiene checks

Acceptance criteria

  • .forgejo/workflows/release.yml names exactly read:user, write:package, and write:repository, with the reversed scope spellings removed.
  • The comment explains that publish-release.sh spends read:user because stoke auth login validates the token against /user.
  • The diff touches only .forgejo/workflows/release.yml and changelog.d/60.md; no step, script, or CLI behavior changes.
  • npm test passes and ci / test is green on the PR head.
  • This PR uses Refs #60; triage owns the post-merge tagged-run verification and issue closure.

Round log

Round at 0edba09a

Round passed with no written reply.

Refs #60 ## Worklog - [x] Correct the release workflow token-scope comment - [x] Add the changelog fragment - [x] Verify the exact scope wording and two-file diff boundary - [x] Run the full test suite and diff hygiene checks ## Acceptance criteria - [x] `.forgejo/workflows/release.yml` names exactly `read:user`, `write:package`, and `write:repository`, with the reversed scope spellings removed. - [x] The comment explains that `publish-release.sh` spends `read:user` because `stoke auth login` validates the token against `/user`. - [x] The diff touches only `.forgejo/workflows/release.yml` and `changelog.d/60.md`; no step, script, or CLI behavior changes. - [x] `npm test` passes and `ci / test` is green on the PR head. - [x] This PR uses `Refs #60`; triage owns the post-merge tagged-run verification and issue closure. ## Round log <!-- round:0edba09a8a60079b2c8b79e01c8e828b13f40f3f --> **Round at 0edba09a** _Round passed with no written reply._
codex-bot-andresmgsl added 1 commit 2026-09-02 22:54:58 +00:00
docs: correct release token scopes
All checks were successful
labels / labels (pull_request) Successful in 12s
ci / test (pull_request) Successful in 17s
0edba09a8a
forgejo-actions added the
scope:ci
scope:packaging
labels 2026-09-02 22:55:06 +00:00
codex-bot-andresmgsl changed title from docs: correct release token scope contract to WIP: docs: correct release token scope contract 2026-09-02 22:55:13 +00:00
forgejo-actions added the
state:addressing
label 2026-09-02 22:55:13 +00:00
Author
Member

Build answer for head 0edba09a8a:

  • .forgejo/workflows/release.yml now names the exact Forgejo token scopes read:user, write:package, and write:repository; the obsolete reversed spellings are gone.
  • The same header explains that publish-release.sh requires read:user because its stoke auth login call validates the token against /user.
  • The workflow steps and all non-comment YAML are unchanged. changelog.d/60.md records the documentation correction.
  • The PR uses Refs #60; the first later tagged run reaching the release-attachment step remains triage-owned post-merge evidence.

Verified: npm test passes 141/141; git diff --check origin/main...HEAD passes; the changed-path audit contains exactly .forgejo/workflows/release.yml and changelog.d/60.md; a comment-stripped workflow comparison is identical; same-head ci / test and labels / labels both report SUCCESS.

Build answer for head 0edba09a8a60079b2c8b79e01c8e828b13f40f3f: - `.forgejo/workflows/release.yml` now names the exact Forgejo token scopes `read:user`, `write:package`, and `write:repository`; the obsolete reversed spellings are gone. - The same header explains that `publish-release.sh` requires `read:user` because its `stoke auth login` call validates the token against `/user`. - The workflow steps and all non-comment YAML are unchanged. `changelog.d/60.md` records the documentation correction. - The PR uses `Refs #60`; the first later tagged run reaching the release-attachment step remains triage-owned post-merge evidence. Verified: `npm test` passes 141/141; `git diff --check origin/main...HEAD` passes; the changed-path audit contains exactly `.forgejo/workflows/release.yml` and `changelog.d/60.md`; a comment-stripped workflow comparison is identical; same-head `ci / test` and `labels / labels` both report SUCCESS.
Author
Member

📣 round answered at head 0edba09a8a

📣 round answered at head 0edba09a8a60079b2c8b79e01c8e828b13f40f3f
codex-bot-andresmgsl changed title from WIP: docs: correct release token scope contract to docs: correct release token scope contract 2026-09-02 22:56:54 +00:00
forgejo-actions added the
blocker:unrequested
label 2026-09-02 23:00:13 +00:00
codex-bot-andresmgsl requested review from glm-bot-andresmgsl 2026-09-02 23:01:01 +00:00
codex-bot-andresmgsl requested review from claude-bot-andresmgsl 2026-09-02 23:01:02 +00:00
codex-bot-andresmgsl requested review from kimi-bot-andresmgsl 2026-09-02 23:01:02 +00:00
codex-bot-andresmgsl added the
state:bots-reviewing
label 2026-09-02 23:01:03 +00:00
forgejo-actions removed the
blocker:unrequested
state:addressing
labels 2026-09-02 23:01:21 +00:00

🔎 reviewing head 0edba09a8a

  • AC1 — release.yml header names exactly read:user, write:package, write:repository; grep confirms no package:write/repository:write anywhere in the tree
  • AC2 — comment states publish-release.sh runs stoke auth login, which validates against /user; verified against scripts/publish-release.sh L41 and src/cli.js tokenClient.get('/user')
  • AC3 — diff is exactly .forgejo/workflows/release.yml + changelog.d/60.md, comment-only; no step/script/CLI change
  • AC4 — npm test 141/141 pass in a detached worktree; ci / test and labels / labels green on this head
  • AC5 — Refs #60, no closing keyword anywhere in the PR body

Verdict submitted.

🔎 reviewing head 0edba09a8a60079b2c8b79e01c8e828b13f40f3f - [x] AC1 — release.yml header names exactly `read:user`, `write:package`, `write:repository`; grep confirms no `package:write`/`repository:write` anywhere in the tree - [x] AC2 — comment states `publish-release.sh` runs `stoke auth login`, which validates against `/user`; verified against `scripts/publish-release.sh` L41 and `src/cli.js` `tokenClient.get('/user')` - [x] AC3 — diff is exactly `.forgejo/workflows/release.yml` + `changelog.d/60.md`, comment-only; no step/script/CLI change - [x] AC4 — `npm test` 141/141 pass in a detached worktree; `ci / test` and `labels / labels` green on this head - [x] AC5 — `Refs #60`, no closing keyword anywhere in the PR body Verdict submitted.

🔎 reviewing head 0edba09a8a

  • issue #60 criteria audited: scope spellings ✓, read:user rationale ✓ (verified vs publish-release.sh L41 + src/cli.js L225), two-file comment-only diff ✓, npm test 141/141 after npm ci ✓, ci/test green on head ✓, Refs-not-Closes body audit clean ✓
  • verdict: approve — composing and submitting
🔎 reviewing head 0edba09a8a60079b2c8b79e01c8e828b13f40f3f - issue #60 criteria audited: scope spellings ✓, read:user rationale ✓ (verified vs publish-release.sh L41 + src/cli.js L225), two-file comment-only diff ✓, npm test 141/141 after npm ci ✓, ci/test green on head ✓, Refs-not-Closes body audit clean ✓ - verdict: approve — composing and submitting

🔎 reviewing head 0edba09a8a

  • worktree checked out detached at head 0edba09, removed after verdict
  • diff verified: only .forgejo/workflows/release.yml (comment only) + changelog.d/60.md
  • release.yml now names exactly read:user, write:package, write:repository; no reversed spellings remain
  • /user claim verified: scripts/publish-release.sh L41 auth login first; src/cli.js L225 tokenClient.get("/user")
  • changelog fragment format matches CHANGELOG.md convention
  • CI: ci / test and labels both success on head (runs 1015/1016)
  • gap: node/npm unavailable in this box, so npm test not run locally — relied on CI
  • verdict: APPROVE submitted and verified via submit-verdict.sh
🔎 reviewing head 0edba09a8a60079b2c8b79e01c8e828b13f40f3f - worktree checked out detached at head 0edba09, removed after verdict - diff verified: only .forgejo/workflows/release.yml (comment only) + changelog.d/60.md - release.yml now names exactly read:user, write:package, write:repository; no reversed spellings remain - /user claim verified: scripts/publish-release.sh L41 `auth login` first; src/cli.js L225 tokenClient.get("/user") - changelog fragment format matches CHANGELOG.md convention - CI: ci / test and labels both success on head (runs 1015/1016) - gap: node/npm unavailable in this box, so npm test not run locally — relied on CI - verdict: APPROVE submitted and verified via submit-verdict.sh
claude-bot-andresmgsl approved these changes 2026-09-02 23:07:54 +00:00
claude-bot-andresmgsl left a comment
Member

Approve at head 0edba09a8a60079b2c8b79e01c8e828b13f40f3f.

The comment-only fix does exactly what #60 specs, and it does not do the thing #60 rejected.

Acceptance criteria

  • Names exactly read:user, write:package, write:repository; reversed spellings gone. .forgejo/workflows/release.yml L8-12 carries all three. grep -rn 'package:write\|repository:write' over the tree (excluding .git/node_modules) returns nothing — the misspelling is gone from the whole repo, not just relocated. The spellings used match FULL_TOKEN_SCOPES in src/cli.js L149-157 and README L221-222, and read:user matches Forgejo's own error text quoted in #60 (required scope(s): [read:user]).
  • States which step spends read:user, and why. "read:user is required because publish-release.sh runs stoke auth login, which validates the token against /user." I verified the claim rather than taking it: scripts/publish-release.sh L41 is run_stoke auth login --url ... --token-file ... as the first stoke call, and src/cli.js L225 is const me = await tokenClient.get('/user') on the --token path. publish-release.sh is named only in the Create release and attach .deb step (yaml.safe_load lists the five steps; it appears in exactly one), so the pointer resolves unambiguously.
  • Diff touches only the workflow and one fragment; no step, script or CLI change. git diff 088e7e2d..HEAD --stat is .forgejo/workflows/release.yml | 8 +++--- and changelog.d/60.md | 1 +, 2 files. The workflow hunk is inside the leading # comment block; yaml.safe_load parses the file and the job/step structure is byte-identical in effect (deb: Check out tag, Run tests, Build .deb, Publish to Debian registry, Create release and attach .deb). The rejected alternative — making publish-release.sh skip auth login — is not present, which is the failure case #60's test plan names.
  • npm test passes; ci / test green on the head. In a detached worktree at this head, npm ci then npm test: 141/141 pass, 0 fail. On the forge, ci / test and labels / labels are both success for 0edba09a (runs 1015/1016).
  • Refs #60, triage owns the close. The body opens with Refs #60. I regex-scanned the whole body for close/closes/closed/fix/fixes/fixed/resolve/resolves/resolved within 20 chars before any #N: zero hits, including inside the code spans. The one other mention is `Refs #60`, number-safe.

Changelog fragment changelog.d/60.md matches the established one-line - <sentence>. (#N). form used by 54.md, 50.md, 48.md, 43.md.

What I could not verify, and what I relied on instead

  • The Forgejo token screen actually offers these three checkboxes as spelled (test-plan step 1). I have no browser and no token-creation rights on the instance from this box. I relied on three converging documentary sources instead: the instance's own 403 text in #60 spells it read:user; src/cli.js's scope constants — which stoke POSTs to /users/{u}/tokens and which Forgejo accepts today — spell it write:package/write:repository; and README L221-222 documents the same forms. All three agree, and the old form (package:write) appears in none of them.
  • The next tagged run reaching Create release and attach .deb (test-plan step 2). That is post-merge by construction and is #60's stated wake condition; triage owns it. No test in this repo reads this comment, so — as #60 says — green CI is not evidence for the text itself; the text evidence above is.

Non-blocking, for a proposal rather than this PR

README.md L1118 still states the same credential contract in prose — "a RELEASE_TOKEN secret (package + repository write for the heavy-duty org)" — and is stale in exactly the way #60 diagnoses: two scopes where the door needs three. I am not requesting changes on it, because #60's third criterion bounds this diff to the workflow plus one fragment, and widening it here would fail that criterion to fix an out-of-scope line. Worth a proposal so the second copy of the contract does not re-strand the next provisioner.

**Approve** at head `0edba09a8a60079b2c8b79e01c8e828b13f40f3f`. The comment-only fix does exactly what #60 specs, and it does not do the thing #60 rejected. ## Acceptance criteria - **Names exactly `read:user`, `write:package`, `write:repository`; reversed spellings gone.** ✅ `.forgejo/workflows/release.yml` L8-12 carries all three. `grep -rn 'package:write\|repository:write'` over the tree (excluding `.git`/`node_modules`) returns nothing — the misspelling is gone from the whole repo, not just relocated. The spellings used match `FULL_TOKEN_SCOPES` in `src/cli.js` L149-157 and README L221-222, and `read:user` matches Forgejo's own error text quoted in #60 (`required scope(s): [read:user]`). - **States which step spends `read:user`, and why.** ✅ "read:user is required because publish-release.sh runs `stoke auth login`, which validates the token against /user." I verified the claim rather than taking it: `scripts/publish-release.sh` L41 is `run_stoke auth login --url ... --token-file ...` as the first stoke call, and `src/cli.js` L225 is `const me = await tokenClient.get('/user')` on the `--token` path. `publish-release.sh` is named only in the *Create release and attach .deb* step (`yaml.safe_load` lists the five steps; it appears in exactly one), so the pointer resolves unambiguously. - **Diff touches only the workflow and one fragment; no step, script or CLI change.** ✅ `git diff 088e7e2d..HEAD --stat` is `.forgejo/workflows/release.yml | 8 +++---` and `changelog.d/60.md | 1 +`, 2 files. The workflow hunk is inside the leading `#` comment block; `yaml.safe_load` parses the file and the job/step structure is byte-identical in effect (`deb`: Check out tag, Run tests, Build .deb, Publish to Debian registry, Create release and attach .deb). The rejected alternative — making `publish-release.sh` skip `auth login` — is **not** present, which is the failure case #60's test plan names. - **`npm test` passes; `ci / test` green on the head.** ✅ In a detached worktree at this head, `npm ci` then `npm test`: **141/141 pass, 0 fail**. On the forge, `ci / test` and `labels / labels` are both `success` for `0edba09a` (runs 1015/1016). - **`Refs #60`, triage owns the close.** ✅ The body opens with `Refs #60`. I regex-scanned the whole body for `close/closes/closed/fix/fixes/fixed/resolve/resolves/resolved` within 20 chars before any `#N`: zero hits, including inside the code spans. The one other mention is `` `Refs #60` ``, number-safe. Changelog fragment `changelog.d/60.md` matches the established one-line `- <sentence>. (#N).` form used by `54.md`, `50.md`, `48.md`, `43.md`. ## What I could not verify, and what I relied on instead - **The Forgejo token screen actually offers these three checkboxes as spelled** (test-plan step 1). I have no browser and no token-creation rights on the instance from this box. I relied on three converging documentary sources instead: the instance's own 403 text in #60 spells it `read:user`; `src/cli.js`'s scope constants — which stoke POSTs to `/users/{u}/tokens` and which Forgejo accepts today — spell it `write:package`/`write:repository`; and README L221-222 documents the same forms. All three agree, and the *old* form (`package:write`) appears in none of them. - **The next tagged run reaching *Create release and attach .deb*** (test-plan step 2). That is post-merge by construction and is #60's stated wake condition; triage owns it. No test in this repo reads this comment, so — as #60 says — green CI is not evidence for the text itself; the text evidence above is. ## Non-blocking, for a proposal rather than this PR `README.md` L1118 still states the same credential contract in prose — "a `RELEASE_TOKEN` secret (package + repository write for the `heavy-duty` org)" — and is stale in exactly the way #60 diagnoses: two scopes where the door needs three. I am **not** requesting changes on it, because #60's third criterion bounds this diff to the workflow plus one fragment, and widening it here would fail that criterion to fix an out-of-scope line. Worth a proposal so the second copy of the contract does not re-strand the next provisioner.
glm-bot-andresmgsl approved these changes 2026-09-02 23:08:38 +00:00
glm-bot-andresmgsl left a comment
Member

Verdict: approve — all pre-merge acceptance criteria of #60 verified at head 0edba09a8a

Reviewed the whole PR at this head against issue #60, then the repo's constraints, then the code.

Criterion 1 — scope spellings. The release.yml header names exactly read:user, write:package, write:repository; the reversed package:write/repository:write forms are gone (repo-wide grep at this head: zero occurrences of the old spellings anywhere).

Criterion 2 — why read:user. The comment says publish-release.sh runs stoke auth login, which validates the token against /user. I verified the claim against the code, not just the prose: scripts/publish-release.sh calls run_stoke auth login before any release command, and the token path of auth login does tokenClient.get('/user') (src/cli.js:225, "Validate the supplied token and resolve the login name"). The comment's technical claim is accurate.

Criterion 3 — two-file, comment-only diff. git diff origin/main...HEAD touches exactly .forgejo/workflows/release.yml and changelog.d/60.md. Filtering the workflow diff's +/- lines to non-comment lines yields nothing — the YAML change is comments only; no step, script, or CLI change. The rejected alternative (touching publish-release.sh) is not present. The fragment matches the existing changelog.d/54.md one-liner convention.

Criterion 4 — tests and CI. Ran npm ci && npm test in a detached throwaway worktree at the head: 141/141 pass. (My first run failed 66 tests solely because the fresh worktree had no node_modules — environment, not code; after npm ci everything passes.) Via the API, ci / test and labels / labels both report success on this head.

Criterion 5 — Refs, not Closes. The PR body uses Refs #60; a closing-keyword audit over the whole body (including prose and code spans) found no close*/fix*/resolve* #60 shape. The post-merge close and the tagged-run wake condition are triage-owned per the issue — correctly shaped, not a gap.

What I could not verify, and what I relied on instead:

  • The actual next v* tagged run reaching Create release and attach .deb — that is the post-merge criterion the issue itself assigns to triage; nothing in this repo can prove it pre-merge, and the issue agrees a green ci / test proves nothing here on its own (no test reads the comment).
  • The Forgejo token-creation screen's selectable spellings — I could not open that UI; I relied on the run-990 failure quoted in #60, where the instance's own error demanded [read:user], confirming the resource:permission spelling against the live server.
  • npm test's first run in my worktree failed on a missing node_modules; I relied on npm ci (the same install CI's Run tests step performs) before trusting the suite.

Non-blocking: none.

## Verdict: approve — all pre-merge acceptance criteria of #60 verified at head 0edba09a8a60079b2c8b79e01c8e828b13f40f3f Reviewed the whole PR at this head against issue #60, then the repo's constraints, then the code. **Criterion 1 — scope spellings.** The release.yml header names exactly `read:user`, `write:package`, `write:repository`; the reversed `package:write`/`repository:write` forms are gone (repo-wide grep at this head: zero occurrences of the old spellings anywhere). **Criterion 2 — why `read:user`.** The comment says `publish-release.sh` runs `stoke auth login`, which validates the token against `/user`. I verified the claim against the code, not just the prose: `scripts/publish-release.sh` calls `run_stoke auth login` before any release command, and the token path of `auth login` does `tokenClient.get('/user')` (`src/cli.js:225`, "Validate the supplied token and resolve the login name"). The comment's technical claim is accurate. **Criterion 3 — two-file, comment-only diff.** `git diff origin/main...HEAD` touches exactly `.forgejo/workflows/release.yml` and `changelog.d/60.md`. Filtering the workflow diff's +/- lines to non-comment lines yields nothing — the YAML change is comments only; no step, script, or CLI change. The rejected alternative (touching `publish-release.sh`) is not present. The fragment matches the existing `changelog.d/54.md` one-liner convention. **Criterion 4 — tests and CI.** Ran `npm ci && npm test` in a detached throwaway worktree at the head: **141/141 pass**. (My first run failed 66 tests solely because the fresh worktree had no `node_modules` — environment, not code; after `npm ci` everything passes.) Via the API, `ci / test` and `labels / labels` both report success on this head. **Criterion 5 — Refs, not Closes.** The PR body uses `Refs #60`; a closing-keyword audit over the whole body (including prose and code spans) found no `close*/fix*/resolve* #60` shape. The post-merge close and the tagged-run wake condition are triage-owned per the issue — correctly shaped, not a gap. **What I could not verify, and what I relied on instead:** - The actual next `v*` tagged run reaching *Create release and attach .deb* — that is the post-merge criterion the issue itself assigns to triage; nothing in this repo can prove it pre-merge, and the issue agrees a green `ci / test` proves nothing here on its own (no test reads the comment). - The Forgejo token-creation screen's selectable spellings — I could not open that UI; I relied on the run-990 failure quoted in #60, where the instance's own error demanded `[read:user]`, confirming the `resource:permission` spelling against the live server. - `npm test`'s first run in my worktree failed on a missing `node_modules`; I relied on `npm ci` (the same install CI's `Run tests` step performs) before trusting the suite. Non-blocking: none.
kimi-bot-andresmgsl approved these changes 2026-09-02 23:09:02 +00:00
kimi-bot-andresmgsl left a comment
Member

Approve — docs-only correction of the RELEASE_TOKEN scope contract, verified against #60's spec at head 0edba09a8a.

Checked against the issue's acceptance criteria:

  1. .forgejo/workflows/release.yml now names exactly read:user, write:package, and write:repository (L8-10); a grep of the whole file shows no reversed (package:write / repository:write) spellings remain.
  2. The comment states read:user is required because publish-release.sh runs stoke auth login, which validates the token against /user. I verified both halves of that claim in the tree: scripts/publish-release.sh L41 runs auth login as its first action, and src/cli.js L225 (const me = await tokenClient.get('/user')) is the /user validation the issue cites.
  3. The diff touches only .forgejo/workflows/release.yml (comment hunk only — no step, script, or CLI behavior change) and the new changelog.d/60.md fragment. git diff --stat main...HEAD confirms the two-file boundary.
  4. The PR body uses Refs #60 with no closing keyword anywhere preceding #N, matching the issue's hand-close / post-merge shape; triage owns closure.
  5. The changelog fragment's (#60). suffix matches the existing CHANGELOG.md entry convention.

What I could not verify: npm test locally — this box has no node/npm installed, so I relied on CI instead. The PR head's commit status shows ci / test (pull_request) success (run 1015) alongside labels / labels (run 1016), so the 141-test suite ran green on this exact head. Given the change is a workflow comment plus a changelog fragment, the untested-locally residual risk is negligible, but naming the gap per reviewer doctrine.

Approve — docs-only correction of the RELEASE_TOKEN scope contract, verified against #60's spec at head 0edba09a8a60079b2c8b79e01c8e828b13f40f3f. Checked against the issue's acceptance criteria: 1. `.forgejo/workflows/release.yml` now names exactly `read:user`, `write:package`, and `write:repository` (L8-10); a grep of the whole file shows no reversed (`package:write` / `repository:write`) spellings remain. 2. The comment states `read:user` is required because `publish-release.sh` runs `stoke auth login`, which validates the token against `/user`. I verified both halves of that claim in the tree: `scripts/publish-release.sh` L41 runs `auth login` as its first action, and `src/cli.js` L225 (`const me = await tokenClient.get('/user')`) is the `/user` validation the issue cites. 3. The diff touches only `.forgejo/workflows/release.yml` (comment hunk only — no step, script, or CLI behavior change) and the new `changelog.d/60.md` fragment. `git diff --stat main...HEAD` confirms the two-file boundary. 4. The PR body uses `Refs #60` with no closing keyword anywhere preceding `#N`, matching the issue's hand-close / post-merge shape; triage owns closure. 5. The changelog fragment's `(#60).` suffix matches the existing CHANGELOG.md entry convention. What I could not verify: `npm test` locally — this box has no `node`/`npm` installed, so I relied on CI instead. The PR head's commit status shows `ci / test (pull_request)` success (run 1015) alongside `labels / labels` (run 1016), so the 141-test suite ran green on this exact head. Given the change is a workflow comment plus a changelog fragment, the untested-locally residual risk is negligible, but naming the gap per reviewer doctrine.
codex-bot-andresmgsl requested review from andres 2026-09-02 23:11:10 +00:00
codex-bot-andresmgsl added the
state:needs-human
label 2026-09-02 23:11:10 +00:00
forgejo-actions removed the
state:bots-reviewing
label 2026-09-02 23:11:28 +00:00

🧹 triage — correcting one clause in this PR's AC5. No objection to the diff, no re-review owed, and nothing is asked of @codex-bot-andresmgsl. Three approvals stand, mergeable: true, and this PR is still ready for @andres to merge as-is.

The clause

Acceptance criterion 5 reads:

  • This PR uses Refs #60; triage owns the post-merge tagged-run verification and issue closure.

The first half and the last half are correct. The middle is stale, and it has been since ~2 minutes after this PR was opened.

  • Refs #60, no closing keyword — true, verified again just now against the body.
  • "triage owns … issue closure"true, and unchanged. #60's close is mine, not the merge's.
  • "the post-merge tagged-run verification"wrong now. The verification is a re-run of run 990's existing job, not a run on a new tag.

Why it changed

This PR was opened 2026-09-02T22:54:57Z. #60 was minted at 22:50:35Z — about two minutes before the diagnosis that corrected this wake condition was written onto #54's AC6 (22:52:29Z) and #56 (22:51:54Z). #60's own criterion carried the pre-correction framing until triage fixed it at 2026-09-03T00:49:53Z. This PR's AC5 was written from #60 while #60 was still wrong, and it is the last place on the board still carrying that framing.

That is a fault in triage's record-keeping, not in this PR. The builder wrote down what the issue said at the time.

What the corrected condition is, re-measured this tick (2026-09-03T03:5xZ)

check result
GET /repos/heavy-duty/stoke/releases/tags/v1.5.0 404 — no release exists
runs with head_branch == v1.5.0 count 1 — run 990, push, failure
GET /repos/heavy-duty/stoke/tags 3 (v1.5.0, v1.4.0, v1.3.0)
GET /api/v1/packages/heavy-duty debian stoke 1.5.0, created 2026-09-02T22:29:42Z — the registry half already shipped
main 088e7e2d66089007a93a00213f2173d0d9142580

Run 990 authenticated fine and printed Published. at the registry step, then died one step later at Create release and attach .deb on Authentication failed: token does not have at least one of required scope(s): [read:user] / HTTP status: 403. So the tag did its job; what is missing is a token scope. The wake is:

@andres mints a new PAT carrying read:user and write:package and write:repository, pastes it into the org-level RELEASE_TOKEN, and re-runs run 990's job.

That single act discharges #60's post-merge criterion, #56's criterion 2 and #54's AC6 together.

The part that matters if AC5 is read literally at merge time

Do not push a new tag to prove this fix, and do not delete v1.5.0. Reading "tagged-run verification" at face value means cutting v1.6.0 — which is the one move the rest of the board is explicitly trying to prevent.

A re-run is safe and a re-tag is not, and the reason is in the script. At 088e7e2d, scripts/publish-deb.sh:

L42: case "$STATUS" in
L43:   201) echo "Published." ;;
L44:   409) echo "Already published (409): this exact version already exists in the registry." ;;
L45:   *)
L46:     echo "error: upload failed with HTTP $STATUS" >&2
L47:     cat /tmp/stoke-publish-response.$$ >&2 || true
L48:     rm -f /tmp/stoke-publish-response.$$
L49:     exit 1
L50:     ;;

The repeat 409 at L44 does not exit 1 — the exit 1 is in the *) arm at L45-49. So a re-run walks straight past the already-published registry step and lands on Create release and attach .deb, the step that has never yet executed to completion. Hand-recovering v1.4.0 is what cost #54 its proof the first time; this door does not have that wall unless someone builds one.

What is and is not being changed

This PR's body is the builder's and triage is not editing it. The clause stays as written — it is what this PR was told, and the correction belongs beside it rather than on top of it. This comment is the correction of record; the authoritative text is #60's post-merge criterion, corrected 2026-09-03T00:49:53Z.

On merge: #60 moves to post-merge and the claim releases. It does not close — Refs, not Closes — and triage holds it open until the re-run proves the corrected scope set is sufficient rather than merely longer. If the re-run still fails on a scope, #60 re-opens its spec instead of closing. That much AC5 got exactly right.


Why this took four ticks to reach the PR: triage runs a standing grep for spent wake clauses, and its pattern is tagged run — with a space. This body says tagged-run, with a hyphen, and scores zero on all three standing patterns. An orthography-tolerant re-sweep over all eight open bodies returns exactly two hits the standing greps miss: #60's correction (which quotes this line) and this line itself. The detector has been widened.

🧹 triage — correcting one clause in this PR's AC5. **No objection to the diff, no re-review owed, and nothing is asked of @codex-bot-andresmgsl.** Three approvals stand, `mergeable: true`, and this PR is still ready for @andres to merge as-is. ## The clause Acceptance criterion 5 reads: > - [x] This PR uses `Refs #60`; triage owns the post-merge **tagged-run** verification and issue closure. **The first half and the last half are correct. The middle is stale, and it has been since ~2 minutes after this PR was opened.** - `Refs #60`, no closing keyword — **true**, verified again just now against the body. - *"triage owns … issue closure"* — **true**, and unchanged. #60's close is mine, not the merge's. - *"the post-merge **tagged-run** verification"* — **wrong now.** The verification is a **re-run of run 990's existing job**, not a run on a new tag. ## Why it changed This PR was opened 2026-09-02T22:54:57Z. [#60](https://forgejo.heavyduty.builders/heavy-duty/stoke/issues/60) was minted at 22:50:35Z — about two minutes *before* the diagnosis that corrected this wake condition was written onto [#54](https://forgejo.heavyduty.builders/heavy-duty/stoke/issues/54)'s AC6 (22:52:29Z) and [#56](https://forgejo.heavyduty.builders/heavy-duty/stoke/issues/56) (22:51:54Z). #60's own criterion carried the pre-correction framing until triage fixed it at 2026-09-03T00:49:53Z. This PR's AC5 was written from #60 while #60 was still wrong, and it is the last place on the board still carrying that framing. **That is a fault in triage's record-keeping, not in this PR.** The builder wrote down what the issue said at the time. ## What the corrected condition is, re-measured this tick (2026-09-03T03:5xZ) | check | result | | --- | --- | | `GET /repos/heavy-duty/stoke/releases/tags/v1.5.0` | **404** — no release exists | | runs with `head_branch == v1.5.0` | **count 1** — run [990](https://forgejo.heavyduty.builders/heavy-duty/stoke/actions/runs/990), `push`, **`failure`** | | `GET /repos/heavy-duty/stoke/tags` | **3** (`v1.5.0`, `v1.4.0`, `v1.3.0`) | | `GET /api/v1/packages/heavy-duty` | `debian stoke 1.5.0`, created 2026-09-02T22:29:42Z — **the registry half already shipped** | | `main` | `088e7e2d66089007a93a00213f2173d0d9142580` | Run 990 authenticated fine and printed `Published.` at the registry step, then died one step later at *Create release and attach .deb* on `Authentication failed: token does not have at least one of required scope(s): [read:user]` / `HTTP status: 403`. So the tag did its job; what is missing is a token scope. The wake is: > @andres mints a **new** PAT carrying `read:user` **and** `write:package` **and** `write:repository`, pastes it into the org-level `RELEASE_TOKEN`, and **re-runs run 990's job**. That single act discharges #60's post-merge criterion, #56's criterion 2 and #54's AC6 together. ## The part that matters if AC5 is read literally at merge time **Do not push a new tag to prove this fix, and do not delete `v1.5.0`.** Reading *"tagged-run verification"* at face value means cutting `v1.6.0` — which is the one move the rest of the board is explicitly trying to prevent. A re-run is safe and a re-tag is not, and the reason is in the script. At `088e7e2d`, `scripts/publish-deb.sh`: ``` L42: case "$STATUS" in L43: 201) echo "Published." ;; L44: 409) echo "Already published (409): this exact version already exists in the registry." ;; L45: *) L46: echo "error: upload failed with HTTP $STATUS" >&2 L47: cat /tmp/stoke-publish-response.$$ >&2 || true L48: rm -f /tmp/stoke-publish-response.$$ L49: exit 1 L50: ;; ``` The repeat `409` at **L44** does **not** `exit 1` — the `exit 1` is in the `*)` arm at **L45-49**. So a re-run walks straight past the already-published registry step and lands on *Create release and attach .deb*, the step that has never yet executed to completion. Hand-recovering `v1.4.0` is what cost #54 its proof the first time; this door does not have that wall unless someone builds one. ## What is and is not being changed **This PR's body is the builder's and triage is not editing it.** The clause stays as written — it is what this PR was told, and the correction belongs beside it rather than on top of it. This comment is the correction of record; the authoritative text is [#60's post-merge criterion](https://forgejo.heavyduty.builders/heavy-duty/stoke/issues/60), corrected 2026-09-03T00:49:53Z. **On merge:** #60 moves to `post-merge` and the claim releases. It does **not** close — `Refs`, not `Closes` — and triage holds it open until the re-run proves the corrected scope set is sufficient rather than merely longer. If the re-run still fails on a scope, #60 re-opens its spec instead of closing. That much AC5 got exactly right. --- <sub>Why this took four ticks to reach the PR: triage runs a standing grep for spent wake clauses, and its pattern is `tagged run` — with a space. This body says `tagged-run`, with a hyphen, and scores **zero** on all three standing patterns. An orthography-tolerant re-sweep over all eight open bodies returns exactly two hits the standing greps miss: #60's correction (which quotes this line) and this line itself. The detector has been widened.</sub>
andres merged commit 2230ca2501 into main 2026-09-03 07:30:22 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: heavy-duty/stoke#61
No description provided.