---
name: openspec-api-contract
description: OpenSpec API 契约规范。创建涉及接口的 OpenSpec 提案时使用。探索阶段提供业务与契约引导清单，提案文档要求 API 契约设计、错误码与完成标准等必填章节。
---

# OpenSpec API 契约规范

**适用场景**：创建涉及 API/接口的 OpenSpec 提案时，探索和提案两个阶段均须遵守本规范。

---

## 一、探索阶段引导清单

在 `openspec-explore` 阶段，当内容涉及接口时，讨论必须覆盖以下所有维度。

### 业务与契约确认

**输入与输出**
- 请求方是谁？用户类型（SuperAdmin/Platform/Agent/Enterprise/Personal）？
- 输入参数：必填/选填字段、格式约束、参数来源（路径/查询/Body）？
- 输出结构：哪些字段必须返回？是否需要分页？

**业务规则**
- 核心业务规则与边界条件？
- 是否涉及状态流转？状态机的完整定义？
- 依赖外部服务时，外部异常的降级行为？

**权限与资源所有权**
- 哪些用户类型可以访问？
- 是否涉及跨用户/跨店铺/跨企业的资源访问？（需三层越权防护）
- 资源所有权校验方式：`CanManageShop` / `CanManageEnterprise` / 自有资源？

**幂等性**
- 操作类型：查询（天然幂等）/ 创建 / 更新 / 删除？
- 写操作幂等策略：状态条件更新 / Redis 业务键防重 + 分布式锁 / 乐观锁（version）？
- 异步任务是否需要任务锁？

**数据模型变更**
- 是否需要新建表、修改现有表或数据回填？
- 迁移策略：上线顺序、兼容旧数据的方式？
- 是否影响 GORM Callback 自动数据权限过滤？

**错误码与异常语义**
- 预期错误场景及对应错误码？
- 错误响应是否泄露敏感信息？（参数校验失败统一返回 `CodeInvalidParam`）

---

## 二、提案文档必填章节

在 `openspec-propose` 生成的提案（`proposal.md` / `design.md`）中，涉及接口时以下内容**不可缺失**。

### API 契约设计

**接口定义**

| 项 | 内容 |
|---|---|
| Endpoint | `METHOD /api/{scope}/{resource}[/:id]` |
| 请求参数 | 字段名、类型、必填/选填、说明 |
| 响应结构 | `data` 字段的完整结构定义 |
| 鉴权要求 | 允许的用户类型 |
| 资源所有权 | 所有权校验方式 |

**列表接口额外要求**
- 分页：`page` + `page_size`（默认 20，最大 100）
- 排序：默认排序字段与方向
- 过滤：支持的过滤条件列表

**错误码清单**

| 场景 | 错误码 | 说明 |
|---|---|---|
| 参数校验失败 | `CodeInvalidParam` | 统一返回，不泄露细节 |
| 资源不存在/越权 | `CodeForbidden` | 不区分两者，防止信息泄露 |
| （业务错误场景...） | （对应错误码） | （说明） |

### 完成标准

**最小验证步骤**（按顺序列出可操作的验证步骤）

1. （例：调用创建接口，验证返回 `code=0`）
2. （例：查询接口确认数据存在且字段正确）
3. （例：PostgreSQL MCP 查询确认数据库记录符合预期）

**影响范围说明**
- 新增/修改的表：
- 影响的现有接口：
- 影响的权限与数据过滤范围：

---

## 约束（必须遵守）

- **优先复用现有架构与库**：不引入新依赖，错误码优先复用已有定义
- **不做顺手重构**：提案范围严格限定在目标功能；发现可优化点，记录到 backlog 但不执行
- **数据库设计**：禁止外键约束，禁止 GORM 关联标签，关联通过 ID 字段手动维护
