This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow-steward.git
The following commit(s) were added to refs/heads/main by this push:
new 65802378 New skills (#492)
65802378 is described below
commit 65802378d99f37fd9265ed75bb24320fb62d97b8
Author: Justin Mclean <[email protected]>
AuthorDate: Fri Jun 12 02:57:50 2026 +1000
New skills (#492)
* Add release-management lifecycle spec and record skill-catalogue gaps
New cross-cutting spec release-management-lifecycle.md (proposed,
Drafting) grounds the 14-step, 10-skill family already designed in
docs/release-management/ but absent from the loop specs; wired into the
README and overview indexes.
Record Known gaps in the existing specs for the plan pass to pick up:
- mentoring-mode: family is one skill deep; first-contribution welcome
and contributor-to-committer path tracker undesigned.
- triage-mode: missing general-issue dedupe/stale/backlog-dashboard;
contributor-growth skills not a formalised family (PMC nomination,
emeritus, offboarding missing); repo-health audits a one-off.
- meta-and-quality-tooling: add optimize-skill; triage-mode: add
pr-management-quick-merge to Where it lives.
* Add project-agnosticism spec for de-ASF-coupling the skill catalogue
New cross-cutting spec project-agnosticism.md (experimental, infra)
captures the standing audit + mechanism for keeping skills usable outside
the ASF. Three generalisation mechanisms in preference order: placeholders
for values, adapters for system swaps, and capability/backend flags for
workflow branches that differ by ecosystem (the model already proven in
docs/release-management/). ASF stays the default profile, never the only
one.
Known gaps for the plan pass: no automated ASF-coupling lint, no non-ASF
adopter profile fixture/eval, and capability-flag vocabulary owed to
contributor intake (ICLA vs DCO), security intake, and CVE allocation.
Wired into the README/overview indexes and cross-referenced from
adapters.md.
* Plan: add ASF-coupling lint + non-ASF profile fixture work items
Plan pass under-covered the project-agnosticism spec. Add the two
buildable gaps as work items: ASF-coupling advisory lint folded into
skill-and-tool-validator (item 5) and a non-ASF adopter profile fixture
plus smoke eval (item 7). Reword the deferral note so only the
capability-flag vocabulary stays deferred (spec-authoring task following
the release-management backend-flag precedent), and add explicit
sequencing notes for the dedupe/backlog and repo-health gaps so later
plan passes do not silently drop them. Refresh the stale What's-been-built
spec list.
---
tools/spec-loop/IMPLEMENTATION_PLAN.md | 209 +++++++++++++++++----
tools/spec-loop/specs/README.md | 2 +
tools/spec-loop/specs/adapters.md | 4 +
tools/spec-loop/specs/mentoring-mode.md | 11 ++
tools/spec-loop/specs/meta-and-quality-tooling.md | 7 +-
tools/spec-loop/specs/overview.md | 2 +
tools/spec-loop/specs/project-agnosticism.md | 140 ++++++++++++++
.../specs/release-management-lifecycle.md | 136 ++++++++++++++
tools/spec-loop/specs/triage-mode.md | 26 ++-
9 files changed, 501 insertions(+), 36 deletions(-)
diff --git a/tools/spec-loop/IMPLEMENTATION_PLAN.md
b/tools/spec-loop/IMPLEMENTATION_PLAN.md
index 0b5de99c..8c955e80 100644
--- a/tools/spec-loop/IMPLEMENTATION_PLAN.md
+++ b/tools/spec-loop/IMPLEMENTATION_PLAN.md
@@ -19,7 +19,8 @@ one PR** (the branch-per-feature constraint).
- **Spec set** — [`specs/`](specs/): an `overview` plus a functional
spec per area (the four live modes, the security lifecycle, the
- privacy-LLM gate, the sandbox, CVE tooling, adoption/setup, adapters,
+ release-management lifecycle (proposed), the privacy-LLM gate, the
+ sandbox, CVE tooling, adoption/setup, adapters, project-agnosticism,
and meta/quality tooling).
- **Loop scaffolding** — `loop.sh` (plan / build / consolidate; a branch
per work item; never pushes), `PROMPT_plan.md`, `PROMPT_build.md`,
@@ -36,10 +37,10 @@ one PR** (the branch-per-feature constraint).
- **Contributor skills** — `contributor-nomination`,
`contributor-activity-sweep`, and `committer-onboarding` shipped with
eval suites. Formerly tracked under draft PRs #227–#229.
-- **Drafting — issue-fix-workflow skill** — `issue-fix-workflow` and
- `audit-finding-fix` shipped with eval suites (covers generic drafting
- from audit findings, formerly tracked as `generic-drafting` / #296).
- Spec: [`specs/drafting-mode.md`](specs/drafting-mode.md).
+- **Drafting — issue-fix-workflow and audit-finding-fix skills** —
+ both shipped with eval suites (covers generic drafting from triaged
+ issues and audit findings, formerly tracked as `generic-drafting` /
+ #296). Spec: [`specs/drafting-mode.md`](specs/drafting-mode.md).
- **Docs — mode economics page** — `docs/mode-economics.md` exists
(per-mode token-cost shape, vendor-neutral).
- **Meta — spec-status index** — `tools/spec-status-index/` exists as a
@@ -61,42 +62,156 @@ one PR** (the branch-per-feature constraint).
---
+## In-flight (local branches and open PRs — not available to build)
+
+The following items are already built on local branches or open as PRs.
+Do not duplicate them.
+
+| Branch slug | PR | Description |
+|---|---|---|
+| `injection-guard` | merged (#473) | Prompt-injection hardening on
forwarder-relay ingest |
+| `check-headers` | #474 | License-header enforcement check in spec-validator |
+| `spec-validator-known-gaps` | #490 | Enforce Known-gaps section in every
functional spec |
+| `spec-validate-hook` | #489 | pre-commit hook for spec-validate |
+| `skill-quality-fix` | #488 | Stabilise setup-verify eval + extend check-1
coverage |
+| `check-eval-coverage` | #481 | SOFT eval-coverage check (check #8) |
+| `eval-quick-merge` | #480 | pr-management-quick-merge skill + evals |
+| `spec-validator-path-check` | local | Validate paths referenced in
Validation blocks |
+| `spec-validator-spdx` | local | Enforce SPDX header on spec files |
+| `tracker-dashboard-tests` | local | pyproject + pytest suite for
security-tracker render.py |
+| `loop-imp` | #467 | Incremental update runs from .last-sync marker |
+| `loop-cli-ux` | #472 | Explicit loop.sh argument handling |
+| `node-bump-markdownlint` | local | Node 22.13→22.20 bump for markdownlint |
+| `token-reduction` | #479 | Slim AGENTS.md into a glossary |
+| `docs-modes-sync` | #483 | Sync modes.md skill inventory |
+| `docs-mentoring-sync` | #482 | Sync mentoring spec to experimental |
+| `eval-setup-status` | #484 | Fix setup-status eval prompts |
+
+---
+
## Work items (planned)
Priority order. Each maps to one branch and one PR. Branch names are
slugs, not numbers (numbering implies an order the specs don't carry).
-1. **Prompt-injection defence hardening.** Skills that ingest external
- content — issue bodies, PR descriptions, mail threads — are potential
- injection surfaces. Audit the highest-risk ingestion skills
- (`security-issue-import`, `security-issue-import-from-pr`,
- `security-issue-import-from-md`, `security-issue-import-via-forwarder`)
- and add explicit injection-resistance guidance (e.g. a
- `treat-as-data` framing block at the ingest boundary) or a validator
- rule in `tools/skill-and-tool-validator/` that flags missing
- data-boundary markers. Validation:
+1. **First release-management skill: release-vote-draft.**
+ `specs/release-management-lifecycle.md` is the only `proposed` spec
+ with zero implemented skills. The adopter contract templates
+ (`projects/_template/release-management-config.md`,
+ `release-build.md`, `pmc-roster.md`, `release-trains.md`,
+ `site-repo.md`) already exist. `release-vote-draft` is the most
+ standalone and highest-frequency PMC task: it takes RC metadata
+ (project name, version, RC number, artifact URLs) and produces a
+ VOTE email draft following ASF conventions. Include an eval suite
+ in `tools/skill-evals/evals/release-vote-draft/`.
+ Validation:
```bash
uv run --project tools/skill-and-tool-validator --group dev
skill-and-tool-validate
- uv run --project tools/skill-evals skill-eval
tools/skill-evals/evals/security-issue-import/
+ uv run --project tools/skill-evals skill-eval
tools/skill-evals/evals/release-vote-draft/
```
- Spec:
[`specs/security-issue-lifecycle.md`](specs/security-issue-lifecycle.md)
- (import path);
[`specs/meta-and-quality-tooling.md`](specs/meta-and-quality-tooling.md)
- (validator surface).
- Branch `injection-guard`.
-
-2. **License-header enforcement.** Skills and tools must carry the
- Apache-2.0 SPDX header (`<!-- SPDX-License-Identifier: Apache-2.0 …
- -->` for Markdown; `# SPDX-License-Identifier: Apache-2.0` for
- Python) per repo-wide `AGENTS.md`. Add a check to
- `tools/skill-and-tool-validator/` that fails when a skill or tool
- source file is missing the header, so new contributions are caught at
- validation time rather than in code review. Validation:
+ Spec:
[`specs/release-management-lifecycle.md`](specs/release-management-lifecycle.md).
+ Branch `release-vote-draft`.
+
+2. **Second release-management skill: release-announce-draft.**
+ Companion to `release-vote-draft`. Takes a successful vote tally
+ (binding +1 count, RC metadata) and produces the ANNOUNCE email
+ draft for the ASF announce@ and dev@ lists, following ASF posting
+ conventions (subject: `[ANNOUNCE] Apache <Project> <Version>
+ released`). Also standalone: it does not depend on
+ `release-vote-draft` being run in the same session. Include an
+ eval suite.
+ Validation:
```bash
uv run --project tools/skill-and-tool-validator --group dev
skill-and-tool-validate
+ uv run --project tools/skill-evals skill-eval
tools/skill-evals/evals/release-announce-draft/
+ ```
+ Spec:
[`specs/release-management-lifecycle.md`](specs/release-management-lifecycle.md).
+ Branch `release-announce-draft`.
+
+3. **Stale-issue sweep for general triage.**
+ `specs/triage-mode.md` Known Gaps explicitly names stale-handling
+ as missing from the general-issue side (the security side covers
+ this via `security-issue-sync`). Add a new skill
+ `issue-stale-sweep` that surfaces issues with no activity past a
+ configurable threshold and proposes closure or an update request
+ (waits for maintainer confirmation before posting). Include an eval
+ suite.
+ Validation:
+ ```bash
+ uv run --project tools/skill-and-tool-validator --group dev
skill-and-tool-validate
+ uv run --project tools/skill-evals skill-eval
tools/skill-evals/evals/issue-stale-sweep/
+ ```
+ Spec: [`specs/triage-mode.md`](specs/triage-mode.md).
+ Branch `issue-stale-sweep`.
+
+4. **First-contribution welcome/orientation skill.**
+ `specs/mentoring-mode.md` Known Gaps names the "first-contribution
+ welcome/orientation skill" as missing. Add `mentoring-welcome`,
+ which greets first-time contributors on a newly opened issue or PR
+ with orientation context: contributing guide link, community norms,
+ expected next steps, and a pointer to the good-first-issue pool.
+ Waits for maintainer confirmation before posting. Include an eval
+ suite.
+ Validation:
+ ```bash
+ uv run --project tools/skill-and-tool-validator --group dev
skill-and-tool-validate
+ uv run --project tools/skill-evals skill-eval
tools/skill-evals/evals/mentoring-welcome/
+ ```
+ Spec: [`specs/mentoring-mode.md`](specs/mentoring-mode.md).
+ Branch `mentoring-welcome`.
+
+5. **ASF-coupling advisory lint (fold into `skill-and-tool-validator`).**
+ `specs/project-agnosticism.md` Known Gaps names the absence of an
+ automated ASF-coupling check as its first gap. Add a new SOFT advisory
+ category to `tools/skill-and-tool-validator` that reuses the existing
+ walk, file allowlist, and inline `e.g.`/`example:` markers (the same
+ machinery as the placeholder check). It flags a curated, tiered set of
+ ASF-coupled tokens in skill bodies (high-confidence:
+ `svn (mv|commit|co)`, `[email protected]`, `dist/(dev|release)/`,
+ Vulnogram URLs; low-confidence: bare `PMC` / `ICLA` / `incubator`) and
+ tags each hit with a remedy class (placeholder / adapter /
+ capability-flag). SOFT only: surfaces on stderr, never fails the build.
+ Extend the validator tests with a coupled fixture and an allowlisted
+ fixture.
+ Validation:
+ ```bash
uv run --project tools/skill-and-tool-validator --group dev pytest
+ uv run --project tools/skill-and-tool-validator --group dev
skill-and-tool-validate
+ ```
+ Spec: [`specs/project-agnosticism.md`](specs/project-agnosticism.md).
+ Branch `asf-coupling-lint`.
+
+6. **Sync drafting-mode spec Known Gaps to reflect shipped skills.**
+ `specs/drafting-mode.md` Known Gaps still says "Generic
+ (non-security, non-issue) Drafting from audit-tool findings is
+ `proposed`", but `audit-finding-fix` shipped with a full eval suite.
+ Update the Known Gaps section to reflect the current state and
+ remove the stale `proposed` claim so new plan passes do not
+ re-raise this as a gap.
+ Validation:
+ ```bash
+ uv run --project tools/spec-validator --group dev spec-validate
tools/spec-loop/specs/
+ uv run --project tools/spec-validator --group dev pytest
+ ```
+ Spec: [`specs/drafting-mode.md`](specs/drafting-mode.md).
+ Branch `drafting-spec-sync`.
+
+7. **Non-ASF adopter profile fixture + smoke eval.**
+ `specs/project-agnosticism.md` acceptance #3 requires that a non-ASF
+ profile can be declared without editing any skill body, but there is
+ no fixture to prove it. Add a worked non-ASF profile under
+ `projects/_template/` (non-ASF values for the existing placeholders
+ and any capability flags) plus a smoke eval that drives a
+ representative skill through it and asserts no skill-body edits are
+ needed. This turns acceptance #3 into a measurable gate. Pure
+ engineering, no policy decision required.
+ Validation:
+ ```bash
+ uv run --project tools/skill-and-tool-validator --group dev
skill-and-tool-validate
+ uv run --project tools/skill-evals skill-eval
tools/skill-evals/evals/non-asf-profile-smoke/
```
- Spec:
[`specs/meta-and-quality-tooling.md`](specs/meta-and-quality-tooling.md).
- Branch `check-headers`.
+ Spec: [`specs/project-agnosticism.md`](specs/project-agnosticism.md).
+ Branch `non-asf-profile-fixture`.
---
@@ -111,7 +226,35 @@ slugs, not numbers (numbering implies an order the specs
don't carry).
it would skip the proof MISSION requires.
- When a build iteration creates a new skill, its eval suite is part of
that same work item — not a separate one.
-- **Next plan pass:** the `adapters.md` spec Known Gaps section was not
- fully read in this pass (only the first 40 lines were sampled). If
- both remaining work items are built before the next plan beat, reading
- `adapters.md` in full is the first step to identify additional items.
+- **Release-management family:** only the two most standalone skills
+ (`release-vote-draft`, `release-announce-draft`) are planned here.
+ The remaining eight (`release-prepare`, `release-keys-sync`,
+ `release-rc-cut`, `release-verify-rc`, `release-vote-tally`,
+ `release-promote`, `release-archive-sweep`, `release-audit-report`)
+ should be planned in subsequent passes once the first two establish
+ the skill-authoring patterns for this family.
+- **Triage contributor-growth gaps** (PMC-member nomination,
+ emeritus-committer handling, contributor offboarding) noted in
+ `triage-mode.md` Known Gaps are intentionally deferred: they are
+ vague enough that a spec-RFC conversation is more appropriate than
+ a direct build item.
+- **Project-agnosticism:** two of the three gaps in
+ `project-agnosticism.md` are buildable and planned now: the ASF-coupling
+ advisory lint (work item 5) and the non-ASF adopter profile fixture
+ (work item 7). The remaining gap, the capability-flag vocabulary for
+ contributor intake (ICLA vs DCO), security intake, and CVE allocation,
+ is deferred only until someone enumerates the option sets and defaults,
+ following the backend-flag precedent already set by
+ `release-management-lifecycle.md` (distribution / approval / announcement
+ backends). That is a spec-authoring task, not yet a build item.
+- **General-issue dedupe and backlog dashboard** (`triage-mode.md` Known
+ Gaps) are deferred behind `issue-stale-sweep` (work item 3): dedupe
+ overlaps the existing `security-issue-deduplicate` matching approach and
+ a backlog dashboard overlaps `pr-management-stats`, so both should reuse
+ those patterns once stale-sweep establishes the general-issue skill
+ shape. Not dropped, sequenced after item 3.
+- **Repo-health family** (`triage-mode.md` Known Gaps: the standalone
+ `ci-runner-audit` plus candidate siblings, GitHub Actions security
+ audit, dependency-update triage, license/NOTICE compliance, flaky-test
+ detection) is deferred pending a family spec; it is a multi-skill area
+ that wants its own spec before any build item.
diff --git a/tools/spec-loop/specs/README.md b/tools/spec-loop/specs/README.md
index fbef80d2..b6b852ee 100644
--- a/tools/spec-loop/specs/README.md
+++ b/tools/spec-loop/specs/README.md
@@ -31,11 +31,13 @@ Start with [`overview.md`](overview.md), then:
[`drafting-mode.md`](drafting-mode.md),
[`pairing-mode.md`](pairing-mode.md).
- Cross-cutting: [`security-issue-lifecycle.md`](security-issue-lifecycle.md),
+ [`release-management-lifecycle.md`](release-management-lifecycle.md),
[`privacy-llm-gate.md`](privacy-llm-gate.md),
[`agent-isolation-sandbox.md`](agent-isolation-sandbox.md),
[`cve-tooling.md`](cve-tooling.md),
[`adoption-and-setup.md`](adoption-and-setup.md),
[`adapters.md`](adapters.md),
+ [`project-agnosticism.md`](project-agnosticism.md),
[`meta-and-quality-tooling.md`](meta-and-quality-tooling.md),
[`security-reporting.md`](security-reporting.md).
diff --git a/tools/spec-loop/specs/adapters.md
b/tools/spec-loop/specs/adapters.md
index 2e2fc32d..744e5e41 100644
--- a/tools/spec-loop/specs/adapters.md
+++ b/tools/spec-loop/specs/adapters.md
@@ -82,3 +82,7 @@ done
- `experimental` overall — adapter coverage varies; a new adopter system
(e.g. GitLab, a different mail backend) is a gap the plan pass records.
+- Adapters cover the *system-swap* case; the broader audit of residual
+ ASF coupling across the catalogue, and the capability-flag mechanism for
+ workflow branches that no adapter resolves, live in
+ [project-agnosticism.md](project-agnosticism.md).
diff --git a/tools/spec-loop/specs/mentoring-mode.md
b/tools/spec-loop/specs/mentoring-mode.md
index 32939ad1..b5e5cffc 100644
--- a/tools/spec-loop/specs/mentoring-mode.md
+++ b/tools/spec-loop/specs/mentoring-mode.md
@@ -115,3 +115,14 @@ uv run --project tools/skill-evals skill-eval
tools/skill-evals/evals/good-first
and readiness thresholds may shift once real backlog candidates run
through it. The curation counterpart (relabeling the *existing* backlog
as good-first-issue candidates) is still unspecced.
+- **The family is one shipped skill deep against a core MISSION stream.**
+ Mentoring is named as one of the four day-to-day work streams, but only
+ `pr-management-mentor` ships (plus the Mentoring-flagged
+ `good-first-issue-author`). Two newcomer-facing capabilities are
+ designed nowhere yet: a *first-contribution welcome / orientation* skill
+ that greets a contributor's first issue or PR with project-convention
+ pointers and a clean hand-off, and a *contributor-to-committer path*
+ tracker that reads the nomination-evidence signals
+ `contributor-nomination` already gathers and surfaces when a contributor
+ is approaching readiness. Both are candidate work items for the plan
+ pass.
diff --git a/tools/spec-loop/specs/meta-and-quality-tooling.md
b/tools/spec-loop/specs/meta-and-quality-tooling.md
index a0c9b43e..9f4b0823 100644
--- a/tools/spec-loop/specs/meta-and-quality-tooling.md
+++ b/tools/spec-loop/specs/meta-and-quality-tooling.md
@@ -45,8 +45,11 @@ trustworthy as it grows.
- `tools/spec-validator/` — validates spec-loop spec frontmatter
(required keys, valid `status`/`kind`/`mode` values, body-section
presence); the spec-side counterpart to `skill-and-tool-validator`.
-- Skills: `write-skill` (author/update a skill), `list-skills`
- (live, generated index of every skill, grouped by family).
+- Skills: `write-skill` (author/update a skill), `optimize-skill`
+ (restructure an existing skill or sweep a set: split oversized
+ `SKILL.md`, lift project-specific values into placeholders, harden
+ prompt-injection defences), `list-skills` (live, generated index of
+ every skill, grouped by family).
## Behaviour & contract
diff --git a/tools/spec-loop/specs/overview.md
b/tools/spec-loop/specs/overview.md
index 294b2680..aebc581f 100644
--- a/tools/spec-loop/specs/overview.md
+++ b/tools/spec-loop/specs/overview.md
@@ -45,12 +45,14 @@ Each mode is an independently toggleable set of skills.
Maturity mirrors
| Area | Spec |
|---|---|
| Security-issue lifecycle (the load-bearing use case) |
[security-issue-lifecycle.md](security-issue-lifecycle.md) |
+| Release-management lifecycle (proposed, spec-first) |
[release-management-lifecycle.md](release-management-lifecycle.md) |
| Privacy-LLM gate + PII redaction |
[privacy-llm-gate.md](privacy-llm-gate.md) |
| Agent isolation / layered sandbox |
[agent-isolation-sandbox.md](agent-isolation-sandbox.md) |
| CVE tooling | [cve-tooling.md](cve-tooling.md) |
| Security reporting & dashboards |
[security-reporting.md](security-reporting.md) |
| Adoption & setup | [adoption-and-setup.md](adoption-and-setup.md) |
| Adapters (Gmail / PonyMail / Jira / GitHub / mail-source / forwarder-relay /
mail-archive / github-body-field / github-rollup) | [adapters.md](adapters.md) |
+| Project-agnosticism (de-ASF coupling) |
[project-agnosticism.md](project-agnosticism.md) |
| Meta & quality tooling |
[meta-and-quality-tooling.md](meta-and-quality-tooling.md) |
## The non-negotiables every area inherits
diff --git a/tools/spec-loop/specs/project-agnosticism.md
b/tools/spec-loop/specs/project-agnosticism.md
new file mode 100644
index 00000000..56452abb
--- /dev/null
+++ b/tools/spec-loop/specs/project-agnosticism.md
@@ -0,0 +1,140 @@
+<!-- SPDX-License-Identifier: Apache-2.0
+ https://www.apache.org/licenses/LICENSE-2.0 -->
+
+---
+title: Project-agnosticism (de-ASF coupling)
+status: experimental
+kind: feature
+mode: infra
+source: >
+ MISSION.md § Abstract and § Affordability and vendor neutrality
+ ("'project' means both an ASF PMC and any non-ASF community, neither is
+ a second-class citizen"). README.md § Skill families. The placeholder +
+ adapter contract in adapters.md and adoption-and-setup.md, and the
+ backend-flag model proven in docs/release-management/ (distribution /
+ approval / announcement backends).
+acceptance:
+ - No shipped skill hardcodes an ASF-only assumption a non-ASF adopter
+ cannot satisfy; every ASF-specific surface is a placeholder, an
+ adapter backend, or a capability-flag branch with a documented
+ non-ASF path and a sensible default.
+ - Behavioural branches that differ by ecosystem (list vote vs
+ PR-approval, svn dist vs github-releases, ICLA vs DCO, mailing-list
+ intake vs GitHub discussion) are selected by a declared
+ `<project-config>` flag, not by editing the skill.
+ - The catalogue stays runnable by an ASF adopter unchanged: ASF is the
+ default profile, not a removed one.
+---
+
+# Project-agnosticism (de-ASF coupling)
+
+## What it does
+
+Keeps the skill catalogue usable by any open-source community, not just
+ASF projects, by ensuring every ASF-specific assumption lives behind one
+of three generalisation mechanisms rather than being baked into a skill.
+MISSION makes non-ASF adopters first-class; this area is the standing
+audit and the mechanism that holds that promise as the catalogue grows.
+
+The three mechanisms, in order of preference:
+
+1. **Placeholders** for project-specific *values* (`<tracker>`,
+ `<upstream>`, `<security-list>`, `<default-branch>`, …), resolved from
+ `<project-config>/`. This is the default and already widely used.
+2. **Adapters** for swapping the backing *system* a step talks to
+ (`tools/gmail`, `tools/ponymail`, `tools/jira`, `tools/github`,
+ `tools/mail-source`). See [adapters.md](adapters.md).
+3. **Capability / backend flags** for the harder case: a step whose
+ *workflow itself* differs by ecosystem. The adopter declares the
+ profile in `<project-config>` and the skill branches on it, keeping the
+ step sequence identical while only the emitted commands / wording
+ change. This is the "conditional flags" mechanism, already modelled in
+ `docs/release-management/` (`release_dist_backend`,
+ `release_approval_mechanism`, `release_announce_backend`).
+
+## Where it lives
+
+- The placeholder + config-resolution contract: `adapters.md`,
+ `adoption-and-setup.md`, and the adopter scaffold
+ `projects/_template/`.
+- The backend-flag precedent: `docs/release-management/README.md`
+ (§ adopter backends) and `projects/_template/release-management-config.md`.
+- The skills carrying residual ASF coupling to audit, by family:
+ - **security**: `security@`-style intake and the ASF security-team
+ relay (`security-issue-import-via-forwarder`), CVE allocation assuming
+ an ASF CNA (`security-cve-allocate`), Vulnogram as the CVE tool.
+ - **contributor / committer growth**: `committer-onboarding`
+ (ICLA gate, PMC vote semantics, `dev@` announce),
+ `contributor-nomination` (committer-vs-PMC roster framing).
+ - **release-management** (proposed): the whole ASF release ritual,
+ already designed with backend flags; the audit confirms the non-ASF
+ paths stay first-class as the skills land.
+ - any skill whose prose names `apache.org` lists, `svn` dist trees,
+ `incubator`, or ASF-only governance steps without a flag.
+
+## Behaviour & contract
+
+- **ASF is the default profile, never the only one.** Generalising a
+ skill must not regress the ASF path; the ASF behaviour becomes the
+ default value of the new flag / adapter, so an ASF adopter sees no
+ change.
+- **Prefer the lightest mechanism.** A value goes in a placeholder; a
+ system swap goes in an adapter; only a genuine workflow fork gets a
+ capability flag. Do not add a flag where a placeholder suffices.
+- **Every flag has a documented non-ASF path.** A capability flag that
+ only enumerates ASF options (e.g. an approval mechanism with just
+ `dev-list-vote`) is incomplete; it must name at least one non-ASF
+ option (`pr-approval`, `maintainer-roster`, `github-discussion`, …) and
+ describe the adopter-facing default.
+- **Advisory, not paternalistic.** The audit surfaces candidate coupling
+ for a maintainer to judge; some ASF strings are legitimate (examples,
+ the ASF default profile, ASF-specific docs). It does not auto-rewrite.
+
+## Out of scope
+
+- Removing or de-prioritising ASF support: ASF is the reference adopter
+ and the default profile.
+- The privacy gate and sandbox ([privacy-llm-gate.md](privacy-llm-gate.md),
+ [agent-isolation-sandbox.md](agent-isolation-sandbox.md)), which are
+ already project-agnostic.
+- The runtime adapter implementations themselves (that is
+ [adapters.md](adapters.md)); this area governs the *coupling audit* and
+ the *flag contract*, not the adapter code.
+
+## Acceptance criteria
+
+1. Every shipped skill is auditable for ASF coupling, and each residual
+ coupling is a placeholder, an adapter backend, or a capability-flag
+ branch with a non-ASF default.
+2. Ecosystem-divergent workflow steps branch on a declared
+ `<project-config>` flag, not on skill edits.
+3. The ASF profile runs the catalogue unchanged (default-valued flags),
+ and a non-ASF profile can be declared without editing any skill body.
+
+## Validation
+
+```bash
+# Advisory sweep: surface ASF-coupled tokens in skill bodies that should
+# be a placeholder, an adapter backend, or a capability-flag branch.
+# Expected to flag legitimate ASF-default examples too; a human judges.
+grep -rInE 'apache\.org|[[:alpha:]]+@apache|\bdev@|\bannounce@|\bICLA\b|\bsvn
(mv|co|commit)|\bincubator\b|Vulnogram' skills/ \
+ | grep -vE '<[a-z-]+>' | head -40
+uv run --project tools/skill-and-tool-validator --group dev
skill-and-tool-validate
+```
+
+## Known gaps
+
+- **No automated ASF-coupling lint exists.** The sweep above is a manual
+ grep; a deterministic advisory check (analogous to the
+ `skill-and-tool-validator` warnings, with an allowlist for legitimate
+ ASF-default strings) is a candidate work item.
+- **No non-ASF adopter profile fixture exists** to run the catalogue
+ against. A `projects/_template` non-ASF profile plus a smoke eval that
+ drives a representative skill through it would turn acceptance #3 into a
+ measurable gate.
+- **The capability-flag vocabulary is defined only for
+ release-management.** The same backend-flag treatment is still owed to:
+ contributor intake (ICLA vs DCO vs none), security intake
+ (`security@`-list + ASF-team relay vs a project's own private intake),
+ and CVE allocation (ASF CNA vs adopter CNA vs no-CVE). Each is a
+ candidate work item for the plan pass.
diff --git a/tools/spec-loop/specs/release-management-lifecycle.md
b/tools/spec-loop/specs/release-management-lifecycle.md
new file mode 100644
index 00000000..7c4609e2
--- /dev/null
+++ b/tools/spec-loop/specs/release-management-lifecycle.md
@@ -0,0 +1,136 @@
+<!-- SPDX-License-Identifier: Apache-2.0
+ https://www.apache.org/licenses/LICENSE-2.0 -->
+
+---
+title: Release-management lifecycle (end-to-end)
+status: proposed
+kind: feature
+mode: Drafting
+source: >
+ MISSION.md § Initial Goals ("cut a first Apache release through the
+ standard process within 3 months of resolution adoption"). README.md
+ § Skill families (release-management, proposed). Designed spec-first in
+ docs/release-management/ (README.md, process.md, spec.md) plus the
+ adopter scaffold projects/_template/release-management-config.md. No
+ release-* skill code exists yet.
+acceptance:
+ - The family's design (14-step process, per-skill state-change
+ boundaries, adopter contract) is reviewable independently of any
+ runtime skill; it already is, in docs/release-management/.
+ - Each release-* skill, when it lands, ships flagged `experimental` and
+ carries `mode: Drafting` or `mode: Triage` per the skill table.
+ - The agent never holds, invokes, or proxies the Release Manager's
+ signing key, and never publishes the release; steps 3, 4, 10, 11 emit
+ paste-ready recipes the human executes as themselves.
+---
+
+# Release-management lifecycle
+
+## What it does
+
+End-to-end automation for an ASF project's release lifecycle, from the
+planning issue and version bump through to `[ANNOUNCE]` on
+`[email protected]`, the archive sweep, and the per-release audit log.
+Ten skills compose into the canonical 14-step process. The procedural
+shape is foundation-wide; project-specific content (release-train
+identity, build invocation, `KEYS` path, vote-window length, retention
+rule, audit-log location) plugs in through `<project-config>/`, exactly
+as the security family does. Non-ASF adopters are first-class: the
+distribution backend, approval mechanism, and announcement backend each
+parametrise the lifecycle without baking in an ASF assumption.
+
+This is the load-bearing parallel to the security-issue lifecycle: a
+multi-skill, high-procedure ASF-process family with shared
+state-change-boundary discipline, designed docs-first before any skill
+code lands.
+
+## Where it lives
+
+- Design docs (present today): `docs/release-management/README.md`
+ (family overview + skill table), `docs/release-management/process.md`
+ (14-step lifecycle, Mermaid flow, label reference),
+ `docs/release-management/spec.md` (per-skill scope and state-change
+ boundary).
+- Adopter contract: `projects/_template/release-management-config.md`,
+ `projects/_template/release-build.md`, `projects/_template/pmc-roster.md`,
+ `projects/_template/site-repo.md`, and the shared
+ `projects/_template/release-trains.md`.
+- Skills (all `proposed`, none implemented yet): `release-prepare`,
+ `release-keys-sync`, `release-rc-cut`, `release-verify-rc`,
+ `release-vote-draft`, `release-vote-tally`, `release-promote`,
+ `release-announce-draft`, `release-archive-sweep`,
+ `release-audit-report`.
+- Adapters it will read/draft through: `tools/github`, `tools/ponymail`
+ (vote threads), `tools/gmail` (announce/vote drafts), plus the project's
+ `svn` dist tree as a distribution backend.
+
+## Behaviour & contract
+
+- **The agent never holds the signing key.** Steps 3 (`KEYS`), 4 (RC tag,
+ sign, checksums, `svn` import to `dist/dev/<project>/`), and 10
+ (`svn mv dist/dev → dist/release`) emit paste-ready command recipes; the
+ Release Manager runs every signing and `svn commit` operation as
+ themselves. Mirrors `security-cve-allocate` (Vulnogram URL + paste-ready
+ JSON, human submits).
+- **The agent never publishes the release.** Step 10 (promotion) and step
+ 11 (`[ANNOUNCE]` send + site-bump merge) are the moments of release; the
+ agent drafts artefacts, the RM and PMC execute and merge.
+- **Drafts, never sends.** `[VOTE]` (step 7) and `[ANNOUNCE]` (step 11)
+ email bodies are drafted to the maintainer's outbox; no skill calls a
+ send.
+- **Conservative tally.** `release-vote-tally` classifies +1/0/-1 binding
+ vs non-binding against the PMC roster and refuses to count ambiguous
+ votes, flagging `AMBIGUOUS, needs RM call` rather than guessing.
+- **Read-only verification.** `release-verify-rc` (signatures, checksums,
+ RAT license headers, NOTICE/LICENSE, prohibited binaries, version
+ consistency) and `release-audit-report` make no state change; voters can
+ run verification in their own dev loop before posting `+1`.
+- **Promotion gated on health evidence, not throughput.** Moving any
+ release-* skill from `experimental` to default-on, or from Drafting to a
+ state-changing lane, requires evidence from Release Managers and binding
+ voters that the process is healthier (fewer stalled RCs, shorter
+ time-to-`[ANNOUNCE]`, fewer reverted promotions).
+
+## Out of scope
+
+- Holding, invoking, or proxying the RM's private signing key.
+- Publishing the release: the `svn mv` promotion, the `[ANNOUNCE]` send,
+ and the site-bump merge are human acts.
+- A new mode. Release-management is a family spanning the existing Triage
+ and Drafting modes; it introduces no new mode.
+
+## Acceptance criteria
+
+1. The 14-step process, per-skill state-change boundaries, and adopter
+ contract are reviewable from `docs/release-management/` without any
+ skill code (they are today).
+2. Each `release-*` skill, as it lands, validates under
+ `skill-and-tool-validate`, ships `experimental`, and carries the
+ `mode` its skill-table row assigns.
+3. No skill in the family signs, imports, promotes, sends, or merges on
+ autopilot; the key-holding and publishing steps emit paste-ready
+ recipes only.
+
+## Validation
+
+```bash
+test -f docs/release-management/spec.md
+test -f docs/release-management/process.md
+test -f projects/_template/release-management-config.md
+uv run --project tools/skill-and-tool-validator --group dev
skill-and-tool-validate
+```
+
+## Known gaps
+
+- **No `release-*` skill code exists yet.** The family is `proposed`,
+ designed docs-first (mirroring Mentoring). All ten skills land in
+ follow-up PRs, each flagged `experimental`. The plan pass turns each
+ un-implemented skill in the `docs/release-management/` table into a work
+ item.
+- **No eval suites exist** under `tools/skill-evals/evals/release-*/`;
+ each skill needs one per the per-skill-eval convention before it can
+ graduate from `experimental`.
+- **Health-evidence promotion criteria are unmeasured.** No adopter has
+ cut a release through the family yet, so the RM/binding-voter evidence
+ window that would justify default-on or a state-changing lane has no
+ data behind it.
diff --git a/tools/spec-loop/specs/triage-mode.md
b/tools/spec-loop/specs/triage-mode.md
index 1c469993..41f1027a 100644
--- a/tools/spec-loop/specs/triage-mode.md
+++ b/tools/spec-loop/specs/triage-mode.md
@@ -30,7 +30,9 @@ suggestion the human signs off on.
## Where it lives
- PR queue: `pr-management-triage`, `pr-management-stats`,
- `pr-management-code-review` (deep review is a triage variant).
+ `pr-management-code-review` (deep review is a triage variant),
+ `pr-management-quick-merge` (read-only express-lane surfacing of
+ trivial, low-risk PRs a maintainer can review in seconds).
Reference implementation: `tools/pr-management-stats/`.
- General issues: `issue-triage`, `issue-reassess`, `issue-reproducer`.
Companion reporting skill: `issue-reassess-stats` (read-only dashboard
@@ -78,3 +80,25 @@ uv run --project tools/skill-and-tool-validator --group dev
skill-and-tool-valid
- PR and general-issue triage are `experimental` — no adopter-pilot eval
has run; behaviour may change.
+- **General-issue triage lacks the dedupe, stale-handling, and
+ backlog-dashboard coverage the security side already has.** There is
+ no general-issue deduplication skill (only `security-issue-deduplicate`
+ exists), no stale-issue management (nudge, then propose-close after a
+ warning window), and no general open-issue backlog dashboard
+ (`pr-management-stats` covers PRs; `issue-reassess-stats` only covers
+ reassess-campaign `verdict.json` output). Each is a candidate work item.
+- **The contributor-growth skills are not yet a formalised family.**
+ `contributor-nomination`, `contributor-activity-sweep`,
+ `committer-onboarding`, and `good-first-issue-author` (Mentoring) span
+ the contributor-to-committer path but are catalogued ad hoc;
+ `contributor-activity-sweep` and `committer-onboarding` are not yet
+ referenced by any spec. Missing members of that path: PMC-member
+ nomination (distinct from committer), emeritus / inactive-committer
+ handling, and contributor offboarding. Worth deciding whether this
+ becomes a named family.
+- **Repo-health audits are a one-off with no family around them.**
+ `ci-runner-audit` is a standalone read-only audit (obsolete runner
+ labels, macOS arch mismatches) with no sibling skills. A repo-health
+ family is a candidate: GitHub Actions workflow security audit (the repo
+ already runs `zizmor` in pre-commit), dependency-update triage,
+ license / NOTICE compliance, and flaky-test detection.