This is an automated email from the ASF dual-hosted git repository.
jerryshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 576d7d8084 [MINOR] docs: fix skill frontmatter position and document
vote + GitHub release stages (#13640)
576d7d8084 is described below
commit 576d7d8084f80966ba50c73dd791752d05abd450
Author: Bharath Krishna <[email protected]>
AuthorDate: Wed Oct 7 23:39:55 2026 -0700
[MINOR] docs: fix skill frontmatter position and document vote + GitHub
release stages (#13640)
### What changes were proposed in this pull request?
**Frontmatter position** — in both `gravitino-release/SKILL.md` and
`trino-test/SKILL.md` the `---` block sat after the licence header, so
no metadata was parsed. Moved to line 1, licence immediately after.
**Release skill content** — added the vote phase (`[VOTE]` /
`[RESULT][VOTE]`, the 72-hour minimum, the binding-vote rules) and the
GitHub release page, neither of which appeared anywhere. Recorded that
`finalize` needs `-r` set to the RC that passed, since
`release-util.sh:141` derives it as (rc tag count + 1). Added `finalize`
to the `GPG_KEY` / `GPG_PASSPHRASE` row — `release-build.sh:75` checks
both before dispatching any stage.
### Why are the changes needed?
Part of #13637
Neither skill exposed a `description`, so Claude never matched either to
a request and the `allowed-tools: Bash` grant never applied. The release
skill also stopped short of the steps that actually gate a release.
### Does this PR introduce _any_ user-facing change?
No.
### How was this patch tested?
Installed each skill and read back the description Claude Code parsed:
```
before => <!--
after => Apache Gravitino release manager — guides through the full staged
release pipeline stage by stage
```
Frontmatter is read only when `---` is the first line; otherwise the
whole file is treated as body content. The skill still answers to its
directory name, so the symptom is missing metadata rather than a missing
command.
`agent-skills/` is not in the RAT excludes, so the reorder was checked
with Apache RAT plus an unlicensed control file:
```
Apache Licensed: 2
!????? control-no-license.md
AL gravitino-release-SKILL.md
AL trino-test-SKILL.md
```
Vote rules follow the [ASF release
policy](https://www.apache.org/legal/release-policy.html#release-approval).
---
agent-skills/gravitino-release/SKILL.md | 75 +++++++++++++++++++++++++++++----
agent-skills/trino-test/SKILL.md | 16 +++----
2 files changed, 74 insertions(+), 17 deletions(-)
diff --git a/agent-skills/gravitino-release/SKILL.md
b/agent-skills/gravitino-release/SKILL.md
index d9fd67c12c..da0e185de5 100644
--- a/agent-skills/gravitino-release/SKILL.md
+++ b/agent-skills/gravitino-release/SKILL.md
@@ -1,3 +1,10 @@
+---
+name: gravitino-release
+description: Apache Gravitino release manager — guides through the full staged
release pipeline stage by stage
+argument-hint: "[branch] (e.g. branch-1.2 | mock | status)"
+allowed-tools: Bash
+---
+
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,13 +22,6 @@
limitations under the License.
-->
----
-name: gravitino-release
-description: Apache Gravitino release manager — guides through the full staged
release pipeline stage by stage
-argument-hint: "[branch] (e.g. branch-1.2 | mock | status)"
-allowed-tools: Bash
----
-
# Apache Gravitino Release Manager
You are the Apache Gravitino release manager agent. Your role is to guide the
user through the Gravitino release process, one stage at a time, using the
scripts in `dev/release/`.
@@ -48,9 +48,11 @@ You are the Apache Gravitino release manager agent. Your
role is to guide the us
| 3 | **docs** | `docs` | `.release-state/{TAG}/docs.done` |
| 4 | **publish** | `publish` | `.release-state/{TAG}/publish.done` |
| 5 | **docker** | _(separate script)_ | `.release-state/{TAG}/docker.done` |
+| — | **vote** | _(mailing list — no script)_ | _(no state file)_ |
| 6 | **finalize** | `finalize` | `.release-state/{TAG}/finalize.done` |
| 7 | **docker-final** | _(separate script)_ |
`.release-state/{TAG}/docker-final.done` |
| 8 | **release-note** | _(agent-generated)_ | _(no state file — always
re-runnable)_ |
+| 9 | **github-release** | _(`gh release create`)_ | _(no state file)_ |
> `{TAG}` is the release candidate tag, e.g. `v1.2.0-rc1`.
@@ -231,8 +233,8 @@ Check each required environment variable before running any
stage. If unset, ask
|----------|---------------------|-------|
| `ASF_USERNAME` | tag, package, publish, finalize | Apache committer username
|
| `ASF_PASSWORD` | tag, package, publish, finalize | Apache committer password
|
-| `GPG_KEY` | package, publish | GPG key ID (typically `[email protected]`) |
-| `GPG_PASSPHRASE` | package, publish | GPG key passphrase |
+| `GPG_KEY` | package, publish, finalize | GPG key ID (typically
`[email protected]`) |
+| `GPG_PASSPHRASE` | package, publish, finalize | GPG key passphrase |
| `PYPI_API_TOKEN` | tag, package, finalize | PyPI API token (starts with
`pypi-`) |
| `GH_TOKEN` | docker, docker-final | GitHub token with `repo`+`workflow`
scope |
| `DOCKER_USERNAME` | docker, docker-final | Docker Hub username |
@@ -449,6 +451,25 @@ export MOCK_STAGE_DELAY=180 # stage sleeps 3 minutes
before completing
---
+### Vote (between docker and finalize)
+
+No script covers this stage.
+
+**Send `[VOTE]` to [email protected]** once the RC artifacts, PyPI
staging, Maven staging and Docker images are all verified. The mail must carry
the git tag and commit, the `dist/dev` URL, the staging repository, the KEYS
URL, and how to verify signatures.
+
+**The rules** ([ASF release
policy](https://www.apache.org/legal/release-policy.html#release-approval)):
+- Open at least **72 hours**. A shorter period must be justified in the mail.
+- Needs **at least 3 binding +1**, and more binding +1 than binding -1.
Binding means PMC member; non-binding votes are encouraged and tallied
separately.
+- Releases **may not be vetoed** — a single -1 does not by itself block the
vote. In practice, if anyone reports a real problem the release manager cancels
the vote rather than carrying it.
+
+**On a -1:** answer the technical point on the thread. If it holds, cancel,
fix, and cut the next RC — the RC number increments, the version does not.
+
+**When it passes**, send `[RESULT][VOTE]` as a **new thread**, not a reply.
List every voter, marked binding or non-binding, and give the tally.
+
+**Then note which RC passed.** `finalize` needs `-r` set to that RC, and the
RC number is *not* auto-detected correctly: `release-util.sh` derives it as the
count of existing `v<version>-rc*` tags plus one, which after rc1, rc2 and rc3
gives 4. A release that needed more than one RC will finalize against a
`dist/dev` path that never existed unless `-r` is passed explicitly.
+
+---
+
### Stage 6: finalize
> ⚠️ **Irreversible.** Always get explicit user confirmation before running.
@@ -534,6 +555,42 @@ The `--state-key docker-final` flag causes
`publish-docker.sh` to write `docker-
---
+### Stage 9: github-release
+
+Every past release has a GitHub release page carrying the same artifacts as
`dist/release`. Nothing in `dev/release/` creates it.
+
+**Independent of the `svn mv`.** It needs only the pushed `v{VERSION}` tag and
the RC artifacts, so it can be done while waiting on PMC karma for
`dist/release`.
+
+**Artifacts:** export the RC directory into a clean directory and upload
exactly what is in it. Do not glob the release working directory — that also
holds the Python sdists, which are not part of the ASF distribution.
+
+```bash
+mkdir -p ~/v{VERSION}-assets && cd ~/v{VERSION}-assets
+svn export --force
https://dist.apache.org/repos/dist/dev/gravitino/v{VERSION}-rc{RC} .
+ls | wc -l # note this count; the release page must end up
matching it
+shasum -a 512 -c *.sha512 # all must print OK
+```
+
+**Create it:**
+```bash
+gh release create "v{VERSION}" -R apache/gravitino \
+ --title "Apache Gravitino {VERSION} Release Notes" \
+ --notes-file notes.md \
+ *.tar.gz *.tar.gz.asc *.tar.gz.sha512
+```
+
+Use `--draft` if the release notes are still in review, then `gh release edit
"v{VERSION}" --draft=false` to publish.
+
+**Verify the asset count, do not trust the exit code:**
+```bash
+gh release view "v{VERSION}" -R apache/gravitino --json assets --jq
'.assets|length' # must match the dist count above
+```
+
+A partial upload still reports success and leaves the release missing its
signatures. If assets are missing, use `gh release upload --clobber` rather
than re-running `create`, which fails on an existing release.
+
+**Body:** the same content as the release-note stage, plus a `**Full
Changelog:**
[v{PREV}...v{VERSION}](https://github.com/apache/gravitino/compare/v{PREV}...v{VERSION})`
line and a `## Credits` section listing contributors as `@login`.
+
+---
+
## Error Handling
When a script fails:
diff --git a/agent-skills/trino-test/SKILL.md b/agent-skills/trino-test/SKILL.md
index 0b9fec5fbb..c5520cee87 100644
--- a/agent-skills/trino-test/SKILL.md
+++ b/agent-skills/trino-test/SKILL.md
@@ -1,3 +1,11 @@
+---
+name: trino-test
+description: Run, debug, and manage Trino integration tests for the Gravitino
project.
+argument-hint: "[command or intent] (e.g. run all | test mysql | trino 446 |
add test)"
+allowed-tools: Bash
+disable-model-invocation: false
+---
+
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
@@ -17,14 +25,6 @@
under the License.
-->
----
-name: trino-test
-description: Run, debug, and manage Trino integration tests for the Gravitino
project.
-argument-hint: "[command or intent] (e.g. run all | test mysql | trino 446 |
add test)"
-allowed-tools: Bash
-disable-model-invocation: false
----
-
# /trino-test — Trino Integration Test Skill
This skill helps you **run, debug, and manage Trino integration tests** for
the **Gravitino** project.