specrails-core 1.7.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,382 @@
1
+ # MCP Server for specrails-core — Feasibility Analysis
2
+
3
+ **Date:** 2026-03-21
4
+ **Author:** CTO of Engineering
5
+ **Status:** Research Complete — Recommendation Included
6
+ **Task:** SPEA-480
7
+
8
+ ---
9
+
10
+ ## Executive Summary
11
+
12
+ This document evaluates whether building an MCP (Model Context Protocol) server for specrails-core is strategically sound. After thorough analysis of the current architecture, the MCP protocol capabilities, and the product roadmap, **the recommendation is YES — with a focused, phased scope**.
13
+
14
+ An MCP server should expose **read-only knowledge access** and **lightweight utility operations**, while the multi-agent orchestration pipeline stays in Claude Code commands. This approach maximizes cross-client reach with minimal maintenance overhead.
15
+
16
+ ---
17
+
18
+ ## 1. What is MCP?
19
+
20
+ The **Model Context Protocol** is Anthropic's open standard for connecting AI models to external data sources and tools. It defines three primitives:
21
+
22
+ | Primitive | Purpose | Direction |
23
+ |-----------|---------|-----------|
24
+ | **Resources** | Expose read-only data (files, records, configs) | Server → Client |
25
+ | **Tools** | Actions that modify state or compute results | Client → Server → Client |
26
+ | **Prompts** | Parameterized prompt templates | Server → Client |
27
+
28
+ MCP servers run as local processes (stdio) or remote services (HTTP+SSE). Any MCP-compatible client can connect: Claude Desktop, Claude Code, Cursor, Windsurf, VS Code (Copilot), Zed, and others.
29
+
30
+ ---
31
+
32
+ ## 2. Current specrails-core Architecture (No MCP)
33
+
34
+ ### Distribution & Execution Model
35
+
36
+ ```
37
+ npx specrails-core@latest init → install.sh (bash) → /setup (Claude Code command)
38
+ │ │
39
+ ├── Copy templates ├── Detect codebase
40
+ ├── Create dirs ├── Generate agents
41
+ └── Write manifest └── Substitute placeholders
42
+ ```
43
+
44
+ ### Runtime Architecture
45
+
46
+ ```
47
+ Claude Code
48
+ ├── Commands (/sr:implement, /sr:product-backlog, ...)
49
+ ├── Skills (/opsx:new, /opsx:apply, /opsx:ff, ...)
50
+ ├── Agents (sr-architect, sr-developer, sr-reviewer, ...)
51
+ ├── Rules (.claude/rules/ — layer-specific conventions)
52
+ └── Agent Memory (.claude/agent-memory/ — explanations, failures)
53
+ ```
54
+
55
+ ### Key Characteristics
56
+
57
+ - **Zero-daemon**: No running processes — everything is files + CLI commands
58
+ - **Claude Code-native**: Tight integration with Agent tool, worktrees, Skills API
59
+ - **CLI-based integrations**: GitHub CLI, OpenSpec CLI, npm — no HTTP APIs
60
+ - **Local-first**: All state stored on filesystem (JSON, YAML, Markdown)
61
+ - **12 specialized agents** with orchestrated multi-phase pipeline
62
+ - **80+ template placeholders** for codebase-adaptive generation
63
+
64
+ ---
65
+
66
+ ## 3. What Would an MCP Server Expose?
67
+
68
+ ### 3.1 Resources (Read-Only Data)
69
+
70
+ | Resource | URI Pattern | Description |
71
+ |----------|-------------|-------------|
72
+ | Specs | `specrails://specs/{name}` | OpenSpec specifications (source of truth) |
73
+ | Active Changes | `specrails://changes/{name}` | Active OpenSpec changes with status |
74
+ | Archived Changes | `specrails://changes/archive/{name}` | Historical change records |
75
+ | Personas | `specrails://personas/{name}` | VPC persona profiles (jobs, pains, gains) |
76
+ | Agent Config | `specrails://agents/{name}` | Agent personality & configuration |
77
+ | Layer Rules | `specrails://rules/{layer}` | Per-layer coding conventions |
78
+ | Failure Records | `specrails://memory/failures` | CI failure patterns and prevention rules |
79
+ | Explanations | `specrails://memory/explanations` | Implementation decision records |
80
+ | Project Config | `specrails://config` | CLAUDE.md, integration contract, manifest |
81
+
82
+ ### 3.2 Tools (Actions)
83
+
84
+ | Tool | Input | Output | Side Effects |
85
+ |------|-------|--------|--------------|
86
+ | `specrails_doctor` | (none) | Health check report | None (read-only) |
87
+ | `specrails_score_feature` | Feature description | VPC scores per persona | None |
88
+ | `specrails_analyze_codebase` | Project root path | Stack, architecture, conventions | None |
89
+ | `specrails_list_changes` | (optional filters) | Active changes with status | None |
90
+ | `specrails_get_change_status` | Change name | Artifact status, task progress | None |
91
+ | `specrails_query_failures` | File glob pattern | Matching failure records | None |
92
+ | `specrails_query_backlog` | (optional filters) | GitHub Issues with VPC scores | None |
93
+ | `specrails_check_compat` | Version string | Integration contract validation | None |
94
+
95
+ ### 3.3 Prompts (Templates)
96
+
97
+ | Prompt | Parameters | Purpose |
98
+ |--------|------------|---------|
99
+ | `review_with_conventions` | `layer`, `files` | Review prompt with auto-loaded layer rules |
100
+ | `explore_feature` | `description` | VPC-aware feature exploration prompt |
101
+ | `implement_context` | `change_name` | Context bundle for a specific change |
102
+
103
+ ---
104
+
105
+ ## 4. Strategic Analysis
106
+
107
+ ### 4.1 Arguments FOR an MCP Server
108
+
109
+ #### A. Cross-Client Reach (High Impact)
110
+
111
+ Currently specrails-core **only works inside Claude Code**. An MCP server makes the knowledge layer accessible from:
112
+
113
+ - **Claude Desktop** — Product managers can query personas and backlog without a terminal
114
+ - **Cursor / Windsurf** — Developers in other IDEs get specrails context
115
+ - **VS Code (Copilot)** — Teams using GitHub Copilot can still access specs and conventions
116
+ - **Custom tooling** — Any MCP client can connect
117
+
118
+ This dramatically expands the addressable market beyond Claude Code-only users.
119
+
120
+ #### B. Tool Ecosystem Composability (Medium Impact)
121
+
122
+ MCP is becoming the standard protocol for AI tool integration. As an MCP server, specrails-core can be **composed** with:
123
+
124
+ - Database MCP servers (query production data alongside specs)
125
+ - Monitoring MCP servers (correlate failures with system metrics)
126
+ - CI/CD MCP servers (trigger builds with specrails context)
127
+
128
+ #### C. Structured API for Hub Integration (High Impact)
129
+
130
+ specrails-hub currently uses a rigid `integration-contract.json` for core↔hub communication. An MCP server provides a **dynamic, structured API** that hub can query:
131
+
132
+ ```
133
+ Current: Hub reads static JSON contract → spawns CLI commands
134
+ With MCP: Hub connects as MCP client → queries resources, invokes tools
135
+ ```
136
+
137
+ This eliminates the version-coupling problem where hub must know core's CLI interface.
138
+
139
+ #### D. Separation of Concerns (Medium Impact)
140
+
141
+ The current architecture tightly couples specrails to Claude Code's command/skill system. MCP creates a clean **knowledge API layer** separate from the **orchestration layer**:
142
+
143
+ ```
144
+ ┌─────────────────────────────────────────────┐
145
+ │ MCP Server (Knowledge) │
146
+ │ Specs, Personas, Memory, Config, Analysis │
147
+ ├─────────────────────────────────────────────┤
148
+ │ Claude Code (Orchestration) │
149
+ │ /sr:implement, /sr:batch-implement, agents │
150
+ └─────────────────────────────────────────────┘
151
+ ```
152
+
153
+ #### E. Remote/Multi-Repo Scenarios (Future Value)
154
+
155
+ MCP supports HTTP+SSE transport. A centralized specrails MCP server could:
156
+
157
+ - Serve specs across multiple repos from one instance
158
+ - Enable cross-repo knowledge queries
159
+ - Power a team-wide development dashboard
160
+
161
+ ### 4.2 Arguments AGAINST an MCP Server
162
+
163
+ #### A. Current System Works Well
164
+
165
+ Skills and commands already provide strong Claude Code integration. MCP adds complexity for users who only use Claude Code.
166
+
167
+ **Counter:** MCP doesn't replace commands/skills — it supplements them with cross-client access.
168
+
169
+ #### B. Orchestration Can't Move to MCP
170
+
171
+ The `/sr:implement` pipeline requires Claude Code's Agent tool (subagent spawning, worktree isolation, background execution). MCP tools are request/response — they can't replicate multi-phase orchestration.
172
+
173
+ **Counter:** This is exactly why the recommendation is scoped. Orchestration stays in Claude Code; only knowledge access moves to MCP.
174
+
175
+ #### C. Maintenance Overhead
176
+
177
+ Two interfaces to maintain (skills + MCP). Template changes could require updates in both.
178
+
179
+ **Counter:** MCP resources are read-only wrappers around existing files. No template duplication — the MCP server reads the same files that skills read.
180
+
181
+ #### D. MCP Server Process Overhead
182
+
183
+ Currently specrails-core is zero-daemon. Adding an MCP server means a running process.
184
+
185
+ **Counter:** MCP stdio servers start on-demand (launched by the client). No persistent daemon needed. The MCP server binary can ship with the npm package.
186
+
187
+ #### E. Protocol Maturity
188
+
189
+ MCP is still evolving. Breaking changes in the protocol could require updates.
190
+
191
+ **Counter:** MCP has reached stable specification status. Core primitives (resources, tools, prompts) are unlikely to change fundamentally.
192
+
193
+ ---
194
+
195
+ ## 5. Competitive Landscape
196
+
197
+ | Product | MCP Support | Notes |
198
+ |---------|-------------|-------|
199
+ | **Cursor** | MCP client | Users can connect to any MCP server |
200
+ | **Windsurf** | MCP client | Growing MCP ecosystem |
201
+ | **Continue.dev** | MCP client | Open-source IDE extension |
202
+ | **Cline** | MCP client | VS Code extension with MCP |
203
+ | **aider** | No MCP | CLI-only, no extensibility protocol |
204
+ | **Devin** | No MCP | Closed platform |
205
+ | **specrails-core** | **No MCP (current)** | Claude Code-only |
206
+
207
+ Having MCP support positions specrails-core as the **only product-driven development framework accessible from any MCP client**.
208
+
209
+ ---
210
+
211
+ ## 6. Recommended Architecture
212
+
213
+ ### 6.1 Server Design
214
+
215
+ ```
216
+ specrails-core/
217
+ ├── src/
218
+ │ └── mcp/
219
+ │ ├── server.ts # MCP server entry point
220
+ │ ├── resources/
221
+ │ │ ├── specs.ts # OpenSpec spec resources
222
+ │ │ ├── changes.ts # Change status resources
223
+ │ │ ├── personas.ts # VPC persona resources
224
+ │ │ ├── agents.ts # Agent config resources
225
+ │ │ ├── memory.ts # Memory/failure resources
226
+ │ │ └── config.ts # Project config resources
227
+ │ ├── tools/
228
+ │ │ ├── doctor.ts # Health check tool
229
+ │ │ ├── score-feature.ts # VPC scoring tool
230
+ │ │ ├── analyze.ts # Codebase analysis tool
231
+ │ │ ├── query-backlog.ts # Backlog query tool
232
+ │ │ └── change-status.ts # Change status tool
233
+ │ └── prompts/
234
+ │ ├── review.ts # Review with conventions
235
+ │ └── explore.ts # VPC-aware exploration
236
+ ├── bin/
237
+ │ └── specrails-mcp.js # MCP stdio entry point
238
+ └── package.json # Add "specrails-mcp" bin entry
239
+ ```
240
+
241
+ ### 6.2 Transport & Distribution
242
+
243
+ ```json
244
+ // Client configuration (e.g., claude_desktop_config.json)
245
+ {
246
+ "mcpServers": {
247
+ "specrails": {
248
+ "command": "npx",
249
+ "args": ["specrails-core@latest", "mcp"],
250
+ "env": {
251
+ "SPECRAILS_PROJECT_ROOT": "/path/to/project"
252
+ }
253
+ }
254
+ }
255
+ }
256
+ ```
257
+
258
+ - **Transport**: stdio (launched by client on-demand)
259
+ - **Distribution**: Ships with existing npm package — no separate install
260
+ - **CLI entry**: `specrails-core mcp` starts the MCP server
261
+ - **Project detection**: Uses `SPECRAILS_PROJECT_ROOT` env var or auto-detects from cwd
262
+
263
+ ### 6.3 Technology Choice
264
+
265
+ | Option | Pros | Cons |
266
+ |--------|------|------|
267
+ | **TypeScript (recommended)** | Same language as rest of specrails ecosystem, official `@modelcontextprotocol/sdk` package, type safety | Build step required |
268
+ | Python | Official SDK, large MCP community | Different language from rest of stack |
269
+ | Bash | Consistent with install.sh | No MCP SDK, painful to implement |
270
+
271
+ **Recommendation: TypeScript** using `@modelcontextprotocol/sdk`.
272
+
273
+ ---
274
+
275
+ ## 7. Implementation Phases
276
+
277
+ ### Phase 1 — Core Resources (MVP)
278
+
279
+ **Effort:** ~2-3 days
280
+ **Value:** Immediate cross-client access to specrails knowledge
281
+
282
+ | Deliverable | Description |
283
+ |-------------|-------------|
284
+ | MCP server scaffold | TypeScript server with stdio transport |
285
+ | Spec resources | Read OpenSpec specs by name |
286
+ | Change resources | List active changes, get status |
287
+ | Persona resources | Read VPC personas |
288
+ | Config resource | Read project CLAUDE.md and layer rules |
289
+ | `specrails-core mcp` CLI | Start MCP server from existing npm package |
290
+
291
+ ### Phase 2 — Tools & Memory
292
+
293
+ **Effort:** ~2-3 days
294
+ **Value:** Actionable intelligence from any MCP client
295
+
296
+ | Deliverable | Description |
297
+ |-------------|-------------|
298
+ | `specrails_doctor` | Health check tool |
299
+ | `specrails_score_feature` | VPC scoring tool |
300
+ | `specrails_query_failures` | Failure pattern queries |
301
+ | `specrails_query_memory` | Agent memory search |
302
+ | `specrails_list_changes` | Change listing with filters |
303
+
304
+ ### Phase 3 — Hub Integration
305
+
306
+ **Effort:** ~3-5 days
307
+ **Value:** Replace rigid integration contract with dynamic MCP API
308
+
309
+ | Deliverable | Description |
310
+ |-------------|-------------|
311
+ | Hub MCP client | specrails-hub connects as MCP client |
312
+ | Dynamic command discovery | Hub queries available commands via MCP |
313
+ | Real-time spec access | Hub reads specs through MCP resources |
314
+ | Status streaming | Change progress via MCP notifications |
315
+
316
+ ### Phase 4 — Advanced Features
317
+
318
+ **Effort:** ~3-5 days
319
+ **Value:** Full ecosystem integration
320
+
321
+ | Deliverable | Description |
322
+ |-------------|-------------|
323
+ | `specrails_analyze_codebase` | Codebase analysis tool |
324
+ | `specrails_query_backlog` | VPC-scored backlog queries |
325
+ | Prompt templates | Review and explore prompts with context |
326
+ | Remote transport | HTTP+SSE for multi-repo scenarios |
327
+
328
+ ---
329
+
330
+ ## 8. What Stays in Claude Code (NOT in MCP)
331
+
332
+ These capabilities require Claude Code's runtime and should NOT be exposed via MCP:
333
+
334
+ | Capability | Reason |
335
+ |------------|--------|
336
+ | `/sr:implement` pipeline | Requires Agent tool (subagent spawning) |
337
+ | `/sr:batch-implement` | Requires git worktree isolation |
338
+ | Agent invocation (sr-*) | Requires Claude Code's Agent subagent system |
339
+ | OpenSpec artifact creation | Interactive, context-heavy (requires conversation) |
340
+ | `/setup` wizard | Multi-step interactive configuration |
341
+ | Template substitution (write) | Modifies project files, requires user consent |
342
+
343
+ **Principle:** MCP = knowledge access. Claude Code = orchestration engine.
344
+
345
+ ---
346
+
347
+ ## 9. Risk Assessment
348
+
349
+ | Risk | Probability | Impact | Mitigation |
350
+ |------|-------------|--------|------------|
351
+ | MCP protocol breaking changes | Low | Medium | Pin SDK version, follow changelog |
352
+ | Maintenance burden (two interfaces) | Medium | Low | MCP reads same files as skills — no duplication |
353
+ | User confusion (MCP vs commands) | Medium | Low | Clear docs: "MCP for access, commands for action" |
354
+ | Security (exposing project data) | Low | Medium | Local stdio only (no remote by default), respect .gitignore |
355
+ | Scope creep (adding orchestration to MCP) | Medium | High | Strict scope boundary: no write operations in Phase 1-2 |
356
+
357
+ ---
358
+
359
+ ## 10. Success Metrics
360
+
361
+ | Metric | Target | Measurement |
362
+ |--------|--------|-------------|
363
+ | Cross-client usage | 3+ MCP clients connect in first month | MCP server logs |
364
+ | Hub integration latency | 50% reduction vs CLI spawning | Hub performance metrics |
365
+ | Developer adoption | 20% of users configure MCP alongside commands | npm download analytics |
366
+ | Knowledge query volume | 100+ resource reads/day across users | MCP server telemetry |
367
+
368
+ ---
369
+
370
+ ## 11. Conclusion
371
+
372
+ Building an MCP server for specrails-core is **strategically sound** because:
373
+
374
+ 1. **It opens a new distribution channel** — any MCP client becomes a specrails client
375
+ 2. **It improves hub integration** — dynamic API replaces rigid contract
376
+ 3. **It positions specrails uniquely** — only product-driven dev framework with MCP support
377
+ 4. **It's low-risk** — read-only resources, no orchestration duplication, ships with existing package
378
+ 5. **The effort is proportional** — Phase 1 MVP in 2-3 days, full implementation in ~2 weeks
379
+
380
+ The key insight is that specrails-core has two layers: **knowledge** (specs, personas, memory, config) and **orchestration** (agent pipeline, worktrees, CI). MCP is the perfect fit for the knowledge layer, while Claude Code commands remain the right tool for orchestration.
381
+
382
+ **Recommendation: Proceed with Phase 1 (Core Resources MVP).**
@@ -0,0 +1,123 @@
1
+ # Test Matrix — specrails Cross-Platform (Claude Code + Codex)
2
+
3
+ Last updated: 2026-03-21
4
+ Epic: [SPEA-505](/SPEA/issues/SPEA-505) — Codex Compatibility Approach B
5
+
6
+ ## Legend
7
+
8
+ | Symbol | Meaning |
9
+ |--------|---------|
10
+ | ✅ | Works / tested |
11
+ | ❌ | Not supported |
12
+ | 🔄 | In progress (implementation pending) |
13
+ | ⚠️ | Partial / with caveats |
14
+ | — | Not applicable |
15
+
16
+ ---
17
+
18
+ ## Feature Coverage by CLI
19
+
20
+ ### Installation & Provider Detection (SPEA-506)
21
+
22
+ | Feature | Claude Code only | Codex only | Both CLIs | Neither CLI |
23
+ |---------|:-:|:-:|:-:|:-:|
24
+ | Auto-detect `claude` binary | ✅ | — | ✅ | — |
25
+ | Auto-detect `codex` binary | — | ✅ | ✅ | — |
26
+ | Prompt user to choose CLI (dual) | — | — | 🔄 | — |
27
+ | Exit with clear error message | — | — | — | 🔄 |
28
+ | Output dir `.claude/` created | ✅ | ❌ | 🔄 | — |
29
+ | Output dir `.codex/` created | ❌ | 🔄 | 🔄 | — |
30
+ | `CLAUDE.md` instruction file | ✅ | ❌ | 🔄 | — |
31
+ | `AGENTS.md` instruction file | ❌ | 🔄 | 🔄 | — |
32
+ | `--provider claude` flag override | ✅ | — | 🔄 | — |
33
+ | `--provider codex` flag override | — | ✅ | 🔄 | — |
34
+
35
+ ### Skills & Commands (SPEA-507)
36
+
37
+ | Feature | Claude Code | Codex |
38
+ |---------|:-:|:-:|
39
+ | Legacy slash commands `.claude/commands/sr/` | ✅ | ❌ |
40
+ | SKILL.md format `.claude/skills/sr-*/` | 🔄 | 🔄 |
41
+ | `sr:implement` skill | ✅ | 🔄 |
42
+ | `sr:product-backlog` skill | ✅ | 🔄 |
43
+ | `sr:health-check` skill | ✅ | 🔄 |
44
+ | `sr:compat-check` skill | ✅ | 🔄 |
45
+ | `sr:why` skill | ✅ | 🔄 |
46
+ | `sr:refactor-recommender` skill | ✅ | 🔄 |
47
+ | `sr:batch-implement` skill | ✅ | 🔄 |
48
+ | `sr:update-product-driven-backlog` skill | ✅ | 🔄 |
49
+ | Backward compat: slash commands still invoke correctly | ✅ | — |
50
+
51
+ ### Permissions Configuration (SPEA-508)
52
+
53
+ | Feature | Claude Code | Codex |
54
+ |---------|:-:|:-:|
55
+ | `.claude/settings.json` generated | ✅ | ❌ |
56
+ | `.codex/config.toml` generated | ❌ | 🔄 |
57
+ | `.codex/rules/default.rules` (Starlark) generated | ❌ | 🔄 |
58
+ | Git permission granted | ✅ | 🔄 |
59
+ | GitHub CLI (gh) permission granted | ✅ | 🔄 |
60
+ | Read/Write filesystem permission | ✅ | 🔄 |
61
+ | Bash tool allowed | ✅ | 🔄 |
62
+
63
+ ### Agent Definitions (SPEA-509)
64
+
65
+ | Agent | Claude Code (`.md`) | Codex (`.toml`) |
66
+ |-------|:-:|:-:|
67
+ | `sr-architect` | ✅ | 🔄 |
68
+ | `sr-developer` | ✅ | 🔄 |
69
+ | `sr-reviewer` | ✅ | 🔄 |
70
+ | `sr-product-manager` | ✅ | 🔄 |
71
+ | Prompt content identical across formats | ✅ | 🔄 |
72
+ | YAML frontmatter valid (Claude Code) | ✅ | — |
73
+ | TOML frontmatter valid (Codex) | — | 🔄 |
74
+
75
+ ### Hub Integration (SPEA-510, SPEA-511)
76
+
77
+ | Feature | Claude Code | Codex |
78
+ |---------|:-:|:-:|
79
+ | Hub detects claude binary | 🔄 | — |
80
+ | Hub detects codex binary | — | 🔄 |
81
+ | `integration-contract.json` v2 schema valid | 🔄 | 🔄 |
82
+ | Hub invokes CLI with correct args | 🔄 | 🔄 |
83
+ | Hub dashboard shows CLI badge | 🔄 | 🔄 |
84
+ | Hub handles "no CLI detected" state | 🔄 | 🔄 |
85
+
86
+ ---
87
+
88
+ ## Edge Case Coverage
89
+
90
+ | Scenario | Test Coverage | Notes |
91
+ |----------|:-:|-------|
92
+ | User has both CLIs, picks Claude Code | 🔄 | Interactive prompt or `--provider` flag |
93
+ | User has both CLIs, picks Codex | 🔄 | Interactive prompt or `--provider` flag |
94
+ | User has neither CLI | 🔄 | Must print install instructions |
95
+ | Re-install after switch from claude → codex | 🔄 | Old `.claude/` must not corrupt `.codex/` |
96
+ | Re-install after switch from codex → claude | 🔄 | Old `.codex/` must not corrupt `.claude/` |
97
+ | Version upgrade: CLI format unchanged | ✅ | Existing regression suite covers this |
98
+ | Version upgrade: provider mismatch | 🔄 | New behavior in SPEA-506 |
99
+
100
+ ---
101
+
102
+ ## Test Files
103
+
104
+ | File | Suite | Covers |
105
+ |------|-------|--------|
106
+ | `tests/test-install.sh` | Install | Existing install flow (Claude Code only) |
107
+ | `tests/test-update.sh` | Update | Update flow (existing) |
108
+ | `tests/test-cli.sh` | CLI | Argument validation, injection safety |
109
+ | `tests/test-codex-compat.sh` | Codex compat | Provider detection, dual-output structure, edge cases |
110
+
111
+ ---
112
+
113
+ ## Acceptance Criteria
114
+
115
+ Before SPEA-505 can be merged and released:
116
+
117
+ 1. `tests/test-codex-compat.sh` — all tests green
118
+ 2. `tests/test-install.sh` — all existing tests still green (regression)
119
+ 3. `tests/test-update.sh` — all existing tests still green (regression)
120
+ 4. `tests/test-cli.sh` — all existing tests still green (regression)
121
+ 5. No broken placeholders: `grep -r '{{[A-Z_]*}}' .claude/agents/ .codex/agents/ 2>/dev/null` returns empty
122
+ 6. Skills valid: every `SKILL.md` in `.claude/skills/` has required frontmatter
123
+ 7. Agent TOML valid: every `.toml` in `.codex/agents/` is parseable TOML