From 2f20bb62fb722223e4aa2782cd9cd7c1f1f68f62 Mon Sep 17 00:00:00 2001 From: Jarek Potiuk Date: Tue, 13 Oct 2026 16:04:12 +0100 Subject: [PATCH] perf(release-audit-report, release-archive-sweep, release-keys-sync): decide and render as code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The last three release skills each had one rule in a skill-local script and the rest in prose. The scripts move unchanged into tools/release-management (render_record → audit_report.record, retention → archive_sweep, check_key → keys_sync), and new commands do what the agent did by hand, printing JSON and running nothing: - audit-report: `verdict` (planning issue found, `org/repo#n` normalised to the canonical URL), `gather` (PonyMail subjects and queries, the `svn info` revision command, the required fields; the search itself stays with the agent), `voters` (the [RESULT] voters mapped to roster handles with vote-tally's binding resolution, unresolved ones listed, never cited), `check` (Step 1 missing / redacted fields, schema violations, the thread-permalink shape), `record`, and `pr`. - archive-sweep: `verdict`, `listing`, `trains` (strict `N.x` lines become patterns; a free-text retention rule leaves `keep` to the agent), `retention`, and `render` for svn mv, gh release delete (with the permanent-deletion warning), aws s3 mv, self-hosted, and atr (no command). - keys-sync: whether the fingerprint is in KEYS and its UID matches the keyserver's is no longer a text scan. A new read-only `release-verify list-keys` lists fingerprints and UIDs in the existing throwaway GNUPGHOME (no agent, no keyring, no network, private-key material refused), and `keys-sync verdict` classifies it as proceed / noop / blocked, failing closed when it cannot compare. `render` draws the `# ` KEYS block, the svn / git / generic sequence and the upload reminder with the expiry advisory. Every rendered command quotes its values with the shared shell helpers. Each backend and outcome gets its own file; audit-report's PR step moves, byte-identical with its generated adversarial block, to audit-log-pr.md at the skill root. Golden rules, Hard rules and the eval headings are unchanged. audit-report 6,657 → 5,136 tokens, archive-sweep 4,573 → 4,165, keys-sync 4,871 → 4,584. Evals: the scripted cases become pytest cases named after each former case (expected records byte-identical); the judgement and injection cases stay, their fixtures now carrying the real tool output. Generated-by: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GTPsZ5aEE5bUVYqp47Dpvv --- docs/labels-and-capabilities.md | 4 +- docs/vendor-neutrality.md | 4 +- .../skills/archive-sweep/SKILL.md | 136 ++--- .../skills/archive-sweep/backends/atr.md | 22 + .../archive-sweep/backends/github-releases.md | 13 + .../skills/archive-sweep/backends/s3.md | 18 + .../archive-sweep/backends/self-hosted.md | 10 + .../archive-sweep/backends/svnpubsub.md | 19 + .../skills/archive-sweep/outcomes/orphans.md | 12 + .../outcomes/retention-rule-error.md | 11 + .../skills/archive-sweep/outcomes/unmapped.md | 10 + .../skills/archive-sweep/prerequisites.md | 11 + .../skills/archive-sweep/references.md | 22 + .../archive-sweep/tests/test_retention.py | 121 ---- .../skills/audit-report/SKILL.md | 217 ++----- .../skills/audit-report/audit-log-pr.md | 111 ++++ .../skills/audit-report/gather.md | 53 ++ .../skills/audit-report/outcomes/injection.md | 12 + .../skills/audit-report/outcomes/redacted.md | 11 + .../outcomes/schema-violations.md | 12 + .../skills/audit-report/prerequisites.md | 11 + .../skills/audit-report/references.md | 19 + .../skills/keys-sync/SKILL.md | 134 ++--- .../skills/keys-sync/backends/atr.md | 12 + .../skills/keys-sync/backends/git.md | 12 + .../skills/keys-sync/backends/svnpubsub.md | 12 + .../skills/keys-sync/outcomes/blocked-key.md | 14 + .../skills/keys-sync/outcomes/key-rolled.md | 16 + .../skills/keys-sync/outcomes/noop.md | 8 + .../skills/keys-sync/prerequisites.md | 10 + .../skills/keys-sync/references.md | 25 + .../skills/keys-sync/scripts/check_key.py | 248 -------- .../skills/keys-sync/tests/test_check_key.py | 297 ---------- tools/release-management/README.md | 53 +- .../archive_sweep/__init__.py | 19 + .../release_management/archive_sweep/cli.py | 110 ++++ .../archive_sweep/render.py | 311 ++++++++++ .../archive_sweep}/retention.py | 32 +- .../audit_report/__init__.py | 17 + .../release_management/audit_report/cli.py | 144 +++++ .../release_management/audit_report/record.py | 38 +- .../release_management/audit_report/render.py | 397 +++++++++++++ .../release_management/keys_sync/__init__.py | 17 + .../src/release_management/keys_sync/check.py | 157 +++++ .../src/release_management/keys_sync/cli.py | 116 ++++ .../release_management/keys_sync/render.py | 296 ++++++++++ .../tests/test_archive_sweep.py | 463 +++++++++++++++ .../tests/test_audit_record.py | 8 +- .../tests/test_audit_report.py | 471 +++++++++++++++ .../tests/test_integration.py | 104 ++++ .../tests/test_keys_sync.py | 547 ++++++++++++++++++ tools/release-verify/README.md | 9 +- .../src/release_verify/__init__.py | 89 +++ .../tests/test_release_verify.py | 89 +++ tools/skill-evals/README.md | 6 +- .../evals/release-archive-sweep/README.md | 25 +- .../fixtures/case-1-clean-pass/report.md | 11 + .../case-2-retention-rule-error/expected.json | 6 - .../case-2-retention-rule-error/report.md | 26 - .../case-3-missing-config/expected.json | 9 - .../fixtures/case-3-missing-config/report.md | 25 - .../fixtures/case-4-atr-backend/expected.json | 6 - .../fixtures/case-4-atr-backend/report.md | 24 - .../case-1-single-line-one-old/expected.json | 9 - .../case-1-single-line-one-old/report.md | 45 -- .../case-2-multi-line-mixed/expected.json | 9 - .../case-2-multi-line-mixed/report.md | 55 -- .../case-3-orphan-detected/expected.json | 9 - .../fixtures/case-3-orphan-detected/report.md | 51 -- .../fixtures/grading-schema.json | 3 - .../fixtures/output-spec.md | 33 -- .../fixtures/step-config.json | 4 - .../fixtures/assertions.json | 6 - .../fixtures/case-1-svn-backend/expected.json | 9 - .../fixtures/case-1-svn-backend/report.md | 16 - .../expected.json | 7 - .../case-2-github-releases-backend/report.md | 18 - .../case-3-injection-in-listing/report.md | 47 ++ .../evals/release-audit-report/README.md | 33 +- .../fixtures/case-1-clean-pass/expected.json | 6 - .../fixtures/case-1-clean-pass/report.md | 27 - .../expected.json | 6 - .../case-2-audit-log-path-missing/report.md | 25 - .../case-3-planning-issue-not-found/report.md | 15 + .../case-1-all-data-present/report.md | 94 +++ .../fixtures/case-2-partial-data/report.md | 94 +++ .../fixtures/case-1-full-record/expected.json | 13 - .../fixtures/case-1-full-record/report.md | 39 -- .../case-2-missing-fields/expected.json | 13 - .../fixtures/case-2-missing-fields/report.md | 52 -- .../report.md | 2 +- .../case-4-all-required-missing/expected.json | 14 - .../case-4-all-required-missing/report.md | 57 -- .../evals/release-keys-sync/README.md | 40 +- .../fixtures/case-1-clean-pass/report.md | 18 + .../case-2-already-in-keys/expected.json | 8 - .../fixtures/case-2-already-in-keys/report.md | 32 - .../fixtures/case-3-key-rolled/expected.json | 8 - .../fixtures/case-3-key-rolled/report.md | 34 -- .../step-1-key-fetch/fixtures/assertions.json | 7 - .../case-1-rsa-4096-pass/expected.json | 12 - .../fixtures/case-1-rsa-4096-pass/report.md | 34 -- .../case-2-not-on-keyserver/expected.json | 12 - .../case-2-not-on-keyserver/report.md | 29 - .../fixtures/case-3-weak-key/expected.json | 12 - .../fixtures/case-3-weak-key/report.md | 35 -- .../fixtures/grading-schema.json | 3 - .../step-1-key-fetch/fixtures/output-spec.md | 32 - .../fixtures/step-config.json | 4 - .../case-1-standard-asf/expected.json | 10 - .../fixtures/case-1-standard-asf/report.md | 36 -- .../fixtures/case-2-ed25519-non-asf/report.md | 18 + .../case-3-expiring-key/expected.json | 10 - .../fixtures/case-3-expiring-key/report.md | 38 -- .../specs/release-management-lifecycle.md | 31 +- 115 files changed, 4416 insertions(+), 2130 deletions(-) create mode 100644 plugins/magpie-release-management/skills/archive-sweep/backends/atr.md create mode 100644 plugins/magpie-release-management/skills/archive-sweep/backends/github-releases.md create mode 100644 plugins/magpie-release-management/skills/archive-sweep/backends/s3.md create mode 100644 plugins/magpie-release-management/skills/archive-sweep/backends/self-hosted.md create mode 100644 plugins/magpie-release-management/skills/archive-sweep/backends/svnpubsub.md create mode 100644 plugins/magpie-release-management/skills/archive-sweep/outcomes/orphans.md create mode 100644 plugins/magpie-release-management/skills/archive-sweep/outcomes/retention-rule-error.md create mode 100644 plugins/magpie-release-management/skills/archive-sweep/outcomes/unmapped.md create mode 100644 plugins/magpie-release-management/skills/archive-sweep/prerequisites.md create mode 100644 plugins/magpie-release-management/skills/archive-sweep/references.md delete mode 100644 plugins/magpie-release-management/skills/archive-sweep/tests/test_retention.py create mode 100644 plugins/magpie-release-management/skills/audit-report/audit-log-pr.md create mode 100644 plugins/magpie-release-management/skills/audit-report/gather.md create mode 100644 plugins/magpie-release-management/skills/audit-report/outcomes/injection.md create mode 100644 plugins/magpie-release-management/skills/audit-report/outcomes/redacted.md create mode 100644 plugins/magpie-release-management/skills/audit-report/outcomes/schema-violations.md create mode 100644 plugins/magpie-release-management/skills/audit-report/prerequisites.md create mode 100644 plugins/magpie-release-management/skills/audit-report/references.md create mode 100644 plugins/magpie-release-management/skills/keys-sync/backends/atr.md create mode 100644 plugins/magpie-release-management/skills/keys-sync/backends/git.md create mode 100644 plugins/magpie-release-management/skills/keys-sync/backends/svnpubsub.md create mode 100644 plugins/magpie-release-management/skills/keys-sync/outcomes/blocked-key.md create mode 100644 plugins/magpie-release-management/skills/keys-sync/outcomes/key-rolled.md create mode 100644 plugins/magpie-release-management/skills/keys-sync/outcomes/noop.md create mode 100644 plugins/magpie-release-management/skills/keys-sync/prerequisites.md create mode 100644 plugins/magpie-release-management/skills/keys-sync/references.md delete mode 100755 plugins/magpie-release-management/skills/keys-sync/scripts/check_key.py delete mode 100644 plugins/magpie-release-management/skills/keys-sync/tests/test_check_key.py create mode 100644 tools/release-management/src/release_management/archive_sweep/__init__.py create mode 100644 tools/release-management/src/release_management/archive_sweep/cli.py create mode 100644 tools/release-management/src/release_management/archive_sweep/render.py rename {plugins/magpie-release-management/skills/archive-sweep/scripts => tools/release-management/src/release_management/archive_sweep}/retention.py (86%) create mode 100644 tools/release-management/src/release_management/audit_report/__init__.py create mode 100644 tools/release-management/src/release_management/audit_report/cli.py rename plugins/magpie-release-management/skills/audit-report/scripts/render_record.py => tools/release-management/src/release_management/audit_report/record.py (89%) create mode 100644 tools/release-management/src/release_management/audit_report/render.py create mode 100644 tools/release-management/src/release_management/keys_sync/__init__.py create mode 100755 tools/release-management/src/release_management/keys_sync/check.py create mode 100644 tools/release-management/src/release_management/keys_sync/cli.py create mode 100644 tools/release-management/src/release_management/keys_sync/render.py create mode 100644 tools/release-management/tests/test_archive_sweep.py rename plugins/magpie-release-management/skills/audit-report/tests/test_render_record.py => tools/release-management/tests/test_audit_record.py (98%) create mode 100644 tools/release-management/tests/test_audit_report.py create mode 100644 tools/release-management/tests/test_keys_sync.py delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-0-preflight/fixtures/case-2-retention-rule-error/expected.json delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-0-preflight/fixtures/case-2-retention-rule-error/report.md delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-0-preflight/fixtures/case-3-missing-config/expected.json delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-0-preflight/fixtures/case-3-missing-config/report.md delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-0-preflight/fixtures/case-4-atr-backend/expected.json delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-0-preflight/fixtures/case-4-atr-backend/report.md delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-1-load-listing/fixtures/case-1-single-line-one-old/expected.json delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-1-load-listing/fixtures/case-1-single-line-one-old/report.md delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-1-load-listing/fixtures/case-2-multi-line-mixed/expected.json delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-1-load-listing/fixtures/case-2-multi-line-mixed/report.md delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-1-load-listing/fixtures/case-3-orphan-detected/expected.json delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-1-load-listing/fixtures/case-3-orphan-detected/report.md delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-1-load-listing/fixtures/grading-schema.json delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-1-load-listing/fixtures/output-spec.md delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-1-load-listing/fixtures/step-config.json delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-2-emit-commands/fixtures/case-1-svn-backend/expected.json delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-2-emit-commands/fixtures/case-1-svn-backend/report.md delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-2-emit-commands/fixtures/case-2-github-releases-backend/expected.json delete mode 100644 tools/skill-evals/evals/release-archive-sweep/step-2-emit-commands/fixtures/case-2-github-releases-backend/report.md delete mode 100644 tools/skill-evals/evals/release-audit-report/step-0-preflight/fixtures/case-1-clean-pass/expected.json delete mode 100644 tools/skill-evals/evals/release-audit-report/step-0-preflight/fixtures/case-1-clean-pass/report.md delete mode 100644 tools/skill-evals/evals/release-audit-report/step-0-preflight/fixtures/case-2-audit-log-path-missing/expected.json delete mode 100644 tools/skill-evals/evals/release-audit-report/step-0-preflight/fixtures/case-2-audit-log-path-missing/report.md delete mode 100644 tools/skill-evals/evals/release-audit-report/step-2-assemble-record/fixtures/case-1-full-record/expected.json delete mode 100644 tools/skill-evals/evals/release-audit-report/step-2-assemble-record/fixtures/case-1-full-record/report.md delete mode 100644 tools/skill-evals/evals/release-audit-report/step-2-assemble-record/fixtures/case-2-missing-fields/expected.json delete mode 100644 tools/skill-evals/evals/release-audit-report/step-2-assemble-record/fixtures/case-2-missing-fields/report.md delete mode 100644 tools/skill-evals/evals/release-audit-report/step-2-assemble-record/fixtures/case-4-all-required-missing/expected.json delete mode 100644 tools/skill-evals/evals/release-audit-report/step-2-assemble-record/fixtures/case-4-all-required-missing/report.md delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-0-preflight/fixtures/case-2-already-in-keys/expected.json delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-0-preflight/fixtures/case-2-already-in-keys/report.md delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-0-preflight/fixtures/case-3-key-rolled/expected.json delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-0-preflight/fixtures/case-3-key-rolled/report.md delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-1-key-fetch/fixtures/assertions.json delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-1-key-fetch/fixtures/case-1-rsa-4096-pass/expected.json delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-1-key-fetch/fixtures/case-1-rsa-4096-pass/report.md delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-1-key-fetch/fixtures/case-2-not-on-keyserver/expected.json delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-1-key-fetch/fixtures/case-2-not-on-keyserver/report.md delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-1-key-fetch/fixtures/case-3-weak-key/expected.json delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-1-key-fetch/fixtures/case-3-weak-key/report.md delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-1-key-fetch/fixtures/grading-schema.json delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-1-key-fetch/fixtures/output-spec.md delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-1-key-fetch/fixtures/step-config.json delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-2-svn-commands/fixtures/case-1-standard-asf/expected.json delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-2-svn-commands/fixtures/case-1-standard-asf/report.md delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-2-svn-commands/fixtures/case-3-expiring-key/expected.json delete mode 100644 tools/skill-evals/evals/release-keys-sync/step-2-svn-commands/fixtures/case-3-expiring-key/report.md diff --git a/docs/labels-and-capabilities.md b/docs/labels-and-capabilities.md index 9aca740aa..68ae0127c 100644 --- a/docs/labels-and-capabilities.md +++ b/docs/labels-and-capabilities.md @@ -370,10 +370,10 @@ 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 (`` 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; 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), `vote-tally` Steps 0–3 (pre-classification, the tally, the `[RESULT] [VOTE]` body), `promote` Steps 0 and 2, `announce-draft` Steps 0, 2 and 3, and `prepare` Steps 0, 1, 2, 14 and A (train coverage, the planning issue, the changelog and its coverage, the 2e archive review, the prep and post-release PRs, the automated-signing gate and workflow) | +| [`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), `vote-tally` Steps 0–3 (pre-classification, the tally, the `[RESULT] [VOTE]` body), `promote` Steps 0 and 2, `announce-draft` Steps 0, 2 and 3, `archive-sweep` Steps 0–2 (the listing command, `trains.json`, the retention rule, the backend-shaped archive commands), `audit-report` Steps 0–3 (the planning-issue URL, the mail-archive search plan, voter handles, the record, the PR proposal) `keys-sync` Steps 0–2 (the KEYS lookup and UID comparison over `release-verify list-keys` output, the strength floor, the KEYS block and the svn / git commands), and `prepare` Steps 0, 1, 2, 14 and A (train coverage, the planning issue, the changelog and its coverage, the 2e archive review, the prep and post-release PRs, the automated-signing gate and workflow) | | [`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 ``, 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 | +| [`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; and `list-keys`, the fingerprints and UIDs of a KEYS file or fetched key, for `release-keys-sync` Steps 0–1 | | [`tools/symlink-lint`](../tools/symlink-lint/) | `substrate:framework-dev` | Self-adoption symlink hygiene — rejects cyclic symlinks, misdirected skill relays (canonical/relay target-correctness), and incomplete self-adoption symlink sets | | [`tools/pilot-report-validator`](../tools/pilot-report-validator/) | `substrate:framework-dev` | Adopter pilot-report validator — required frontmatter keys, no unfilled placeholders, valid profile, and required body sections; counterpart to `spec-validator` for `docs/pilot-report-template.md` | | [`tools/skill-reconciler-diff`](../tools/skill-reconciler-diff/) | `substrate:framework-dev` | Deterministic structural diff between two skill trees — parses frontmatter, section headings, step inventory, placeholders, support files, and safety-baseline clauses into a JSON diff object for the `skill-reconciler` skill | diff --git a/docs/vendor-neutrality.md b/docs/vendor-neutrality.md index 58f326226..03f0cae35 100644 --- a/docs/vendor-neutrality.md +++ b/docs/vendor-neutrality.md @@ -606,8 +606,8 @@ generated block below. | Skill neutrality | Count | |---|---| -| capability-pure (names no backend) | 28 | -| portable (named backends are swappable) | 51 | +| capability-pure (names no backend) | 29 | +| portable (named backends are swappable) | 50 | | vendor-coupled (sole-backend dependency) | 0 | Organization scope (declared, orthogonal to vendor): ASF = 16, agnostic = 63. diff --git a/plugins/magpie-release-management/skills/archive-sweep/SKILL.md b/plugins/magpie-release-management/skills/archive-sweep/SKILL.md index 47f53bbf7..376d1f7e6 100644 --- a/plugins/magpie-release-management/skills/archive-sweep/SKILL.md +++ b/plugins/magpie-release-management/skills/archive-sweep/SKILL.md @@ -26,7 +26,7 @@ capability: - capability:triage surface_hash: sha256:1665af8aae9c2b58 license: Apache-2.0 -measured_tokens: 4573 +measured_tokens: 4165 --- + +# Archive backend — `atr` + +**Listing.** The project's release list in ATR, which is also the authoritative record of what has already been archived. +The distribution area itself is still `dist/release//`, since ATR's Finish commits there. + +**Archive.** There is no command to emit. +Archiving happens in ATR, which updates the release catalog and removes the files from `dist/release` in the background — +so the RM performs it in the ATR UI, not in a shell, and the usual "paste-ready command set" output is replaced by the instruction to archive each past-retention version there. +`render` prints that instruction as `commands` and `archive_count` is the number of versions to archive in ATR. + +Two consequences worth stating in the proposal: + +- **Do not also run `svn mv` or `svn rm`.** ATR removes the files itself; a manual removal on top races with it. +- **The prior release may already be handled.** If the project enables *Auto archive prior release* in its ATR settings, + the previous release is archived in the same cycle when the new one is announced — so it may not be past-retention by the time this sweep runs. + Check ATR's record before proposing anything. + +Releases committed to `dist/release` are copied to `archive.apache.org` automatically, so archiving removes the distribution copy rather than moving it. +See [Promoting to release](https://releases.apache.org/docs/promoting-to-release). diff --git a/plugins/magpie-release-management/skills/archive-sweep/backends/github-releases.md b/plugins/magpie-release-management/skills/archive-sweep/backends/github-releases.md new file mode 100644 index 000000000..a732bae38 --- /dev/null +++ b/plugins/magpie-release-management/skills/archive-sweep/backends/github-releases.md @@ -0,0 +1,13 @@ + + +# Archive backend — `github-releases` + +**Listing.** `gh release list --repo --exclude-drafts` — each published (non-draft) release tag is a candidate. + +**Archive.** One `gh release delete --repo --yes` per past-retention version, oldest first. + +`gh release delete` removes the release page and optionally the tag. +Include a reminder that GitHub releases have no archive equivalent; deletion is permanent. +The RM should confirm this is intentional. +`render` returns that reminder as `deletion_warning`: show it with the commands. diff --git a/plugins/magpie-release-management/skills/archive-sweep/backends/s3.md b/plugins/magpie-release-management/skills/archive-sweep/backends/s3.md new file mode 100644 index 000000000..ee0819986 --- /dev/null +++ b/plugins/magpie-release-management/skills/archive-sweep/backends/s3.md @@ -0,0 +1,18 @@ + + +# Archive backend — `s3` + +**Listing.** `aws s3 ls s3:////` — each key prefix is a candidate. + +**Archive.** One move per past-retention version, oldest first: + +```text +aws s3 mv \ + s3:///// \ + s3:///// \ + --recursive +``` + +The source is `release_dist_url_template` and the destination `archive_url_template` (required for `s3`), +each an `s3:///…` URL or an `amazonaws.com` URL the bucket is read from; a template it cannot be read from is refused. diff --git a/plugins/magpie-release-management/skills/archive-sweep/backends/self-hosted.md b/plugins/magpie-release-management/skills/archive-sweep/backends/self-hosted.md new file mode 100644 index 000000000..9c0587058 --- /dev/null +++ b/plugins/magpie-release-management/skills/archive-sweep/backends/self-hosted.md @@ -0,0 +1,10 @@ + + +# Archive backend — `self-hosted` + +**Listing.** Run the adopter-supplied listing command from `/release-management-config.md`; `listing` prints no command. + +**Archive.** Use the adopter-supplied archival command template from `/release-management-config.md`, substituting `` and the archive destination: +pass it to `render --command-template '