Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/labels-and-capabilities.md
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ or a contract-free mix of substrates (e.g. `tools/spec-inventory` is
| [`tools/vendor-neutrality-score`](../tools/vendor-neutrality-score/) | `substrate:framework-dev` + `substrate:analytics` | Deterministic vendor-neutrality score — reads each contract tool's `**Kind:**` / `**Vendor:**` metadata and scores per-contract + per-skill neutrality (`analytics`); backs the score block in [`docs/vendor-neutrality.md`](vendor-neutrality.md) |
| [`tools/spec-validator`](../tools/spec-validator/) | `substrate:framework-dev` | Spec-frontmatter and body-section validator — counterpart to `skill-and-tool-validator` for `tools/spec-loop/specs/` |
| [`tools/release-config`](../tools/release-config/) | `substrate:release` | `release-config` — loads the release-management config (`<project-config>` layered lookup, defaults, derived values) and runs each `release-*` skill's deterministic Step 0 pre-flight checks as JSON; used by every `release-*` skill's Step 0 and the Step 1 metadata of `rc-cut`, `vote-draft`, `announce-draft`, `promote` and `verify-rc` |
| [`tools/release-management`](../tools/release-management/) | `substrate:release` | `release-management` — renders what the `release-*` skills hand the release manager (paste-ready command blocks, drafts, planning-issue comments) from `release-config load`, refusing a `dist/release/` staging target or an MD5 / SHA-1 digest in code, and classifies what `verify-rc`'s checks printed (the `release-verify` arguments, RAT, JVM artefacts, the Nexus probe, reproducibility, the report and its trusted-hardware attestation); runs nothing. Used by `rc-cut` Steps 0 and 2–4 and `verify-rc` Steps 1–10 |
| [`tools/release-management`](../tools/release-management/) | `substrate:release` | `release-management` — renders what the `release-*` skills hand the release manager (paste-ready command blocks, drafts, planning-issue comments) from `release-config load`, refusing a `dist/release/` staging target or an MD5 / SHA-1 digest in code; runs nothing. Used by `rc-cut` Steps 0 and 2–4, `verify-rc` Steps 1–10, `vote-draft` Steps 0, 2 and 3 (verify-rc gate, `[VOTE]` body, planning-issue comment), and `vote-tally` Steps 0–3 (pre-classification, the tally, the `[RESULT] [VOTE]` body) |
| [`tools/reproducible-archive`](../tools/reproducible-archive/) | `substrate:release` | `repro-archive` — build, lint and compare reproducible source archives from a git ref (`git archive` + `.gitattributes` `export-ignore`, every reproducible-builds.org archive rule applied); used by `release-rc-cut` Step 2/2b and `release-verify-rc` Step 9 |
| [`tools/maven-artifact-verify`](../tools/maven-artifact-verify/) | `substrate:release` | `maven-artifact-verify` — verify locally staged JVM RC artefacts: POM ALv2 licence / developers / scm (with parent-POM inheritance resolution), podling incubation disclaimer in `<description>`, companion `-sources.jar` / `-javadoc.jar` presence with their own signatures and checksums; used by `release-verify-rc` Step 6b |
| [`tools/release-verify`](../tools/release-verify/) | `substrate:release` | `release-verify` — deterministic, read-only checks of a staged RC (inventory, signatures against the project KEYS only, checksums, NOTICE/LICENSE, prohibited binaries, dangling symlinks, version strings) and the verdict roll-up, each as JSON; used by `release-verify-rc` Steps 1–3, 5–8 and 10 |
Expand Down
4 changes: 2 additions & 2 deletions docs/vendor-neutrality.md
Original file line number Diff line number Diff line change
Expand Up @@ -606,8 +606,8 @@ generated block below.

| Skill neutrality | Count |
|---|---|
| capability-pure (names no backend) | 26 |
| portable (named backends are swappable) | 53 |
| capability-pure (names no backend) | 27 |
| portable (named backends are swappable) | 52 |
| vendor-coupled (sole-backend dependency) | 0 |

Organization scope (declared, orthogonal to vendor): ASF = 16, agnostic = 63.
Expand Down
285 changes: 75 additions & 210 deletions plugins/magpie-release-management/skills/vote-draft/SKILL.md

Large diffs are not rendered by default.

17 changes: 17 additions & 0 deletions plugins/magpie-release-management/skills/vote-draft/canned-body.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->

# A project `[VOTE]` template (`canned_body`)

When `<project-config>/canned-responses.md` has a `[VOTE]` template block, save it to a file and pass it as `--canned-body`.
The render substitutes the metadata placeholders (`<vote_list>`, `<Product Name>`, `<version>`, `<version>-rcN`, `<staging_url>`, `<svn_revision>`, `<tag_url>`, `<changelog_url>`, `<keys_url>`, `<vote_window_hours>`, `<RM name>`)
and appends the `[EXPEDITED]` / `[SKIP-VERIFY]` notices when those overrides are in force.

The *How to verify* section is part of every `[VOTE]`, whichever backend sends it and whether the body came from the default template or from `canned_body`:
a PMC member reading the thread on their phone must find the agentic one-liner, the human-readable page, and the reproducibility record without opening the tracker.
When `canned_body` lacks the section, append it and tell the RM the project's canned block should gain it.
The *Agentic path* paragraph is fixed text describing what `verify-rc` does.
Keep it verbatim, including the SWHID and convenience-artefact clauses, even when the planning issue recorded no SWHID or the project declares no convenience artefacts;
only the *Reproducibility record* lines and the *Convenience artefacts* block vary with what the report provides.

The render does the appending: `verify_section_appended: true` and a `warnings` entry mean it added the section; pass the warning on to the RM.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->

# Delivery — `vote_backend = atr`

The drafted subject + body go to the ATR platform, which *sends* the `[VOTE]` to `<vote_list>` and *tabulates* replies.
The skill still sends nothing: the Step 2 render's `atr_vote_command` is a paste-ready `atr vote start` command for the RM to run under their own ATR credentials
(`-m <vote_list>`, `--duration <vote_window_hours>`, the final subject, and `--no-auto-publish`, which is REQUIRED for the hybrid: ATR must NOT publish, SVN owns promotion).
Pass `--atr-revision <rev>` only when the RM names one: it defaults to the latest uploaded revision, so do not hard-depend on a `revisions` lookup.
Verb and flag names may shift between ATR releases; tell the RM to confirm them with `atr vote start --help`,
and to acknowledge any concern-group keys `atr check concerns <project> <version>` lists with `--concerns-noted`.

The `<staging_url>` in the body must still point at the dist backend's download location (e.g. `dist/dev/<project>/…` under the hybrid), so voters fetch the canonical artefacts even though ATR drives the thread;
the render keeps it, and adds the *ATR check results for this candidate* line (`--atr-candidate-url`, from the planning issue; the render refuses without it).
ATR's own default vote text links only the candidate page, so the RM supplies the drafted body, with its *How to verify* section, to ATR (the client's body option, or the vote form on the candidate page; confirm with `atr vote start --help`).

This is a proposal like the email: present it and get RM confirmation before it is run.
Posting the `[VOTE]` is a state change the RM performs, never the skill.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->

# Delivery — `vote_backend = manual` (default)

The draft is a paste-ready email.
The RM copies the body into their mail client and sends it to `<vote_list>` themselves.
The skill never sends mail (Golden rule 2).
`atr_vote_command` is empty.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->

# Override — `--expedited <reason>`

Accepted only when `vote_window_hours` is below 72; `release-config preflight` reports `expedited: true` (Golden rule 4).

**The reason is public.**
The `[VOTE]` thread and the planning issue are public, so until the advisory ships the reason names no CVE and does not call the release a security fix
([`AGENTS.md` § Confidentiality](../../../../../AGENTS.md#confidentiality-of-the-tracker-repository)).
Rewording it is your judgement, not the tool's: write it neutrally (*"Time-sensitive fix release"*), keep any approval the RM cited, and tell the RM what was left out.
Pass the reworded reason as `--expedited` to both renders.
When a render's `warnings` still flags the reason, reword it and render again; never present a body or comment carrying the flagged reason.

What the renders add:

- **Step 2** — the `[EXPEDITED: <reason>. ASF policy requires this deviation to be noted in the project's next board report.]` notice after the window line, and `expedited: true`.
- **Step 3** — the expedited variant: `(expedited)` in the header, the shortened window, the reason, and the board-report reminder.
- **Step 4** — restate the flag and the reason, and remind the RM to note the deviation in the project's next board report per ASF policy.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->

# Override — `--skip-verify-check <reason>`

Resolves the verify-rc gate (Golden rule 5): Step 0's verdict reports `skip_verify_override: true` and no verify-rc blocker.
The reason is logged in both outputs:

- **Step 2** — pass it as `--skip-verify-check "<reason>"`; the body carries
`[SKIP-VERIFY: release-verify-rc was not run for this RC; the RM accepted this with the reason: <reason>.]` and `skip_verify_logged` is `true`.
- **Step 4** — restate the reason in the hand-back.

A verify-rc `FAIL` is never drafted over without this override (Hard rules).
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->

# release-vote-draft — prerequisites

- **`release-verify-rc` ran with PASS** on `<version>-<rcN>`, or `--skip-verify-check <reason>` was passed (Golden rule 5).
- **Planning issue open** and labelled `rc-staged`, or the RM gives its URL.
- **`<project-config>/release-management-config.md` readable** — `vote_window_hours`, `vote_subject_template`, `vote_dev_list`.
- **RC metadata available** — staging, tag, KEYS and changelog URLs, from the planning issue body or supplied explicitly.
24 changes: 24 additions & 0 deletions plugins/magpie-release-management/skills/vote-draft/references.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->

# release-vote-draft — references

- [`docs/release-management/process.md`](../../../../docs/release-management/process.md) —
Step 7 context.
- [`docs/release-management/spec.md`](../../../../docs/release-management/spec.md) —
`release-vote-draft` per-skill specification.
- [`<project-config>/release-management-config.md`](../../../magpie-setup/templates/release-management-config.md) —
adopter keys this skill reads (`vote_*`, `vote_verification_doc_url`,
`reproducibility_doc_url`, `vote_verification_skill`).
- [`docs/release-management/reproducibility.md`](../../../../docs/release-management/reproducibility.md) —
what the reproducibility record in the body means and how a voter
uses it.
- [`docs/release-management/manual-release-process.md` § Manual verification](../../../../docs/release-management/manual-release-process.md#manual-verification--what-a-voter-runs-before-1) —
the longhand voter path the framework's own `[VOTE]` links to.
- `release-verify-rc` (proposed) —
upstream step; PASS is a prerequisite, and the agentic path the body
offers voters.
- `release-vote-tally` (proposed) —
downstream step; runs after the vote window closes.
- [ASF release policy § release approval](https://www.apache.org/legal/release-policy.html#release-approval) —
the 72h vote-window floor.
Loading