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 fd382b2 feat(setup): add method:local self-adoption; drop
setup-steward shim (#443)
fd382b2 is described below
commit fd382b2a035ce8e10e75bbaa813fe42590bb7b44
Author: Jarek Potiuk <[email protected]>
AuthorDate: Wed Jun 3 17:59:38 2026 +0200
feat(setup): add method:local self-adoption; drop setup-steward shim (#443)
The Apache Magpie framework checkout is the one repo that cannot use
the snapshot adoption mechanism — a remote snapshot of the framework
into itself is circular. Add a `method:local` self-adoption path: the
adopt flow detects the framework checkout structurally (skills/setup
SKILL.md with name: magpie-setup + skills/list-skills present) and,
instead of fetching a snapshot, links the in-repo skills/ source
directly. Each magpie-<skill> is a COMMITTED symlink into
../../skills/<skill>/ (targets are in-repo, always resolve on a fresh
clone), written under BOTH .claude/skills/ (Claude Code) and
.github/skills/ (GitHub's skill loader) so the skills are discoverable
from either harness. No remote URL, no snapshot, no copy; a
`method: local` marker lock records the mode and verify gets a reduced
check set.
Self-adopt this repo: 76 committed magpie-* symlinks (38 skills × the
two loader dirs), .gitignore un-ignores them in both, and
.apache-magpie.lock records method: local.
Drop the setup-steward migration shim (and its references in
AGENTS.md, install-recipes.md, upgrade.md): pre-Magpie migration is
no longer automated — the docs now describe the manual path.
Generated-by: Claude Code (Opus 4.8)
---
.apache-magpie.lock | 6 +
.claude/skills/magpie-audit-finding-fix | 1 +
.claude/skills/magpie-committer-onboarding | 1 +
.claude/skills/magpie-contributor-activity-sweep | 1 +
.claude/skills/magpie-contributor-nomination | 1 +
.claude/skills/magpie-good-first-issue-author | 1 +
.claude/skills/magpie-issue-fix-workflow | 1 +
.claude/skills/magpie-issue-reassess | 1 +
.claude/skills/magpie-issue-reassess-stats | 1 +
.claude/skills/magpie-issue-reproducer | 1 +
.claude/skills/magpie-issue-triage | 1 +
.claude/skills/magpie-list-skills | 1 +
.claude/skills/magpie-optimize-skill | 1 +
.claude/skills/magpie-pairing-multi-agent-review | 1 +
.claude/skills/magpie-pairing-self-review | 1 +
.claude/skills/magpie-pr-management-code-review | 1 +
.claude/skills/magpie-pr-management-mentor | 1 +
.claude/skills/magpie-pr-management-quick-merge | 1 +
.claude/skills/magpie-pr-management-stats | 1 +
.claude/skills/magpie-pr-management-triage | 1 +
.claude/skills/magpie-security-cve-allocate | 1 +
.claude/skills/magpie-security-issue-deduplicate | 1 +
.claude/skills/magpie-security-issue-fix | 1 +
.claude/skills/magpie-security-issue-import | 1 +
.../skills/magpie-security-issue-import-from-md | 1 +
.../skills/magpie-security-issue-import-from-pr | 1 +
.../magpie-security-issue-import-via-forwarder | 1 +
.claude/skills/magpie-security-issue-invalidate | 1 +
.claude/skills/magpie-security-issue-sync | 1 +
.claude/skills/magpie-security-issue-triage | 1 +
.../skills/magpie-security-tracker-stats-dashboard | 1 +
.claude/skills/magpie-setup | 1 +
.claude/skills/magpie-setup-isolated-setup-doctor | 1 +
.claude/skills/magpie-setup-isolated-setup-install | 1 +
.claude/skills/magpie-setup-isolated-setup-update | 1 +
.claude/skills/magpie-setup-isolated-setup-verify | 1 +
.claude/skills/magpie-setup-override-upstream | 1 +
.claude/skills/magpie-setup-shared-config-sync | 1 +
.claude/skills/magpie-write-skill | 1 +
.claude/skills/setup-steward/SKILL.md | 87 -------
.claude/skills/setup-steward/upgrade.md | 270 ---------------------
.github/skills/magpie-audit-finding-fix | 1 +
.github/skills/magpie-committer-onboarding | 1 +
.github/skills/magpie-contributor-activity-sweep | 1 +
.github/skills/magpie-contributor-nomination | 1 +
.github/skills/magpie-good-first-issue-author | 1 +
.github/skills/magpie-issue-fix-workflow | 1 +
.github/skills/magpie-issue-reassess | 1 +
.github/skills/magpie-issue-reassess-stats | 1 +
.github/skills/magpie-issue-reproducer | 1 +
.github/skills/magpie-issue-triage | 1 +
.github/skills/magpie-list-skills | 1 +
.github/skills/magpie-optimize-skill | 1 +
.github/skills/magpie-pairing-multi-agent-review | 1 +
.github/skills/magpie-pairing-self-review | 1 +
.github/skills/magpie-pr-management-code-review | 1 +
.github/skills/magpie-pr-management-mentor | 1 +
.github/skills/magpie-pr-management-quick-merge | 1 +
.github/skills/magpie-pr-management-stats | 1 +
.github/skills/magpie-pr-management-triage | 1 +
.github/skills/magpie-security-cve-allocate | 1 +
.github/skills/magpie-security-issue-deduplicate | 1 +
.github/skills/magpie-security-issue-fix | 1 +
.github/skills/magpie-security-issue-import | 1 +
.../skills/magpie-security-issue-import-from-md | 1 +
.../skills/magpie-security-issue-import-from-pr | 1 +
.../magpie-security-issue-import-via-forwarder | 1 +
.github/skills/magpie-security-issue-invalidate | 1 +
.github/skills/magpie-security-issue-sync | 1 +
.github/skills/magpie-security-issue-triage | 1 +
.../skills/magpie-security-tracker-stats-dashboard | 1 +
.github/skills/magpie-setup | 1 +
.github/skills/magpie-setup-isolated-setup-doctor | 1 +
.github/skills/magpie-setup-isolated-setup-install | 1 +
.github/skills/magpie-setup-isolated-setup-update | 1 +
.github/skills/magpie-setup-isolated-setup-verify | 1 +
.github/skills/magpie-setup-override-upstream | 1 +
.github/skills/magpie-setup-shared-config-sync | 1 +
.github/skills/magpie-write-skill | 1 +
.gitignore | 17 +-
AGENTS.md | 2 +-
docs/setup/install-recipes.md | 49 ++--
skills/setup/SKILL.md | 17 +-
skills/setup/adopt.md | 122 +++++++++-
skills/setup/upgrade.md | 39 +--
skills/setup/verify.md | 44 +++-
86 files changed, 309 insertions(+), 420 deletions(-)
diff --git a/.apache-magpie.lock b/.apache-magpie.lock
new file mode 100644
index 0000000..8582221
--- /dev/null
+++ b/.apache-magpie.lock
@@ -0,0 +1,6 @@
+# .apache-magpie.lock — committed. Local self-adoption marker.
+# The framework checkout links its own skills/ source; there is
+# no remote snapshot. Edited only by /magpie-setup.
+
+method: local
+source: skills/
diff --git a/.claude/skills/magpie-audit-finding-fix
b/.claude/skills/magpie-audit-finding-fix
new file mode 120000
index 0000000..c32be1b
--- /dev/null
+++ b/.claude/skills/magpie-audit-finding-fix
@@ -0,0 +1 @@
+../../skills/audit-finding-fix
\ No newline at end of file
diff --git a/.claude/skills/magpie-committer-onboarding
b/.claude/skills/magpie-committer-onboarding
new file mode 120000
index 0000000..9f421b7
--- /dev/null
+++ b/.claude/skills/magpie-committer-onboarding
@@ -0,0 +1 @@
+../../skills/committer-onboarding
\ No newline at end of file
diff --git a/.claude/skills/magpie-contributor-activity-sweep
b/.claude/skills/magpie-contributor-activity-sweep
new file mode 120000
index 0000000..4c4ad61
--- /dev/null
+++ b/.claude/skills/magpie-contributor-activity-sweep
@@ -0,0 +1 @@
+../../skills/contributor-activity-sweep
\ No newline at end of file
diff --git a/.claude/skills/magpie-contributor-nomination
b/.claude/skills/magpie-contributor-nomination
new file mode 120000
index 0000000..84b98fd
--- /dev/null
+++ b/.claude/skills/magpie-contributor-nomination
@@ -0,0 +1 @@
+../../skills/contributor-nomination
\ No newline at end of file
diff --git a/.claude/skills/magpie-good-first-issue-author
b/.claude/skills/magpie-good-first-issue-author
new file mode 120000
index 0000000..360135b
--- /dev/null
+++ b/.claude/skills/magpie-good-first-issue-author
@@ -0,0 +1 @@
+../../skills/good-first-issue-author
\ No newline at end of file
diff --git a/.claude/skills/magpie-issue-fix-workflow
b/.claude/skills/magpie-issue-fix-workflow
new file mode 120000
index 0000000..7bb0e8d
--- /dev/null
+++ b/.claude/skills/magpie-issue-fix-workflow
@@ -0,0 +1 @@
+../../skills/issue-fix-workflow
\ No newline at end of file
diff --git a/.claude/skills/magpie-issue-reassess
b/.claude/skills/magpie-issue-reassess
new file mode 120000
index 0000000..8e91821
--- /dev/null
+++ b/.claude/skills/magpie-issue-reassess
@@ -0,0 +1 @@
+../../skills/issue-reassess
\ No newline at end of file
diff --git a/.claude/skills/magpie-issue-reassess-stats
b/.claude/skills/magpie-issue-reassess-stats
new file mode 120000
index 0000000..a5b2632
--- /dev/null
+++ b/.claude/skills/magpie-issue-reassess-stats
@@ -0,0 +1 @@
+../../skills/issue-reassess-stats
\ No newline at end of file
diff --git a/.claude/skills/magpie-issue-reproducer
b/.claude/skills/magpie-issue-reproducer
new file mode 120000
index 0000000..c8cdab9
--- /dev/null
+++ b/.claude/skills/magpie-issue-reproducer
@@ -0,0 +1 @@
+../../skills/issue-reproducer
\ No newline at end of file
diff --git a/.claude/skills/magpie-issue-triage
b/.claude/skills/magpie-issue-triage
new file mode 120000
index 0000000..a32c627
--- /dev/null
+++ b/.claude/skills/magpie-issue-triage
@@ -0,0 +1 @@
+../../skills/issue-triage
\ No newline at end of file
diff --git a/.claude/skills/magpie-list-skills
b/.claude/skills/magpie-list-skills
new file mode 120000
index 0000000..a6c207d
--- /dev/null
+++ b/.claude/skills/magpie-list-skills
@@ -0,0 +1 @@
+../../skills/list-skills
\ No newline at end of file
diff --git a/.claude/skills/magpie-optimize-skill
b/.claude/skills/magpie-optimize-skill
new file mode 120000
index 0000000..8cddd77
--- /dev/null
+++ b/.claude/skills/magpie-optimize-skill
@@ -0,0 +1 @@
+../../skills/optimize-skill
\ No newline at end of file
diff --git a/.claude/skills/magpie-pairing-multi-agent-review
b/.claude/skills/magpie-pairing-multi-agent-review
new file mode 120000
index 0000000..ddb431c
--- /dev/null
+++ b/.claude/skills/magpie-pairing-multi-agent-review
@@ -0,0 +1 @@
+../../skills/pairing-multi-agent-review
\ No newline at end of file
diff --git a/.claude/skills/magpie-pairing-self-review
b/.claude/skills/magpie-pairing-self-review
new file mode 120000
index 0000000..b2fccf7
--- /dev/null
+++ b/.claude/skills/magpie-pairing-self-review
@@ -0,0 +1 @@
+../../skills/pairing-self-review
\ No newline at end of file
diff --git a/.claude/skills/magpie-pr-management-code-review
b/.claude/skills/magpie-pr-management-code-review
new file mode 120000
index 0000000..4b543a0
--- /dev/null
+++ b/.claude/skills/magpie-pr-management-code-review
@@ -0,0 +1 @@
+../../skills/pr-management-code-review
\ No newline at end of file
diff --git a/.claude/skills/magpie-pr-management-mentor
b/.claude/skills/magpie-pr-management-mentor
new file mode 120000
index 0000000..02c3493
--- /dev/null
+++ b/.claude/skills/magpie-pr-management-mentor
@@ -0,0 +1 @@
+../../skills/pr-management-mentor
\ No newline at end of file
diff --git a/.claude/skills/magpie-pr-management-quick-merge
b/.claude/skills/magpie-pr-management-quick-merge
new file mode 120000
index 0000000..a504c5a
--- /dev/null
+++ b/.claude/skills/magpie-pr-management-quick-merge
@@ -0,0 +1 @@
+../../skills/pr-management-quick-merge
\ No newline at end of file
diff --git a/.claude/skills/magpie-pr-management-stats
b/.claude/skills/magpie-pr-management-stats
new file mode 120000
index 0000000..b1a1338
--- /dev/null
+++ b/.claude/skills/magpie-pr-management-stats
@@ -0,0 +1 @@
+../../skills/pr-management-stats
\ No newline at end of file
diff --git a/.claude/skills/magpie-pr-management-triage
b/.claude/skills/magpie-pr-management-triage
new file mode 120000
index 0000000..4ae07e2
--- /dev/null
+++ b/.claude/skills/magpie-pr-management-triage
@@ -0,0 +1 @@
+../../skills/pr-management-triage
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-cve-allocate
b/.claude/skills/magpie-security-cve-allocate
new file mode 120000
index 0000000..6cc475b
--- /dev/null
+++ b/.claude/skills/magpie-security-cve-allocate
@@ -0,0 +1 @@
+../../skills/security-cve-allocate
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-issue-deduplicate
b/.claude/skills/magpie-security-issue-deduplicate
new file mode 120000
index 0000000..63f6e88
--- /dev/null
+++ b/.claude/skills/magpie-security-issue-deduplicate
@@ -0,0 +1 @@
+../../skills/security-issue-deduplicate
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-issue-fix
b/.claude/skills/magpie-security-issue-fix
new file mode 120000
index 0000000..40c0839
--- /dev/null
+++ b/.claude/skills/magpie-security-issue-fix
@@ -0,0 +1 @@
+../../skills/security-issue-fix
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-issue-import
b/.claude/skills/magpie-security-issue-import
new file mode 120000
index 0000000..d80190b
--- /dev/null
+++ b/.claude/skills/magpie-security-issue-import
@@ -0,0 +1 @@
+../../skills/security-issue-import
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-issue-import-from-md
b/.claude/skills/magpie-security-issue-import-from-md
new file mode 120000
index 0000000..3c96cda
--- /dev/null
+++ b/.claude/skills/magpie-security-issue-import-from-md
@@ -0,0 +1 @@
+../../skills/security-issue-import-from-md
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-issue-import-from-pr
b/.claude/skills/magpie-security-issue-import-from-pr
new file mode 120000
index 0000000..41c4085
--- /dev/null
+++ b/.claude/skills/magpie-security-issue-import-from-pr
@@ -0,0 +1 @@
+../../skills/security-issue-import-from-pr
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-issue-import-via-forwarder
b/.claude/skills/magpie-security-issue-import-via-forwarder
new file mode 120000
index 0000000..213f546
--- /dev/null
+++ b/.claude/skills/magpie-security-issue-import-via-forwarder
@@ -0,0 +1 @@
+../../skills/security-issue-import-via-forwarder
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-issue-invalidate
b/.claude/skills/magpie-security-issue-invalidate
new file mode 120000
index 0000000..7b07030
--- /dev/null
+++ b/.claude/skills/magpie-security-issue-invalidate
@@ -0,0 +1 @@
+../../skills/security-issue-invalidate
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-issue-sync
b/.claude/skills/magpie-security-issue-sync
new file mode 120000
index 0000000..b4f409e
--- /dev/null
+++ b/.claude/skills/magpie-security-issue-sync
@@ -0,0 +1 @@
+../../skills/security-issue-sync
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-issue-triage
b/.claude/skills/magpie-security-issue-triage
new file mode 120000
index 0000000..162016a
--- /dev/null
+++ b/.claude/skills/magpie-security-issue-triage
@@ -0,0 +1 @@
+../../skills/security-issue-triage
\ No newline at end of file
diff --git a/.claude/skills/magpie-security-tracker-stats-dashboard
b/.claude/skills/magpie-security-tracker-stats-dashboard
new file mode 120000
index 0000000..ea7df87
--- /dev/null
+++ b/.claude/skills/magpie-security-tracker-stats-dashboard
@@ -0,0 +1 @@
+../../skills/security-tracker-stats-dashboard
\ No newline at end of file
diff --git a/.claude/skills/magpie-setup b/.claude/skills/magpie-setup
new file mode 120000
index 0000000..8f69d9c
--- /dev/null
+++ b/.claude/skills/magpie-setup
@@ -0,0 +1 @@
+../../skills/setup
\ No newline at end of file
diff --git a/.claude/skills/magpie-setup-isolated-setup-doctor
b/.claude/skills/magpie-setup-isolated-setup-doctor
new file mode 120000
index 0000000..44f2819
--- /dev/null
+++ b/.claude/skills/magpie-setup-isolated-setup-doctor
@@ -0,0 +1 @@
+../../skills/setup-isolated-setup-doctor
\ No newline at end of file
diff --git a/.claude/skills/magpie-setup-isolated-setup-install
b/.claude/skills/magpie-setup-isolated-setup-install
new file mode 120000
index 0000000..794d890
--- /dev/null
+++ b/.claude/skills/magpie-setup-isolated-setup-install
@@ -0,0 +1 @@
+../../skills/setup-isolated-setup-install
\ No newline at end of file
diff --git a/.claude/skills/magpie-setup-isolated-setup-update
b/.claude/skills/magpie-setup-isolated-setup-update
new file mode 120000
index 0000000..fabb0d7
--- /dev/null
+++ b/.claude/skills/magpie-setup-isolated-setup-update
@@ -0,0 +1 @@
+../../skills/setup-isolated-setup-update
\ No newline at end of file
diff --git a/.claude/skills/magpie-setup-isolated-setup-verify
b/.claude/skills/magpie-setup-isolated-setup-verify
new file mode 120000
index 0000000..d76e89a
--- /dev/null
+++ b/.claude/skills/magpie-setup-isolated-setup-verify
@@ -0,0 +1 @@
+../../skills/setup-isolated-setup-verify
\ No newline at end of file
diff --git a/.claude/skills/magpie-setup-override-upstream
b/.claude/skills/magpie-setup-override-upstream
new file mode 120000
index 0000000..a9cee55
--- /dev/null
+++ b/.claude/skills/magpie-setup-override-upstream
@@ -0,0 +1 @@
+../../skills/setup-override-upstream
\ No newline at end of file
diff --git a/.claude/skills/magpie-setup-shared-config-sync
b/.claude/skills/magpie-setup-shared-config-sync
new file mode 120000
index 0000000..f850cf0
--- /dev/null
+++ b/.claude/skills/magpie-setup-shared-config-sync
@@ -0,0 +1 @@
+../../skills/setup-shared-config-sync
\ No newline at end of file
diff --git a/.claude/skills/magpie-write-skill
b/.claude/skills/magpie-write-skill
new file mode 120000
index 0000000..f512e9d
--- /dev/null
+++ b/.claude/skills/magpie-write-skill
@@ -0,0 +1 @@
+../../skills/write-skill
\ No newline at end of file
diff --git a/.claude/skills/setup-steward/SKILL.md
b/.claude/skills/setup-steward/SKILL.md
deleted file mode 100644
index d1f4005..0000000
--- a/.claude/skills/setup-steward/SKILL.md
+++ /dev/null
@@ -1,87 +0,0 @@
----
-name: setup-steward
-description: |
- Transition migration shim for pre-Magpie (apache-steward) adopters.
- This is the ONLY framework artefact that still carries the legacy
- `steward` name, and it exists for exactly one purpose: to migrate a
- repo that adopted the framework before it was renamed to Apache
- Magpie over to the new `magpie-` layout, then delete itself.
- Sub-actions:
- `/setup-steward upgrade` — run the one-time pre-Magpie migration
- (the only supported sub-action)
-when_to_use: |
- Invoke ONLY as the bridge for a pre-Magpie adopter: a repo whose
- committed framework skill is still `.claude/skills/setup-steward/`
- and whose runtime state still uses `.apache-steward*` / un-prefixed
- framework symlinks. A frozen pre-Magpie `/setup-steward upgrade`
- lands here automatically after it refreshes the snapshot and reloads
- the committed skill in-flight. After the migration completes the
- adopter uses `/magpie-setup` for everything; this shim is gone.
-argument-hint: "[upgrade]"
-capability: capability:setup
-license: Apache-2.0
----
-
-<!-- SPDX-License-Identifier: Apache-2.0
- https://www.apache.org/legal/release-policy.html -->
-
-<!-- Placeholder convention (see
../../../AGENTS.md#placeholder-convention-used-in-skill-files):
- <adopter-skills-dir> → the dir holding the adopter's skills
- (`.claude/skills/` or `.github/skills/`,
- per the project's convention)
- <snapshot-dir> → the gitignored framework snapshot. Pre-Magpie
- it is `.apache-steward/`; the migration moves
- it to `.apache-magpie/`. -->
-
-# setup-steward — pre-Magpie migration shim
-
-> **This skill is a one-shot transition artefact.** The framework was
-> renamed from **apache-steward** to **Apache Magpie**, which moved the
-> skill source (`.claude/skills/` → `skills/`), renamed the dotfiles
-> (`.apache-steward*` → `.apache-magpie*`), renamed the bootstrap skill
-> (`setup-steward` → committed as `magpie-setup`), and namespaced every
-> framework skill under a `magpie-` prefix. A repo that adopted the
-> framework **before** that rename has a committed `setup-steward` skill
-> frozen on the old layout, and cannot self-upgrade across the change.
-> This shim is the bridge.
-
-## How a pre-Magpie adopter reaches this shim
-
-The pre-Magpie `setup-steward/upgrade.md` an adopter committed does, on
-every `/setup-steward upgrade`:
-
-1. delete `.apache-steward/` and re-fetch the framework per the
- committed lock (which lands the **new** Magpie framework on disk),
-2. overwrite its committed `.claude/skills/setup-steward/` from the
- snapshot's `.apache-steward/.claude/skills/setup-steward/`, and
-3. **reload that skill in-flight** (its Golden rule 9).
-
-Because the Magpie framework still ships this shim at the legacy path
-`.claude/skills/setup-steward/`, step (2) finds it, step (3) reloads
-**this** `upgrade.md`, and the migration below runs in place of the old
-upgrade logic — no manual bootstrap required.
-
-> A `/magpie-setup upgrade` on an already-migrated repo never lands
-> here (it has no `setup-steward` skill). If a repo is only *partly*
-> migrated, `magpie-setup`'s own `upgrade.md` Step 0 detects the
-> leftover `.apache-steward*` artefacts and routes back here.
-
-## Sub-actions
-
-| Invocation | Loads | Purpose |
-|---|---|---|
-| `/setup-steward upgrade` | [`upgrade.md`](upgrade.md) | Run the one-time
pre-Magpie → Magpie migration, then hand off to the migrated `magpie-setup`. |
-| `/setup-steward` (no args) | [`upgrade.md`](upgrade.md) | Same — the
migration is the only thing this shim does. |
-
-Any other sub-action (`adopt`, `verify`, `worktree-init`, `override`,
-`unadopt`) is **not** served here: those belong to the migrated
-`magpie-setup` skill. If asked for one before migrating, run the
-migration first, then invoke it as `/magpie-setup <sub-action>`.
-
-## After the migration
-
-The migration's final step **removes this shim** — it replaces the
-committed `.claude/skills/setup-steward/` with `magpie-setup` and drops
-the `setup-steward` entry. From then on the adopter uses `/magpie-setup`
-for adopt / upgrade / verify / worktree-init / override / unadopt, and
-the `steward` name is gone from their repo entirely.
diff --git a/.claude/skills/setup-steward/upgrade.md
b/.claude/skills/setup-steward/upgrade.md
deleted file mode 100644
index 05db459..0000000
--- a/.claude/skills/setup-steward/upgrade.md
+++ /dev/null
@@ -1,270 +0,0 @@
-<!-- SPDX-License-Identifier: Apache-2.0
- https://www.apache.org/legal/release-policy.html -->
-
-# upgrade — one-time pre-Magpie → Magpie migration
-
-You reached this file because a pre-Magpie `/setup-steward upgrade`
-refreshed the framework snapshot and reloaded the committed skill
-in-flight (its Golden rule 9), and the refreshed framework ships this
-migration shim at the legacy `.claude/skills/setup-steward/` path. Run
-the migration below **once**. It is idempotent and every mutating step
-is surfaced before it runs.
-
-The snapshot has already been re-fetched by the pre-Magpie upgrade and
-is the **new Magpie framework**, but it still sits at the old path
-`.apache-steward/` and the rest of the repo still uses the old names.
-The migration renames everything to the Magpie layout and then removes
-this shim.
-
-## Step 0 — Confirm this is a pre-Magpie repo and show the plan
-
-Detect the legacy state. Treat the repo as pre-Magpie if **any** of
-these exist:
-
-- `.apache-steward.lock` (committed legacy pin)
-- `.apache-steward/` (legacy snapshot dir)
-- `.apache-steward-overrides/` (legacy overrides dir)
-- `<adopter-skills-dir>/setup-steward/` (committed legacy bootstrap skill)
-- a framework symlink in `<adopter-skills-dir>` **without** the
- `magpie-` prefix (e.g. `security-issue-import`, `pr-management-triage`)
-- `~/.config/apache-steward/` (legacy per-user config dir)
-
-If **none** exist, the repo is already on Magpie — stop and tell the
-user to run `/magpie-setup upgrade` instead; there is nothing to
-migrate.
-
-Resolve `<adopter-skills-dir>` exactly as the framework's
-[`magpie-setup` conventions](../../../skills/setup/conventions.md) does —
-detect Pattern A (flat `.claude/skills/`), B (per-skill double-symlink
-to `.github/skills/`), or D (one of `.claude/skills` / `.github/skills`
-is a directory symlink to the other). Pin it for the rest of the run.
-
-**Surface the full migration plan** (every rename below, as a single
-list) and get the user's confirmation before writing anything. This is
-a one-time, repo-reshaping change; the user sees it before it runs.
-
-## Step 1 — Rename the snapshot dir
-
-```bash
-# Gitignored build artefact — a plain mv, no history impact.
-[ -d .apache-steward ] && mv .apache-steward .apache-magpie
-```
-
-If `.apache-magpie/` already exists (a partial prior run), keep it and
-`rm -rf .apache-steward`. After this the snapshot is at
-`.apache-magpie/`, and the new framework's skills are at
-`.apache-magpie/skills/<skill>/` (no longer `.../.claude/skills/...`).
-
-Confirm `.apache-magpie/skills/setup/SKILL.md` exists — that is the new
-bootstrap skill source. If it is missing, the re-fetch landed an
-unexpected layout; stop and surface it.
-
-## Step 2 — Rename the lock files
-
-```bash
-# Committed pin — use git mv so history follows.
-[ -f .apache-steward.lock ] && git mv .apache-steward.lock .apache-magpie.lock
-# Gitignored per-machine record — plain mv.
-[ -f .apache-steward.local.lock ] && mv .apache-steward.local.lock
.apache-magpie.local.lock
-```
-
-## Step 3 — Rename the overrides dir
-
-```bash
-# Committed; preserve every override file and its history.
-[ -d .apache-steward-overrides ] && git mv .apache-steward-overrides
.apache-magpie-overrides
-```
-
-The override **filenames** are keyed to framework skill names. Only one
-framework skill was renamed in the Magpie rename: `setup-steward` →
-`setup`. So if an override `setup-steward.md` exists, rename it too:
-
-```bash
-[ -f .apache-magpie-overrides/setup-steward.md ] && \
- git mv .apache-magpie-overrides/setup-steward.md
.apache-magpie-overrides/setup.md
-```
-
-All other override filenames (`security-issue-sync.md`,
-`pr-management-triage.md`, …) are unchanged — the `magpie-` prefix is an
-install-time symlink-name concern, not an override-file concern (an
-override targets the skill by its clean source name).
-
-## Step 4 — Replace the committed bootstrap skill (`setup-steward` →
`magpie-setup`)
-
-The committed skill currently on disk at `<adopter-skills-dir>/setup-steward/`
-is **this shim** (the pre-Magpie upgrade just overwrote it from the
-snapshot). Replace it with the real Magpie bootstrap skill, named
-`magpie-setup`, per the adopter's layout pattern:
-
-```bash
-# Pattern A (flat):
-rm -rf <adopter-skills-dir>/setup-steward
-cp -r .apache-magpie/skills/setup <adopter-skills-dir>/magpie-setup
-
-# Pattern B (double-symlinked) — copy into .github/skills/, then the
-# outer .claude/skills/magpie-setup symlink is created in Step 5:
-rm -rf .github/skills/setup-steward .claude/skills/setup-steward
-cp -r .apache-magpie/skills/setup .github/skills/magpie-setup
-
-# Pattern D — write to the canonical side only (D.1 → .github/skills/,
-# D.2 → .claude/skills/); the symlinked side resolves automatically:
-rm -rf <canonical-side>/setup-steward
-cp -r .apache-magpie/skills/setup <canonical-side>/magpie-setup
-```
-
-`magpie-setup` is the one **committed** framework skill (Golden rule 6);
-it lands as new files in `git status` for the migration PR.
-
-## Step 5 — Re-prefix every framework symlink to `magpie-`
-
-Pre-Magpie, framework skills were symlinked under their bare names
-(`<adopter-skills-dir>/security-issue-import` → snapshot). Magpie
-namespaces every framework skill under a `magpie-` prefix. For **each**
-existing framework symlink in `<adopter-skills-dir>` (every entry that
-is a symlink resolving into the snapshot, i.e. not the committed
-`magpie-setup` and not an adopter-owned skill):
-
-1. Determine its clean source name `<n>` (the snapshot skill it points
- at). **Note the one renamed skill:** a legacy `list-steward-skills`
- symlink maps to the new source name `list-skills`.
-2. Create `<adopter-skills-dir>/magpie-<n>` → relative path into
- `.apache-magpie/skills/<n>/` (per pattern — both layers for B; the
- canonical side only for D).
-3. Remove the old bare symlink (`security-issue-import`,
- `pr-management-triage`, `list-steward-skills`, …).
-
-Compute the symlink set fresh from `.apache-magpie/skills/` filtered to
-the families the project had (read from the renamed
-`.apache-magpie.lock` plus the always-on `setup-*` / `list-*` families)
-— do not hard-code names. The post-migration state: every framework
-skill the project uses is reachable as `magpie-<n>`, and no bare-named
-framework symlink remains.
-
-## Step 6 — Rewrite the `.gitignore` block
-
-Replace the legacy framework gitignore entries. The Magpie layout
-collapses the per-family symlink lines into a single `magpie-*` glob,
-because **every** framework symlink now carries the prefix:
-
-```text
-# --- remove these legacy lines if present ---
-/.apache-steward/
-/.apache-steward.local.lock
-/.claude/skills/security-*
-/.claude/skills/pr-management-*
-/.claude/skills/issue-*
-/.claude/skills/setup-isolated-setup-*
-/.claude/skills/setup-override-upstream
-/.claude/skills/setup-shared-config-sync
-/.claude/skills/list-steward-*
-/.github/skills/security-* # (Pattern B/D only)
-/.github/skills/pr-management-*
-/.github/skills/issue-*
-/.github/skills/setup-isolated-setup-*
-/.github/skills/setup-override-upstream
-/.github/skills/setup-shared-config-sync
-/.github/skills/list-steward-*
-
-# --- write these Magpie lines ---
-/.apache-magpie/
-/.apache-magpie.local.lock
-/.claude/skills/magpie-*
-!/.claude/skills/magpie-setup
-/.github/skills/magpie-* # (Pattern B; or the canonical side for
D)
-!/.github/skills/magpie-setup # (Pattern B/D — same side as the glob
above)
-```
-
-Keep the orientation right for the adopter's pattern (Pattern A → only
-the `.claude/skills/magpie-*` pair; D → only the canonical side). The
-`!/.../magpie-setup` negation is **required**: the `magpie-*` glob would
-otherwise swallow the committed `magpie-setup` bootstrap (the one tracked
-framework skill, per [`SKILL.md` Golden rule 6](SKILL.md#golden-rules)), so
-a plain `git add` would silently skip it and fresh clones would land with
-no bootstrap skill. Keep the negation on the **same side(s)** as the glob
-(Pattern A → the `.claude` pair only; Pattern B → both pairs; Pattern D →
-the canonical side only). Use **no trailing slash** — it must re-include
-the outer symlink in Pattern B as well as the real directory. The committed
-`.apache-magpie.lock` and `.apache-magpie-overrides/` are **not**
-gitignored.
-
-## Step 7 — Migrate the per-user config dir + sandbox allowlist
-
-The per-user credential / config dir moved from `~/.config/apache-steward/`
-to `~/.config/apache-magpie/`:
-
-```bash
-[ -d ~/.config/apache-steward ] && [ ! -e ~/.config/apache-magpie ] && \
- mv ~/.config/apache-steward ~/.config/apache-magpie
-```
-
-This dir is **outside** the repo and per-machine — migrate it once per
-machine. **Then tell the operator to update their sandbox allowlist**:
-any `~/.config/apache-steward/` entry in their Claude Code settings
-(project `.claude/settings.local.json`, project `.claude/settings.json`,
-or user-scope `~/.claude/settings.json`) must become
-`~/.config/apache-magpie/`, or sandboxed framework tools will not be
-able to read the moved credentials. The framework cannot edit those
-settings files for the operator — surface the exact one-line change.
-
-## Step 8 — Migrate the post-checkout hook, lint config + doc sections
-
-- **Git hook.** If `.git/hooks/post-checkout` contains the legacy
- `setup-steward verify --auto-fix-symlinks` recipe, update it to
- `magpie-setup verify --auto-fix-symlinks` (same auto-fix behaviour,
- new skill name). Leave any non-framework hook lines untouched.
-- **Project docs.** In `README.md` / `AGENTS.md` / `CONTRIBUTING.md`,
- update any adoption section that still names `setup-steward`,
- `/setup-steward`, `.apache-steward*`, or the bare-named framework
- symlinks. Best-effort and surfaced as part of the migration diff; the
- framework-name prose ("Apache Magpie") is independent and not touched
- here.
-- **Lint / pre-commit config.** If the adopter's `.pre-commit-config.yaml`
- (or any other prek / linter config) *excludes* the committed framework
- skill or the overrides dir by their old paths — e.g.
- `^\.github/skills/setup-steward/`, `^\.claude/skills/setup-steward/`,
- `^\.apache-steward-overrides/` — re-point those exclusion patterns to the
- magpie paths (`magpie-setup`, `.apache-magpie-overrides/`). Adopters add
- these so the committed bootstrap skill is skipped by license / spellcheck
- / markdown-lint / link-check hooks; leaving a pattern stale lets those
- hooks run on the renamed files and the migration commit **fails**. The
- exact lines are adopter-specific — grep the config for `setup-steward`
- and `apache-steward` and re-point every match. Surfaced as part of the
- migration diff.
-
-## Step 9 — Hand off to `magpie-setup` and finish the upgrade
-
-The repo is now on the Magpie layout and **this shim is gone** (Step 4
-replaced the committed `setup-steward` with `magpie-setup`). Reload and
-hand off, per Golden rule 9:
-
-1. Re-read `<adopter-skills-dir>/magpie-setup/SKILL.md` and
- `<adopter-skills-dir>/magpie-setup/upgrade.md`.
-2. The snapshot is already fresh at `.apache-magpie/`, so **skip** the
- delete/re-fetch steps and resume the migrated upgrade from its
- **Step 5 (reconcile overrides)** onward — reconcile overrides
- against the new framework structure, then the Step 6 symlink-refresh
- pass (idempotent — it confirms the `magpie-*` links Step 5 created),
- the worktree propagation pass, and the upgrade summary.
-
-## Step 10 — Summary
-
-Report the migration as a single block:
-
-```text
-Migrated pre-Magpie (apache-steward) → Apache Magpie:
- snapshot .apache-steward/ → .apache-magpie/
- committed pin .apache-steward.lock → .apache-magpie.lock
- local pin .apache-steward.local.lock → .apache-magpie.local.lock
- overrides .apache-steward-overrides/ → .apache-magpie-overrides/
- bootstrap setup-steward → magpie-setup (committed)
- symlinks <bare>-* → magpie-* (N re-prefixed)
- gitignore per-family lines → magpie-* glob
- user config ~/.config/apache-steward/ → ~/.config/apache-magpie/
- hook setup-steward verify → magpie-setup verify
-
-Action required (operator): update the ~/.config/apache-steward/ entry
-in your Claude Code sandbox allowlist to ~/.config/apache-magpie/.
-
-From now on use /magpie-setup for everything. The setup-steward shim is
-removed; commit this migration diff as the upgrade PR.
-```
diff --git a/.github/skills/magpie-audit-finding-fix
b/.github/skills/magpie-audit-finding-fix
new file mode 120000
index 0000000..c32be1b
--- /dev/null
+++ b/.github/skills/magpie-audit-finding-fix
@@ -0,0 +1 @@
+../../skills/audit-finding-fix
\ No newline at end of file
diff --git a/.github/skills/magpie-committer-onboarding
b/.github/skills/magpie-committer-onboarding
new file mode 120000
index 0000000..9f421b7
--- /dev/null
+++ b/.github/skills/magpie-committer-onboarding
@@ -0,0 +1 @@
+../../skills/committer-onboarding
\ No newline at end of file
diff --git a/.github/skills/magpie-contributor-activity-sweep
b/.github/skills/magpie-contributor-activity-sweep
new file mode 120000
index 0000000..4c4ad61
--- /dev/null
+++ b/.github/skills/magpie-contributor-activity-sweep
@@ -0,0 +1 @@
+../../skills/contributor-activity-sweep
\ No newline at end of file
diff --git a/.github/skills/magpie-contributor-nomination
b/.github/skills/magpie-contributor-nomination
new file mode 120000
index 0000000..84b98fd
--- /dev/null
+++ b/.github/skills/magpie-contributor-nomination
@@ -0,0 +1 @@
+../../skills/contributor-nomination
\ No newline at end of file
diff --git a/.github/skills/magpie-good-first-issue-author
b/.github/skills/magpie-good-first-issue-author
new file mode 120000
index 0000000..360135b
--- /dev/null
+++ b/.github/skills/magpie-good-first-issue-author
@@ -0,0 +1 @@
+../../skills/good-first-issue-author
\ No newline at end of file
diff --git a/.github/skills/magpie-issue-fix-workflow
b/.github/skills/magpie-issue-fix-workflow
new file mode 120000
index 0000000..7bb0e8d
--- /dev/null
+++ b/.github/skills/magpie-issue-fix-workflow
@@ -0,0 +1 @@
+../../skills/issue-fix-workflow
\ No newline at end of file
diff --git a/.github/skills/magpie-issue-reassess
b/.github/skills/magpie-issue-reassess
new file mode 120000
index 0000000..8e91821
--- /dev/null
+++ b/.github/skills/magpie-issue-reassess
@@ -0,0 +1 @@
+../../skills/issue-reassess
\ No newline at end of file
diff --git a/.github/skills/magpie-issue-reassess-stats
b/.github/skills/magpie-issue-reassess-stats
new file mode 120000
index 0000000..a5b2632
--- /dev/null
+++ b/.github/skills/magpie-issue-reassess-stats
@@ -0,0 +1 @@
+../../skills/issue-reassess-stats
\ No newline at end of file
diff --git a/.github/skills/magpie-issue-reproducer
b/.github/skills/magpie-issue-reproducer
new file mode 120000
index 0000000..c8cdab9
--- /dev/null
+++ b/.github/skills/magpie-issue-reproducer
@@ -0,0 +1 @@
+../../skills/issue-reproducer
\ No newline at end of file
diff --git a/.github/skills/magpie-issue-triage
b/.github/skills/magpie-issue-triage
new file mode 120000
index 0000000..a32c627
--- /dev/null
+++ b/.github/skills/magpie-issue-triage
@@ -0,0 +1 @@
+../../skills/issue-triage
\ No newline at end of file
diff --git a/.github/skills/magpie-list-skills
b/.github/skills/magpie-list-skills
new file mode 120000
index 0000000..a6c207d
--- /dev/null
+++ b/.github/skills/magpie-list-skills
@@ -0,0 +1 @@
+../../skills/list-skills
\ No newline at end of file
diff --git a/.github/skills/magpie-optimize-skill
b/.github/skills/magpie-optimize-skill
new file mode 120000
index 0000000..8cddd77
--- /dev/null
+++ b/.github/skills/magpie-optimize-skill
@@ -0,0 +1 @@
+../../skills/optimize-skill
\ No newline at end of file
diff --git a/.github/skills/magpie-pairing-multi-agent-review
b/.github/skills/magpie-pairing-multi-agent-review
new file mode 120000
index 0000000..ddb431c
--- /dev/null
+++ b/.github/skills/magpie-pairing-multi-agent-review
@@ -0,0 +1 @@
+../../skills/pairing-multi-agent-review
\ No newline at end of file
diff --git a/.github/skills/magpie-pairing-self-review
b/.github/skills/magpie-pairing-self-review
new file mode 120000
index 0000000..b2fccf7
--- /dev/null
+++ b/.github/skills/magpie-pairing-self-review
@@ -0,0 +1 @@
+../../skills/pairing-self-review
\ No newline at end of file
diff --git a/.github/skills/magpie-pr-management-code-review
b/.github/skills/magpie-pr-management-code-review
new file mode 120000
index 0000000..4b543a0
--- /dev/null
+++ b/.github/skills/magpie-pr-management-code-review
@@ -0,0 +1 @@
+../../skills/pr-management-code-review
\ No newline at end of file
diff --git a/.github/skills/magpie-pr-management-mentor
b/.github/skills/magpie-pr-management-mentor
new file mode 120000
index 0000000..02c3493
--- /dev/null
+++ b/.github/skills/magpie-pr-management-mentor
@@ -0,0 +1 @@
+../../skills/pr-management-mentor
\ No newline at end of file
diff --git a/.github/skills/magpie-pr-management-quick-merge
b/.github/skills/magpie-pr-management-quick-merge
new file mode 120000
index 0000000..a504c5a
--- /dev/null
+++ b/.github/skills/magpie-pr-management-quick-merge
@@ -0,0 +1 @@
+../../skills/pr-management-quick-merge
\ No newline at end of file
diff --git a/.github/skills/magpie-pr-management-stats
b/.github/skills/magpie-pr-management-stats
new file mode 120000
index 0000000..b1a1338
--- /dev/null
+++ b/.github/skills/magpie-pr-management-stats
@@ -0,0 +1 @@
+../../skills/pr-management-stats
\ No newline at end of file
diff --git a/.github/skills/magpie-pr-management-triage
b/.github/skills/magpie-pr-management-triage
new file mode 120000
index 0000000..4ae07e2
--- /dev/null
+++ b/.github/skills/magpie-pr-management-triage
@@ -0,0 +1 @@
+../../skills/pr-management-triage
\ No newline at end of file
diff --git a/.github/skills/magpie-security-cve-allocate
b/.github/skills/magpie-security-cve-allocate
new file mode 120000
index 0000000..6cc475b
--- /dev/null
+++ b/.github/skills/magpie-security-cve-allocate
@@ -0,0 +1 @@
+../../skills/security-cve-allocate
\ No newline at end of file
diff --git a/.github/skills/magpie-security-issue-deduplicate
b/.github/skills/magpie-security-issue-deduplicate
new file mode 120000
index 0000000..63f6e88
--- /dev/null
+++ b/.github/skills/magpie-security-issue-deduplicate
@@ -0,0 +1 @@
+../../skills/security-issue-deduplicate
\ No newline at end of file
diff --git a/.github/skills/magpie-security-issue-fix
b/.github/skills/magpie-security-issue-fix
new file mode 120000
index 0000000..40c0839
--- /dev/null
+++ b/.github/skills/magpie-security-issue-fix
@@ -0,0 +1 @@
+../../skills/security-issue-fix
\ No newline at end of file
diff --git a/.github/skills/magpie-security-issue-import
b/.github/skills/magpie-security-issue-import
new file mode 120000
index 0000000..d80190b
--- /dev/null
+++ b/.github/skills/magpie-security-issue-import
@@ -0,0 +1 @@
+../../skills/security-issue-import
\ No newline at end of file
diff --git a/.github/skills/magpie-security-issue-import-from-md
b/.github/skills/magpie-security-issue-import-from-md
new file mode 120000
index 0000000..3c96cda
--- /dev/null
+++ b/.github/skills/magpie-security-issue-import-from-md
@@ -0,0 +1 @@
+../../skills/security-issue-import-from-md
\ No newline at end of file
diff --git a/.github/skills/magpie-security-issue-import-from-pr
b/.github/skills/magpie-security-issue-import-from-pr
new file mode 120000
index 0000000..41c4085
--- /dev/null
+++ b/.github/skills/magpie-security-issue-import-from-pr
@@ -0,0 +1 @@
+../../skills/security-issue-import-from-pr
\ No newline at end of file
diff --git a/.github/skills/magpie-security-issue-import-via-forwarder
b/.github/skills/magpie-security-issue-import-via-forwarder
new file mode 120000
index 0000000..213f546
--- /dev/null
+++ b/.github/skills/magpie-security-issue-import-via-forwarder
@@ -0,0 +1 @@
+../../skills/security-issue-import-via-forwarder
\ No newline at end of file
diff --git a/.github/skills/magpie-security-issue-invalidate
b/.github/skills/magpie-security-issue-invalidate
new file mode 120000
index 0000000..7b07030
--- /dev/null
+++ b/.github/skills/magpie-security-issue-invalidate
@@ -0,0 +1 @@
+../../skills/security-issue-invalidate
\ No newline at end of file
diff --git a/.github/skills/magpie-security-issue-sync
b/.github/skills/magpie-security-issue-sync
new file mode 120000
index 0000000..b4f409e
--- /dev/null
+++ b/.github/skills/magpie-security-issue-sync
@@ -0,0 +1 @@
+../../skills/security-issue-sync
\ No newline at end of file
diff --git a/.github/skills/magpie-security-issue-triage
b/.github/skills/magpie-security-issue-triage
new file mode 120000
index 0000000..162016a
--- /dev/null
+++ b/.github/skills/magpie-security-issue-triage
@@ -0,0 +1 @@
+../../skills/security-issue-triage
\ No newline at end of file
diff --git a/.github/skills/magpie-security-tracker-stats-dashboard
b/.github/skills/magpie-security-tracker-stats-dashboard
new file mode 120000
index 0000000..ea7df87
--- /dev/null
+++ b/.github/skills/magpie-security-tracker-stats-dashboard
@@ -0,0 +1 @@
+../../skills/security-tracker-stats-dashboard
\ No newline at end of file
diff --git a/.github/skills/magpie-setup b/.github/skills/magpie-setup
new file mode 120000
index 0000000..8f69d9c
--- /dev/null
+++ b/.github/skills/magpie-setup
@@ -0,0 +1 @@
+../../skills/setup
\ No newline at end of file
diff --git a/.github/skills/magpie-setup-isolated-setup-doctor
b/.github/skills/magpie-setup-isolated-setup-doctor
new file mode 120000
index 0000000..44f2819
--- /dev/null
+++ b/.github/skills/magpie-setup-isolated-setup-doctor
@@ -0,0 +1 @@
+../../skills/setup-isolated-setup-doctor
\ No newline at end of file
diff --git a/.github/skills/magpie-setup-isolated-setup-install
b/.github/skills/magpie-setup-isolated-setup-install
new file mode 120000
index 0000000..794d890
--- /dev/null
+++ b/.github/skills/magpie-setup-isolated-setup-install
@@ -0,0 +1 @@
+../../skills/setup-isolated-setup-install
\ No newline at end of file
diff --git a/.github/skills/magpie-setup-isolated-setup-update
b/.github/skills/magpie-setup-isolated-setup-update
new file mode 120000
index 0000000..fabb0d7
--- /dev/null
+++ b/.github/skills/magpie-setup-isolated-setup-update
@@ -0,0 +1 @@
+../../skills/setup-isolated-setup-update
\ No newline at end of file
diff --git a/.github/skills/magpie-setup-isolated-setup-verify
b/.github/skills/magpie-setup-isolated-setup-verify
new file mode 120000
index 0000000..d76e89a
--- /dev/null
+++ b/.github/skills/magpie-setup-isolated-setup-verify
@@ -0,0 +1 @@
+../../skills/setup-isolated-setup-verify
\ No newline at end of file
diff --git a/.github/skills/magpie-setup-override-upstream
b/.github/skills/magpie-setup-override-upstream
new file mode 120000
index 0000000..a9cee55
--- /dev/null
+++ b/.github/skills/magpie-setup-override-upstream
@@ -0,0 +1 @@
+../../skills/setup-override-upstream
\ No newline at end of file
diff --git a/.github/skills/magpie-setup-shared-config-sync
b/.github/skills/magpie-setup-shared-config-sync
new file mode 120000
index 0000000..f850cf0
--- /dev/null
+++ b/.github/skills/magpie-setup-shared-config-sync
@@ -0,0 +1 @@
+../../skills/setup-shared-config-sync
\ No newline at end of file
diff --git a/.github/skills/magpie-write-skill
b/.github/skills/magpie-write-skill
new file mode 120000
index 0000000..f512e9d
--- /dev/null
+++ b/.github/skills/magpie-write-skill
@@ -0,0 +1 @@
+../../skills/write-skill
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 655d048..1f5f751 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,13 +5,18 @@ logs
.build
.claude/worktrees/
.claude/settings.local.json
-# Skill source lives in skills/; .claude/skills/ holds only
-# gitignored self-adoption symlinks (a maintainer adopts the
-# framework into itself to make the skills active locally).
+# Skill source lives in skills/. The framework self-adopts by
+# committing magpie-<skill> symlinks that point into ../../skills/<skill>/
+# (see skills/setup/adopt.md → "Local self-adoption"). They live under
+# BOTH .claude/skills/ (Claude Code) and .github/skills/ (GitHub's skill
+# loader). Those symlinks ARE committed — their targets are in-repo and
+# always resolve on a fresh clone, so every contributor gets the skills
+# active with no setup step. Everything else dropped into these dirs
+# stays local.
.claude/skills/*
-# Transition migration shim for pre-Magpie adopters — committed so it
-# ships in the snapshot a frozen `/setup-steward upgrade` fetches.
-!/.claude/skills/setup-steward/
+!/.claude/skills/magpie-*
+.github/skills/*
+!/.github/skills/magpie-*
# macOS
.DS_Store
diff --git a/AGENTS.md b/AGENTS.md
index fa0aaec..2f61d6f 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -99,7 +99,7 @@ Repo-root files:
- [`projects/_template/`](projects/_template/) — bootstrap scaffold for a new
adopter's `<project-config>/`.
- [`tools/<name>/`](tools/) — tool adapters (GitHub operations, issue-template
schema, project-board GraphQL, …) for the external tools the skills invoke.
- [`skills/<name>/SKILL.md`](skills/) — the agentic workflows.
-- [`.claude/skills/setup-steward/`](.claude/skills/setup-steward/) — a
**transition migration shim**, deliberately committed (un-ignored) at the
legacy path so it ships in the snapshot. It is the only artefact that still
carries the `steward` name; its sole job is to migrate a pre-Magpie adopter to
the `magpie-` layout (see its
[`SKILL.md`](.claude/skills/setup-steward/SKILL.md)). **Do not delete it**
until the framework drops pre-Magpie migration support.
+- `.claude/skills/magpie-<name>/` and `.github/skills/magpie-<name>/` —
committed symlinks into `../../skills/<name>/`. This repo **self-adopts**:
`/magpie-setup` with `method:local` links every skill source under both
`.claude/skills/` (Claude Code) and `.github/skills/` (GitHub's skill loader)
so the framework's own skills are callable from either harness while developing
the framework (see [`skills/setup/adopt.md`](skills/setup/adopt.md) → "Local
self-adoption"). The symlinks are comm [...]
There is no source code to build or test in this framework
repository itself. Adopting projects may include project-specific
diff --git a/docs/setup/install-recipes.md b/docs/setup/install-recipes.md
index aeb2324..847e788 100644
--- a/docs/setup/install-recipes.md
+++ b/docs/setup/install-recipes.md
@@ -290,34 +290,21 @@ A repo that adopted the framework **before** it was
renamed from
`apache-steward` to **Apache Magpie** is on the old layout: a committed
`.claude/skills/setup-steward/` skill, an `.apache-steward/` snapshot,
`.apache-steward.lock` / `.apache-steward-overrides/`, un-prefixed
-framework symlinks, and `~/.config/apache-steward/`. **No manual recipe
-is needed** — the migration is automatic and one-shot:
-
-```text
-/setup-steward upgrade
-```
-
-The frozen `setup-steward` skill committed in the repo refreshes the
-snapshot per its lock (which lands the current Magpie framework), and —
-because the Magpie framework still ships a transition shim at the legacy
-`.claude/skills/setup-steward/` path — reloads that shim in-flight (its
-Golden rule 9). The shim's
-[`upgrade.md`](../../.claude/skills/setup-steward/upgrade.md) then
-migrates everything in place:
-
-- `.apache-steward*` → `.apache-magpie*` (snapshot, locks, overrides)
-- the committed `setup-steward` skill → `magpie-setup`
-- every un-prefixed framework symlink → `magpie-<name>`
-- the `.gitignore` block → the collapsed `magpie-*` form
-- `~/.config/apache-steward/` → `~/.config/apache-magpie/` (per-machine)
-
-…then **removes itself**. Review and commit the migration diff as the
-upgrade PR. From then on the repo uses `/magpie-setup` for everything,
-and the `steward` name is gone.
-
-> **One manual step the framework cannot do for you:** update any
-> `~/.config/apache-steward/` entry in your Claude Code sandbox
-> allowlist (project `.claude/settings.local.json` / `.claude/settings.json`
-> or user-scope `~/.claude/settings.json`) to `~/.config/apache-magpie/`,
-> or sandboxed framework tools cannot read the moved credentials. The
-> migration surfaces the exact one-line change.
+framework symlinks, and `~/.config/apache-steward/`. The framework
+**no longer ships an automated migration** for this layout — migrate by
+hand:
+
+1. Remove the legacy in-repo artefacts: `.apache-steward*` (snapshot,
+ locks, overrides), any un-prefixed framework symlinks under the
+ skills dir, and the committed `.claude/skills/setup-steward/` skill.
+2. Re-adopt from scratch with `/magpie-setup` (see
+ [`setup/adopt.md`](../../skills/setup/adopt.md)) so the current
+ `.apache-magpie*` layout and `magpie-`-prefixed symlinks are written
+ fresh. Preserve any `.apache-steward-overrides/*.md` you want to keep
+ by moving them into the new `.apache-magpie-overrides/` first.
+3. Move `~/.config/apache-steward/` (per-user) to
+ `~/.config/apache-magpie/`, and update any `~/.config/apache-steward/`
+ entry in your Claude Code sandbox allowlist (project
+ `.claude/settings.local.json` / `.claude/settings.json` or user-scope
+ `~/.claude/settings.json`) to `~/.config/apache-magpie/` — otherwise
+ sandboxed framework tools cannot read the moved credentials.
diff --git a/skills/setup/SKILL.md b/skills/setup/SKILL.md
index 4b2691c..d671d9c 100644
--- a/skills/setup/SKILL.md
+++ b/skills/setup/SKILL.md
@@ -94,6 +94,21 @@ copy):
[`docs/setup/agentic-overrides.md`](../../docs/setup/agentic-overrides.md)
for the design rationale.
+**Local self-adoption (the framework checkout only).** The one
+repo that cannot be adopted via the snapshot mechanism is the
+Apache Magpie framework checkout itself — a remote snapshot of the
+framework into itself would be circular. Instead it **self-adopts**
+with `method:local`: each `magpie-<skill>` is a **committed**
+symlink into the in-repo `../../skills/<skill>/` source — written
+under both `.claude/skills/` (Claude Code) and `.github/skills/`
+(GitHub's skill loader) — with no snapshot, no remote fetch, and
+no copy. This makes
+the framework's own skills callable while developing the framework,
+and every contributor gets them active on a fresh clone with no
+setup step. `adopt` detects the framework checkout structurally and
+routes there automatically (see
+[`adopt.md` → Local self-adoption](adopt.md#local-self-adoption-methodlocal)).
+
## The two lock files
The framework's lock-file model splits **what the project pins
@@ -342,7 +357,7 @@ first, then continue.
| Flag | Effect |
|---|---|
| `from:<git-ref>` / `from:<version>` | Adopt or upgrade from a specific
framework ref or version. Used during `adopt` (overrides the user prompt) and
`upgrade` (overrides the committed lock for *this run only* — does NOT update
the committed lock). |
-| `method:<git-branch\|git-tag\|svn-zip>` | Pick the install method
explicitly. Default during `adopt`: prompt the user. |
+| `method:<git-branch\|git-tag\|svn-zip\|local>` | Pick the install method
explicitly. Default during `adopt`: prompt the user. **`local`** is
**framework-checkout only** — it self-adopts by linking the in-repo `skills/`
source directly instead of fetching a snapshot (see [`adopt.md` → Local
self-adoption](adopt.md#local-self-adoption-methodlocal)). |
| `skill-families:<list>` | Comma-separated **opt-in** families to symlink
(`security`, `pr-management`, `issue`). Default on `adopt`: prompt. Default on
`upgrade`: read the families list from `<committed-lock>` / `<local-lock>`,
**auto-include any opt-in family the framework has introduced since the lock
was written** (recorded back into the lock), and **ensure every framework skill
in the effective family set has a valid symlink** — create or repair missing /
broken symlinks, not just [...]
| `--purge-overrides` | *(unadopt only)* Also `git rm -r`
`.apache-magpie-overrides/`. Default: preserve. |
| `dry-run` | Show what the skill would do without writing anything. |
diff --git a/skills/setup/adopt.md b/skills/setup/adopt.md
index 9926eaa..b7b508b 100644
--- a/skills/setup/adopt.md
+++ b/skills/setup/adopt.md
@@ -63,9 +63,31 @@ between automatically:
`$(dirname "$(cd "$(git rev-parse --git-common-dir)" && pwd)")` —
surface it explicitly in the error message so the operator
can `cd` there without guessing.
-3. Confirm we are **not** in `apache/airflow-steward` itself
- (read `git remote get-url origin` and refuse if it
- resolves to the framework).
+3. Detect whether we are **in the Apache Magpie framework
+ checkout itself** rather than an adopter repo. The framework
+ checkout is the one place self-adoption is possible — it
+ links its own `skills/` source directly instead of fetching a
+ snapshot (see
+ [Local self-adoption](#local-self-adoption-methodlocal)).
+
+ Detect it **structurally** — do *not* rely on the `origin`
+ URL, which on a contributor's fork points at
+ `<user>/airflow-steward`, not `apache/`. The repo is the
+ framework checkout when `skills/setup/SKILL.md` exists at the
+ repo root with `name: magpie-setup` in its frontmatter **and**
+ `skills/list-skills/` is present.
+
+ - **Framework checkout** → self-adoption is available. If the
+ user passed `method:local`, go straight to
+ [Local self-adoption](#local-self-adoption-methodlocal).
+ Otherwise offer it — the only non-circular adoption for the
+ framework repo is the local one (a remote snapshot of the
+ framework into itself would shadow the live `skills/`
+ source with a stale copy). On confirmation, follow that
+ section; a remote `method:` against the framework checkout
+ is refused.
+ - **Adopter repo** (the structural markers are absent) →
+ continue with the normal remote-snapshot flow below.
4. Detect the adopter's existing skills-dir convention by
following [`conventions.md`](conventions.md). Pin the
result as `<adopter-skills-dir>` for the rest of this
@@ -105,6 +127,100 @@ between automatically:
change; the adopt flow surfaces every step before
writing.
+## Local self-adoption (`method:local`)
+
+**Framework checkout only.** When `/magpie-setup` runs inside the
+Apache Magpie framework checkout (detected in
+[Step 0](#step-0--pre-flight)), it adopts the framework *into
+itself* by linking the live `skills/` source directly — **no
+remote URL, no snapshot fetch, no repo copy**. This is how a
+maintainer makes the framework's own skills callable while
+developing the framework. An adopter repo never reaches this
+section; it runs Steps 1–12 below.
+
+How it differs from a remote adoption:
+
+- **No `<snapshot-dir>`.** Nothing is fetched — the skill sources
+ already live in `skills/` at the repo root.
+- **No remote lock.** A single committed marker file
+ `.apache-magpie.lock` records `method: local` (no
+ `url`/`ref`/`commit`/`sha512`), and there is no
+ `.apache-magpie.local.lock`.
+- **Symlinks are committed, not gitignored.** Each
+ `magpie-<skill>` symlink targets `../../skills/<skill>/` — an
+ in-repo path that always resolves on a fresh clone — so the
+ links are committed. They are written under **both**
+ `.claude/skills/` (Claude Code) and `.github/skills/` (GitHub's
+ skill loader), so the framework's own skills are discoverable
+ by either harness; `.gitignore` un-ignores `magpie-*` in both
+ dirs. Every contributor gets the skills active with no setup
+ step.
+- **All skills, no family prompt.** Self-adoption links *every*
+ skill under `skills/`, so the opt-in family prompt of
+ [Step 5](#step-5--pick-the-skill-families) is skipped.
+ `skill-families:` is still honoured if the maintainer wants to
+ narrow the set.
+- **`magpie-setup` is itself a symlink** (→ `../../skills/setup/`),
+ not a committed copy. The copy-vs-symlink rule of
+ [`SKILL.md` Golden rule 6](SKILL.md#golden-rules) exists only
+ because adopter snapshots disappear on clone; the framework's
+ own source is always present, so the bootstrap is linked like
+ every other skill.
+
+### Steps
+
+1. **Pre-flight** ([Step 0](#step-0--pre-flight)) has confirmed
+ we are in the framework checkout and in the main checkout (not
+ a worktree).
+2. **Refuse a remote method.** If the user passed
+ `method:git-branch|git-tag|svn-zip`, stop: a remote snapshot
+ of the framework into itself is circular and would shadow the
+ live `skills/` source.
+3. **Enumerate skills.** List every directory under
+ `<repo-root>/skills/` that contains a `SKILL.md`. Apply
+ `skill-families:` as a filter if it was passed; otherwise take
+ all of them.
+4. **Write the marker lock** at `<repo-root>/.apache-magpie.lock`:
+
+ ```text
+ # .apache-magpie.lock — committed. Local self-adoption marker.
+ # The framework checkout links its own skills/ source; there is
+ # no remote snapshot. Edited only by /magpie-setup.
+
+ method: local
+ source: skills/
+ ```
+
+5. **`.gitignore`.** Ensure each skills dir glob is ignored with
+ the `magpie-*` set un-ignored, in **both** locations
+ (idempotent — add any missing line):
+
+ ```text
+ .claude/skills/*
+ !/.claude/skills/magpie-*
+ .github/skills/*
+ !/.github/skills/magpie-*
+ ```
+
+6. **Create the symlinks.** For each enumerated skill `<n>`,
+ create the relative symlink `magpie-<n>` → `../../skills/<n>`
+ under **both** `<repo-root>/.claude/skills/` and
+ `<repo-root>/.github/skills/`. Idempotent: re-point a
+ pre-existing `magpie-<n>` symlink only if it targets something
+ else; never overwrite a non-symlink (surface the conflict and
+ stop). Show the full list and confirm before writing.
+7. **Verify + stage.** Confirm every `magpie-<n>` symlink (in
+ both dirs) resolves to a directory containing `SKILL.md`, then
+ suggest the user `git add` the symlinks, `.apache-magpie.lock`,
+ and `.gitignore`.
+
+Self-adoption skips the adopter-only steps entirely: no snapshot
+fetch (Step 3), no committed-`setup` reconcile (Step 3b), no
+fit-signal probe (Step 4b), no family prompt (Step 5), no
+`.apache-magpie-overrides/` scaffold (Step 9), no `user.md`
+(Step 9b), no comdev MCP prereqs (Step 9c), no project-doc
+updates (Step 11) — the framework repo *is* the documentation.
+
## Step 1 — Detect adoption shape
```text
diff --git a/skills/setup/upgrade.md b/skills/setup/upgrade.md
index 0fcf726..bc104e1 100644
--- a/skills/setup/upgrade.md
+++ b/skills/setup/upgrade.md
@@ -59,27 +59,30 @@ Both paths run the same flow.
## Step 0a — Pre-Magpie leftovers safety check
-A repo that adopted the framework before it was renamed from
-**apache-steward** to **Apache Magpie** migrates via the
-one-shot transition shim at `.claude/skills/setup-steward/`
-(a frozen `/setup-steward upgrade` lands there automatically;
-see that skill's
[`upgrade.md`](../../.claude/skills/setup-steward/upgrade.md)).
-A fully-migrated repo never reaches *this* file with legacy
-artefacts present.
-
-If you nonetheless detect **any** legacy artefact here —
+The framework was once named **apache-steward** before it was
+renamed to **Apache Magpie**. The framework **no longer ships an
+automated pre-Magpie migration** — a repo still on the old layout
+must be migrated by hand.
+
+If you detect **any** legacy artefact here —
`.apache-steward.lock`, `.apache-steward/`,
`.apache-steward-overrides/`, a committed
`<adopter-skills-dir>/setup-steward/`, or a framework symlink
-**without** the `magpie-` prefix — a prior migration did not
-finish. Do **not** continue the normal upgrade against the
-half-migrated state. Run the transition migration to
-completion first (follow
-[`.claude/skills/setup-steward/upgrade.md`](../../.claude/skills/setup-steward/upgrade.md),
-which is idempotent and safe to re-run), then resume this
-upgrade. `~/.config/apache-steward/` alone (per-user, no
-in-repo artefacts) just needs the dir + sandbox-allowlist
-move from that file's Step 7.
+**without** the `magpie-` prefix — do **not** continue the normal
+upgrade against the half-migrated state. Stop and surface the
+manual remediation:
+
+1. Remove the legacy in-repo artefacts (`.apache-steward*`, any
+ un-prefixed framework symlinks, a committed `setup-steward`
+ skill).
+2. Re-adopt from scratch with `/magpie-setup` so the current
+ `.apache-magpie*` layout and `magpie-`-prefixed symlinks are
+ written fresh.
+3. Move `~/.config/apache-steward/` (per-user) to
+ `~/.config/apache-magpie/` and update any sandbox-allowlist
+ entry that referenced the old path.
+
+Then resume this upgrade against the clean Magpie layout.
## Step 1 — Compute drift
diff --git a/skills/setup/verify.md b/skills/setup/verify.md
index e7a346e..8db9c41 100644
--- a/skills/setup/verify.md
+++ b/skills/setup/verify.md
@@ -21,13 +21,51 @@ default — surfaces gaps and remediation commands.
## Pre-flight
1. `git rev-parse --show-toplevel` — must succeed.
-2. `git remote get-url origin` — refuse if it resolves to
- `apache/airflow-steward` itself (this skill is for
- adopters, not the framework).
+2. **Framework checkout?** Detect structurally (as in
+ [`adopt.md` Step 0](adopt.md#step-0--pre-flight)):
+ `skills/setup/SKILL.md` exists at the repo root with
+ `name: magpie-setup` and `skills/list-skills/` is present. If
+ so **and** `.apache-magpie.lock` records `method: local`, the
+ repo is **self-adopted** — run the
+ [Local self-adoption checks](#local-self-adoption-checks)
+ instead of the snapshot checks below, then stop. A framework
+ checkout with no `method: local` lock is simply not adopted
+ yet — point at `/magpie-setup`.
3. If `<repo-root>/.apache-magpie.lock` is missing, the
repo is not adopted. Surface and stop with a pointer at
`/magpie-setup adopt`.
+## Local self-adoption checks
+
+Run these (and only these) when pre-flight detected a framework
+checkout self-adopted with `method: local`. There is no snapshot,
+no remote lock, and no per-machine lock to drift against — the
+committed symlinks into the in-repo `skills/` source *are* the
+adoption state.
+
+1. **Marker lock.** `.apache-magpie.lock` parses and records
+ `method: local`. ✓ when present; ✗ with a pointer at
+ `/magpie-setup` otherwise.
+2. **Symlinks resolve into `skills/`.** In **both**
+ `.claude/skills/` and `.github/skills/`, every `magpie-<n>` is
+ a symlink whose target (`../../skills/<n>/`) resolves to a
+ directory containing `SKILL.md`. ✗ list any dangling or
+ non-symlink entry; remediation: re-run `/magpie-setup`
+ (idempotent).
+3. **Coverage.** Every `skills/<n>/` with a `SKILL.md` has a
+ matching `magpie-<n>` symlink in **both** dirs (unless a
+ `skill-families:` filter was deliberately applied). ⚠ list any
+ source skill with no link; remediation: `/magpie-setup`.
+4. **`.gitignore`.** `.claude/skills/*` and `.github/skills/*` are
+ ignored, with `!/.claude/skills/magpie-*` and
+ `!/.github/skills/magpie-*` un-ignoring the committed symlinks.
+ ✗ if either un-ignore line is missing (those symlinks would not
+ be tracked).
+5. **No remote leftovers.** No `.apache-magpie/` snapshot dir and
+ no `.apache-magpie.local.lock` — local self-adoption uses
+ neither. ⚠ surface either if found (a stale remote adoption was
+ not cleaned up).
+
## The checks
Run all checks even on early failure (a missing snapshot at