actions-workflows: document cutting releases with gh
Assisted-by: Claude Opus 5.5 via Claude Code
change vlsvmwyqlzunkukowzvnlqouvszmqzmr
commit 5a8ac9059b9c5ce9d484a30b8dbc688989ba8e04
author Alpha Chen <alpha@kejadlen.dev>
date
parent sstynzwv
diff --git a/ai/skills/actions-workflows/SKILL.md b/ai/skills/actions-workflows/SKILL.md
index 2354a991..68743a0a 100644
--- a/ai/skills/actions-workflows/SKILL.md
+++ b/ai/skills/actions-workflows/SKILL.md
@@ -5,7 +5,7 @@ description: Use when writing, reviewing, or debugging GitHub Actions or Gitea A
 
 # Actions workflows
 
-*This is a self-improving skill — see the `self-improving-skills` skill.*
+*This is a self-improving skill. If you used it and it came up short — a missing command, flag, gotcha, or workflow — invoke the `self-improving-skills` skill and follow it before you finish.*
 
 Gitea Actions is a GitHub Actions-compatible engine. Same YAML, same
 `${{ github.* }}` contexts, same `$GITHUB_OUTPUT`/`$GITHUB_ENV`
@@ -90,6 +90,29 @@ scoped token. If you truly need `git push` (for example, to push a
 tag), scope the credentials to the single step that needs them —
 don't leave them persistent for the whole job.
 
+`gh release create` creates the tag too when it doesn't exist yet, so a
+build workflow can cut its own release in one step. It needs `contents:
+write` and an explicit `GH_TOKEN` — the `gh` CLI does not pick up the
+job token on its own:
+
+```yaml
+- name: Create GitHub release
+  env:
+    GH_TOKEN: ${{ github.token }}
+    VERSION: ${{ github.event.inputs.version }}
+  run: |
+    gh release create "v$VERSION" \
+      --target "$GITHUB_SHA" \
+      --title "v$VERSION" \
+      --notes "Released from $GITHUB_SHA."
+```
+
+Keep backticks out of `--notes`. An unquoted heredoc or a double-quoted
+string runs them as command substitution, and quoting the heredoc
+delimiter to stop that also kills the variable expansion you wanted.
+Write the notes without code spans, or build a notes file and pass
+`--notes-file`.
+
 Indirect environment variable expansion. Never interpolate expressions
 directly in `run:` scripts — an attacker-controlled value (branch
 name, PR title, issue body) can inject shell commands. Assign