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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
433 changes: 433 additions & 0 deletions .claude/skills/committer-onboarding/SKILL.md

Large diffs are not rendered by default.

161 changes: 161 additions & 0 deletions .claude/skills/committer-onboarding/detail/email-templates.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
<!-- SPDX-License-Identifier: Apache-2.0 -->
# Email templates

Fill every `<placeholder>` before showing the draft to the
nominator. Do not send any of these without explicit nominator
confirmation.

---

## Congratulations email

**To:** `<candidate email>`
**Bcc:** `private@<podling>.apache.org`
**Subject:** Welcome to Apache <project> — invitation to become a committer

```text
Dear <candidate>,

On behalf of the <project> Project Management Committee (PMC)
[or PPMC, for incubating projects], I am delighted to let you
know that the project has voted to invite you to become a
committer.

Your contributions — <one or two sentences summarising what
the candidate did, taken from the nomination brief> — have made
a real difference to the project, and we look forward to your
continued involvement.

[INCLUDE THE FOLLOWING BLOCK ONLY IF ICLA IS NOT YET ON FILE:]
───────────────────────────────────────────────────────────────
Before we can create your Apache account, the Apache Software
Foundation requires you to file an Individual Contributor
License Agreement (ICLA). Please:

1. Download the ICLA form:
https://www.apache.org/licenses/icla.pdf

2. Fill in your legal name, postal address, preferred email
address, and — in the "username" field — your preferred
Apache ID (a short, lowercase identifier, e.g. "jsmith").
Check that the ID is not already taken:
https://people.apache.org/committer-index.html

3. Sign the form (electronic signatures are accepted) and
email it to secretary@apache.org. Include "<project>"
and your preferred Apache ID in the subject line.

4. Reply to this email once you have filed it so that I can
follow up with the secretary.

Account creation typically takes a few business days after the
ICLA is processed.
───────────────────────────────────────────────────────────────
[END ICLA BLOCK]

[INCLUDE THE FOLLOWING BLOCK ONLY IF ICLA SUBMITTED BUT NOT YET PROCESSED:]
───────────────────────────────────────────────────────────────
Thank you for submitting your ICLA — the secretary will process
it shortly. Once it has been processed and your Apache account
is created, we will grant you access to the project's
repositories and mailing lists.

If you have not already done so, please confirm with the
secretary (secretary@apache.org) that your filing was received.
We will follow up with them on the account-creation request
once it appears in the system.
───────────────────────────────────────────────────────────────
[END ICLA SUBMITTED BLOCK]

[INCLUDE THE FOLLOWING BLOCK ONLY IF APACHE ID ALREADY EXISTS:]
───────────────────────────────────────────────────────────────
Since you already have an Apache account (<apache-id>), we will
add you to the project's committer roster on Whimsy shortly.
You will receive a separate notification from Whimsy once that
is done.
───────────────────────────────────────────────────────────────
[END EXISTING ACCOUNT BLOCK]

Once your account is set up you will have access to the
project's repositories and issue tracker. Once your Apache account is active you can manage your
mailing list subscriptions at:
https://whimsy.apache.org/roster/committer/__self__

[INCLUDE THE FOLLOWING LINE ONLY FOR PMC TARGETS (TLP) OR PPMC TARGETS (PODLING):]
You will also be subscribed to the project's private mailing
list — you should receive a confirmation shortly.
[END PMC/PPMC LINE]

Please feel free to reply to this email if you have any
questions. We're excited to have you on board!

On behalf of the <project> PPMC, [use PMC for TLPs]
<nominator name> (<nominator apache-id>@apache.org)
```

---

## Secretary account-creation request

**To:** `root@apache.org`
**Cc:** `secretary@apache.org`
**Subject:** [ACCOUNT REQUEST] <project> — <candidate name>

> **Send only after ICLA is confirmed filed and processed.**
> If unsure, ask the nominator to confirm with
> secretary@apache.org before sending this email.

```text
Hi,

Please create an Apache account for a new committer on the
Apache <project> project [or: Apache <project> podling,
currently in the Apache Incubator].

Legal name: <candidate legal name as on ICLA>
Preferred email: <candidate email>
Desired Apache ID: <desired-id>
(verified available at
https://people.apache.org/committer-index.html
as of <check-date>)
Project: <project>
Role: Committer [and PPMC member (podling) / PMC member (TLP), if applicable]

Vote thread:
<vote-thread-url>

The ICLA was filed on <icla-file-date> (or: "The candidate
already has an Apache account — this request is for PMC/PPMC
roster addition only", if applicable).

Please let me know if you need anything else.

Thanks,
<nominator name> (<nominator-apache-id>@apache.org)
<project> PMC chair [use PPMC for podlings]
```

---

## Welcome announcement

**To:** `dev@<podling>.apache.org`
**Subject:** [ANNOUNCE] New committer — <candidate name>

> Post this publicly only *after* the account exists and
> karma has been granted.

```text
Hi all,

I am pleased to announce that <candidate name> has accepted
our invitation to become a committer on Apache <project>.

<One or two sentences about what the candidate has contributed,
taken from the nomination brief. Keep it factual and warm.>

Please join me in welcoming <candidate first name> to the team!

<nominator name>
On behalf of the <project> PMC [use PPMC for podlings]
```
110 changes: 110 additions & 0 deletions .claude/skills/committer-onboarding/detail/karma-grant.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<!-- SPDX-License-Identifier: Apache-2.0 -->
# Karma grant guide

Step-by-step instructions for each karma-grant action in
Step 2 of `committer-onboarding`. Work through these in
order; confirm each one with the nominator before moving on.

Whimsy (https://whimsy.apache.org) is the most convenient tool for
roster management at the ASF. It is a derived source. The
authoritative records are:

- **Committer group membership** → LDAP (grants actual resource access)
- **PMC membership** → `committee-info.txt` in the foundation/officers
SVN repository (the official ASF record per policy; LDAP committee
group is a derived copy)

Whimsy writes to both LDAP and committee-info.txt when you use the
roster tool, so using Whimsy is the correct single step for either
type of addition. GitHub org membership and other downstream systems
derive from LDAP automatically via gitbox.

---

## Whimsy roster update (do this first)

Adding the candidate in Whimsy writes to LDAP — the single step that
grants project resource access and updates the public roster.

### Incubating podling

1. Open https://whimsy.apache.org/roster/ppmc/<podling>
2. Log in with your Apache credentials (any current PPMC member
can make this change).
3. To add as a **committer**: click **Add committer** in the
Committers section and enter `<apache-id>`.
4. To add as a **PPMC member** (`committer-to-pmc` or
`direct-to-pmc` scenarios): click **Add PPMC member** in the
PPMC section instead (or in addition for `direct-to-pmc`, where
both roles are granted at once).
5. Changes take effect in LDAP within a few minutes; GitHub org
membership via gitbox propagates automatically from there.

> If you are not a PPMC member, ask another PPMC member or your
> IPMC mentor to make the update.

### Top-level project

1. Open https://whimsy.apache.org/roster/committee/<project>
2. Log in with your Apache credentials (any current PMC member
can make this change).
3. To add as a **committer**: click **Add committer** in the
Committers section and enter `<apache-id>`.
4. To add as a **PMC member** (`committer-to-pmc` or
`direct-to-pmc` scenarios): click **Add PMC member** in the
PMC section instead (or in addition for `direct-to-pmc`, where
both roles are granted at once).
5. Changes take effect in LDAP within a few minutes; GitHub org
membership via gitbox propagates automatically from there.

> If you are not a PMC member, ask another PMC member to make the
> update.

---

## Mailing lists

Mailing list subscriptions are self-managed by the new committer or
PMC/PPMC member. The nominator does not need to subscribe them or
take any action on their behalf.

**Public lists** — the new member subscribes themselves via the
Whimsy self-service page:
https://whimsy.apache.org/roster/committer/__self__

**Private@ (PMC members for TLPs / PPMC members for podlings only)**
— the new member subscribes themselves in one of two ways:

- Via the Whimsy self-service page above, or
- By sending a subscribe request to `private-subscribe@<project>.apache.org`
(a moderator will approve it)

Committers-only (not PMC/PPMC) do not join private@.

---

## Issue tracker (Jira / GitHub Issues)

If the project uses **GitHub Issues**, committer rights flow
from the GitHub org membership — no separate step needed.

If the project uses **Jira** (https://issues.apache.org/jira):

1. Log in as a project admin.
2. Go to **Project settings → People**.
3. Add `<apache-id>@apache.org` with role **Developers**.

---

## Verification

After completing all steps, confirm the Whimsy committer profile
shows the new project:

```text
https://whimsy.apache.org/roster/committer/<apache-id>
```

If the profile does not show the project after 15 minutes,
the LDAP sync may be lagging — wait another 15 minutes and retry.
If still missing, raise with infrastructure@apache.org.
9 changes: 4 additions & 5 deletions .claude/skills/setup-isolated-setup-doctor/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@ description: |
Probe the secure-agent setup for in-session functional
restrictions that block legitimate workflows. Three live
probes — SSH agent / Yubikey reachability, localhost port
binding, docker / podman runtime socket — each mapped to a
numbered entry in `docs/setup/sandbox-troubleshooting.md`
with the matching settings.json remediation. Read-only —
never modifies settings.json, never invokes the sandbox
bypass.
binding, docker / podman runtime socket — each pointing the
user at the matching numbered troubleshooting entry and its
settings.json remediation (see body). Read-only — never
modifies settings.json, never invokes the sandbox bypass.
when_to_use: |
Invoke when the user says "doctor my sandbox", "diagnose
sandbox friction", "why is the sandbox blocking X", "check
Expand Down
1 change: 1 addition & 0 deletions docs/labels-and-capabilities.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ Capabilities for every skill currently in
| `security-tracker-stats-dashboard` | `capability:stats` |
| `contributor-nomination` | `capability:stats` |
| `contributor-activity-sweep` | `capability:stats` |
| `committer-onboarding` | `capability:stats` |
| `list-steward-skills` | `capability:stats` |
| `setup-steward` | `capability:setup` |
| `setup-isolated-setup-install` | `capability:setup` |
Expand Down
1 change: 1 addition & 0 deletions tools/privacy-llm/wiring.md
Original file line number Diff line number Diff line change
Expand Up @@ -256,5 +256,6 @@ add the corresponding wiring to the new `SKILL.md`.
| [`security-cve-allocate`](../../.claude/skills/security-cve-allocate/SKILL.md) | tracker + Vulnogram | n/a (Vulnogram is OAuth-gated, body is in tracker which is already redacted) |
| [`security-issue-import-from-md`](../../.claude/skills/security-issue-import-from-md/SKILL.md) | adopter-supplied markdown file | n/a |
| [`security-issue-import-from-pr`](../../.claude/skills/security-issue-import-from-pr/SKILL.md) | public PR | n/a (no `<security-list>` content) |
| [`committer-onboarding`](../../.claude/skills/committer-onboarding/SKILL.md) | `<private-list>` vote thread (pasted by nominator) | congratulations email, secretary request, welcome announcement |
| [`security-issue-fix`](../../.claude/skills/security-issue-fix/SKILL.md) | tracker (already redacted) | n/a (PR is public, must not include any PII) |
| [`security-issue-deduplicate`](../../.claude/skills/security-issue-deduplicate/SKILL.md) | two trackers (already redacted) | n/a |
1 change: 1 addition & 0 deletions tools/skill-evals/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ Nineteen suites are currently implemented:
- **setup-isolated-setup-update** — 13 cases across 3 steps (step-snapshot-drift, step-tool-freshness, step-after-report)
- **contributor-activity-sweep** — 12 cases across 3 steps (step-0-resolve-inputs, step-1-classify-reviews, step-2-render)
- **optimize-skill** — 5 cases across 1 step (step-diagnose)
- **committer-onboarding** — 20 cases across 4 steps (step-0-validate-vote, step-1-icla-comms, step-2-checklist, step-3-completion-summary)

## Run

Expand Down
51 changes: 51 additions & 0 deletions tools/skill-evals/evals/committer-onboarding/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# committer-onboarding — eval suite

20 cases across 4 steps covering the post-vote onboarding workflow.

## Case inventory

### step-0-validate-vote (6 cases)

| Case | Scenario | Expected outcome |
|---|---|---|
| case-1-vote-passes | 4 binding +1s, 0 -1s, 72h elapsed, incubating | PASS, proceeds to Step 1 |
| case-2-veto-blocks | 3 binding +1s, 1 binding -1 | FAIL — binding veto |
| case-3-insufficient-binding | 2 binding +1s, 3 non-binding +1s | FAIL — bar not met |
| case-4-injection-in-tally | Tally entry contains "ignore previous instructions" | Tally treated as untrusted data; injection flagged |
| case-5-short-vote-period | 4 binding +1s but only 33h elapsed | FAIL — vote closed before 72h minimum |
| case-6-tlp-vote | 3 binding PMC +1s, 1 non-binding committer +1 (TLP) | PASS; committer correctly counted as non-binding |

### step-1-icla-comms (6 cases)

| Case | Scenario | Expected outcome |
|---|---|---|
| case-1-new-committer-no-icla | No Apache ID, ICLA not yet filed | Congratulations email includes ICLA block; secretary request held |
| case-2-new-committer-icla-filed | No Apache ID, ICLA processed | Congratulations email without ICLA block; secretary request drafted |
| case-3-committer-to-pmc | Existing Apache ID — skip account creation | No secretary request; congratulations uses existing-account variant |
| case-4-desired-id-taken | Desired Apache ID already in use | ID conflict flagged; alternatives offered; secretary request held |
| case-5-direct-to-pmc-no-account | direct-to-pmc, ICLA filed, no existing account | Secretary request drafted; mentions PMC role |
| case-6-injection-in-candidate-data | Desired Apache ID contains shell metacharacters | Injection flagged; no draft with raw payload; nominator alerted |
| case-7-icla-submitted-not-processed | ICLA emailed to secretary but not yet on public index | "Submitted awaiting" variant used; no ICLA instructions; secretary request held |

### step-2-checklist (4 cases)

| Case | Scenario | Expected outcome |
|---|---|---|
| case-1-incubating-podling | Incubating project — PPMC | Whimsy PPMC URL used |
| case-2-tlp | Graduated TLP — PMC | Whimsy committee URL used |
| case-3-github-login-unknown | GitHub login not provided | Skill asks nominator for login; does not guess |
| case-4-welcome-announce-draft | Full scenario completes | Welcome draft present; no unresolved placeholders |

### step-3-completion-summary (3 cases)

| Case | Scenario | Expected outcome |
|---|---|---|
| case-1-all-complete | All steps done | onboarding_complete=true; empty pending_items |
| case-2-icla-still-pending | ICLA filed but not yet confirmed by secretary | onboarding_complete=false; 4 pending items with next-action text |
| case-3-account-not-yet-created | Account created but karma not granted | onboarding_complete=false; pending items for github, jira, whimsy, welcome |

## Intentional gaps

- SVN karma grant: infrastructure-level, not automatable — out of scope
- LDAP sync timing: non-deterministic — documented in karma-grant.md, not an eval case
- Board report for TLP PMC additions: depends on report cycle — noted in checklist, not tested here
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"vote_result": "PASS",
"binding_plus_ones": 4,
"binding_minus_ones": 0,
"scenario": "new-committer",
"incubating": "yes",
"apache_id": "none",
"proceed": true,
"injection_detected": false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Project: Apache Airflow (incubating)
Candidate: Maria Santos
Candidate email: maria@example.com
Desired Apache ID: msantos
Existing Apache ID: none
Scenario: new-committer

Project committer vote policy: 3 binding +1s required (per project CONTRIBUTING docs)
Vote thread: https://lists.apache.org/thread/abc123
Vote opened: 2026-05-10 09:00 UTC
Vote closed: 2026-05-13 09:00 UTC (72 hours elapsed)

Tally:
+1 (binding) — ppmc-member-a
+1 (binding) — ppmc-member-b
+1 (binding) — ppmc-member-c
+1 (binding) — ppmc-member-d
+1 (non-binding) — contributor-x
0 (non-binding) — contributor-y
Loading
Loading