ci: use shared Forgejo review writer #7

Merged
jercik merged 4 commits from chore/public-shared-review-writer-canary into main 2026-08-02 10:36:40 +00:00
Owner

Installs the public shared review-writer action as the public production canary.

The generated posting workflow pins the action to immutable merge commit ac19a5f2f8009f178b572faab54d66087e4607a0, removes all fourteen retired local writer files, and removes only the stale Knip writer entry.

This installation PR cannot exercise its own pull_request_target base workflow. After merge, a separate harmless follow-up PR will validate cold and warm shared-action resolution.

Installs the public shared review-writer action as the public production canary. The generated posting workflow pins the action to immutable merge commit ac19a5f2f8009f178b572faab54d66087e4607a0, removes all fourteen retired local writer files, and removes only the stale Knip writer entry. This installation PR cannot exercise its own pull_request_target base workflow. After merge, a separate harmless follow-up PR will validate cold and warm shared-action resolution.
ci: use shared Forgejo review writer
All checks were successful
commit-msg / commitlint (pull_request) Successful in 28s
Checks / quality-checks (26.5.0) (pull_request) Successful in 1m0s
Checks / quality-checks (24.15.0) (pull_request) Successful in 1m0s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m36s
PR Review / forgejo-review-approach-3 generator (pull_request_target) Successful in 1m53s
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Successful in 2m55s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Successful in 3m14s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 5m13s
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Successful in 6m12s
PR Review / Dispatch and observe exact review writers (pull_request_target) Successful in 7m8s
249476651b
forgejo-actions left a comment

Approach review: The approach looks good. This PR is a clean deletion-and-replacement migration: it removes the 14-file local .forgejo/actions/post-review/ implementation and substitutes a single URL-pinned reference to the shared forgejo-review-writer action. The chosen design is the correct, idiomatic way to consume a shared composite action across Forgejo repositories.

The immutable 40-character commit SHA pin (ac19a5f2…07a0) is preferable to a tag pin for security-critical CI: a mutable tag could be re-pointed, whereas the SHA is fixed for the lifetime of the action. The now-redundant actions/checkout step is correctly removed (the action is no longer local), while actions/setup-node is retained because the remote action executes its TypeScript at runtime. The with: block passes all nine inputs that the deleted action.yml declared, preserving the existing contract, and knip.json drops only the now-defunct local entry while keeping the workflow glob.

No materially better alternative exists — the migration is already in its minimal, safe form.

Approach review by Approach Review 3 (OpenCode Wafer) (GLM-5.2)

**Approach review:** The approach looks good. This PR is a clean deletion-and-replacement migration: it removes the 14-file local `.forgejo/actions/post-review/` implementation and substitutes a single URL-pinned reference to the shared `forgejo-review-writer` action. The chosen design is the correct, idiomatic way to consume a shared composite action across Forgejo repositories. The immutable 40-character commit SHA pin (`ac19a5f2…07a0`) is preferable to a tag pin for security-critical CI: a mutable tag could be re-pointed, whereas the SHA is fixed for the lifetime of the action. The now-redundant `actions/checkout` step is correctly removed (the action is no longer local), while `actions/setup-node` is retained because the remote action executes its TypeScript at runtime. The `with:` block passes all nine inputs that the deleted `action.yml` declared, preserving the existing contract, and `knip.json` drops only the now-defunct local entry while keeping the workflow glob. No materially better alternative exists — the migration is already in its minimal, safe form. _Approach review by Approach Review 3 (OpenCode Wafer) (GLM-5.2)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiIyNDk0NzY2NTFiYjVhNmE0YjM3YjMxNDJjMTZlZTIyNDMwYjJmNzM2Iiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWFwcHJvYWNoLTMiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMTI5ODUiLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiZjcwMmFiYTctYWU5ZC00NDgyLTg0ZDktZmY3ODZlOGUzMjIwIn0= -->
forgejo-actions left a comment

Approach review: The approach is sound. Replacing the vendored composite action with the shared writer is a straightforward lift-and-shift: the nine with: inputs match the deleted action.yml one-for-one, the full-URL uses: form already has precedent in this repo (https://data.forgejo.org/forgejo/{upload,download}-artifact@v4), and the action is pinned to an immutable commit rather than a movable tag — the right mitigation for a step that runs with github.token and OIDC on main. Dropping the checkout follows correctly since nothing in the job reads the repository any more, and the removal is clean: no tsconfig/package.json/workspace references survive, and the only leftover is the now-empty .forgejo/actions/** glob in knip.json, which is harmless and keeps future local actions covered.

One maintenance coupling is worth a thought (inline). Separately, timeout-minutes: 3 is unchanged and its comment now omits checkout, but the job gained a cold clone of the action repository in its place — the follow-up validation PR described in the description is the natural place to confirm the budget still holds on a cold resolve.

Approach review by Claude Code Opus (opus)

**Approach review:** The approach is sound. Replacing the vendored composite action with the shared writer is a straightforward lift-and-shift: the nine `with:` inputs match the deleted `action.yml` one-for-one, the full-URL `uses:` form already has precedent in this repo (`https://data.forgejo.org/forgejo/{upload,download}-artifact@v4`), and the action is pinned to an immutable commit rather than a movable tag — the right mitigation for a step that runs with `github.token` and OIDC on `main`. Dropping the checkout follows correctly since nothing in the job reads the repository any more, and the removal is clean: no `tsconfig`/`package.json`/workspace references survive, and the only leftover is the now-empty `.forgejo/actions/**` glob in `knip.json`, which is harmless and keeps future local actions covered. One maintenance coupling is worth a thought (inline). Separately, `timeout-minutes: 3` is unchanged and its comment now omits checkout, but the job gained a cold clone of the action repository in its place — the follow-up validation PR described in the description is the natural place to confirm the budget still holds on a cold resolve. _Approach review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiIyNDk0NzY2NTFiYjVhNmE0YjM3YjMxNDJjMTZlZTIyNDMwYjJmNzM2Iiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWFwcHJvYWNoLXNtYXJ0LTIiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMTI5ODUiLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiOTYxYTcxNGUtNTA2YS00YjBkLTk5MzItZWQyMmFhOWFlMzFjIn0= -->
@ -62,3 +55,3 @@
- name: Post exact finalized review
uses: ./.forgejo/actions/post-review
uses: https://code.j4k.dev/j4k-oss/forgejo-review-writer@ac19a5f2f8009f178b572faab54d66087e4607a0

The consumer workflow still pins the runtime (actions/setup-node@v6, 26.5.0) that the shared action depends on. That was coherent when post-review.ts lived in this repo, but the Node requirement is now an implementation detail of forgejo-review-writer (native TS execution needs 22.18+/24+), and nothing links the two pins: bumping the action's SHA in each installed repo can silently pair it with a Node version it no longer expects, and any future runtime change means editing every consumer workflow in lockstep.

Worth considering for the shared action instead: either declare it as a JS action (runs: using: node24) so it runs on the runner's bundled runtime, or keep it composite and let it run its own actions/setup-node step. Consumers would then reduce to the single uses: line, and the runtime requirement would travel with the pinned SHA. Not blocking for the canary — it works as written — but it is cheaper to settle before the action is installed across more repositories.

The consumer workflow still pins the runtime (`actions/setup-node@v6`, `26.5.0`) that the shared action depends on. That was coherent when `post-review.ts` lived in this repo, but the Node requirement is now an implementation detail of `forgejo-review-writer` (native TS execution needs 22.18+/24+), and nothing links the two pins: bumping the action's SHA in each installed repo can silently pair it with a Node version it no longer expects, and any future runtime change means editing every consumer workflow in lockstep. Worth considering for the shared action instead: either declare it as a JS action (`runs: using: node24`) so it runs on the runner's bundled runtime, or keep it composite and let it run its own `actions/setup-node` step. Consumers would then reduce to the single `uses:` line, and the runtime requirement would travel with the pinned SHA. Not blocking for the canary — it works as written — but it is cheaper to settle before the action is installed across more repositories.
Author
Owner

This is an approach alternative with two materially different designs (JS node24 action versus composite-owned setup-node). It requires user direction before any change; awaiting that decision.

<!-- gh-feedback:reply-to:34169 --> This is an approach alternative with two materially different designs (JS node24 action versus composite-owned setup-node). It requires user direction before any change; awaiting that decision.
forgejo-actions left a comment

Approach review: The shared-action migration is the materially simpler maintenance model: the workflow preserves the existing input contract, pins the shared action to an immutable commit, and removes the now-redundant local implementation and Knip entry. No clearly better approach is evident.

Approach review by Codex GPT-5.6 SOL (gpt-5.6-sol)

**Approach review:** The shared-action migration is the materially simpler maintenance model: the workflow preserves the existing input contract, pins the shared action to an immutable commit, and removes the now-redundant local implementation and Knip entry. No clearly better approach is evident. _Approach review by Codex GPT-5.6 SOL (gpt-5.6-sol)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiIyNDk0NzY2NTFiYjVhNmE0YjM3YjMxNDJjMTZlZTIyNDMwYjJmNzM2Iiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWFwcHJvYWNoLXNtYXJ0LTEiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMTI5ODUiLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiMGU1MjMxMjItMWE5YS00NWQwLWEwNmMtYTdiYzIxODcwNmMxIn0= -->
forgejo-actions left a comment

Summary: No actionable defects found. One informational note.

I verified the migration is behavior-preserving rather than taking it on faith:

  • Input contract matches. The pinned shared action's action.yml at ac19a5f2 is byte-identical to the deleted .forgejo/actions/post-review/action.yml, including all nine input names and the node "${{ github.action_path }}/post-review.ts" composite step, so every with: key in the workflow still resolves.
  • Writer logic matches. Fetching all writer sources at the pinned SHA and diffing them against HEAD^:.forgejo/actions/post-review/*: post-review.ts, -capability, -comments, -diff, -envelope, -http, -pending, -pr, -receipt, -result are identical. forgejo-post-review-common.ts differs only by an added explanatory comment — the pinned AXRECIPE_URL/AXRECIPE_AUDIENCE constants enforced by pinnedEnvironment() are unchanged, so the anti-OIDC-redirect control survives. package.json gains only devDependencies (still "type": "module", no runtime deps), and tsconfig.json only widens include for tests. Nothing the action needs at runtime requires an install.
  • Dropping the checkout is safe. The writer reaches the diff, PR state, and reviews purely over the Forgejo API; nothing in it reads the working tree. Neither remaining step (actions/setup-node, the composite action, which runs from github.action_path) needs repo contents.
  • Pin resolves. ac19a5f2f8009f178b572faab54d66087e4607a0 is the current tip of main in the public j4k-oss/forgejo-review-writer repo and is anonymously readable, so the runner's action fetch can resolve it cold; it stays reachable from main as later commits land.
  • No dangling references. No workflow, config, or doc still points at ./.forgejo/actions/post-review, and pr-review.yml's dispatch assertion (info.jobs[0] !== "post-review") still matches the retained job id.

Code review by Claude Code Opus (opus)

**Summary:** No actionable defects found. One informational note. I verified the migration is behavior-preserving rather than taking it on faith: - **Input contract matches.** The pinned shared action's `action.yml` at `ac19a5f2` is byte-identical to the deleted `.forgejo/actions/post-review/action.yml`, including all nine input names and the `node "${{ github.action_path }}/post-review.ts"` composite step, so every `with:` key in the workflow still resolves. - **Writer logic matches.** Fetching all writer sources at the pinned SHA and diffing them against `HEAD^:.forgejo/actions/post-review/*`: `post-review.ts`, `-capability`, `-comments`, `-diff`, `-envelope`, `-http`, `-pending`, `-pr`, `-receipt`, `-result` are identical. `forgejo-post-review-common.ts` differs only by an added explanatory comment — the pinned `AXRECIPE_URL`/`AXRECIPE_AUDIENCE` constants enforced by `pinnedEnvironment()` are unchanged, so the anti-OIDC-redirect control survives. `package.json` gains only devDependencies (still `"type": "module"`, no runtime deps), and `tsconfig.json` only widens `include` for tests. Nothing the action needs at runtime requires an install. - **Dropping the checkout is safe.** The writer reaches the diff, PR state, and reviews purely over the Forgejo API; nothing in it reads the working tree. Neither remaining step (`actions/setup-node`, the composite action, which runs from `github.action_path`) needs repo contents. - **Pin resolves.** `ac19a5f2f8009f178b572faab54d66087e4607a0` is the current tip of `main` in the public `j4k-oss/forgejo-review-writer` repo and is anonymously readable, so the runner's action fetch can resolve it cold; it stays reachable from `main` as later commits land. - **No dangling references.** No workflow, config, or doc still points at `./.forgejo/actions/post-review`, and `pr-review.yml`'s dispatch assertion (`info.jobs[0] !== "post-review"`) still matches the retained job id. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiIyNDk0NzY2NTFiYjVhNmE0YjM3YjMxNDJjMTZlZTIyNDMwYjJmNzM2Iiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWNvZGUtc21hcnQtMSIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMjk4NSIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiJlNGZkYjUxZS1lY2E5LTQ5Y2UtOTZkOS0yNWMwZjZkNzM0YTcifQ== -->
knip.json Outdated
@ -6,3 +6,2 @@
"github-actions": {
"config": [".forgejo/workflows/*.{yml,yaml}", ".forgejo/actions/**/action.{yml,yaml}"],
"entry": [".forgejo/actions/post-review/post-review.ts"]
"config": [".forgejo/workflows/*.{yml,yaml}", ".forgejo/actions/**/action.{yml,yaml}"]

ℹ️ Info: .forgejo/actions/**/action.{yml,yaml} now matches nothing — this PR deletes the entire .forgejo/actions/ tree. It is harmless (this repo runs plain knip, not --treat-config-hints-as-errors like the writer repo does), so CI is unaffected; worth dropping only if you don't expect to add a local action back.

ℹ️ **Info:** `.forgejo/actions/**/action.{yml,yaml}` now matches nothing — this PR deletes the entire `.forgejo/actions/` tree. It is harmless (this repo runs plain `knip`, not `--treat-config-hints-as-errors` like the writer repo does), so CI is unaffected; worth dropping only if you don't expect to add a local action back.
Author
Owner

Fixed in 3d4280b: removed the stale local-action config glob.

<!-- gh-feedback:reply-to:34213 --> Fixed in 3d4280b: removed the stale local-action config glob.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: No correctness or security defects found; 1 low cleanup item and 1 informational note.

I verified the migration end to end against the pinned commit rather than assuming it:

  • Fetched code.j4k.dev/j4k-oss/forgejo-review-writer at ac19a5f2f8009f178b572faab54d66087e4607a0. It is the current default-branch tip and its action.yml is byte-identical to the deleted .forgejo/actions/post-review/action.yml, so all nine input names (axrecipe-urlsource-generator-attempt) and the node "${{ github.action_path }}/post-review.ts" invocation still line up with the with: block.
  • Diffed all thirteen removed writer sources against the shared repo at that commit: post-review.ts and every forgejo-post-review-*.ts are identical except one added comment in forgejo-post-review-common.ts; only package.json/tsconfig.json differ, and the shared package.json keeps "type": "module", which is what the type-stripped ESM entry needs. The pinned AXRECIPE_URL/AXRECIPE_AUDIENCE constants are unchanged, so vars.AXRECIPE_URL still has to match the compiled value or the writer fails closed.
  • All runtime imports in the shared action are node: builtins or relative ./*.ts, so dropping the checkout without adding an install step is safe; actions/setup-node@v6 with an explicit node-version needs no workspace either, and no other step in the job touched the repo tree.
  • Cross-checked integration points: pr-review.yml still dispatches job id post-review (asserted at pr-review.yml:3406), and its slot allowlist (pr-review.yml:351 and repeats) matches the writer's REVIEW_SLOTS set exactly. forgejo-review-tools is an artifact name, not a slot, so it is correctly absent from the writer allowlist.
  • Grepped the tree: no remaining reference to .forgejo/actions/post-review anywhere (no tsconfig, oxfmt, oxlint, pnpm-workspace, or docs reference), so the fourteen deletions leave nothing dangling.

Code review by Claude Code Opus (opus)

**Summary:** No correctness or security defects found; 1 low cleanup item and 1 informational note. I verified the migration end to end against the pinned commit rather than assuming it: - Fetched `code.j4k.dev/j4k-oss/forgejo-review-writer` at `ac19a5f2f8009f178b572faab54d66087e4607a0`. It is the current default-branch tip and its `action.yml` is byte-identical to the deleted `.forgejo/actions/post-review/action.yml`, so all nine input names (`axrecipe-url` … `source-generator-attempt`) and the `node "${{ github.action_path }}/post-review.ts"` invocation still line up with the `with:` block. - Diffed all thirteen removed writer sources against the shared repo at that commit: `post-review.ts` and every `forgejo-post-review-*.ts` are identical except one added comment in `forgejo-post-review-common.ts`; only `package.json`/`tsconfig.json` differ, and the shared `package.json` keeps `"type": "module"`, which is what the type-stripped ESM entry needs. The pinned `AXRECIPE_URL`/`AXRECIPE_AUDIENCE` constants are unchanged, so `vars.AXRECIPE_URL` still has to match the compiled value or the writer fails closed. - All runtime imports in the shared action are `node:` builtins or relative `./*.ts`, so dropping the checkout without adding an install step is safe; `actions/setup-node@v6` with an explicit `node-version` needs no workspace either, and no other step in the job touched the repo tree. - Cross-checked integration points: `pr-review.yml` still dispatches job id `post-review` (asserted at `pr-review.yml:3406`), and its slot allowlist (`pr-review.yml:351` and repeats) matches the writer's `REVIEW_SLOTS` set exactly. `forgejo-review-tools` is an artifact name, not a slot, so it is correctly absent from the writer allowlist. - Grepped the tree: no remaining reference to `.forgejo/actions/post-review` anywhere (no tsconfig, oxfmt, oxlint, pnpm-workspace, or docs reference), so the fourteen deletions leave nothing dangling. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiIyNDk0NzY2NTFiYjVhNmE0YjM3YjMxNDJjMTZlZTIyNDMwYjJmNzM2Iiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWNvZGUtc21hcnQtMiIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMjk4NSIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiI3YjZlYjcxOS0wODg0LTQxZDEtYTFlZi02OTRhMGFlMWJmMWUifQ== -->
@ -62,3 +55,3 @@
- name: Post exact finalized review
uses: ./.forgejo/actions/post-review
uses: https://code.j4k.dev/j4k-oss/forgejo-review-writer@ac19a5f2f8009f178b572faab54d66087e4607a0

ℹ️ Info: Verified the pin resolves: ac19a5f2f8009f178b572faab54d66087e4607a0 is the default-branch tip of the public j4k-oss/forgejo-review-writer repo and its action.yml is byte-identical to the local one this PR deletes, so the nine with: inputs below all match.

Worth recording for future bumps: this job passes github.token and, via workflow-level enable-openid-connect: true, exposes ACTIONS_ID_TOKEN_REQUEST_* to the action's steps. The full-SHA pin is the only thing keeping that code immutable now that it lives outside this repo — a later change to a tag or branch would silently hand review-write and OIDC-minting capability to whatever that ref points at. A side effect of the move is that the writer sources no longer pass through this repo's pnpm lint/format:check/knip; that coverage now depends entirely on the shared repo's own CI.

ℹ️ **Info:** Verified the pin resolves: `ac19a5f2f8009f178b572faab54d66087e4607a0` is the default-branch tip of the public `j4k-oss/forgejo-review-writer` repo and its `action.yml` is byte-identical to the local one this PR deletes, so the nine `with:` inputs below all match. Worth recording for future bumps: this job passes `github.token` and, via workflow-level `enable-openid-connect: true`, exposes `ACTIONS_ID_TOKEN_REQUEST_*` to the action's steps. The full-SHA pin is the only thing keeping that code immutable now that it lives outside this repo — a later change to a tag or branch would silently hand review-write and OIDC-minting capability to whatever that ref points at. A side effect of the move is that the writer sources no longer pass through this repo's `pnpm lint`/`format:check`/`knip`; that coverage now depends entirely on the shared repo's own CI.
jercik marked this conversation as resolved
knip.json Outdated
@ -6,3 +6,2 @@
"github-actions": {
"config": [".forgejo/workflows/*.{yml,yaml}", ".forgejo/actions/**/action.{yml,yaml}"],
"entry": [".forgejo/actions/post-review/post-review.ts"]
"config": [".forgejo/workflows/*.{yml,yaml}", ".forgejo/actions/**/action.{yml,yaml}"]

🟢 Low: With .forgejo/actions/ fully deleted, the second glob .forgejo/actions/**/action.{yml,yaml} now matches nothing and can be dropped alongside the entry line this PR removed, leaving "config": [".forgejo/workflows/*.{yml,yaml}"].

No functional impact: I ran knip@6 against this config and it reports no configuration hint for the unmatched pattern, so pnpm knip in checks.yml is unaffected either way — this is just the last stale writer reference left behind.

🟢 **Low:** With `.forgejo/actions/` fully deleted, the second glob `.forgejo/actions/**/action.{yml,yaml}` now matches nothing and can be dropped alongside the `entry` line this PR removed, leaving `"config": [".forgejo/workflows/*.{yml,yaml}"]`. No functional impact: I ran `knip@6` against this config and it reports no configuration hint for the unmatched pattern, so `pnpm knip` in `checks.yml` is unaffected either way — this is just the last stale writer reference left behind.
Author
Owner

Fixed in 3d4280b: removed the stale local-action config glob.

<!-- gh-feedback:reply-to:34229 --> Fixed in 3d4280b: removed the stale local-action config glob.
jercik marked this conversation as resolved
chore: remove stale local-action Knip glob
All checks were successful
commit-msg / commitlint (pull_request) Successful in 21s
Checks / quality-checks (24.15.0) (pull_request) Successful in 59s
Checks / quality-checks (26.5.0) (pull_request) Successful in 59s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 3m2s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 6m42s
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Successful in 8m16s
PR Review / Dispatch and observe exact review writers (pull_request_target) Successful in 8m44s
3d4280bd1d
Author
Owner

Replying to review #8404

Approach looks good.

> Replying to review #8404 Approach looks good.
Author
Owner

Replying to review #8411

Approach looks good.

> Replying to review #8411 Approach looks good.
Author
Owner

Replying to review #8409

Awaiting user direction on the inline runtime-ownership alternative.

> Replying to review #8409 Awaiting user direction on the inline runtime-ownership alternative.
forgejo-actions left a comment

Summary: Verified the installation end-to-end; found 1 low-severity documentation issue and 1 informational note.

Verification performed against the pinned ref:

  • j4k-oss/forgejo-review-writer is publicly readable and ac19a5f2f8009f178b572faab54d66087e4607a0 exists and is the current head of main (repo has no tags), so the SHA pin resolves and is immutable.
  • The pinned action.yml declares exactly the nine inputs the workflow passes — axrecipe-url, axrecipe-audience, forgejo-token, review-slot, review-repository, review-number, review-head-sha, source-workflow-run-id, source-generator-attempt — with no new or dropped input, and is byte-identical to the deleted local action.yml.
  • All twelve deleted .ts sources are byte-identical to their counterparts at the pinned commit except forgejo-post-review-common.ts, which differs only by an added two-line comment above the AXRECIPE_URL/AXRECIPE_AUDIENCE constants. The pinnedEnvironment checks still reject any vars.AXRECIPE_* value that does not match the compiled constants, so the OIDC-redirect guard is preserved.
  • The shared action is dependency-free (only node: builtins and relative .ts imports) and touches no filesystem or subprocess: no node:fs, no child_process, no GITHUB_WORKSPACE read. The PR diff is fetched over the Forgejo API, not from a work tree. Dropping actions/checkout is therefore safe, and actions/setup-node@v6 needs no lockfile because cache is not set.
  • No dangling references to .forgejo/actions/post-review remain in workflows, knip.json, tsconfigs, .oxfmtrc.json, fta.json, or the hooks. The deleted action package.json was not a pnpm workspace member (pnpm-workspace.yaml declares no packages), so pnpm install --frozen-lockfile is unaffected.
  • The REVIEW_SLOTS allowlist at the pinned commit matches the five slot names the generator workflow dispatches.

Code review by Claude Code Opus (opus)

**Summary:** Verified the installation end-to-end; found 1 low-severity documentation issue and 1 informational note. Verification performed against the pinned ref: - `j4k-oss/forgejo-review-writer` is publicly readable and `ac19a5f2f8009f178b572faab54d66087e4607a0` exists and is the current head of `main` (repo has no tags), so the SHA pin resolves and is immutable. - The pinned `action.yml` declares exactly the nine inputs the workflow passes — `axrecipe-url`, `axrecipe-audience`, `forgejo-token`, `review-slot`, `review-repository`, `review-number`, `review-head-sha`, `source-workflow-run-id`, `source-generator-attempt` — with no new or dropped input, and is byte-identical to the deleted local `action.yml`. - All twelve deleted `.ts` sources are byte-identical to their counterparts at the pinned commit except `forgejo-post-review-common.ts`, which differs only by an added two-line comment above the `AXRECIPE_URL`/`AXRECIPE_AUDIENCE` constants. The `pinnedEnvironment` checks still reject any `vars.AXRECIPE_*` value that does not match the compiled constants, so the OIDC-redirect guard is preserved. - The shared action is dependency-free (only `node:` builtins and relative `.ts` imports) and touches no filesystem or subprocess: no `node:fs`, no `child_process`, no `GITHUB_WORKSPACE` read. The PR diff is fetched over the Forgejo API, not from a work tree. Dropping `actions/checkout` is therefore safe, and `actions/setup-node@v6` needs no lockfile because `cache` is not set. - No dangling references to `.forgejo/actions/post-review` remain in workflows, `knip.json`, tsconfigs, `.oxfmtrc.json`, `fta.json`, or the hooks. The deleted action `package.json` was not a pnpm workspace member (`pnpm-workspace.yaml` declares no `packages`), so `pnpm install --frozen-lockfile` is unaffected. - The `REVIEW_SLOTS` allowlist at the pinned commit matches the five slot names the generator workflow dispatches. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiIzZDQyODBiZDFkODE1ZjBhNDA4MTFiMGEzMWU4NWYxYmM4YmY4NmVhIiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWNvZGUtc21hcnQtMSIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMzAzNiIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiI0Yjc2ODUyOS01ZDk4LTRiYTUtODc4MS1kOWNhNjI0ZWI5ZjcifQ== -->
@ -45,3 +45,1 @@
# This job includes checkout, a cold Node setup, and Forgejo/Axrecipe API
# calls. Its timeout caps scheduled execution but excludes runner queue
# time; the writer independently rejects results past Axrecipe's expiry.
# This job includes a cold Node setup and Forgejo/Axrecipe API calls. Its

🟢 Low: This comment enumerates what the 3-minute budget has to cover, and the edit drops checkout without adding the step that replaced it. The job now fetches and resolves a remote action from code.j4k.dev before the composite step runs — a network cost that did not exist when the action came from the workspace, and the one the PR body itself flags for cold/warm validation. As written the comment understates the budget's contents for the next person tuning timeout-minutes.

Suggested wording: This job includes a cold Node setup, a cold shared-action fetch, and Forgejo/Axrecipe API calls.

🟢 **Low:** This comment enumerates what the 3-minute budget has to cover, and the edit drops `checkout` without adding the step that replaced it. The job now fetches and resolves a remote action from `code.j4k.dev` before the composite step runs — a network cost that did not exist when the action came from the workspace, and the one the PR body itself flags for cold/warm validation. As written the comment understates the budget's contents for the next person tuning `timeout-minutes`. Suggested wording: `This job includes a cold Node setup, a cold shared-action fetch, and Forgejo/Axrecipe API calls.`
Author
Owner

Fixed in 84deaca: documented the cold shared-action fetch in the timeout budget.

<!-- gh-feedback:reply-to:34338 --> Fixed in 84deaca: documented the cold shared-action fetch in the timeout budget.
jercik marked this conversation as resolved
@ -62,3 +55,3 @@
- name: Post exact finalized review
uses: ./.forgejo/actions/post-review
uses: https://code.j4k.dev/j4k-oss/forgejo-review-writer@ac19a5f2f8009f178b572faab54d66087e4607a0

ℹ️ Info: No action needed — recording what I verified about this pin, since it moves privileged code (task token plus OIDC minting) out of the repo.

The commit resolves, is the current head of main, and the repo carries no tags. A commit SHA cannot be repointed the way a tag can, so the pin is sound; the only way it stops resolving is a history rewrite that GCs the object, which fails the job closed rather than silently running different code. The action's action.yml and all twelve TypeScript modules at this SHA are byte-identical to the files deleted here, apart from a two-line explanatory comment in forgejo-post-review-common.ts, so this installation is behaviour-preserving.

ℹ️ **Info:** No action needed — recording what I verified about this pin, since it moves privileged code (task token plus OIDC minting) out of the repo. The commit resolves, is the current head of `main`, and the repo carries no tags. A commit SHA cannot be repointed the way a tag can, so the pin is sound; the only way it stops resolving is a history rewrite that GCs the object, which fails the job closed rather than silently running different code. The action's `action.yml` and all twelve TypeScript modules at this SHA are byte-identical to the files deleted here, apart from a two-line explanatory comment in `forgejo-post-review-common.ts`, so this installation is behaviour-preserving.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: No actionable issues found.

What I checked on the changed files:

  • Behavioral parity of the swap. I fetched https://code.j4k.dev/j4k-oss/forgejo-review-writer at the pinned commit ac19a5f2f8009f178b572faab54d66087e4607a0 and diffed all fourteen files against the deleted local copies (git show 2494766^:...). Every runtime file is byte-identical, including action.yml. The only differences are a comment above the AXRECIPE_URL/AXRECIPE_AUDIENCE constants, the action repo's own package.json metadata/devDeps, and tsconfig.json adding test/**/*.ts to include — none reachable at run time.
  • Input interface. All nine with: keys in pr-review-post.yml match the shared action.yml inputs exactly; no input added, renamed, or dropped.
  • OIDC redirect guard survives. The removed local writer pinned the workflow-supplied vars.AXRECIPE_URL/AXRECIPE_AUDIENCE against compiled-in constants so a repository-scoped Actions variable could not redirect a live OIDC JWT. The shared action at this commit keeps pinnedEnvironment("AXRECIPE_URL", AXRECIPE_URL) with the same https://recipe.axkit.dev constants, so passing vars.* remains safe. The action is pinned to a 40-hex immutable commit rather than a mutable tag.
  • Dropping actions/checkout. The writer reads only the Forgejo and Axrecipe APIs — it never touched the workspace, and github.action_path resolves inside the runner's action download for a remote action. observe-review-writers in pr-review.yml is an existing checkout-free setup-node job in this same pipeline, so the pattern is already exercised here. actions/setup-node@v6's package-manager-cache default only auto-enables for an npm packageManager field, so the now-absent package.json/lockfile causes no cache lookup or failure.
  • No dangling references. Nothing else in the tree references .forgejo/actions/ (release.yml only reuses ./.forgejo/workflows/checks.yml), and the knip.json edit removes exactly the two entries whose targets were deleted while keeping the workflow glob. pr-review.yml's dispatch assertion still matches the single post-review job name.

One thing I could not verify from here, consistent with the PR body's own canary plan: whether the runner resolves a uses: URL pinned to a commit SHA on cold and warm fetches. I did not assert a limitation because I had no way to test it.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found. What I checked on the changed files: - **Behavioral parity of the swap.** I fetched `https://code.j4k.dev/j4k-oss/forgejo-review-writer` at the pinned commit `ac19a5f2f8009f178b572faab54d66087e4607a0` and diffed all fourteen files against the deleted local copies (`git show 2494766^:...`). Every runtime file is byte-identical, including `action.yml`. The only differences are a comment above the `AXRECIPE_URL`/`AXRECIPE_AUDIENCE` constants, the action repo's own `package.json` metadata/devDeps, and `tsconfig.json` adding `test/**/*.ts` to `include` — none reachable at run time. - **Input interface.** All nine `with:` keys in `pr-review-post.yml` match the shared `action.yml` inputs exactly; no input added, renamed, or dropped. - **OIDC redirect guard survives.** The removed local writer pinned the workflow-supplied `vars.AXRECIPE_URL`/`AXRECIPE_AUDIENCE` against compiled-in constants so a repository-scoped Actions variable could not redirect a live OIDC JWT. The shared action at this commit keeps `pinnedEnvironment("AXRECIPE_URL", AXRECIPE_URL)` with the same `https://recipe.axkit.dev` constants, so passing `vars.*` remains safe. The action is pinned to a 40-hex immutable commit rather than a mutable tag. - **Dropping `actions/checkout`.** The writer reads only the Forgejo and Axrecipe APIs — it never touched the workspace, and `github.action_path` resolves inside the runner's action download for a remote action. `observe-review-writers` in `pr-review.yml` is an existing checkout-free `setup-node` job in this same pipeline, so the pattern is already exercised here. `actions/setup-node@v6`'s `package-manager-cache` default only auto-enables for an npm `packageManager` field, so the now-absent `package.json`/lockfile causes no cache lookup or failure. - **No dangling references.** Nothing else in the tree references `.forgejo/actions/` (`release.yml` only reuses `./.forgejo/workflows/checks.yml`), and the `knip.json` edit removes exactly the two entries whose targets were deleted while keeping the workflow glob. `pr-review.yml`'s dispatch assertion still matches the single `post-review` job name. One thing I could not verify from here, consistent with the PR body's own canary plan: whether the runner resolves a `uses:` URL pinned to a commit SHA on cold and warm fetches. I did not assert a limitation because I had no way to test it. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiIzZDQyODBiZDFkODE1ZjBhNDA4MTFiMGEzMWU4NWYxYmM4YmY4NmVhIiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWNvZGUtc21hcnQtMiIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMzAzNiIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiJhNzRhOWIxNS02Yjc3LTRiMzYtYTEwZi1iMGYxMjgxYWE2YTMifQ== -->
docs: describe shared action cold fetch
All checks were successful
commit-msg / commitlint (pull_request) Successful in 18s
Checks / quality-checks (26.5.0) (pull_request) Successful in 1m21s
Checks / quality-checks (24.15.0) (pull_request) Successful in 1m21s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m33s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 4m34s
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Successful in 5m41s
PR Review / Dispatch and observe exact review writers (pull_request_target) Successful in 6m1s
84deaca241
forgejo-actions left a comment

Summary: No actionable issues found.

Verified the swap from the in-repo composite action to the pinned shared writer:

  • Input contract matches. The pinned action.yml at ac19a5f2 declares exactly the same nine required inputs (axrecipe-url, axrecipe-audience, forgejo-token, review-slot, review-repository, review-number, review-head-sha, source-workflow-run-id, source-generator-attempt) and the same node "${{ github.action_path }}/post-review.ts" entry point, so every with: key in the workflow still binds.
  • Runtime code is byte-identical. Diffing all thirteen removed sources against the pinned commit shows only a comment added to forgejo-post-review-common.ts and test-only changes to package.json/tsconfig.json. REVIEW_SLOTS, the pinnedEnvironment checks on AXRECIPE_URL/AXRECIPE_AUDIENCE, and the trusted-head/capability logic are unchanged, so no behavioral regression. The slot allowlist still covers every slot pr-review.yml dispatches.
  • Dropping the checkout is safe. The action imports only node:process and its siblings; it never touches node:fs, process.cwd(), or GITHUB_WORKSPACE, and it resolves its own files through github.action_path. Nothing else in the reduced job needs a working tree, and actions/setup-node runs with an explicit node-version and no cache, so it needs no lockfile.
  • Pin is sound. ac19a5f2f8009f178b572faab54d66087e4607a0 is the current head of main in the public j4k-oss/forgejo-review-writer repo, and pinning by SHA is immutable. Full-URL uses: already has precedent in pr-review.yml (https://data.forgejo.org/forgejo/...), so runner resolution is exercised.
  • No stale references. Nothing outside the deleted tree pointed at .forgejo/actions/** — no tsconfig include, vitest glob, oxlint/oxfmt path, or other workflow. pr-review.yml's dispatch validation asserts the job id post-review, which the workflow still uses. The knip.json trim removes exactly the now-dangling entry and action-config glob while leaving the workflow glob intact.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found. Verified the swap from the in-repo composite action to the pinned shared writer: - **Input contract matches.** The pinned `action.yml` at `ac19a5f2` declares exactly the same nine required inputs (`axrecipe-url`, `axrecipe-audience`, `forgejo-token`, `review-slot`, `review-repository`, `review-number`, `review-head-sha`, `source-workflow-run-id`, `source-generator-attempt`) and the same `node "${{ github.action_path }}/post-review.ts"` entry point, so every `with:` key in the workflow still binds. - **Runtime code is byte-identical.** Diffing all thirteen removed sources against the pinned commit shows only a comment added to `forgejo-post-review-common.ts` and test-only changes to `package.json`/`tsconfig.json`. `REVIEW_SLOTS`, the `pinnedEnvironment` checks on `AXRECIPE_URL`/`AXRECIPE_AUDIENCE`, and the trusted-head/capability logic are unchanged, so no behavioral regression. The slot allowlist still covers every slot `pr-review.yml` dispatches. - **Dropping the checkout is safe.** The action imports only `node:process` and its siblings; it never touches `node:fs`, `process.cwd()`, or `GITHUB_WORKSPACE`, and it resolves its own files through `github.action_path`. Nothing else in the reduced job needs a working tree, and `actions/setup-node` runs with an explicit `node-version` and no `cache`, so it needs no lockfile. - **Pin is sound.** `ac19a5f2f8009f178b572faab54d66087e4607a0` is the current head of `main` in the public `j4k-oss/forgejo-review-writer` repo, and pinning by SHA is immutable. Full-URL `uses:` already has precedent in `pr-review.yml` (`https://data.forgejo.org/forgejo/...`), so runner resolution is exercised. - **No stale references.** Nothing outside the deleted tree pointed at `.forgejo/actions/**` — no tsconfig include, vitest glob, oxlint/oxfmt path, or other workflow. `pr-review.yml`'s dispatch validation asserts the job id `post-review`, which the workflow still uses. The `knip.json` trim removes exactly the now-dangling `entry` and action-config glob while leaving the workflow glob intact. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiI4NGRlYWNhMjQxMGU1MjRjYWNmMzk0ODUyMDVlY2I2MTdlMDhjZTMyIiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWNvZGUtc21hcnQtMSIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMzA3MSIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiJhMzQxYjY1OS00NDgxLTRjZWYtOGMxZC0yZTllZGM2Y2Y0NzgifQ== -->
forgejo-actions left a comment

Summary: No actionable issues found; 1 informational note.

I verified the migration end to end against the pinned commit:

  • Input contract matches. The pinned action.yml at ac19a5f is byte-identical to the deleted local .forgejo/actions/post-review/action.yml — same nine required inputs, same env mapping, same node "${{ github.action_path }}/post-review.ts" composite step. Every input the workflow still passes is declared.
  • Runtime behavior is unchanged. All thirteen writer sources in the shared repo at that commit are identical to the removed local copies except one added comment in forgejo-post-review-common.ts; the pinned AXRECIPE_URL/AXRECIPE_AUDIENCE constants and the pinnedEnvironment check are intact, and the slot allowlist (forgejo-review-{approach-smart-1,approach-smart-2,approach-3,code-smart-1,code-smart-2}) still matches the five slots pr-review.yml dispatches.
  • Dropping the checkout is safe. The writer reads no filesystem state (no node:fs, no GITHUB_WORKSPACE); it only consumes the nine action inputs plus runner-provided GITHUB_SERVER_URL and the OIDC request env. The old checkout existed solely to materialize the local action. actions/setup-node@v6 is invoked without cache, so it needs no workspace either.
  • Pin form is supported. Forgejo documents both the fully-qualified uses: URL and commit-SHA refs, and recommends SHAs over tags. The referenced repository is public (anonymous read succeeds) and ac19a5f2f8009f178b572faab54d66087e4607a0 is the current tip of its main, so the ref resolves.
  • No stale references remain. Nothing outside the deleted tree referenced .forgejo/actions; the generator's dispatch validation still expects exactly one job named post-review, which is unchanged. The knip.json trim removes only globs whose targets no longer exist, and the root entry/project scopes are untouched.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found; 1 informational note. I verified the migration end to end against the pinned commit: - **Input contract matches.** The pinned `action.yml` at `ac19a5f` is byte-identical to the deleted local `.forgejo/actions/post-review/action.yml` — same nine required inputs, same env mapping, same `node "${{ github.action_path }}/post-review.ts"` composite step. Every input the workflow still passes is declared. - **Runtime behavior is unchanged.** All thirteen writer sources in the shared repo at that commit are identical to the removed local copies except one added comment in `forgejo-post-review-common.ts`; the pinned `AXRECIPE_URL`/`AXRECIPE_AUDIENCE` constants and the `pinnedEnvironment` check are intact, and the slot allowlist (`forgejo-review-{approach-smart-1,approach-smart-2,approach-3,code-smart-1,code-smart-2}`) still matches the five slots `pr-review.yml` dispatches. - **Dropping the checkout is safe.** The writer reads no filesystem state (no `node:fs`, no `GITHUB_WORKSPACE`); it only consumes the nine action inputs plus runner-provided `GITHUB_SERVER_URL` and the OIDC request env. The old checkout existed solely to materialize the local action. `actions/setup-node@v6` is invoked without `cache`, so it needs no workspace either. - **Pin form is supported.** Forgejo documents both the fully-qualified `uses:` URL and commit-SHA refs, and recommends SHAs over tags. The referenced repository is public (anonymous read succeeds) and `ac19a5f2f8009f178b572faab54d66087e4607a0` is the current tip of its `main`, so the ref resolves. - **No stale references remain.** Nothing outside the deleted tree referenced `.forgejo/actions`; the generator's dispatch validation still expects exactly one job named `post-review`, which is unchanged. The `knip.json` trim removes only globs whose targets no longer exist, and the root `entry`/`project` scopes are untouched. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiI4NGRlYWNhMjQxMGU1MjRjYWNmMzk0ODUyMDVlY2I2MTdlMDhjZTMyIiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWNvZGUtc21hcnQtMiIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMzA3MSIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiI5M2I2MmYxMC1kMGQ3LTQ1MDctODZjZC0yM2U2NzZkNzE0MDAifQ== -->
@ -62,3 +56,3 @@
- name: Post exact finalized review
uses: ./.forgejo/actions/post-review
uses: https://code.j4k.dev/j4k-oss/forgejo-review-writer@ac19a5f2f8009f178b572faab54d66087e4607a0

ℹ️ Info: Verified against the pinned commit: the shared action.yml declares exactly the nine inputs passed here, and the writer sources at ac19a5f differ from the deleted local copies only by an added comment — no runtime behavior change. The commit is the current tip of the writer repo's main, so it is reachable today; if that branch is ever rewritten and the commit becomes unreferenced, this step would start failing to fetch. A tag or release ref pointing at the same commit would make the pin durable without weakening it, since the runner still resolves it to the same tree.

ℹ️ **Info:** Verified against the pinned commit: the shared `action.yml` declares exactly the nine inputs passed here, and the writer sources at `ac19a5f` differ from the deleted local copies only by an added comment — no runtime behavior change. The commit is the current tip of the writer repo's `main`, so it is reachable today; if that branch is ever rewritten and the commit becomes unreferenced, this step would start failing to fetch. A tag or release ref pointing at the same commit would make the pin durable without weakening it, since the runner still resolves it to the same tree.
jercik marked this conversation as resolved
docs: align shared action timeout note
All checks were successful
commit-msg / commitlint (pull_request) Successful in 59s
Checks / quality-checks (26.5.0) (pull_request) Successful in 1m36s
Checks / quality-checks (24.15.0) (pull_request) Successful in 1m36s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 3m9s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Successful in 4m43s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 4m48s
PR Review / Dispatch and observe exact review writers (pull_request_target) Successful in 5m31s
8f46262faf
forgejo-actions left a comment

Summary: No actionable issues found. 1 informational note.

The PR replaces the 14-file local post-review composite action with a SHA-pinned shared action and drops the now-unneeded checkout step. I verified the migration end to end against the pinned commit rather than assuming it:

  • ac19a5f2f8009f178b572faab54d66087e4607a0 resolves on the public repo j4k-oss/forgejo-review-writer (private: false) and is the current main head, so the runner can fetch and check it out.
  • The shared action.yml declares exactly the nine inputs the workflow passes (axrecipe-url, axrecipe-audience, forgejo-token, review-slot, review-repository, review-number, review-head-sha, source-workflow-run-id, source-generator-attempt) and maps them to the same env names; no input-name drift.
  • All eleven writer TypeScript modules at that SHA are byte-identical to the deleted local copies. forgejo-post-review-common.ts differs only by an added two-line comment, and action.yml only by a leading ---. The compiled AXRECIPE_URL/AXRECIPE_AUDIENCE pins are unchanged, so the existing vars.AXRECIPE_URL/vars.AXRECIPE_AUDIENCE still satisfy pinnedEnvironment.
  • The writer's REVIEW_SLOTS allowlist matches the five slots pr-review.yml dispatches.
  • Removing the checkout is safe: the writer reads no repository files (only node:process env plus HTTP), and the dispatcher's response check still expects job id post-review, which the job keeps.
  • knip.json no longer points at deleted paths; the removed entry and .forgejo/actions/** config glob would otherwise be unresolved. The deleted .forgejo/actions/post-review/package.json was not a pnpm workspace importer (pnpm-workspace.yaml declares no packages), so --frozen-lockfile is unaffected, and no other workflow or config references .forgejo/actions.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found. 1 informational note. The PR replaces the 14-file local `post-review` composite action with a SHA-pinned shared action and drops the now-unneeded checkout step. I verified the migration end to end against the pinned commit rather than assuming it: - `ac19a5f2f8009f178b572faab54d66087e4607a0` resolves on the public repo `j4k-oss/forgejo-review-writer` (private: false) and is the current `main` head, so the runner can fetch and check it out. - The shared `action.yml` declares exactly the nine inputs the workflow passes (`axrecipe-url`, `axrecipe-audience`, `forgejo-token`, `review-slot`, `review-repository`, `review-number`, `review-head-sha`, `source-workflow-run-id`, `source-generator-attempt`) and maps them to the same env names; no input-name drift. - All eleven writer TypeScript modules at that SHA are byte-identical to the deleted local copies. `forgejo-post-review-common.ts` differs only by an added two-line comment, and `action.yml` only by a leading `---`. The compiled `AXRECIPE_URL`/`AXRECIPE_AUDIENCE` pins are unchanged, so the existing `vars.AXRECIPE_URL`/`vars.AXRECIPE_AUDIENCE` still satisfy `pinnedEnvironment`. - The writer's `REVIEW_SLOTS` allowlist matches the five slots `pr-review.yml` dispatches. - Removing the checkout is safe: the writer reads no repository files (only `node:process` env plus HTTP), and the dispatcher's response check still expects job id `post-review`, which the job keeps. - `knip.json` no longer points at deleted paths; the removed `entry` and `.forgejo/actions/**` config glob would otherwise be unresolved. The deleted `.forgejo/actions/post-review/package.json` was not a pnpm workspace importer (`pnpm-workspace.yaml` declares no `packages`), so `--frozen-lockfile` is unaffected, and no other workflow or config references `.forgejo/actions`. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiI4ZjQ2MjYyZmFmN2Y3NWM3NGFiMTc4NGM0MjE4NDA1YjlhODMzYzU4Iiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWNvZGUtc21hcnQtMiIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMzA5MiIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiI5ODk3ZGJiMy1mOWU1LTRmNTUtYWRiMy04MzE5YWU3NWYxN2EifQ== -->
@ -62,3 +55,3 @@
- name: Post exact finalized review
uses: ./.forgejo/actions/post-review
uses: https://code.j4k.dev/j4k-oss/forgejo-review-writer@ac19a5f2f8009f178b572faab54d66087e4607a0

ℹ️ Info: Verified against the pinned commit: the action exists on the public j4k-oss/forgejo-review-writer repo at ac19a5f… (current main head), its declared inputs match this with: block exactly, its REVIEW_SLOTS allowlist covers all five slots pr-review.yml dispatches, and its sources are byte-identical to the removed local files (including the compiled AXRECIPE_URL/AXRECIPE_AUDIENCE pins). The writer touches no repository files, so dropping the checkout step is safe. One consequence worth being aware of, not a defect: review publication now depends on the runner being able to fetch code.j4k.dev at job time, and a fetch failure inside the 3-minute job timeout fails the writer run the same way a checkout failure did before.

ℹ️ **Info:** Verified against the pinned commit: the action exists on the public `j4k-oss/forgejo-review-writer` repo at `ac19a5f…` (current `main` head), its declared inputs match this `with:` block exactly, its `REVIEW_SLOTS` allowlist covers all five slots `pr-review.yml` dispatches, and its sources are byte-identical to the removed local files (including the compiled `AXRECIPE_URL`/`AXRECIPE_AUDIENCE` pins). The writer touches no repository files, so dropping the checkout step is safe. One consequence worth being aware of, not a defect: review publication now depends on the runner being able to fetch `code.j4k.dev` at job time, and a fetch failure inside the 3-minute job timeout fails the writer run the same way a checkout failure did before.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: No actionable issues found.

Verification performed against the pinned shared action (ac19a5f, fetched anonymously from code.j4k.dev):

  • Its action.yml declares exactly the nine inputs the workflow passes (axrecipe-url, axrecipe-audience, forgejo-token, review-slot, review-repository, review-number, review-head-sha, source-workflow-run-id, source-generator-attempt) and is otherwise byte-identical to the deleted local action.yml, including the composite node "${{ github.action_path }}/post-review.ts" step.
  • The writer sources at that commit are byte-identical to the fourteen deleted files apart from an added comment in forgejo-post-review-common.ts and repo packaging (package.json, tsconfig.json include). "type": "module" is retained, and the code stays dependency-free, so the un-installed devDependencies in the shared package.json do not matter at runtime.
  • Removing the actions/checkout step is safe: post-review.ts reads only environment variables plus GITHUB_SERVER_URL and talks to the Forgejo/Axrecipe HTTP APIs; nothing in the writer touches the workspace. actions/setup-node is still needed for the composite node invocation and is pinned to an explicit version, so it does not need repository files either.
  • No dangling references to .forgejo/actions/post-review remain (pr-review.yml only matches the post-review job name in its dispatch check, which is unchanged), and the knip.json trim drops exactly the globs whose targets were deleted.

Code review by Claude Code Opus (opus)

**Summary:** No actionable issues found. Verification performed against the pinned shared action (`ac19a5f`, fetched anonymously from `code.j4k.dev`): - Its `action.yml` declares exactly the nine inputs the workflow passes (`axrecipe-url`, `axrecipe-audience`, `forgejo-token`, `review-slot`, `review-repository`, `review-number`, `review-head-sha`, `source-workflow-run-id`, `source-generator-attempt`) and is otherwise byte-identical to the deleted local `action.yml`, including the composite `node "${{ github.action_path }}/post-review.ts"` step. - The writer sources at that commit are byte-identical to the fourteen deleted files apart from an added comment in `forgejo-post-review-common.ts` and repo packaging (`package.json`, `tsconfig.json` include). `"type": "module"` is retained, and the code stays dependency-free, so the un-installed `devDependencies` in the shared `package.json` do not matter at runtime. - Removing the `actions/checkout` step is safe: `post-review.ts` reads only environment variables plus `GITHUB_SERVER_URL` and talks to the Forgejo/Axrecipe HTTP APIs; nothing in the writer touches the workspace. `actions/setup-node` is still needed for the composite `node` invocation and is pinned to an explicit version, so it does not need repository files either. - No dangling references to `.forgejo/actions/post-review` remain (`pr-review.yml` only matches the `post-review` *job* name in its dispatch check, which is unchanged), and the `knip.json` trim drops exactly the globs whose targets were deleted. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL3Ryb3Brb2QtY2xpZW50IiwibnVtYmVyIjoiNyIsImhlYWRTaGEiOiI4ZjQ2MjYyZmFmN2Y3NWM3NGFiMTc4NGM0MjE4NDA1YjlhODMzYzU4Iiwic2xvdCI6ImZvcmdlam8tcmV2aWV3LWNvZGUtc21hcnQtMSIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxMzA5MiIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiI5ZmY0Y2RmMi1kNjljLTQ3ZTYtODY5My0wMzg2ZjEzNmM3NDAifQ== -->
@ -62,3 +55,3 @@
- name: Post exact finalized review
uses: ./.forgejo/actions/post-review
uses: https://code.j4k.dev/j4k-oss/forgejo-review-writer@ac19a5f2f8009f178b572faab54d66087e4607a0

ℹ️ Info: Verified ac19a5f2f8009f178b572faab54d66087e4607a0 resolves in j4k-oss/forgejo-review-writer and its action.yml input set matches every with: key below, so the swap is interface-compatible.

One operational note, no change requested here: that commit is currently the tip of main and the repo has no tags. A commit SHA pin is only immutable while the object stays reachable — a force-push of main followed by GC on the Forgejo side would make the fetch fail. It fails closed (the writer job errors rather than running unpinned code), but the symptom would be reviews silently not being posted until the pin is refreshed, so keeping a protected tag or branch on the referenced commit in the writer repo is worth doing.

ℹ️ **Info:** Verified `ac19a5f2f8009f178b572faab54d66087e4607a0` resolves in `j4k-oss/forgejo-review-writer` and its `action.yml` input set matches every `with:` key below, so the swap is interface-compatible. One operational note, no change requested here: that commit is currently the tip of `main` and the repo has no tags. A commit SHA pin is only immutable while the object stays reachable — a force-push of `main` followed by GC on the Forgejo side would make the fetch fail. It fails closed (the writer job errors rather than running unpinned code), but the symptom would be reviews silently not being posted until the pin is refreshed, so keeping a protected tag or branch on the referenced commit in the writer repo is worth doing.
jercik marked this conversation as resolved
Author
Owner

Replying to review #8477

Acknowledged: the exact-head review found no actionable defect; its fetch-failure note describes the intended fail-closed behavior at 8f46262.

> Replying to review #8477 Acknowledged: the exact-head review found no actionable defect; its fetch-failure note describes the intended fail-closed behavior at 8f46262.
Author
Owner

Replying to review #8479

Acknowledged: the exact-head review found no actionable defect at 8f46262.

> Replying to review #8479 Acknowledged: the exact-head review found no actionable defect at 8f46262.
jercik merged commit 6dad00db40 into main 2026-08-02 10:36:40 +00:00
jercik deleted branch chore/public-shared-review-writer-canary 2026-08-02 10:36:40 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
2 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
j4k-oss/tropkod-client!7
No description provided.