blob: a33c4ae8729c8d322ff841f1338e41f3d905df12 [file] [view]
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
- [RFC-AI-0005: Framework taxonomy](#rfc-ai-0005-framework-taxonomy)
- [Abstract](#abstract)
- [Status of this document](#status-of-this-document)
- [Motivation](#motivation)
- [The taxonomies at a glance](#the-taxonomies-at-a-glance)
- [Capability — the two-axis model](#capability--the-two-axis-model)
- [Axis 1 — Skill capability (what a workflow *does*)](#axis-1--skill-capability-what-a-workflow-does)
- [Axis 2 — Tool capability (what a backend *provides*)](#axis-2--tool-capability-what-a-backend-provides)
- [How the two axes link](#how-the-two-axes-link)
- [The other taxonomies (unchanged, documented here for completeness)](#the-other-taxonomies-unchanged-documented-here-for-completeness)
- [`family:*` — subject](#family--subject)
- [`kind:*` — change type](#kind--change-type)
- [`mode:*` — agentic mode](#mode--agentic-mode)
- [`organization:` — organization membership / inheritance](#organization--organization-membership--inheritance)
- [Standalone labels](#standalone-labels)
- [Migration](#migration)
- [Out of scope](#out-of-scope)
- [References](#references)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->
# RFC-AI-0005: Framework taxonomy
## Abstract
Magpie classifies its issues, skills, and tools with several label
dimensions — `family:`, `capability:`, `kind:`, `mode:`, and the newer
`organization:` scope. This RFC documents the **whole** taxonomy in one
place and fixes the one dimension that has drifted: **`capability:`**.
Today a single capability vocabulary is stamped on two very different
entities — *skills* (where it names a workflow-lifecycle phase) and
*tools* (where it should name a technical interface). The mismatch
collapses ~75% of tools into a meaningless catch-all bucket and
leaves four capabilities with no tool ever using them. This RFC splits
`capability:` into two orthogonal axes — **skill capability** (what a
workflow does) and **tool capability** (what a backend provides, = the
contract it implements) — and specifies the migration.
## Status of this document
**Proposed.** Implemented in the same change set that lands this RFC
(`skill-and-tool-validator`, every `tools/*/README.md`, the
`setup`-capability skills, `docs/labels-and-capabilities.md`, and the
`AGENTS.md` / `tools/AGENTS.md` labeling sections). Supersedes the single
`capability:` vocabulary described in earlier revisions of
`docs/labels-and-capabilities.md`.
## Motivation
`docs/labels-and-capabilities.md` defines nine capabilities — `triage`,
`review`, `fix`, `intake`, `reconciliation`, `resolve`, `reassess`,
`stats`, `setup` — and applies them to both skills and tools. Measured
against the live tree:
- **The `setup` capability is a grab-bag — 24 of 33 tools.** It is stamped
on entities with nothing in common: API substrate (`github`, `jira`,
`gmail`, `vcs`), adapter *contracts* (`cve-tool`, `mail-archive`,
`forwarder-relay`, `scan-format`, `mail-source`), a command guard
(`agent-guard`), sandbox/isolation (`agent-isolation`,
`egress-gateway`, `probe-templates`, `sandbox-lint`,
`permission-audit`), PII redaction (`privacy-llm`), the framework
dev-loop (`dev`, `spec-loop`, `spec-validator`,
`skill-and-tool-validator`, `spec-status-index`, `skill-evals`), and
context-safe helpers (`github-body-field`, `github-rollup`).
- **Four capabilities have zero tools** — `triage`, `review`, `fix`,
`reassess`. They only ever describe a skill.
- **The surviving tool buckets are too coarse** — `stats` lumps a data
*source* (`apache-projects`) with HTML *renderers*
(`dashboard-generator`); `resolve` on a tool means only "CVE
authority".
**Root cause.** The nine capabilities are *workflow-lifecycle phases* —
the right model for **skills** (orthogonal to `family:`). A lifecycle phase
is the wrong model for a **tool**, which has a *technical interface*, not
a phase. The framework already has the right concept for a tool's
capability: the **capability contract** (`tools/cve-tool/`,
`mail-archive/`, `forwarder-relay/`, `scan-format/`, plus
`source-control` and the tracker interface). A tool's real capability is
*the contract it implements* — but that is not what `**Capability:**`
records.
## The taxonomies at a glance
| Dimension | Applies to | Answers | Source of truth |
|---|---|---|---|
| `family:*` | issues, PRs | *which part of the framework?* | this RFC + `docs/labels-and-capabilities.md` |
| **skill capability** | skills, issues, PRs | *what lifecycle phase does the workflow perform?* | this RFC + `docs/labels-and-capabilities.md` |
| **tool capability** | tools / adapters | *what interface/contract does the backend provide?* | this RFC + the adapter [registry](../adapters/registry.md) |
| `kind:*` | issues, PRs | *what type of change?* | `docs/labels-and-capabilities.md` |
| `mode:*` | skills, issues | *which agentic mode / risk tier?* | `docs/modes.md` |
| `organization:` | skills, families, tools, projects | *which organization does this belong to / inherit from?* | `organizations/README.md` |
The change in this RFC is splitting the third row out of the second.
## Capability — the two-axis model
### Axis 1 — Skill capability (what a workflow *does*)
The lifecycle phase a skill performs, orthogonal to `family:`:
`triage · review · fix · intake · reconciliation · resolve · reassess ·
stats · platform · authoring`
This is the previous list with `setup` **split** into:
- **`platform`** — framework/agent substrate skills: install, verify,
update, doctor, override-upstream, status, shared-config-sync, the
`setup` bootstrap.
- **`authoring`** — skills that author or maintain *other* skills:
`write-skill`, `optimize-skill`.
Splitting `setup` removes the last overloaded skill bucket: "stand up the
agent" (`platform`) and "write a workflow" (`authoring`) are different
jobs and were both `setup`.
### Axis 2 — Tool capability (what a backend *provides*)
A tool's capability is **the contract / interface it implements**, drawn
from a controlled vocabulary that mirrors the capability contracts plus a
small set of substrate kinds:
| Tool capability | Kind | What it provides |
|---|---|---|
| `tracker` | contract | issue / PR / board / label backend |
| `source-control` | contract | branch / commit / diff / push (VCS) |
| `mail-archive` | contract | public mailing-list / forum archive reads |
| `mail-source` | contract | inbound-mail ingestion (mbox / IMAP / …) |
| `mail-create` | contract | outbound mail composition — always an editable draft; sending is a separate human-approved step (draft mode default and only mode implemented; send mode declared, unimplemented) |
| `cve-authority` | contract | CVE allocation / record management / publication |
| `report-relay` | contract | inbound security-report relay detection |
| `scan-format` | contract | security-scanner report parsing |
| `project-metadata` | contract | governance rosters / people / releases |
| `analytics` | substrate | read-only metrics / dashboards / renderers |
| `sandbox` | substrate | agent isolation, egress control, settings audit |
| `action-guard` | substrate | deterministic pre-tool-use command guards |
| `privacy` | substrate | PII redaction / approved-LLM gating |
| `framework-dev` | substrate | build / validate / eval the framework itself |
The *contract* rows are exactly the seams an [adapter](../vendor-neutrality.md#tool-adapters)
plugs into; the tool capability of an adapter is the contract it
fulfils. The *substrate* rows replace the old `setup`
catch-all with meaningful kinds.
### How the two axes link
A **skill consumes** tool capabilities (the contracts it needs); a
**tool provides** one. This is the edge the single vocabulary could not
express:
> `security-issue-import` (skill capability `intake`) consumes the
> `mail-archive` + `mail-source` tool capabilities; `ponymail` provides
> `mail-archive`.
`docs/labels-and-capabilities.md` therefore carries **two** maps: a
*skill → skill-capability* map, and a *contract → adapters* map (the same
table as the adapter [registry](../adapters/registry.md)).
## The other taxonomies (unchanged, documented here for completeness)
### `family:*` — subject
`family:pr-management`, `family:security`, `family:setup`, `family:issue`,
`family:tools`, `family:ci`, `family:docs`. Orthogonal to capability: a
triage-rule change in PR management and one in security are both skill
capability `triage`, in different `family:`s.
### `kind:*` — change type
`kind:dx` (maintainer dev-loop / CLI UX), `kind:policy` (rule changes),
`kind:perf` (token / latency / API-call budget), `kind:adopter-config`
(per-adopter knob).
### `mode:*` — agentic mode
The five modes from `docs/modes.md`: **Agentic Triage**, **Agentic
Mentoring**, **Agentic Drafting**, **Agentic Pairing**, **Agentic
Autonomous** (off by default), plus `mode:cross-cutting` and
`mode:platform` for substrate that is not a mode. `mode:` is the *risk
tier* of an action; skill capability is the *phase*. A skill carries
both (e.g. `pr-management-code-review`: capability `review`, mode
Pairing/Drafting).
### `organization:` — organization membership / inheritance
Per RFC context in `organizations/README.md`: a skill, skill family,
tool, or project may declare the organization it belongs to / inherits
from. Absent = organization-agnostic. Distinct from the dimensions above
— it scopes *which governing body's defaults apply*, not what the entity
does.
### Standalone labels
`marketing`, `dependencies`, `python:uv`, and the default GitHub labels
(`bug`, `enhancement`, `documentation`, `good first issue`, …).
## Migration
1. **Validator** (`skill-and-tool-validator`): replace the single
`ALLOWED_CAPABILITIES` with `SKILL_CAPABILITIES` (Axis 1) and
`TOOL_CAPABILITIES` (Axis 2); skill-frontmatter validation checks
Axis 1, tool-README validation checks Axis 2; the capability-sync
check splits into the two maps. Tests updated.
2. **Tools**: rewrite every `tools/*/README.md` `**Capability:**` line to
its Axis-2 value (see the registry / `labels-and-capabilities.md` map).
3. **Skills**: re-label the `setup` skills to `platform` or
`authoring`.
4. **Docs**: `docs/labels-and-capabilities.md` becomes two maps;
`AGENTS.md` labeling + `tools/AGENTS.md` updated.
5. **Evals**: any eval fixture asserting a capability value updated.
6. **GitHub labels** (follow-up, optional): the `capability:*` issue
labels are renamed/added to match; existing issues relabelled.
The change is breaking for the `**Capability:**` declaration format but
mechanical once the vocabulary is fixed; the skill *lifecycle* phases are
unchanged except for the `setup` split.
## Out of scope
- Reworking `family:`, `kind:`, or `mode:` — documented here, unchanged.
- A per-capability *floor* spec for tools (which contract version an
adapter targets) — a possible future RFC.
## References
- `docs/labels-and-capabilities.md` — the implementing taxonomy doc.
- `docs/vendor-neutrality.md` — tool adapters + capability contracts.
- `docs/adapters/registry.md` — the contract → adapters map.
- `docs/modes.md` — the agentic modes.
- `organizations/README.md` — the organization dimension.