3.2 Harness Research Method
Purpose: Define a repeatable, evidence-driven procedure for classifying the AI coding harnesses (a.k.a. "agents") that Spec Kitty supports. The output of this method is the support matrix at docs/api/supported-harnesses.md.
Sources of authority:
CLAUDE.md§"Supported AI Agents" — canonical list of installed surfaces.kitty-specs/spec-kitty-3-2-docs-01KS4KSZ/start-here.md§"Supported Harness Research" plus the current CLI agent registry — 17 candidate subjects.data-model.md§"HarnessEntry" — schema each row must satisfy.
Access date for all citations in this revision: 2026-05-21.
1. Subject list — 17 candidate harnesses
| # | Harness | Key |
|---|---|---|
| 1 | Claude Code | claude |
| 2 | Codex CLI | codex |
| 3 | OpenCode | opencode |
| 4 | Cursor | cursor |
| 5 | Google Gemini CLI | gemini |
| 6 | Pi TUI | pi |
| 7 | Qwen Code | qwen |
| 8 | Amazon Q CLI | q |
| 9 | GitHub Copilot | copilot |
| 10 | Augment Code (Auggie) | augment |
| 11 | Roo Cline | roo |
| 12 | Kilo Code | kilocode |
| 13 | Kiro | kiro |
| 14 | Windsurf | windsurf |
| 15 | Mistral Vibe | vibe |
| 16 | Letta Code | letta |
| 17 | Google Antigravity | antigravity |
The set is the union of (a) directories present in the repo, (b) entries in CLAUDE.md's command-surface and command-skill tables, (c) entries in src/specify_cli/core/config.py's AI_CHOICES, and (d) entries in start-here.md §"Supported Harness Research" (per R-003).
2. Inventory step — on-disk evidence
For each candidate harness, the research process records:
- Installed surface directory — the conventional path Spec Kitty deploys command/skill/prompt files to (e.g.,
.claude/commands/,.agents/skills/spec-kitty.<command>/,.amazonq/prompts/); legacy.codex/roots may still appear on older hosts. - Presence check —
ls -d <dir>against the active host; record present/absent and file count. - Cross-reference — every present surface must match an entry in
CLAUDE.md§"Supported AI Agents".
2.1 Procedure
Run from repo root (or this lane worktree):
# .codex/ is probed as a legacy root only — current Codex support lives in .agents/skills/
ls -d .claude/ .codex/ .opencode/ .cursor/ .gemini/ .qwen/ .amazonq/ \
.augment/ .kiro/ .kilocode/ .roo/ .windsurf/ .agent/ .agents/ \
.vibe/ .github/prompts 2>/dev/null
for d in .claude/commands .codex .opencode/command .cursor/commands \
.gemini/commands .qwen/commands .amazonq/prompts .augment/commands \
.kiro/prompts .kilocode/workflows .roo/commands .windsurf/workflows \
.agent/workflows .agents/skills .github/prompts; do
echo "=== $d ==="
ls "$d" 2>/dev/null | head -10
done
2.2 Findings (snapshot 2026-05-21)
| Harness | Expected directory | On-disk? | Files observed |
|---|---|---|---|
| Claude Code | .claude/commands/ |
partial (dir exists, no commands/ subdir in this lane) |
— |
| Codex CLI | .agents/skills/spec-kitty.* |
yes (skills) | .agents/skills/spec-kitty (skill package directory, not the SKILL.md file) |
| OpenCode | .opencode/command/ |
yes | spec-kitty-standalone.md |
| Cursor | .cursor/commands/ |
yes | spec-kitty-standalone.md |
| Gemini CLI | .gemini/commands/ |
yes | spec-kitty-standalone.md |
| Pi TUI | .agents/skills/spec-kitty.* |
yes (skills) | shared command-skill packages |
| Qwen Code | .qwen/commands/ |
yes | spec-kitty-standalone.md |
| Amazon Q | .amazonq/prompts/ |
yes | spec-kitty-standalone.md |
| GitHub Copilot | .github/prompts/ |
yes | spec-kitty-standalone.md |
| Augment Code | .augment/commands/ |
yes | spec-kitty-standalone.md |
| Roo Cline | .roo/commands/ |
yes | spec-kitty-standalone.md |
| Kilo Code | .kilocode/workflows/ |
yes | spec-kitty-standalone.md |
| Kiro | .kiro/prompts/ |
yes | spec-kitty-standalone.md |
| Windsurf | .windsurf/workflows/ |
yes | spec-kitty-standalone.md |
| Google Antigravity | .agent/workflows/ |
yes | spec-kitty-standalone.md |
| Vibe | .agents/skills/ via .vibe/config.toml |
yes (shared with Codex) | shares .agents/skills/spec-kitty (skill package directory, not the SKILL.md file) |
| Letta Code | .agents/skills/spec-kitty.* |
yes (skills) | shared command-skill packages |
Notes:
spec-kitty-standalone.mdis the lane-bootstrap surface; the full/spec-kitty.*command set lives at the source undersrc/specify_cli/missions/*/command-templates/and is materialized byspec-kitty agent config sync(seeCLAUDE.md§"Adding/Removing Agents")..agents/skills/spec-kitty/is the Agent Skills package directory (not the SKILL.md file) shared between Codex CLI, Mistral Vibe, Pi, and Letta Code (perCLAUDE.md§"Agent Skills Agents").- Current Codex CLI support uses the shared Agent Skills packages under
.agents/skills/spec-kitty.<command>/SKILL.md. Legacy.codex/roots were not observed in this lane; they may still exist on hosts initialized by older CLI versions and are documented as legacy-only (seedocs/api/environment-variables.md§CODEX_HOME). - Google Antigravity (
.agent/workflows/) is present in the current CLI agent registry and is included in the matrix.
3. Canonical mechanism step
Each row in the support matrix records exactly one mechanism value from the HarnessMechanism enum in data-model.md:
| Mechanism | Meaning | Examples |
|---|---|---|
slash_command |
The harness exposes user-typed /... commands. |
Claude Code .claude/commands/, Cursor .cursor/commands/. |
prompt |
The harness reads prompt files at runtime. | Amazon Q .amazonq/prompts/, Kiro .kiro/prompts/, GitHub Copilot .github/prompts/. |
workflow |
The harness drives multi-step workflows defined by YAML/Markdown. | Windsurf .windsurf/workflows/, Kilo Code .kilocode/workflows/, Google Antigravity .agent/workflows/. |
skill |
The harness loads Agent Skills packages with SKILL.md. |
Codex CLI, Mistral Vibe, Pi, Letta Code (via .agents/skills/). |
command_file |
The harness reads command files outside a commands/ directory. |
reserved; no current harness uses this mode. |
config |
The harness needs an additional config-file edit before commands are visible. | Vibe (.vibe/config.toml skill_paths). |
A harness may have a primary mechanism plus a secondary config step (e.g., Vibe = skill + config); the matrix records the primary mechanism and the secondary is noted in the row's notes.
4. Citation step
Every harness row at tier ≥ supported requires at least one current public-doc URL. Citations are recorded with the access date.
4.1 Canonical citation roots (access date 2026-05-21)
| Harness | Citation URL |
|---|---|
| Claude Code | https://docs.claude.com/en/docs/claude-code/overview |
| Codex CLI | https://github.com/openai/codex |
| OpenCode | https://opencode.ai/docs |
| Cursor | https://cursor.com/docs |
| Gemini CLI | https://github.com/google-gemini/gemini-cli |
| Pi TUI | https://pi.dev/docs/latest/skills |
| Qwen Code | https://github.com/QwenLM/qwen-code |
| Amazon Q CLI | https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/ |
| GitHub Copilot | https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot |
| Augment Code (Auggie) | https://docs.augmentcode.com/auggie/overview |
| Roo Cline | https://docs.roocode.com/ |
| Kilo Code | https://kilocode.ai/docs |
| Kiro | https://kiro.dev/docs |
| Windsurf | https://docs.windsurf.com/windsurf/cascade/workflows |
| Google Antigravity | https://antigravity.im/documentation |
| Mistral Vibe | https://docs.mistral.ai/mistral-vibe/terminal/quickstart |
| Letta Code | https://docs.letta.com/letta-code/skills |
4.2 Citation rule
- Prefer the harness's primary documentation site over blog posts.
- Record the access date alongside each citation. The freshness audit (WP13) re-validates each link.
- A harness with no current public doc is classified at
partialor lower until evidence lands.
5. Classification criteria — the five tiers
| Tier | Criteria |
|---|---|
first_class |
(1) Installed surface present on disk; (2) primary command mechanism is the harness's canonical UX (slash command or skill); (3) at least one external doc citation ≤ 12 months old; (4) spec-kitty agent config sync produces a complete /spec-kitty.* set; (5) covered by integration tests in src/specify_cli/. |
supported |
(1) Installed surface present on disk; (2) covered by the standard installer; (3) at least one external doc citation ≤ 12 months old. May lack first-class integration tests or have a degraded command surface (e.g., requires a config edit). |
partial |
(1) Installer touches the host but coverage is incomplete (e.g., only spec-kitty-standalone.md, no /spec-kitty.* set); OR (2) no current external citation could be located. |
experimental |
(1) Coverage is intentionally provisional; (2) shipping behavior may break without notice. Vibe sits here because it shares its skill installation with Codex through a config file. |
archived |
(1) The harness is no longer covered by the installer; OR (2) the upstream project has been deprecated; OR (3) coverage was removed and lives in docs/migrations/ only. |
5.1 Validation rules (mirror data-model.md)
support_tier in {first_class, supported}⇒external_doc_citationsis non-empty.support_tier == archived⇒page_pathis underdocs/migrations/or absent.keyis unique across the matrix.- Every row's
repo_directorymatches the directory inCLAUDE.mdor is explicitly documented as a partial-tier exception.
6. Promotion rule
A harness moves up tiers only when new evidence lands; tier moves are recorded in the matrix's row history (notes column) and in CHANGELOG.
6.1 partial → supported
Promote when all of the following hold:
- The installer (e.g.,
spec-kitty agent config add <key>) produces a complete/spec-kitty.*command set on disk. - A current external-doc citation (≤ 12 months old) is added to the matrix row.
- A smoke test against a real session has been recorded (manual evidence is acceptable; document in the row's
notes).
6.2 supported → first_class
Promote when all of the following hold:
- Integration tests in
src/specify_cli/exercise the harness's installed surface end-to-end. - The harness's command mechanism is the host's canonical UX (slash command or Agent Skill — not a prompt-file workaround).
- The per-harness "how-to" page under
docs/guides/harnesses/<key>.mdexists and is non-stub. - CHANGELOG entry records the promotion.
6.3 Demotion
A harness demotes when:
- An external citation cannot be re-verified for two consecutive freshness audits (move to
partial). - The upstream project is deprecated or abandoned (move to
archived). - The installer no longer produces a valid command surface for the harness (move to
partialorarchiveddepending on intent).
7. Per-harness research dossier — 2026-05-21
The matrix in docs/api/supported-harnesses.md is the canonical output. The research notes that fed each row are summarized below.
| Key | Display name | Mechanism | Tier | Citation | Notes |
|---|---|---|---|---|---|
claude |
Claude Code | slash_command | first_class | https://docs.claude.com/en/docs/claude-code/overview | Reference harness; integration tests live in src/specify_cli/. |
codex |
Codex CLI | skill | first_class | https://github.com/openai/codex | Heaviest Agent Skills integration; .agents/skills/spec-kitty.*/SKILL.md is the authoritative skill tree. |
opencode |
OpenCode | slash_command | supported | https://opencode.ai/docs | .opencode/command/ installed. |
cursor |
Cursor | slash_command | supported | https://cursor.com/docs | .cursor/commands/ installed. |
gemini |
Google Gemini CLI | slash_command | supported | https://github.com/google-gemini/gemini-cli | .gemini/commands/ installed. |
qwen |
Qwen Code | slash_command | supported | https://github.com/QwenLM/qwen-code | .qwen/commands/ installed. |
q |
Amazon Q CLI | prompt | supported | https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/ | .amazonq/prompts/; legacy alongside Kiro rebrand per CLAUDE.md. |
copilot |
GitHub Copilot | prompt | supported | https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot | .github/prompts/ installed. |
augment |
Augment Code (Auggie) | slash_command | supported | https://docs.augmentcode.com/auggie/overview | .augment/commands/ installed. |
roo |
Roo Cline | slash_command | supported | https://docs.roocode.com/ | .roo/commands/ installed. |
kilocode |
Kilo Code | workflow | supported | https://kilocode.ai/docs | .kilocode/workflows/ installed. |
windsurf |
Windsurf | workflow | supported | https://docs.windsurf.com/windsurf/cascade/workflows | .windsurf/workflows/ installed. |
kiro |
Kiro | prompt | partial | https://kiro.dev/docs | .kiro/prompts/ installed but coverage is the standalone bootstrap only; promote once full /spec-kitty.* surface is verified. |
antigravity |
Google Antigravity | workflow | partial | https://antigravity.im/documentation | .agent/workflows/ installed; keep partial until full command-set smoke evidence is recorded. |
pi |
Pi TUI | skill | partial | https://pi.dev/docs/latest/skills | .agents/skills/spec-kitty.*/SKILL.md installed; Pi docs confirm project .agents/skills/ discovery and /skill:<name> invocation. |
vibe |
Mistral Vibe | skill | experimental | https://docs.mistral.ai/mistral-vibe/terminal/quickstart | Requires .vibe/config.toml skill_paths edit; depends on the shared command-skill installation. |
letta |
Letta Code | skill | partial | https://docs.letta.com/letta-code/skills | .agents/skills/spec-kitty.*/SKILL.md installed; keep partial until full command-set smoke evidence is recorded. |
8. Maintenance
- Re-run the inventory step (§2) on every release.
- Re-run the citation step (§4) on every release as part of the freshness audit (WP13).
- Update tiers per the promotion rule (§6); record demotions in CHANGELOG.
- The matrix (
docs/api/supported-harnesses.md) is the canonical published artifact; this research method document is the procedural source of truth that explains how the matrix is built.