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 ee21d85 docs: scope expansion (Pairing mode) + mode-letter rename
(#99)
ee21d85 is described below
commit ee21d85affe042cbe1a8f5d6e5c8d9a0b45beb8c
Author: Jarek Potiuk <[email protected]>
AuthorDate: Sun May 10 12:44:12 2026 +0200
docs: scope expansion (Pairing mode) + mode-letter rename (#99)
Two changes landed together because the rename also introduces
the new mode:
1. Apply Russell Spitzer's kickoff-thread feedback: extend the
project's scope from agent-assisted maintainership to
maintainership AND development. New "Pairing" mode covers
developer-side dev-cycle skills (multi-agent dev workflow,
self-review and pre-flight patterns, scoped agent-drafted
patches under the developer's own driver's seat). Mentorship
is intrinsic to Pairing — agents handle implementation-detail
review so the human conversation stays on design, reasoning,
and the ASF contributor → committer → PMC progression.
Pairing ships before Auto-merge in the project's automation
roadmap.
2. Rename Mode A/B/C/D to single-word names so references read
without lookup:
Mode A → Triage
Mode B → Mentoring
Mode C → Drafting
(new) → Pairing
Mode D → Auto-merge
Auto-merge's gating sentence updated to require Triage,
Mentoring, Drafting, AND Pairing running for two quarters
before it can ship.
Touches MISSION.md, docs/modes.md (canonical taxonomy doc),
docs/rfcs/RFC-AI-0004.md, docs/security/threat-model.md,
docs/mentoring/{README,spec}.md, the pr-management-mentor skill
files, the projects/_template/mentoring-config.md scaffold, the
.asf.yaml description, and the skill-validator code + tests
(ALLOWED_MODES updated). DocToc TOCs regenerated by prek.
Generated-by: Claude Code (Claude Opus 4.7)
---
.asf.yaml | 2 +-
.claude/skills/pr-management-code-review/SKILL.md | 2 +-
.claude/skills/pr-management-mentor/SKILL.md | 20 +--
.../pr-management-mentor/comment-templates.md | 4 +-
.claude/skills/pr-management-mentor/tone-checks.md | 6 +-
.claude/skills/pr-management-triage/SKILL.md | 2 +-
.claude/skills/security-cve-allocate/SKILL.md | 2 +-
.claude/skills/security-issue-deduplicate/SKILL.md | 2 +-
.claude/skills/security-issue-fix/SKILL.md | 2 +-
.../skills/security-issue-import-from-md/SKILL.md | 2 +-
.../skills/security-issue-import-from-pr/SKILL.md | 2 +-
.claude/skills/security-issue-import/SKILL.md | 2 +-
.claude/skills/security-issue-invalidate/SKILL.md | 2 +-
.claude/skills/security-issue-sync/SKILL.md | 2 +-
MISSION.md | 34 +++---
docs/mentoring/README.md | 10 +-
docs/mentoring/spec.md | 53 ++++----
docs/modes.md | 135 +++++++++++++--------
docs/rfcs/RFC-AI-0004.md | 8 +-
docs/security/threat-model.md | 44 +++----
projects/_template/mentoring-config.md | 12 +-
.../src/skill_validator/__init__.py | 4 +-
tools/skill-validator/tests/test_validator.py | 10 +-
23 files changed, 203 insertions(+), 159 deletions(-)
diff --git a/.asf.yaml b/.asf.yaml
index 1655abe..8613e43 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -18,7 +18,7 @@
# https://cwiki.apache.org/confluence/display/INFRA/git+-+.asf.yaml+features
---
github:
- description: "Agent-assisted maintainership framework for Apache projects —
triage (Mode A) and agent-authored fixes with human review (Mode C); mentoring
(Mode B) and narrowly-scoped auto-merge (Mode D) on the roadmap."
+ description: "Agent-assisted maintainership and development framework for
Apache projects — Triage and Drafting (agent-authored fixes with human review);
Mentoring, Pairing (developer-side dev-cycle), and Auto-merge on the roadmap."
homepage: "https://github.com/apache/airflow-steward"
labels:
# Note that GitHub only supports <=20 labels/topics per repo! Pipeline
diff --git a/.claude/skills/pr-management-code-review/SKILL.md
b/.claude/skills/pr-management-code-review/SKILL.md
index 0495761..0fdc490 100644
--- a/.claude/skills/pr-management-code-review/SKILL.md
+++ b/.claude/skills/pr-management-code-review/SKILL.md
@@ -1,6 +1,6 @@
---
name: maintainer-review
-mode: A
+mode: Triage
description: |
Walk a maintainer through deep code review of open pull requests on the
configured `<upstream>` repo (default: read from `<project-config>/project.md →
upstream_repo`). The
default working list — referred to throughout the docs as **"my reviews"** —
is the union of five signals on the
diff --git a/.claude/skills/pr-management-mentor/SKILL.md
b/.claude/skills/pr-management-mentor/SKILL.md
index 6217866..6488cd2 100644
--- a/.claude/skills/pr-management-mentor/SKILL.md
+++ b/.claude/skills/pr-management-mentor/SKILL.md
@@ -1,6 +1,6 @@
---
name: pr-management-mentor
-mode: B
+mode: Mentoring
description: |
Draft a teaching-register comment on a single GitHub issue or
PR thread on the configured `<upstream>` repo (default: read
@@ -13,7 +13,7 @@ description: |
maintainer confirmation before posting via `gh`. Does **not**
triage (no labels, draft toggles, closes), review code (no
diff comments, approve / request-changes), or open PRs — those
- are Mode A and Mode C surfaces. Bows out and pings the
+ are Triage and Drafting surfaces. Bows out and pings the
configured maintainer team when the thread reaches
`max_agent_turns`, when the contributor pushes back on a
substantive design point, when the topic enters
@@ -27,7 +27,7 @@ when_to_use: |
contributor, missing repro / convention". Not appropriate for
PRs already mid-review with a maintainer (the agent should
not talk over a human reviewer), for security-sensitive
- threads (Mode B always hands off these), or for any thread
+ threads (Mentoring always hands off these), or for any thread
where the maintainer has *deliberately* not replied yet — ask
before invoking.
license: Apache-2.0
@@ -42,7 +42,7 @@ license: Apache-2.0
# pr-management-mentor
-**Status: experimental.** First prototype of Mode B
+**Status: experimental.** First prototype of Mentoring
([conversational mentoring](../../../docs/mentoring/spec.md)). The
skill exists to make the spec executable on a single thread at
a time so we can iterate on tone wording, convention pointers,
@@ -58,7 +58,7 @@ answer, for the invoked thread, one question:
> what does it say?*
If the answer is "no" (thread is already on track, maintainer
-already engaging, scope exceeds Mode B), the skill says so and
+already engaging, scope exceeds Mentoring), the skill says so and
exits without posting. The agent's silence is a feature, not a
failure.
@@ -118,7 +118,7 @@ is short on purpose — one comment in, one decision out:
audience.
3. **Out-of-scope check**. If the thread title or recent
comments touch any `out_of_scope_topics` entry, **do not
- draft**. Surface "this thread is out of Mode B scope —
+ draft**. Surface "this thread is out of Mentoring scope —
handing off" and run the [hand-off](hand-off.md) flow.
4. **Maintainer-already-engaged check**. If a maintainer (login
in the configured committers team, see `pr-management-config.md →
@@ -178,7 +178,7 @@ maintainer reads the thread.
- **Triage.** No labels, no draft toggles, no closes.
[`pr-management-triage`](../pr-management-triage/SKILL.md)
owns that.
-- **Authoring fixes.** No PRs opened. That is Mode C.
+- **Authoring fixes.** No PRs opened. That is Drafting.
- **Predicting maintainer decisions.** The skill never says
"the maintainers will probably want X". It says "a
maintainer will reply on this; in the meantime, here's the
@@ -188,7 +188,7 @@ maintainer reads the thread.
voice; the agent does not have a list-subscriber identity.
- **Auto-fire.** Every invocation is opt-in by a maintainer.
No cron, no webhook, no auto-trigger. Auto-fire is a
- Mode-D-shaped problem and inherits Mode D's sequencing
+ Auto-merge-shaped problem and inherits Auto-merge's sequencing
constraint.
## Cross-references
@@ -197,10 +197,10 @@ maintainer reads the thread.
the full spec this skill implements.
- [`docs/mentoring/README.md`](../../../docs/mentoring/README.md) —
family overview + status.
-- [`docs/modes.md` § Mode
B](../../../docs/modes.md#mode-b--conversational-mentoring) —
+- [`docs/modes.md` § Mentoring](../../../docs/modes.md#mentoring) —
current implementation status (experimental once this skill
ships).
-
[`projects/_template/mentoring-config.md`](../../../projects/_template/mentoring-config.md)
—
adopter scaffold.
-- [`MISSION.md` § Mode B](../../../MISSION.md#technical-scope) —
+- [`MISSION.md` § Mentoring](../../../MISSION.md#technical-scope) —
RAI empowerment framing.
diff --git a/.claude/skills/pr-management-mentor/comment-templates.md
b/.claude/skills/pr-management-mentor/comment-templates.md
index 4a8b651..fdd628c 100644
--- a/.claude/skills/pr-management-mentor/comment-templates.md
+++ b/.claude/skills/pr-management-mentor/comment-templates.md
@@ -96,7 +96,7 @@ Listed so reviewers see the choices and can push back.
agent posting "welcome to the project!" before the
maintainer has the chance is rude and cuts the maintainer
out of the relationship. If a project wants a welcome
- comment, that is a triage-level concern, not a Mode B
+ comment, that is a triage-level concern, not a Mentoring
concern.
- **Closing comment**. The skill never posts on a thread it is
about to close — closing belongs to triage. If the
@@ -104,7 +104,7 @@ Listed so reviewers see the choices and can push back.
skill exits without commenting and lets
[`pr-management-triage`](../pr-management-triage/SKILL.md)
handle the close.
-- **Approval / "looks good"**. Mode B does not signal review
+- **Approval / "looks good"**. Mentoring does not signal review
outcomes. Even a casual "this looks like a good direction"
shifts contributor expectations.
[`pr-management-code-review`](../pr-management-code-review/SKILL.md)
diff --git a/.claude/skills/pr-management-mentor/tone-checks.md
b/.claude/skills/pr-management-mentor/tone-checks.md
index 5583a45..a7ac4e6 100644
--- a/.claude/skills/pr-management-mentor/tone-checks.md
+++ b/.claude/skills/pr-management-mentor/tone-checks.md
@@ -23,7 +23,7 @@ The checks run in order. The first failure stops the run.
| # | Rule | Detection |
|---|---|---|
-| 1 | No praise without specificity. | Reject if the draft contains "great
question", "thanks for the contribution", "awesome", "amazing", "fantastic",
"love this", or any standalone praise sentence (a sentence whose only content
is positive affect). Praise *with* a specific reference ("nice catch on the
off-by-one in `foo()`") is fine, but Mode B does not have that information by
construction; in practice this rule means: no praise. |
+| 1 | No praise without specificity. | Reject if the draft contains "great
question", "thanks for the contribution", "awesome", "amazing", "fantastic",
"love this", or any standalone praise sentence (a sentence whose only content
is positive affect). Praise *with* a specific reference ("nice catch on the
off-by-one in `foo()`") is fine, but Mentoring does not have that information
by construction; in practice this rule means: no praise. |
| 2 | No restating the contributor's message. | Reject if the draft contains
"so what you're saying is", "if I understand correctly", "you mentioned that",
or any sentence whose content is a paraphrase of the contributor's most recent
message. |
| 3 | No AI self-reference outside the footer. | Reject if the body
(everything before `<ai_attribution_footer>`) contains "as an AI", "I'm an AI",
"I cannot", "as a language model", "I was trained", "my training", or "I don't
have access to". The footer says it once. The body says nothing. |
| 4 | No speaking for the maintainer. | Reject if the draft contains "the
maintainers will probably", "the maintainers want", "the team would prefer", or
any forward-looking claim about a maintainer decision. The skill says "a
maintainer will reply" and stops. |
@@ -32,7 +32,7 @@ The checks run in order. The first failure stops the run.
| 7 | Footer present and verbatim. | Reject if the draft does not end with the
literal `<ai_attribution_footer>` expansion from
`<project-config>/mentoring-config.md`. Reject if anything follows the footer. |
| 8 | Author tagged once. | Reject if `@<author>` appears zero times or more
than once. The first line tags; the rest of the comment does not. |
| 9 | No paraphrased docs. | Reject if the body contains a quoted block of
more than two lines from a project doc. The convention is link, don't quote. |
-| 10 | No predictions about review outcome. | Reject if the draft contains
"looks good", "this should be approved", "this will probably be merged", "I
don't think this will land". Mode B does not signal review outcomes. |
+| 10 | No predictions about review outcome. | Reject if the draft contains
"looks good", "this should be approved", "this will probably be merged", "I
don't think this will land". Mentoring does not signal review outcomes. |
---
@@ -67,5 +67,5 @@ Surfaced so reviewers can push back.
the right length depends on the intervention; a why-question
answer can legitimately need a few sentences of context.
- **Inclusivity / language scan.** Important, but lives in the
- framework's general writing standards, not in the Mode B
+ framework's general writing standards, not in the Mentoring
tone checks specifically.
diff --git a/.claude/skills/pr-management-triage/SKILL.md
b/.claude/skills/pr-management-triage/SKILL.md
index 5b43280..9d9129a 100644
--- a/.claude/skills/pr-management-triage/SKILL.md
+++ b/.claude/skills/pr-management-triage/SKILL.md
@@ -1,6 +1,6 @@
---
name: pr-management-triage
-mode: A
+mode: Triage
description: |
Sweep open pull requests on the configured `<upstream>` repo
(default: read from `<project-config>/project.md →
diff --git a/.claude/skills/security-cve-allocate/SKILL.md
b/.claude/skills/security-cve-allocate/SKILL.md
index 4836e8b..ac269e2 100644
--- a/.claude/skills/security-cve-allocate/SKILL.md
+++ b/.claude/skills/security-cve-allocate/SKILL.md
@@ -1,6 +1,6 @@
---
name: security-cve-allocate
-mode: A
+mode: Triage
description: |
Walk a security team member through allocating a CVE for an
<tracker> tracking issue. Prints the ASF Vulnogram
diff --git a/.claude/skills/security-issue-deduplicate/SKILL.md
b/.claude/skills/security-issue-deduplicate/SKILL.md
index 6f35ac7..b5dafa0 100644
--- a/.claude/skills/security-issue-deduplicate/SKILL.md
+++ b/.claude/skills/security-issue-deduplicate/SKILL.md
@@ -1,6 +1,6 @@
---
name: security-issue-deduplicate
-mode: A
+mode: Triage
description: |
Merge two <tracker> tracking issues that describe the same
root-cause vulnerability (typically discovered independently by two
diff --git a/.claude/skills/security-issue-fix/SKILL.md
b/.claude/skills/security-issue-fix/SKILL.md
index c0a6356..974be3d 100644
--- a/.claude/skills/security-issue-fix/SKILL.md
+++ b/.claude/skills/security-issue-fix/SKILL.md
@@ -1,6 +1,6 @@
---
name: security-issue-fix
-mode: C
+mode: Drafting
description: |
Attempt to fix a security issue tracked in <tracker> by
implementing the change in a public <upstream> PR. Runs the
diff --git a/.claude/skills/security-issue-import-from-md/SKILL.md
b/.claude/skills/security-issue-import-from-md/SKILL.md
index 0d0202c..6bfb7bf 100644
--- a/.claude/skills/security-issue-import-from-md/SKILL.md
+++ b/.claude/skills/security-issue-import-from-md/SKILL.md
@@ -1,6 +1,6 @@
---
name: security-issue-import-from-md
-mode: A
+mode: Triage
description: |
Open one or more `<tracker>` tracking issues from a markdown file
containing a batch of security findings (typically the output of an
diff --git a/.claude/skills/security-issue-import-from-pr/SKILL.md
b/.claude/skills/security-issue-import-from-pr/SKILL.md
index 7dadc94..30aad04 100644
--- a/.claude/skills/security-issue-import-from-pr/SKILL.md
+++ b/.claude/skills/security-issue-import-from-pr/SKILL.md
@@ -1,6 +1,6 @@
---
name: security-issue-import-from-pr
-mode: A
+mode: Triage
description: |
Open a tracking issue in <tracker> for a security-relevant fix that
has already been opened (or merged) as a public PR in <upstream>,
diff --git a/.claude/skills/security-issue-import/SKILL.md
b/.claude/skills/security-issue-import/SKILL.md
index 57f9474..aa61897 100644
--- a/.claude/skills/security-issue-import/SKILL.md
+++ b/.claude/skills/security-issue-import/SKILL.md
@@ -1,6 +1,6 @@
---
name: security-issue-import
-mode: A
+mode: Triage
description: |
Scan <security-list> for reports that have not yet been
copied into <tracker> as tracking issues, present the proposed
diff --git a/.claude/skills/security-issue-invalidate/SKILL.md
b/.claude/skills/security-issue-invalidate/SKILL.md
index 909fb2b..24b82d6 100644
--- a/.claude/skills/security-issue-invalidate/SKILL.md
+++ b/.claude/skills/security-issue-invalidate/SKILL.md
@@ -1,6 +1,6 @@
---
name: security-issue-invalidate
-mode: A
+mode: Triage
description: |
Close an `<tracker>` tracking issue as invalid: apply the
`invalid` label, remove the scope label, post a short closing
diff --git a/.claude/skills/security-issue-sync/SKILL.md
b/.claude/skills/security-issue-sync/SKILL.md
index d0df918..3a331dd 100644
--- a/.claude/skills/security-issue-sync/SKILL.md
+++ b/.claude/skills/security-issue-sync/SKILL.md
@@ -1,6 +1,6 @@
---
name: security-issue-sync
-mode: A
+mode: Triage
description: |
Synchronize a security issue in <tracker> with the state of its
GitHub discussion, the <security-list> mailing thread, and any
diff --git a/MISSION.md b/MISSION.md
index 5982162..4dfd327 100644
--- a/MISSION.md
+++ b/MISSION.md
@@ -31,17 +31,18 @@
## Abstract
-Apache `<PROJECT_NAME>` is platform infrastructure for **agent-assisted
repository maintainership** — across the ASF and equally for any open-source
project that wants in. Three streams of day-to-day work:
+Apache `<PROJECT_NAME>` is platform infrastructure for **agent-assisted
repository maintainership and development** — across the ASF and equally for
any open-source project that wants in. Four streams of day-to-day work:
- **Security-issue handling** end-to-end — inbound triage, deduplication,
agent-drafted reporter replies under human review, CVE allocation hand-off,
audit-logged status tracking through publication.
- **Issue and PR triage and management** — including audit-tool findings
(Apache Verum, Apache Caer, equivalents) ingested as actionable issues.
- **Conversational contributor mentoring** — meeting new contributors where
they are.
+- **Development-cycle skills for committers and contributors, mentorship built
in** — multi-agent development workflows, self-review and pre-flight patterns,
scoped agent-drafted patches under the developer's own driver's seat.
Mentorship is intrinsic, not a separate mode: the agent handles
implementation-detail review (formatting, conventions, lint-grade nits) so the
human conversation between contributor and maintainer — and between peer
maintainers — stays on design, reasoning, and th [...]
One conviction underneath: each project picks how much automation actually
fits. The platform makes a range of automation levels possible without picking
one for you, and "project" means both an ASF PMC and any non-ASF community —
neither is a second-class citizen.
## Proposal
-The Apache Software Foundation establishes the Apache `<PROJECT_NAME>` Project
as a Top-Level Project by Board resolution, scope: agent-assisted
repository-maintainership infrastructure under the Apache License, Version 2.0.
+The Apache Software Foundation establishes the Apache `<PROJECT_NAME>` Project
as a Top-Level Project by Board resolution, scope: agent-assisted repository
**maintainership and development** infrastructure under the Apache License,
Version 2.0.
## Proposed Names
@@ -60,21 +61,24 @@ The initial committee will discuss and vote on the final
name. Starting candidat
Open-source projects share the same shape of problem: contributors keep
arriving, reviewers don't scale to match, and the highest-stakes work —
security-issue handling — is the *most* manual, the *most* reviewer-intensive,
and the *most* embarrassing to get wrong. The two complaints heard most loudly
— **onboarding latency** and **review-cycle latency** — are the priorities the
ASF Responsible AI Initiative names. `<PROJECT_NAME>` is the operational layer
for those goals: not a position [...]
-Three design choices set the project apart from "just bolt a code-review bot
on it":
+Four design choices set the project apart from "just bolt a code-review bot on
it":
-**Project autonomy is the structural starting point — and "project" includes
non-ASF.** Four modes (A – triage, B – mentoring, C – agent-authored fix with
human review, D – narrowly-scoped auto-merge) ship as separate,
independently-toggleable skills. Each project picks the modes that match its
culture and risk tolerance. ASF integrations (private lists, Vulnogram CVE
flows, PMC roles, ASF release process) live behind clean configuration
boundaries; non-ASF adopters swap them for whateve [...]
+**Project autonomy is the structural starting point — and "project" includes
non-ASF.** Five modes — **Triage**, **Mentoring**, **Drafting** (agent-authored
fix with human review), **Pairing** (developer-side dev-cycle skills with
mentorship intrinsic), and **Auto-merge** (narrowly-scoped fix-and-merge) —
ship as separate, independently-toggleable skills. Each project picks the modes
that match its culture and risk tolerance. ASF integrations (private lists,
Vulnogram CVE flows, PMC role [...]
-**Security-issue handling is a load-bearing use case, not a footnote on
triage.** The work that became `<PROJECT_NAME>` started as a framework for
handling ASF security reports — high-stakes, high-procedure,
every-step-needs-an-audit-trail flows that turn out to be exactly what
agent-assisted-with-human-gates is good at. Every Mode A/B/C/D capability has
to clear the security-flow bar (private content stays private, every outbound
draft has a human signature, every state change is logged [...]
+**Security-issue handling is a load-bearing use case, not a footnote on
triage.** The work that became `<PROJECT_NAME>` started as a framework for
handling ASF security reports — high-stakes, high-procedure,
every-step-needs-an-audit-trail flows that turn out to be exactly what
agent-assisted-with-human-gates is good at. Every mode has to clear the
security-flow bar (private content stays private, every outbound draft has a
human signature, every state change is logged) before it ships. [...]
**Mentoring is a first-class mode, not a side-effect of triage.** The lever
the ASF — and the wider open-source world — actually needs and the one
off-the-shelf agent tooling skips. Meets new contributors where they are,
explains conventions, points at the relevant prior PR, asks the clarifying
question *before* a reviewer burns time on it. This is where the Responsible AI
Initiative's contributor-empowerment goal gets operationalised: the mode that
produces the outcomes RAI is trying to [...]
+**Development-cycle skills sit alongside maintainership skills, with
mentorship intrinsic to them.** Maintainers also write code; contributors live
the development side of every project. The same agentic primitives that triage
an inbound report or mentor a new contributor compose into a committer's or
contributor's own dev loop: multi-agent review pipelines that catch issues
before submission, self-review patterns that pre-flight a PR against project
conventions, scoped agent-drafted pat [...]
+
## Initial Goals
- Stand up `github.com/apache/<PROJECT_NAME>` with project skeleton, CI, and
contributor docs.
- Provision standard ASF infrastructure: `private@`, `dev@`, `commits@`;
GitHub Issues; site at `<PROJECT_NAME>.apache.org`.
-- Get modes A–C running against **3–4 friendly pilots within 3 months** — at
least one ASF PMC running the full security-issue flow (Airflow, given the
project's lineage), one ASF PMC running just triage + mentoring (Arrow or ATR),
and **at least one non-ASF project from day one** (Python core has folks
interested). Non-ASF in the first cohort, not later — the
project-governance-agnosticism claim is only worth what it can prove.
+- Get **Triage**, **Mentoring**, and **Drafting** running against **3–4
friendly pilots within 3 months** — at least one ASF PMC running the full
security-issue flow (Airflow, given the project's lineage), one ASF PMC running
just Triage + Mentoring (Arrow or ATR), and **at least one non-ASF project from
day one** (Python core has folks interested). Non-ASF in the first cohort, not
later — the project-governance-agnosticism claim is only worth what it can
prove.
- Cut a first Apache release through the standard process within 3 months of
resolution adoption, with artefacts usable directly by non-ASF adopters (no
ASF-only assumption baked into the install path).
-- Wire modes A–C up to Apache Verum and Apache Caer findings, and to at least
one non-ASF audit-tool equivalent (a CodeQL output stream is the likely first
non-ASF case).
+- Wire **Triage**, **Mentoring**, and **Drafting** up to Apache Verum and
Apache Caer findings, and to at least one non-ASF audit-tool equivalent (a
CodeQL output stream is the likely first non-ASF case).
+- **Ship at least one Pairing skill family** in v1, with mentorship hooks
intrinsic — multi-agent review or pre-flight self-review — demonstrated against
a friendly-pilot project's contributor dev loop, so the
maintainership-and-development scope claim and the
human-relationship-preservation claim both have working code to point at.
- Settle on a contributor-sentiment evaluation methodology with Apache Plumb
(separate proposal). Eval covers both ASF and non-ASF cohorts so the data isn't
an internal-ASF artefact.
- **Ship the privacy and security posture** as a release-blocking part of v1 —
sandbox setup, clean-env wrapper, privacy-LLM gate, PII redactor, signed
releases, pinned-tools manifest. Not a follow-up.
- **Ship the maintainer-education stream** alongside v1 — pattern catalogue,
"your first skill" path, first scheduled workshops. The platform is only as
adoptable as the docs that go with it.
@@ -82,17 +86,19 @@ Three design choices set the project apart from "just bolt
a code-review bot on
## Technical scope
-A platform substrate — issue and PR ingestion, GitHub API write-back,
conversation threading, audit logging, integration with adjacent systems
(Gmail, PonyMail, Vulnogram, generic CVE submission, an extensible adapter
layer so non-ASF adopters plug in their own equivalents) — with four modes
built on top.
+A platform substrate — issue and PR ingestion, GitHub API write-back,
conversation threading, audit logging, integration with adjacent systems
(Gmail, PonyMail, Vulnogram, generic CVE submission, an extensible adapter
layer so non-ASF adopters plug in their own equivalents) — with five modes
built on top.
[`docs/modes.md`](docs/modes.md) is the honest snapshot mapping each mode
below to the skills currently shipped, with a `stable / experimental / proposed
/ off` status legend.
-**Mode A — triage assistant** for issues, security reports, and PRs. *On the
security side:* spots inbound reports, classifies against prior triaged cases,
surfaces likely duplicates, identifies anything that should not have been filed
publicly, proposes initial routing to the security team. *On the regular side:*
suggests labels, spots duplicates, links related discussions, proposes routing.
Every output is a suggestion the human signs off on; nothing lands without
review. Lowest risk surface.
+**Triage** — for issues, security reports, and PRs. *On the security side:*
spots inbound reports, classifies against prior triaged cases, surfaces likely
duplicates, identifies anything that should not have been filed publicly,
proposes initial routing to the security team. *On the regular side:* suggests
labels, spots duplicates, links related discussions, proposes routing. Every
output is a suggestion the human signs off on; nothing lands without review.
Lowest risk surface.
+
+**Mentoring** — conversational. Joins issue and PR threads in a deliberately
teaching register: clarifying questions, pointers to project conventions and
docs, an explanation of *why* a change is being asked for, paired examples from
similar prior PRs, clean hand-off to a human reviewer when the question exceeds
what an agent should answer. The differentiator and the highest-value
project-side mode — where the Responsible AI Initiative's empowerment outcome
lives.
-**Mode B — conversational mentoring**. Joins issue and PR threads in a
deliberately teaching register: clarifying questions, pointers to project
conventions and docs, an explanation of *why* a change is being asked for,
paired examples from similar prior PRs, clean hand-off to a human reviewer when
the question exceeds what an agent should answer. The differentiator and the
highest-value mode — where the Responsible AI Initiative's empowerment outcome
lives.
+**Drafting** — agent-authored fixes with human review. The agent drafts a fix
for a well-scoped problem (a tracked issue, a triaged security report with team
consensus on scope, an Apache Verum or Apache Caer finding, a failing test with
an obvious cause, a documentation hole) and opens a PR. Every PR is reviewed
and merged by a human committer; the agent never merges its own work. For
security PRs the public surface strips CVE / private context per the project's
disclosure policy, so th [...]
-**Mode C — agent-authored fixes with human review**. The agent drafts a fix
for a well-scoped problem (a tracked issue, a triaged security report with team
consensus on scope, an Apache Verum or Apache Caer finding, a failing test with
an obvious cause, a documentation hole) and opens a PR. Every PR is reviewed
and merged by a human committer; the agent never merges its own work. For
security PRs the public surface strips CVE / private context per the project's
disclosure policy, so the [...]
+**Pairing** — developer-side dev-loop skills, mentorship intrinsic. Beyond the
project-side modes above — which describe the project's agent presence on its
own infrastructure — the platform also ships skills that maintainers and
contributors run in their *own* dev loop: multi-agent review pipelines,
self-review and pre-flight patterns, scoped fix drafting under the developer's
driver's seat. Pairing skills don't make state changes on behalf of the
project; they're the developer's indivi [...]
-**Mode D — narrowly-scoped fix-and-merge**. Auto-merge restricted to
objectively boring change classes — lint fixes, dependency bumps inside an
allow-list, license-header insertion, formatting, broken-link repair.
Per-project AND per-class opt-in; every auto-merged change is reversibly
logged. **Not turned on** until A/B/C have been running for two quarters and
contributor-sentiment data says the project is healthier, not just faster.
Security-class changes are explicitly *out* of D — no [...]
+**Auto-merge** — narrowly-scoped fix-and-merge. Auto-merge restricted to
objectively boring change classes — lint fixes, dependency bumps inside an
allow-list, license-header insertion, formatting, broken-link repair.
Per-project AND per-class opt-in; every auto-merged change is reversibly
logged. **Not turned on** until Triage, Mentoring, Drafting, **and Pairing**
have been running for two quarters and contributor-sentiment data says the
project is healthier, not just faster. Security-c [...]
The substrate also handles per-project config (which modes are on, eligible
change classes, who reviews, how disputes route, where security reports come
from, where audit findings come from, what the release process expects), full
audit logging and rollback for every agent-authored change — security and
non-security alike — and an integration hook for the Apache Plumb eval
framework so the contributor-empowerment claim has measurable data behind it.
@@ -149,7 +155,7 @@ The ASF mission line — *"to provide software for the public
good"* — has alw
## Initial PMC composition (target)
-PMC composition matters more than most because the project's social stakes are
higher than its technical stakes. The PMC will be filled from existing ASF
members, and potentially Apache Airflow PMC members where implementation of
A/B/C is already live and used — coordinated with Membership before the
resolution is adopted.
+PMC composition matters more than most because the project's social stakes are
higher than its technical stakes. The PMC will be filled from existing ASF
members, and potentially Apache Airflow PMC members where implementation of
Triage, Mentoring, and Drafting is already live and used — coordinated with
Membership before the resolution is adopted.
- **Size:** 7–9 members.
- **Diversity:** at least three distinct organisational affiliations; no
single employer holding a majority.
@@ -210,7 +216,7 @@ The contributor experience is the most sensitive surface in
any open-source proj
The project commits to:
-- **Mentoring-first sequencing** — Modes A and B before C and D.
+- **Mentoring-first sequencing** — Triage and Mentoring before Drafting and
Pairing; Auto-merge last.
- **ASF Privacy and Legal involvement from project start**, not
retrospectively.
- **Contributor-sentiment evidence as a graduation criterion** for new
automation modes alongside the standard technical-maturity criteria.
- **Tight feedback loop** — the SKILL-based approach with human oversight lets
agentic skills self-update from maintainer / triager feedback and contributor
responses; mistakes get corrected and message tone is tuned to the
communication style the PMC selects.
diff --git a/docs/mentoring/README.md b/docs/mentoring/README.md
index 7a55e18..9622257 100644
--- a/docs/mentoring/README.md
+++ b/docs/mentoring/README.md
@@ -18,7 +18,7 @@
spec — tone guide, hand-off protocol, adopter contract — ahead
of any skill code so the project's tone choices are reviewable
independently of runtime behaviour. See
-[`MISSION.md` § Mode B](../../MISSION.md#technical-scope) for
+[`MISSION.md` § Mentoring](../../MISSION.md#technical-scope) for
the *why*.
Why a framework skill family? Mentoring is named in
@@ -31,7 +31,7 @@ at once.
## Status
-Mode B is **proposed**. No SKILL.md exists yet. This directory
+Mentoring is **proposed**. No SKILL.md exists yet. This directory
currently contains:
- [**`spec.md`**](spec.md) — what the future skill should do:
@@ -39,7 +39,7 @@ currently contains:
A prototype skill (`pr-management-mentor`, working name) lands
in a follow-up PR after this spec is reviewed. The skill ships
-flagged `mode: B` + `experimental` per the
+flagged `mode: Mentoring` + `experimental` per the
[mode lifecycle](../modes.md#mode-lifecycle).
## Adopter contract (proposed)
@@ -51,8 +51,8 @@ template at
## Cross-references
-- [`MISSION.md` § Mode B](../../MISSION.md#technical-scope) —
+- [`MISSION.md` § Mentoring](../../MISSION.md#technical-scope) —
mode definition, RAI empowerment framing.
-- [`docs/modes.md` § Mode B](../modes.md#mode-b--conversational-mentoring) —
+- [`docs/modes.md` § Mentoring](../modes.md#mentoring) —
implementation status.
- [`spec.md`](spec.md) — full spec.
diff --git a/docs/mentoring/spec.md b/docs/mentoring/spec.md
index f970b48..78f91b2 100644
--- a/docs/mentoring/spec.md
+++ b/docs/mentoring/spec.md
@@ -2,7 +2,7 @@
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents** *generated with
[DocToc](https://github.com/thlorenz/doctoc)*
-- [Mode B — conversational mentoring
(spec)](#mode-b--conversational-mentoring-spec)
+- [Mentoring (spec)](#mentoring-spec)
- [Status](#status)
- [Scope](#scope)
- [Triggers](#triggers)
@@ -20,21 +20,21 @@
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->
-# Mode B — conversational mentoring (spec)
+# Mentoring (spec)
## Status
-Proposed. No skill code yet. This document defines what Mode B
+Proposed. No skill code yet. This document defines what Mentoring
should do once it exists; it lands ahead of any skill so the
project's tone choices and hand-off rules are reviewable
independently from runtime behaviour. See
-[`MISSION.md` § Mode B](../../MISSION.md#technical-scope) and
-[`docs/modes.md` § Mode B](../modes.md#mode-b--conversational-mentoring)
+[`MISSION.md` § Mentoring](../../MISSION.md#technical-scope) and
+[`docs/modes.md` § Mentoring](../modes.md#mentoring)
for sequencing.
## Scope
-Mode B joins issue and PR threads in a teaching register. The
+Mentoring joins issue and PR threads in a teaching register. The
agent's job is to lower the barrier to a contributor's *next
useful action*. Concretely, in scope:
@@ -56,21 +56,20 @@ useful action*. Concretely, in scope:
Out of scope:
-- *Reviewing code*. That is Mode A's
+- *Reviewing code*. That is Triage's
[`pr-management-code-review`](../../.claude/skills/pr-management-code-review/SKILL.md)
- skill. Mode B does not approve, request changes, or post inline
+ skill. Mentoring does not approve, request changes, or post inline
diff comments.
-- *Triage routing*. That is Mode A's
+- *Triage routing*. That is Triage's
[`pr-management-triage`](../../.claude/skills/pr-management-triage/SKILL.md)
- skill. Mode B does not assign labels, mark draft, or close PRs.
-- *Authoring fixes*. That is Mode C. Mode B does not open PRs or
+ skill. Mentoring does not assign labels, mark draft, or close PRs.
+- *Authoring fixes*. That is Drafting. Mentoring does not open PRs or
edit code.
-- *Speaking for the maintainer team* on disputed decisions. Mode
- B says "a maintainer will weigh in" and stops.
+- *Speaking for the maintainer team* on disputed decisions. Mentoring says "a
maintainer will weigh in" and stops.
## Triggers
-Mode B never posts unprompted on a thread it has not been
+Mentoring never posts unprompted on a thread it has not been
invoked on. The skill is opt-in per invocation. Three trigger
paths:
@@ -84,7 +83,7 @@ paths:
classifies a PR as "first contributor, missing repro" (or
equivalent triage flag), the maintainer can chain
`/pr-management-mentor` on that PR. The two skills compose;
- Mode B does not run inside Mode A by default.
+ Mentoring does not run inside Triage by default.
3. **Issue-thread invocation**. Same opt-in, on issues rather
than PRs, for the "missing version / missing repro" case.
@@ -92,8 +91,8 @@ Why no auto-fire: posting a teaching-register comment without
explicit human authorization risks the agent talking past a
maintainer who is mid-conversation with the contributor, or
posting on a thread where the maintainer has *deliberately* not
-replied yet. Auto-fire is a Mode-D-shaped problem and inherits
-Mode D's sequencing constraint.
+replied yet. Auto-fire is a Auto-merge-shaped problem and inherits
+Auto-merge's sequencing constraint.
## Teaching register — tone guide
@@ -131,7 +130,7 @@ feeling managed.
- AI self-reference outside the attribution footer. The footer
says it once; the body should not.
- Speaking for the maintainer. "The maintainers will probably
- want X" — Mode B does not predict maintainer decisions. It
+ want X" — Mentoring does not predict maintainer decisions. It
says "a maintainer will reply on this; in the meantime,
here's the convention" and stops.
@@ -153,12 +152,12 @@ documented two-stage process.
The agent bows out and pings a human when:
1. The contributor pushes back on a substantive design point.
- Mode B answers "why is this convention" once. If the
- contributor disagrees, Mode B does not argue; it pings the
+ Mentoring answers "why is this convention" once. If the
+ contributor disagrees, Mentoring does not argue; it pings the
maintainer.
2. The question touches security, embargoed work, deprecation
timing, or anything not covered by public documentation.
- Mode B does not improvise on these surfaces.
+ Mentoring does not improvise on these surfaces.
3. The thread reaches `<max_agent_turns>` (configurable, default
2). After that the agent stops engaging on the thread
regardless of content.
@@ -191,7 +190,7 @@ Required keys:
Surfaced here so reviewers can weigh in before the skill is
built.
-- **Should Mode B post on the project's mailing list, or only
+- **Should Mentoring post on the project's mailing list, or only
on GitHub threads?** Current draft: GitHub only. Mailing-list
mentoring lives in the human maintainer's voice; the agent
does not have a list-subscriber identity.
@@ -199,20 +198,20 @@ built.
footer, or distinct?** Current draft: same wording, different
step token. One contributor-trust calibration is easier to
reason about than two.
-- **Should the maintainer review every Mode B draft, or can
+- **Should the maintainer review every Mentoring draft, or can
they pre-authorize a class of comments (e.g., "always ok to
ask for repro")?** Current draft: every draft is reviewed.
- Pre-authorization is Mode-D-shaped and inherits the same
+ Pre-authorization is Auto-merge-shaped and inherits the same
sequencing constraint.
## Cross-references
-- [`MISSION.md` § Mode B](../../MISSION.md#technical-scope) —
+- [`MISSION.md` § Mentoring](../../MISSION.md#technical-scope) —
the mode definition + responsible-AI framing.
-- [`docs/modes.md` § Mode B](../modes.md#mode-b--conversational-mentoring) —
+- [`docs/modes.md` § Mentoring](../modes.md#mentoring) —
current implementation status (proposed).
-
[`.claude/skills/pr-management-triage/comment-templates.md`](../../.claude/skills/pr-management-triage/comment-templates.md)
—
closest existing surface; informs the tone-footer convention
- but is not Mode B.
+ but is not Mentoring.
- [`AGENTS.md`](../../AGENTS.md) — repository-level rules every
mode inherits.
diff --git a/docs/modes.md b/docs/modes.md
index 404c6df..e0c62eb 100644
--- a/docs/modes.md
+++ b/docs/modes.md
@@ -5,10 +5,11 @@
- [Modes — MISSION taxonomy mapped to current
skills](#modes--mission-taxonomy-mapped-to-current-skills)
- [Status legend](#status-legend)
- [Modes at a glance](#modes-at-a-glance)
- - [Mode A — triage](#mode-a--triage)
- - [Mode B — conversational mentoring](#mode-b--conversational-mentoring)
- - [Mode C — agent-authored fixes with human
review](#mode-c--agent-authored-fixes-with-human-review)
- - [Mode D — narrowly-scoped
fix-and-merge](#mode-d--narrowly-scoped-fix-and-merge)
+ - [Triage](#triage)
+ - [Mentoring](#mentoring)
+ - [Drafting](#drafting)
+ - [Pairing](#pairing)
+ - [Auto-merge](#auto-merge)
- [Outside the modes](#outside-the-modes)
- [Mode lifecycle](#mode-lifecycle)
- [Cross-references](#cross-references)
@@ -20,12 +21,14 @@
# Modes — MISSION taxonomy mapped to current skills
-[`MISSION.md`](../MISSION.md) frames the framework around four
-toggleable **modes** of agent-assisted repository maintainership:
-**A** (triage), **B** (mentoring), **C** (agent-authored fixes
-with human review), and **D** (narrowly-scoped fix-and-merge).
-Each adopting project picks the modes that match its culture and
-risk tolerance.
+[`MISSION.md`](../MISSION.md) frames the framework around five
+toggleable **modes** of agent-assisted repository maintainership
+and development: **Triage**, **Mentoring**, **Drafting**
+(agent-authored fixes with human review), **Pairing**
+(developer-side dev-cycle skills with mentorship intrinsic), and
+**Auto-merge** (narrowly-scoped fix-and-merge). Each adopting
+project picks the modes that match its culture and risk
+tolerance.
This document maps that taxonomy to the skills that currently
ship in the framework. It is the **honest snapshot** — modes
@@ -41,21 +44,22 @@ sequencing commitments behind them.
| **stable** | Implemented, in use by at least one adopter, behaviour expected
to remain backward-compatible across minor framework versions. |
| **experimental** | Implemented but not yet covered by an adopter pilot or
contributor-sentiment evaluation; shape may change. |
| **proposed** | Designed in [`MISSION.md`](../MISSION.md) but no skill yet
exists; tracked for future implementation. |
-| **off** | Deliberately not implemented per a MISSION-level sequencing rule
(Mode D). |
+| **off** | Deliberately not implemented per a MISSION-level sequencing rule
(Auto-merge). |
## Modes at a glance
| Mode | Purpose | Status | Skill count |
|---|---|---|---|
-| **A** — triage | Issues, security reports, PRs: spot, classify, route,
surface duplicates. Every output is a suggestion the human signs off on. |
stable (security) / experimental (pr-management) | 10 |
-| **B** — conversational mentoring | Joins issue and PR threads in a teaching
register: clarifying questions, pointers to project conventions, paired
examples from prior PRs, hand-off to a human when scope exceeds the agent. |
proposed | 0 |
-| **C** — agent-authored fixes with human review | Agent drafts a fix for a
well-scoped problem and opens a PR; every PR is reviewed and merged by a human
committer. | stable (security-only); generic case proposed | 1 |
-| **D** — narrowly-scoped fix-and-merge | Auto-merge restricted to objectively
boring change classes (lint, dependency bumps inside an allow-list,
license-header insertion, formatting, broken-link repair). | off | 0 |
+| **Triage** | Issues, security reports, PRs: spot, classify, route, surface
duplicates. Every output is a suggestion the human signs off on. | stable
(security) / experimental (pr-management) | 10 |
+| **Mentoring** | Joins issue and PR threads in a teaching register:
clarifying questions, pointers to project conventions, paired examples from
prior PRs, hand-off to a human when scope exceeds the agent. | proposed | 0 |
+| **Drafting** | Agent drafts a fix for a well-scoped problem and opens a PR;
every PR is reviewed and merged by a human committer. | stable (security-only);
generic case proposed | 1 |
+| **Pairing** | Developer-side dev-cycle skills with mentorship intrinsic —
multi-agent review pipelines, self-review and pre-flight patterns, scoped fix
drafting under the developer's driver's seat. | proposed | 0 |
+| **Auto-merge** | Auto-merge restricted to objectively boring change classes
(lint, dependency bumps inside an allow-list, license-header insertion,
formatting, broken-link repair). | off | 0 |
A few skills sit **outside** the mode taxonomy by design — see
[Outside the modes](#outside-the-modes) below.
-## Mode A — triage
+## Triage
Inbound report and PR triage. The lowest-risk surface and the
foundation everything else builds on. Skills propose labels,
@@ -81,21 +85,21 @@ Two notes on the boundaries:
- `pr-management-code-review` is a deeper variant of triage —
the agent reads diff and surrounding code rather than only
metadata, but the output is still a suggestion for the human
- reviewer. It belongs to Mode A by the same rule.
+ reviewer. It belongs to Triage by the same rule.
- `security-cve-allocate` is procedural rather than classificatory
- (CVE allocation happens after assessment), but it shares Mode A's
+ (CVE allocation happens after assessment), but it shares Triage's
shape: the agent prepares a paste-ready artefact, the human
PMC member submits it. Listed here for navigability.
-## Mode B — conversational mentoring
+## Mentoring
**Status: proposed. No skill yet.**
-[`MISSION.md` § Mode B](../MISSION.md#technical-scope) names this
-the highest-value mode and the one off-the-shelf agent tooling
-skips. Per MISSION sequencing, the spec — tone guide, hand-off
-protocol, adopter contract — lands ahead of any skill code so
-the project's tone choices are reviewable independently from
+[`MISSION.md` § Mentoring](../MISSION.md#technical-scope) names this
+the highest-value project-side mode and the one off-the-shelf agent
+tooling skips. Per MISSION sequencing, the spec — tone guide,
+hand-off protocol, adopter contract — lands ahead of any skill code
+so the project's tone choices are reviewable independently from
the runtime behaviour.
| Doc | Purpose |
@@ -106,14 +110,14 @@ the runtime behaviour.
A prototype skill (`pr-management-mentor`, working name) lands
in a follow-up PR after the spec is reviewed; it ships flagged
-`mode: B` + `experimental`.
+`mode: Mentoring` + `experimental`.
The closest existing surface is
[`pr-management-triage/comment-templates.md`](../.claude/skills/pr-management-triage/comment-templates.md),
-which carries Mode A classification responses — informational,
-not pedagogical. It is **not** Mode B.
+which carries Triage classification responses — informational,
+not pedagogical. It is **not** Mentoring.
-## Mode C — agent-authored fixes with human review
+## Drafting
The agent drafts a fix for a well-scoped problem (a tracked
issue, a triaged security report with team consensus on scope, a
@@ -125,37 +129,71 @@ the agent never merges its own work.
|---|---|---|
| [`security-issue-fix`](../.claude/skills/security-issue-fix/SKILL.md) |
Draft a fix PR in `<upstream>` from a triaged, CVE-allocated tracker. | stable
(security-only) |
-**Generic Mode C is proposed.** [`MISSION.md`](../MISSION.md)
+**Generic Drafting is proposed.** [`MISSION.md`](../MISSION.md)
names lint fixes, audit-tool findings (Apache Verum, Apache Caer,
CodeQL, equivalents), failing tests with obvious causes, and
-documentation holes as in-scope for Mode C beyond the security
+documentation holes as in-scope for Drafting beyond the security
case. None of those are implemented yet; security-issue-fix is
-the only Mode C skill in the framework today.
+the only Drafting skill in the framework today.
-For security-class Mode C PRs, the public surface strips CVE and
-private context per the project's disclosure policy, so the
+For security-class Drafting PRs, the public surface strips CVE
+and private context per the project's disclosure policy, so the
public surface stays clean until the embargo lifts — see
[`AGENTS.md` §
Confidentiality](../AGENTS.md#confidentiality-of-the-tracker-repository)
for the rules the skill enforces.
-## Mode D — narrowly-scoped fix-and-merge
+## Pairing
+
+**Status: proposed. No skill yet.**
+
+[`MISSION.md` § Pairing](../MISSION.md#technical-scope) introduces
+this mode as the developer-side counterpart to the project-side
+modes. Where Triage / Mentoring / Drafting / Auto-merge describe
+the agent's presence on the project's own infrastructure, Pairing
+skills run in the maintainer's or contributor's *own* dev loop —
+multi-agent review pipelines, self-review and pre-flight patterns,
+scoped fix drafting under the developer's driver's seat.
+**Mentorship is intrinsic** to Pairing skills: the agent handles
+the mechanical, implementation-detail review (formatting,
+conventions, lint-grade nits) so the human conversation between
+contributor and maintainer — and between peer maintainers —
+stays on design, reasoning, and the trade-offs the project cares
+about. Pairing skills are the platform's mechanism for protecting
+the **ASF contribution path** (contributor → committer → PMC)
+against being eroded by automation that replaces, rather than
+augments, the human-to-human relationships that path is built on.
+
+Pairing skills don't make state changes on behalf of the project;
+they share the same skill format and security posture as the
+project-side modes, so a maintainer who already trusts the
+framework for Triage gets the same posture for the patches they
+write themselves.
+
+**Sequencing.** Pairing ships before Auto-merge in the project's
+automation roadmap — full auto-merge of maintainer-driven changes
+follows only after Pairing has established that human reasoning
+and relationships, not implementation chatter, are the
+load-bearing parts of the workflow.
+
+## Auto-merge
**Status: off. Deliberately not implemented.**
-[`MISSION.md` § Mode D](../MISSION.md#technical-scope) holds
-auto-merge off until Modes A, B, and C have been running for
-two quarters and contributor-sentiment data says the project is
-healthier, not just faster. Security-class changes are
-explicitly **out** of Mode D — no auto-merge ever touches
-anything embargoed or CVE-tagged.
+[`MISSION.md` § Auto-merge](../MISSION.md#technical-scope) holds
+auto-merge off until Triage, Mentoring, Drafting, and Pairing
+have been running for two quarters and contributor-sentiment
+data says the project is healthier, not just faster.
+Security-class changes are explicitly **out** of Auto-merge — no
+auto-merge ever touches anything embargoed or CVE-tagged.
The framework's current `.asf.yaml` configuration reflects this
posture: `pull_requests.allow_auto_merge` is set to `false`
([`.asf.yaml`](../.asf.yaml)).
-When Mode D ships, the eligible change classes will be declared
-per-adopter in `<project-config>/` and gated by an allow-list
-that the framework refuses to grow without an adopter PR.
+When Auto-merge ships, the eligible change classes will be
+declared per-adopter in `<project-config>/` and gated by an
+allow-list that the framework refuses to grow without an
+adopter PR.
## Outside the modes
@@ -191,11 +229,12 @@ A mode moves through four states as it matures:
production, behaviour is backward-compatible across minor
framework versions. The default state for skills shipped to
adopters.
-4. **graduated-to-D-eligible** *(future state, Mode A/B/C only)* —
- the mode has run stable for two quarters with positive
- contributor-sentiment evidence, the framework will start
- considering an equivalent change class for Mode D auto-merge.
- This state does not exist yet because Mode D itself is off.
+4. **graduated-to-Auto-merge-eligible** *(future state; Triage,
+ Mentoring, Drafting, and Pairing only)* — the mode has run
+ stable for two quarters with positive contributor-sentiment
+ evidence, the framework will start considering an equivalent
+ change class for Auto-merge. This state does not exist yet
+ because Auto-merge itself is off.
A mode can be **retracted** from any state. The retraction
triggers MISSION names — sustained negative contributor
diff --git a/docs/rfcs/RFC-AI-0004.md b/docs/rfcs/RFC-AI-0004.md
index 9ce1e82..ca457ed 100644
--- a/docs/rfcs/RFC-AI-0004.md
+++ b/docs/rfcs/RFC-AI-0004.md
@@ -137,16 +137,16 @@ A skill that triages 200 PRs in 10 minutes is doing 200
state changes. If the ma
1. **Propose-then-apply, always.** The agent's natural unit of work is "here
is the proposal, will you confirm?". The "apply" pass that follows confirmation
is mechanical — no reasoning, no surprises, no second proposal hidden inside.
2. **Per-proposal confirmation, no batch yes.** Multiple state changes in the
same response require a confirmation surface that lets the maintainer say "1,
3, 4 yes; 2 no". `all` as a one-keystroke shortcut is acceptable; the agent
must still surface every item before honouring it.
-3. **No standing pre-approvals.** A skill MUST NOT support a config switch
that says "auto-approve every X-class proposal". The boundary between Mode C
(agent-authored fix with human review) and Mode D (narrowly-scoped auto-merge)
is exactly this; Mode D is governed by a separate, much stricter contract (see
Principle 1, *narrow auto-merge carve-out* below).
+3. **No standing pre-approvals.** A skill MUST NOT support a config switch
that says "auto-approve every X-class proposal". The boundary between Drafting
(agent-authored fix with human review) and Auto-merge (narrowly-scoped
auto-merge) is exactly this; Auto-merge is governed by a separate, much
stricter contract (see Principle 1, *narrow auto-merge carve-out* below).
4. **Drafts, never sends.** Outbound communication (email, chat) is
**drafted** by the agent and stored in the communication system's drafts
folder. The maintainer reviews and presses Send. The framework MUST NOT have a
"yes, send the draft" path that bypasses the human read.
5. **Audit log of every confirmation.** Every applied state change writes a
structured audit-log entry: timestamp, maintainer identity, proposal text,
applied diff, triggering skill. Open-source maintenance is a public-trust
activity; the trail makes future review possible.
### Narrow auto-merge carve-out
-Mode D ("narrowly-scoped fix-and-merge", in Apache Steward (to be renamed)'s
terminology) is the explicit exception. It permits auto-merge, but only after
**all** of the following gate conditions hold:
+Auto-merge ("narrowly-scoped fix-and-merge", in Apache Steward (to be
renamed)'s terminology) is the explicit exception. It permits auto-merge, but
only after **all** of the following gate conditions hold:
- The change class is on a per-project, per-class allow-list (lint fixes,
dependency bumps within an allow-list, license headers, formatting, broken-link
repair). Security-class changes are explicitly out.
-- The project has been running Modes A/B/C with HITL confirmation for at least
two release cycles, and a contributor-sentiment evaluation says the project is
healthier, not just faster.
+- The project has been running Triage, Mentoring, and Drafting with HITL
confirmation for at least two release cycles, and a contributor-sentiment
evaluation says the project is healthier, not just faster.
- Every auto-merged change is reversibly logged; reverts are one keystroke
away.
The carve-out exists because lint-rebase-format has marginal human value and
should not require a human in the loop forever. It is **off by default** in the
reference implementation. A project that turns it on without first running the
manual loop has skipped the proof.
@@ -415,4 +415,4 @@ The Apache Steward (to be renamed) project is happy to
consult on the lift — s
## Acknowledgements
-This RFC distils principles operationalised in the Apache Steward (to be
renamed) reference implementation. The PMC roster and collaborator list (see
[`MISSION.md`](https://github.com/apache/airflow-steward/blob/main/MISSION.md))
includes the people whose discussion, code, and incident-review work shaped
these principles. The framing of the principles here owes a particular debt to
the 2026-05 prompt-injection audit
([gist](https://gist.github.com/andrew/0bc8bdaac6902656ccf3b1400ad160f0) [...]
+This RFC distils principles operationalised in the Apache Steward (to be
renamed) reference implementation. The PMC roster and collaborator list (see
[`MISSION.md`](https://github.com/apache/airflow-steward/blob/main/MISSION.md))
includes the people whose discussion, code, and incident-review work shaped
these principles. The framing of the principles here owes a particular debt to
the 2026-05 prompt-injection audit
([gist](https://gist.github.com/andrew/0bc8bdaac6902656ccf3b1400ad160f0) [...]
diff --git a/docs/security/threat-model.md b/docs/security/threat-model.md
index 5197529..bb6e0fc 100644
--- a/docs/security/threat-model.md
+++ b/docs/security/threat-model.md
@@ -59,13 +59,13 @@ This document is the authoritative threat model for that
automation.
It enumerates the trust boundaries, the adversaries that may attack
each boundary, the asset each adversary is after, and the
mitigations the framework relies on. It is a release-blocking
-artefact: a Mode C skill that touches a security tracker without
+artefact: a Drafting skill that touches a security tracker without
a STRIDE row in this document is, by construction, unreviewed.
The intended readers are:
- security-team members evaluating whether to enable a skill in
- Mode A or Mode C against their tracker;
+ Triage or Drafting against their tracker;
- contributors proposing a new skill in the security family or a
change that crosses one of the trust boundaries below;
- ASF Security and the project PMC during a pre-release security
@@ -93,11 +93,11 @@ In scope for this document:
The following are out of scope and should be addressed in their
own threat model when they are introduced:
-- Mode D auto-merge — not implemented in v1; see
- [`docs/modes.md`](../modes.md). When proposed, Mode D requires
+- Auto-merge auto-merge — not implemented in v1; see
+ [`docs/modes.md`](../modes.md). When proposed, Auto-merge requires
its own threat model entry and a separate ASF Security review.
-- generic Mode C beyond `security-issue-fix` — proposed but not
- shipped. Each new Mode C skill ships with its own STRIDE row in
+- generic Drafting beyond `security-issue-fix` — proposed but not
+ shipped. Each new Drafting skill ships with its own STRIDE row in
the [STRIDE matrix](#stride-matrix-per-skill-family).
- the underlying LLM provider's infrastructure — treated as a
trusted component subject to its own provider-side threat model.
@@ -118,11 +118,11 @@ The threat model is valid only while these assumptions
hold. A
violation of any assumption invalidates the corresponding mitigation
and triggers a re-audit.
-1. **The maintainer reviewing a Mode C output is competent and
- acting in good faith.** Mode C ships agent-authored fixes
+1. **The maintainer reviewing a Drafting output is competent and
+ acting in good faith.** Drafting ships agent-authored fixes
gated on human review; the human is the final defence against
- subtle agent error. A maintainer who rubber-stamps Mode C output
- collapses Mode C into Mode D, which is explicitly out of scope.
+ subtle agent error. A maintainer who rubber-stamps Drafting output
+ collapses Drafting into Auto-merge, which is explicitly out of scope.
2. **The agent host's filesystem sandbox is enforced by the runtime,
not by the agent's good behaviour.** `permissions.deny` entries
are advisory and visible to the agent; `sandbox.filesystem.denyRead`
@@ -154,9 +154,9 @@ and triggers a re-audit.
- **Embargo window** — the period between a report arriving on
`security@` and the public advisory being published. During this
window the existence and detail of the issue are confidential.
-- **Mode A / B / C / D** — see [`docs/modes.md`](../modes.md). Mode A
- is read-only triage; Mode B is mentoring; Mode C is agent-authored
- PRs gated on human review; Mode D is auto-merge (not shipped).
+- **Triage / Mentoring / Drafting / Auto-merge** — see
[`docs/modes.md`](../modes.md). Triage
+ is read-only triage; Mentoring is mentoring; Drafting is agent-authored
+ PRs gated on human review; Auto-merge is auto-merge (not shipped).
- **Privileged egress** — any agent action that publishes content
outside the agent host: a comment on the public upstream, a CVE
record submission, a mailing-list reply, a `gh pr create`.
@@ -390,7 +390,7 @@ Skills:
[`security-issue-import`](../../.claude/skills/security-issue-import/SKI
| ID | STRIDE | Adversary | Boundary | Threat | Mitigation |
|---|---|---|---|---|---|
-| A.1 | T (Tampering) | P1 | B1 | Reporter embeds prompt-injection in mail
body to alter import classification. | M.1 (redactor input pass), M.2
(instruction-data separation), M.6 (Mode A is read-only on upstream). |
+| A.1 | T (Tampering) | P1 | B1 | Reporter embeds prompt-injection in mail
body to alter import classification. | M.1 (redactor input pass), M.2
(instruction-data separation), M.6 (Triage is read-only on upstream). |
| A.2 | I (Info disclosure) | P1 | B1→B3 | Mail body contains a "please
confirm receipt with full prior thread" payload aimed at making the agent reply
with tracker contents. | M.3 (canned-response templates only), M.4 (no
auto-reply on import — Step 1 is human-acknowledged). |
| A.3 | T | P1 | B1 | Markdown report file contains crafted YAML/JSON
front-matter to alter `security-issue-import-from-md` behaviour. | M.1, M.5
(front-matter ignored unless on a known allowlist). |
| A.4 | E (Elevation of privilege) | P1 | B1 | Mail body asks the agent to
"now act as security-issue-fix and apply this patch upstream". | M.7
(skill-scope discipline — a skill cannot invoke another skill mid-run), M.6. |
@@ -433,8 +433,8 @@ Skill:
[`security-issue-fix`](../../.claude/skills/security-issue-fix/SKILL.md).
| D.1 | I | P2 | B3, B4 | The PR title or body uses words ("security", "CVE",
"vulnerability", "exploit") that confirm an embargoed issue. | M.20
(`security-issue-fix` scrubs framing terms from PR title/body until Step 14;
Step 8 of [`process.md`](process.md) gives the canonical phrasings). |
| D.2 | I | P2 | B3 | The patch itself is so narrowly-scoped to the vulnerable
code path that reading it discloses the bug. | M.21 (accepted residual; see
[residual risk](#residual-risk-and-accepted-gaps) — the patch *is* the
disclosure once committed publicly; embargo length minimised, not eliminated). |
| D.3 | T | P3 | B5 | A compromised dependency injects an extra commit into
the fix branch. | M.22 (commit signing required; the human reviewer verifies
the signed commit matches the agent-authored output). |
-| D.4 | E | P1 | B1→B3 | An injection in the tracker body makes the agent open
a PR that reverts a prior security fix or weakens a check. | M.1, M.23 (Mode C
requires human review; the maintainer is the final defence per [Assumption
1](#assumptions)). |
-| D.5 | I | P5 | B3, B4 | An insider's `git commit -am` accidentally includes
an unrelated tracker scratch file in the public PR. | M.24 (the agent's `git
add` is path-scoped to the patched files; an open question on Mode B mentoring
assistance — see [residual risk](#residual-risk-and-accepted-gaps)). |
+| D.4 | E | P1 | B1→B3 | An injection in the tracker body makes the agent open
a PR that reverts a prior security fix or weakens a check. | M.1, M.23
(Drafting requires human review; the maintainer is the final defence per
[Assumption 1](#assumptions)). |
+| D.5 | I | P5 | B3, B4 | An insider's `git commit -am` accidentally includes
an unrelated tracker scratch file in the public PR. | M.24 (the agent's `git
add` is path-scoped to the patched files; an open question on Mentoring
mentoring assistance — see [residual risk](#residual-risk-and-accepted-gaps)). |
| D.6 | R | P5 | B2, B3 | After release, attribution between the agent's
authoring and the human reviewer's approval is disputed. | M.9, M.25 (the
public commit carries a `Generated-by:` trailer for the agent and a
`Signed-off-by:` line for the human reviewer; `Co-Authored-By:` for agents is
forbidden, so an agent cannot be misattributed as a human author). |
### Skill family E — Closure
@@ -522,7 +522,7 @@ describes it.
| M.3 | Canned-response templates only for reporter-facing replies. |
[`projects/_template/canned-responses.md`](../../projects/_template/canned-responses.md).
|
| M.4 | No auto-reply on inbound import. Step 1 acknowledgement is
human-authored. | [`process.md` Step
1](process.md#step-1--report-arrives-on-security). |
| M.5 | Front-matter on imported markdown reports is ignored unless on the
documented allowlist. |
[`security-issue-import-from-md/SKILL.md`](../../.claude/skills/security-issue-import-from-md/SKILL.md).
|
-| M.6 | Mode A is read-only on the upstream public repository. |
[`docs/modes.md`](../modes.md). |
+| M.6 | Triage is read-only on the upstream public repository. |
[`docs/modes.md`](../modes.md). |
| M.7 | Skill-scope discipline by authoring convention — each `SKILL.md`
declares its own scope and does not chain into other skills mid-run. **Not**
runtime-enforced; the discipline is a function of how the skills are written
and reviewed. The residual gap (an injection that successfully prompts the
agent to behave as a different skill) is captured in [residual risk
#9](#residual-risk-and-accepted-gaps). | Per-skill
[`SKILL.md`](../../.claude/skills/) authoring; not a runtime control. |
| M.8 | Identity claims in inbound mail are not trusted; mail headers are
recorded but not used for authorisation. | Skill family A behaviour. |
| M.9 | Every agent-driven state transition is recorded as a tracker comment
attributable to the agent's bot identity. | Skill behaviour; the bot identity
is configured per adopter in `projects/<adopter>/project.md`. |
@@ -539,7 +539,7 @@ describes it.
| M.20 | `security-issue-fix` scrubs embargo-framing terms from PR title and
body until Step 14. |
[`security-issue-fix/SKILL.md`](../../.claude/skills/security-issue-fix/SKILL.md).
|
| M.21 | Embargo window is minimised by promptly merging and releasing once
the fix is reviewed; the diff itself is accepted as a controlled disclosure. |
[`process.md` Steps 11 and 12](process.md). |
| M.22 | Commit signing is expected on the fix branch by adopter policy; the
human reviewer verifies the signed commit chain matches the agent's authored
set. | Maintainer / adopter process; **not framework-enforceable** — see
[residual risk #10](#residual-risk-and-accepted-gaps). |
-| M.23 | Mode C is gated on human review; the maintainer is the last line of
defence on agent-authored fixes. | [`docs/modes.md`](../modes.md). |
+| M.23 | Drafting is gated on human review; the maintainer is the last line of
defence on agent-authored fixes. | [`docs/modes.md`](../modes.md). |
| M.24 | The agent's `git add` is path-scoped to the patched files. |
[`security-issue-fix/SKILL.md`](../../.claude/skills/security-issue-fix/SKILL.md).
|
| M.25 | Agent authorship is recorded via a `Generated-by:` commit trailer in
the public commit (per [`AGENTS.md` Commit and PR
conventions](../../AGENTS.md#commit-and-pr-conventions) and
[`security-issue-fix/SKILL.md`](../../.claude/skills/security-issue-fix/SKILL.md)).
`Co-Authored-By:` is **forbidden** for agents per the same section — agents
are assistants, not authors. The trailer is part of the public commit metadata
and survives merge. | [`AGENTS.md`](../../AGENTS.md#commit-and-pr [...]
| M.26 | The agent will not draft the CVE-record submission until the public
advisory URL is present in the tracker. |
[`security-issue-sync/SKILL.md`](../../.claude/skills/security-issue-sync/SKILL.md).
|
@@ -557,7 +557,7 @@ the trigger that would force a re-evaluation.
identified that the redactor contract (M.1) describes the
*what* but not *which skills call the redactor at which step*.
v1 ships the redactor; v1.1 ships the per-skill wiring. **Trigger
- for re-eval:** any new Mode C skill, or any reported false-negative
+ for re-eval:** any new Drafting skill, or any reported false-negative
from the redactor on a skill that does not yet wire it explicitly.
2. **Mailing-list flood (A.7) has no framework-side rate limit.**
The agent will process whatever the mailing-list moderator lets
@@ -628,9 +628,9 @@ the trigger that would force a re-evaluation.
This document is release-blocking and time-bounded. The cadences
below are the framework's commitment.
-- **On every new Mode C skill** — the proposing PR must add a
+- **On every new Drafting skill** — the proposing PR must add a
STRIDE row to the matching skill family in [STRIDE matrix per
- skill family](#stride-matrix-per-skill-family). A Mode C skill
+ skill family](#stride-matrix-per-skill-family). A Drafting skill
without a row does not pass review.
- **On every change to `.claude/settings.json`** — the proposing
PR must update the [Trust boundaries](#trust-boundaries) and
@@ -645,7 +645,7 @@ below are the framework's commitment.
as PRs that update this document and (if applicable) the
[`process.md`](process.md) flow.
- **Pre-release audit** — every framework release that bumps the
- major version, or that ships a new Mode C skill, requires a fresh
+ major version, or that ships a new Drafting skill, requires a fresh
pass over [Assumptions](#assumptions), [Adversaries](#adversaries),
and [Residual risk](#residual-risk-and-accepted-gaps).
diff --git a/projects/_template/mentoring-config.md
b/projects/_template/mentoring-config.md
index 91ac478..0208d14 100644
--- a/projects/_template/mentoring-config.md
+++ b/projects/_template/mentoring-config.md
@@ -2,7 +2,7 @@
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents** *generated with
[DocToc](https://github.com/thlorenz/doctoc)*
-- [Apache Airflow — mentoring (Mode B)
configuration](#apache-airflow--mentoring-mode-b-configuration)
+- [Apache Airflow — mentoring (Mentoring)
configuration](#apache-airflow--mentoring-mentoring-configuration)
- [Identifiers](#identifiers)
- [Convention pointers](#convention-pointers)
- [Out-of-scope topics](#out-of-scope-topics)
@@ -13,13 +13,13 @@
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->
-# Apache Airflow — mentoring (Mode B) configuration
+# Apache Airflow — mentoring (Mentoring) configuration
-**This file is a placeholder ahead of the Mode B skill landing.**
-The skill does not exist yet (Mode B is proposed per
-[`docs/modes.md`](../../docs/modes.md#mode-b--conversational-mentoring)).
+**This file is a placeholder ahead of the Mentoring skill landing.**
+The skill does not exist yet (Mentoring is proposed per
+[`docs/modes.md`](../../docs/modes.md#mentoring)).
The keys below match the
-[Mode B spec](../../docs/mentoring/spec.md#adopter-contract)
+[Mentoring spec](../../docs/mentoring/spec.md#adopter-contract)
and are the values the future skill will read. New adopters
should copy this file into their own
`<project-config>/mentoring-config.md` and replace every
diff --git a/tools/skill-validator/src/skill_validator/__init__.py
b/tools/skill-validator/src/skill_validator/__init__.py
index cb4b768..e66fa8c 100644
--- a/tools/skill-validator/src/skill_validator/__init__.py
+++ b/tools/skill-validator/src/skill_validator/__init__.py
@@ -53,8 +53,8 @@ REQUIRED_FRONTMATTER_KEYS = {"name", "description", "license"}
OPTIONAL_FRONTMATTER_KEYS = {"when_to_use", "mode"}
ALLOWED_LICENSES = {"Apache-2.0"}
# MISSION mode taxonomy — see docs/modes.md.
-# "D" deliberately excluded: Mode D (auto-merge) is off per MISSION sequencing.
-ALLOWED_MODES = {"A", "B", "C"}
+# "Auto-merge" deliberately excluded: it is off per MISSION sequencing.
+ALLOWED_MODES = {"Triage", "Mentoring", "Drafting", "Pairing"}
# Forbidden hardcoded project references (fixed strings, case-sensitive)
FORBIDDEN_PATTERNS: list[str] = [
diff --git a/tools/skill-validator/tests/test_validator.py
b/tools/skill-validator/tests/test_validator.py
index 3b991f8..9094b2f 100644
--- a/tools/skill-validator/tests/test_validator.py
+++ b/tools/skill-validator/tests/test_validator.py
@@ -113,7 +113,7 @@ class TestValidateFrontmatter:
def test_valid_mode(self, tmp_path: Path) -> None:
path = tmp_path / "SKILL.md"
- for mode in ("A", "B", "C"):
+ for mode in ("Triage", "Mentoring", "Drafting", "Pairing"):
text = (
"---\n"
"name: foo\n"
@@ -132,11 +132,11 @@ class TestValidateFrontmatter:
"name: foo\n"
"description: bar\n"
"license: Apache-2.0\n"
- "mode: D\n"
+ "mode: Auto-merge\n"
"---\n"
)
violations = list(validate_frontmatter(path, text))
- assert any("mode" in v.message and "'D'" in v.message for v in
violations)
+ assert any("mode" in v.message and "'Auto-merge'" in v.message for v
in violations)
def test_mode_optional(self, tmp_path: Path) -> None:
# Skills without a mode (e.g. setup-* infrastructure) must not fail.
@@ -167,8 +167,8 @@ class TestSlugify:
def test_em_dash_in_heading(self) -> None:
assert (
- slugify("Mode B — conversational mentoring")
- == "mode-b--conversational-mentoring"
+ slugify("Mentoring")
+ == "mentoring"
)