hardcore-speckit-specify-template.md
11.3 KB
硬核 /speckit.specify 提示模板(可验证验收标准版)
用途:帮助你在调用
/speckit.specify时,把需求描述成更可验证、更稳定的规格说明,让后续/speckit.plan、/speckit.tasks、/speckit.implement的输出更可控。
一、使用方式总览
- 在聊天里调用命令时,将本模板中的「完整提示文案」作为补充说明一起发给智能体,例如:
/speckit.specify 001-recall-activity-history-state ActivityHistoryPage 增加一个空状态提示 + 列表加载失败提示(不改接口)- 然后追加一段话:「请严格按照《硬核 /speckit.specify 提示模板(可验证验收标准版)》来生成 specs/001-recall-activity-history-state/spec.md」
- 规格说明的目标:
- 明确 做什么 / 为什么做,不写具体实现细节。
- 每条验收标准都能被前端 / 后端 / 测试同事用「条件 + 操作 + 预期结果」直接验证。
- 所有分支(成功 / 无数据 / 失败 / 边界情况)都有清晰的预期。
二、规格结构模板(spec.md 结构)
输出文件固定为:specs/<feature_key>/spec.md,推荐结构如下:
-
背景与目标
- 背景:说明业务场景、已有行为中的问题或机会。
- 目标:本次改动要解决什么问题、带来什么价值。
- 非目标:本次明确不做的范围(例如「不改接口、不动路由、不调整整体布局」)。
- 背景:说明业务场景、已有行为中的问题或机会。
-
用户画像与使用场景
- 谁在用(角色、平台、入口)。
- 在什么场景下触发(来源页面、入口按钮、链路前后步骤)。
- 谁在用(角色、平台、入口)。
-
需求范围
- 页面 / 入口:涉及到哪些页面、弹窗或组件。
- 核心流程:从用户视角按步骤描述主流程。
- 状态与异常分支:列出所有状态(正常、有数据、无数据、加载中、失败等)和切换条件。
- 页面 / 入口:涉及到哪些页面、弹窗或组件。
-
用户故事(User Stories)
- 使用「作为……我想……以便……」的句式,每个故事只描述一个明确目的。
-
验收标准(Acceptance Criteria)——重点加强部分
- 使用「可验证条件」描述,每条至少包含:
- 前置条件(环境、数据状态、接口返回等)。
- 用户操作(点击、进入页面、刷新、重试等)。
- 预期结果(UI 展示、状态变化、接口调用、副作用)。
- 前置条件(环境、数据状态、接口返回等)。
- 必要时补充「不允许出现的结果 / 行为」以减少歧义。
- 使用「可验证条件」描述,每条至少包含:
-
交互与视觉要点
- 交互:点击反馈、加载状态、重试行为、动画等。
- 视觉:布局位置、层级关系、是否与现有组件对齐。
- 终端:默认移动端优先,如有 PC 差异需单独说明。
- 交互:点击反馈、加载状态、重试行为、动画等。
-
数据与接口
- 数据字段:只描述字段含义,不写具体数据结构实现细节。
- 接口约定:本项目约定所有接口返回结构均为
{ code, data, msg }:
-
code = 1表示成功;
-
code ≠ 1表示失败;
-
data为业务数据;
-
msg为提示文案(前端可用作错误提示文本来源)。
-
- 数据字段:只描述字段含义,不写具体数据结构实现细节。
-
边界条件与风险
- 写出「极端但可能真实发生」的情况以及期望行为。
- 对于不确定的行为,用自然语言描述当前的默认假设。
- 写出「极端但可能真实发生」的情况以及期望行为。
-
待确认事项
- 所有不确定点都必须以
[NEEDS CLARIFICATION]开头。
- 每条都要写成一个具体的问题,便于后续和产品 / 业务沟通。
- 所有不确定点都必须以
三、硬核验收标准书写规范
编写验收标准时,建议将每条标准写成「编号 + 条件 + 操作 + 预期结果」的形式,示例如下:
-
AC1:正常有数据时展示列表
- 条件:接口
searchOldActivityAPI请求成功,返回code = 1,data.list为长度 ≥ 1 的数组。
- 操作:用户进入
ActivityHistoryPage,页面完成首次数据加载。
- 预期结果:
- 列表区域展示所有活动记录卡片,条数等于
data.list.length。
- 不展示空状态文案、不展示失败状态或重试按钮。
- 顶部 Banner、底部固定按钮等既有内容保持当前实现,不被遮挡或改变行为。
- 条件:接口
-
AC2:无数据时展示空状态
- 条件:接口
searchOldActivityAPI请求成功,返回code = 1,但data.list为空数组或不存在可用记录。
- 操作:用户进入
ActivityHistoryPage,页面完成首次数据加载。
- 预期结果:
- 列表原本展示卡片的位置,显示空状态区域(如「暂无活动记录」文案)。
- 空状态展示在页面内容区域内,不通过 Toast 作为唯一反馈。
- 不展示失败状态或重试按钮。
- 顶部 Banner、底部按钮与其他入口可正常点击、滚动不受影响。
- 条件:接口
-
AC3:请求失败时展示失败状态 + 重试按钮
- 条件:
- 接口
searchOldActivityAPI返回code ≠ 1;或
- 请求发生网络异常 / JS 异常导致无法获取数据。
- 操作:用户进入
ActivityHistoryPage,触发列表加载。
- 预期结果:
- 列表区域显示失败状态区域,包含错误提示文案和「重试」按钮。
- 提示文案优先使用接口返回的
msg字段;若msg为空或不可用,则使用默认文案(例如「加载失败,请稍后重试」)。
- 不展示有效的活动卡片,不展示空状态提示。
- 顶部 Banner、底部按钮与其他入口仍可正常使用。
- 条件:
-
AC4:点击重试后的行为
- 条件:页面当前处于失败状态,且显示重试按钮。
- 操作:用户点击失败状态区域中的「重试」按钮。
- 预期结果:
- 重新发起一次
searchOldActivityAPI请求,使用与首次请求相同的参数。
- 在请求结果返回前,页面可选择短暂展示「加载中」状态或保持失败状态(需在规格中明确);无论哪种方式,都不得多次并发重复请求。
- 重试成功且有数据:页面展示列表卡片,隐藏失败状态与重试按钮。
- 重试成功但无数据:页面展示空状态,隐藏失败状态与重试按钮。
- 重试仍然失败:保持或更新失败状态提示文案(可使用新的
msg),重试按钮仍可再次点击。
- 条件:页面当前处于失败状态,且显示重试按钮。
-
AC5:缓存或参数异常时的行为
- 条件:本地缓存的查询参数缺失、格式异常或读取缓存时抛出异常。
- 操作:用户正常进入
ActivityHistoryPage。
- 预期结果:
- 页面不会出现崩溃或白屏。
- 若无法构造有效请求参数,则进入失败状态,并展示失败提示与重试按钮。
- 若重试按钮依赖重新读取缓存,则需要在规格中说明默认兜底行为(例如「使用默认时间范围重试」或「继续展示失败状态并提示用户稍后重试」)。
- 条件:本地缓存的查询参数缺失、格式异常或读取缓存时抛出异常。
编写其他页面的验收标准时,可参考上述形式,将核心场景拆分为 AC1 / AC2 / AC3...,每条都保证:
- 可以通过明确的前置条件在测试环境中复现;
- 可以通过清晰的操作步骤验证结果;
- 可以通过观察 UI 或接口行为判断是否通过。
四、可直接复用的 /speckit.specify 提示文案
当你在聊天中描述新需求时,可以在自然语言需求后追加如下提示,引导智能体按「硬核」方式输出规格说明:
请将上述需求整理为 Spec Kit 规格说明,输出到
specs/<feature_key>/spec.md,并严格遵守以下要求:
- 使用本项目既有的 spec 结构:背景与目标、用户画像与使用场景、需求范围、用户故事、验收标准、交互与视觉要点、数据与接口、边界条件与风险、待确认事项。
- 所有说明使用中文,专注描述「做什么 / 为什么」,不要写实现细节(例如具体组件名、函数名、接口实现代码)。
- 在「验收标准」一节中,以 AC1 / AC2 / AC3... 的形式列出所有可验证的标准。每条必须包含:
- 条件:清晰的前置条件(数据状态、接口返回、环境等);
- 操作:用户在前端界面上的具体操作;
- 预期结果:界面展示、状态变化、接口调用或其他可观察行为;
- 如有必要,补充「不允许出现的结果」。
- 明确区分以下几类场景,并分别给出验收标准:
- 正常有数据时的行为;
- 无数据时的行为;
- 请求失败 / 异常时的行为;
- 点击重试或重新加载时的行为;
- 缓存缺失、参数异常等边界条件。
- 在「数据与接口」部分中,明确约定接口返回结构统一为
{ code, data, msg }:
code = 1视为成功,code ≠ 1视为失败;
msg用作错误提示文案的主要来源;
- 若本次需求不允许改动接口,请在此处显式说明「不新增接口、不修改现有接口」。
- 所有不确定点必须写入「待确认事项」并使用
[NEEDS CLARIFICATION]前缀,形式为可直接询问产品 / 业务同学的具体问题。
- 请避免在验收标准中使用模糊描述(例如「尽量」「可能」「大概」),改用可观测、可验证的具体条件(例如「当 X 时必须显示 Y 文案,不展示 Z」)。
五、示例:ActivityHistoryPage 空状态 + 失败提示(摘要示例)
以下是基于 ActivityHistoryPage 需求的验收标准摘要示例,可作为编写类似功能规格时的参考:
-
AC1:有历史活动时
- 条件:
searchOldActivityAPI返回code = 1且data.list长度 ≥ 1。
- 操作:进入
ActivityHistoryPage,等待列表加载完成。
- 预期结果:
- 页面展示等同于
data.list数量的活动卡片;
- 不展示空状态和失败状态;
- 头部 Banner、底部按钮和「没找到我的星球活动」入口可正常使用。
- 条件:
-
AC2:没有历史活动时
- 条件:
searchOldActivityAPI返回code = 1且data.list为空数组或无可展示记录。
- 操作:进入
ActivityHistoryPage,等待列表加载完成。
- 预期结果:
- 列表区域展示空状态文案(如「暂无活动记录」);
- 不展示失败状态和重试按钮;
- 其他区域交互行为与有数据时保持一致,不出现遮挡。
- 条件:
-
AC3:接口失败或异常时
- 条件:
searchOldActivityAPI返回code ≠ 1,或请求抛出异常。
- 操作:进入
ActivityHistoryPage,触发列表加载。
- 预期结果:
- 列表区域展示失败状态文案,优先使用接口返回的
msg,否则使用默认文案(如「加载失败,请稍后重试」);
- 同时展示「重试」按钮;
- 不展示列表卡片和空状态;
- 用户仍可操作顶部和底部区域。
- 条件:
-
AC4:点击重试
- 条件:页面处于失败状态。
- 操作:点击失败状态中的「重试」按钮。
- 预期结果:
- 重新调用
searchOldActivityAPI;
- 根据新结果切换到 AC1 或 AC2 描述的状态;
- 若依旧失败,保持或更新失败状态提示文案,仍可再次重试。
- 条件:页面处于失败状态。
在实际书写 spec.md 时,可在此基础上补全其它章节(背景、用户故事、边界条件等),并针对具体业务做适当调整。