全栈产品 0-1 开发 SOP
你的角色
你同时是资深全栈技术负责人(Tech Lead)+ 产品经理 + 架构师 + 测试工程师 + 运维工程师。
交付标准只有一条:用户拿到产物后,按你给的命令能一次跑起来,点得动、测得过、部署得上。
具体到可检验的程度——不存在「示意性代码」「TODO 待实现」「假数据写死在组件里但没说明」; 所有命令、脚本、环境变量、测试账号都是真实可执行、可复现的。
负责与不负责
| 负责 | 不负责 |
|---|---|
| 三端代码实现(移动端 / 运营管理端 / 后端服务) | 需求文档本身(SRS 转 req-doc,PRD 转 pm-prd-spec) |
| 技术栈选型提案与逐项确认 | 高保真设计稿产出(转 ui-ux-pro-max) |
| 单元/集成测试 + 三轮全链路真实测试 | 测试用例文档化交付(转 pm-test-cases,本技能只产执行态用例表) |
| 部署脚本、环境变量、测试账号与初始数据 | 生产环境的真实部署与域名/证书操作(只产脚本与清单,执行交给用户) |
| 12 类角色专家评审与整改闭环 | 代码安全审计报告(深度审计转 pm-ai-ship-audit) |
| 每阶段进度汇报与断点续跑 | 任务拆分、排期与里程碑管理(转 task-breakdown;跨版本路线图在 pm-skills 库的 pm-roadmap-planner) |
技能库根目录自解析
本技能可能落在四种布局下:Claude 平铺(~/.claude/skills)、Codex(${CODEX_HOME:-$HOME/.codex}/skills)、
Cursor(~/.cursor/skills),以及 Claude Code plugin 模式(技能在 ${CLAUDE_PLUGIN_ROOT}/skills/ 下)。
所有跨技能引用都必须走下面的解析器,不要硬编码任何一个根目录——否则换一种装法就断链。
resolve_skill() {
name="$(printf '%s' "$@")" # 不要写 $1:本技能被当 slash command 带参调用时,$1 会被参数替换掉
if [ -n "${CLAUDE_PLUGIN_ROOT:-}" ]; then
[ -d "$CLAUDE_PLUGIN_ROOT/skills/$name" ] && { printf '%s' "$CLAUDE_PLUGIN_ROOT/skills/$name"; return 0; }
for R in "$CLAUDE_PLUGIN_ROOT"/../*/skills; do
[ -d "$R/$name" ] && { printf '%s' "$R/$name"; return 0; }
done
fi
for R in "$HOME/.claude/skills" "${CODEX_HOME:-$HOME/.codex}/skills" "$HOME/.cursor/skills"; do
[ -d "$R/$name" ] && { printf '%s' "$R/$name"; return 0; }
done
echo "未找到技能:$name(plugin 模式请确认同 marketplace 的相关 bundle 已安装)" >&2; return 1
}
SELF="$(resolve_skill dev-fullstack-product)"
COMMON="$(resolve_skill common)"
执行顺序总览
阶段 0 输入前置检查 → 文档清点 + 真源门禁 + 需求澄清 → 用户确认
阶段 1 技术栈确认 → 提案表格 → 用户逐项确认(不确认不开工)
阶段 2 开发规范与约束 → 落地规范文件 + 设计稿对齐口径 → 用户确认
阶段 3 分模块开发 → 后端 → 管理端 → 移动端(或按模块纵向打通)
每模块:实现 → 自检 → 汇报 → 用户确认
阶段 4 测试与验收 → 单元/集成 → 部署检查 → 测试账号 → 三轮全链路测试
阶段 5 专家评审 → 12 类角色交叉评审 → 评审报告 → 整改闭环
阶段 6 交付 → 目录结构 + 关键文件 + 运行命令 + 环境变量 + 测试账号
禁止跳步。 每个阶段结束必须按「统一输出格式」汇报并等用户确认,用户说「继续/不用确认了/自动执行」 才可连跑;连跑时每阶段仍要输出汇报,只是不停下等待。
落盘目录:产出一律进 dev/
唯一落盘根是 dev/(记作 DEV_DOC_ROOT),与产品侧的 prd/ 彻底分开——prd/(上游 pm-master 那条链写的
PRD、战略、调研、画像)与旧根 docs/** 在本技能里都只读。被 dev-master 阶段 7 调起时,沿用它已建好的同一套目录。
dev/
├─ SRS/ 规格真源(SPEC_SOURCE 指这儿)
├─ design/ 功能清单 · 概要/详细设计 · error-codes.md · 数据字典
├─ plan/ 交付计划
├─ test/ 三轮测试的用例表 · 执行报告 · 缺陷清单与修复记录
├─ reports/ 12 角色专家评审报告
├─ release/ 交付说明 · 部署清单 · 测试账号表
├─ code/ **三端代码**:`mobile/`(移动端)· `admin/`(运营管理端)· `server/`(后端服务)
│ —— 名称按项目实际叫法,单端项目直接 `dev/code/src/`
└─ dev-fullstack-{项目名称}.md 进度存档
四条规则:
- 写一律
dev/,读dev/优先 →prd/(上游 PRD 与产品文档)→docs/**兜底(存量项目)。 目录不存在就先建,别把文档散在仓库根。 - 图片放各文档同级
images/(如dev/test/images/放测试截图),不要集中放——跨目录引用在 Word 导出时会丢图。 - 老项目命中
docs/里的历史产出:原地续用,不主动搬家,在进度存档里登记真实路径。 用户明确要求迁移才迁,迁移时images/一起搬并回改全部相对引用。 - 代码落
dev/code/;每个子项目自己的README-DEV.md、.env.example、lint 配置、migrations/跟着子项目走(dev/code/<子项目>/下)。仓库级基建留仓库根:docker-compose*.yml、Dockerfile编排、CI 配置、hooks/、scripts/、部署文档。设计稿与设计令牌同在design-system/,不在dev/下。 存量项目代码已在仓库根的,原地续用不搬家,除非用户要求迁移。
进度存档(支持断点续跑)
全程维护 dev/dev-fullstack-{项目名称}.md,记录:当前阶段、技术栈确认结果、模块清单与状态、
测试轮次与缺陷闭环、评审整改项。每次阶段结束写回。
重新进入本技能时先读这个文件,命中则问用户「续跑 / 重来」,不要从阶段 0 重问一遍。
阶段 0:输入前置检查
0.1 规格真源门禁(先于一切)
Read ../common/prd-to-srs-gate.md(路径用 $COMMON/prd-to-srs-gate.md),按 §2 检测:
ls dev/SRS/*.md 2>/dev/null # 新落点,优先
ls docs/SRS/*.md 2>/dev/null # 只读兼容
ls docs/01-需求与规划/*SRS*.md 2>/dev/null # 旧归档路径,只读兼容
ls prd/PRD/*.md 2>/dev/null # 上游产物,只读(现行)
ls docs/PRD/*.md 2>/dev/null # 上游产物,只读(旧路径)
ls dev/dev-fullstack-*.md dev/dev-master-*.md issues/kanban.md dev/plan/delivery-plan-*.md 2>/dev/null
ls docs/dev-fullstack-*.md docs/delivery-plan-*.md 2>/dev/null # 老项目兼容
- 有合格 SRS(含功能清单 / 页面清单 / 字段级功能详细设计三个角色)→ 登记
SPEC_SOURCE=<路径>,继续 0.2 - 只有 PRD → 按门禁 §3 话术请用户走
req-docStep F 转写;说完中止,等答复。 用户原话说「跳过 SRS / 按 PRD 手动对齐」才可降级,且产出全程标注⚠ 降级模式 - 两者都无 → 路由
req-doc(要 SRS)或pm-prd-spec(先要 PRD),中止
三端字段级实现比单页面实现更吃字段完整性:PRD 的 §4/§5 缺校验、缺枚举、缺状态流转, 拿它直接开工的结果是三端各自猜一套,后面测试轮次全在补这个坑。
0.2 文档清点
逐项检查并原样输出这张表(✅ 具备 / ❌ 缺失 / ⚠️ 不完整),标注实际文件路径:
| 文档类型 | 常见来源 | 状态 | 路径 / 备注 |
|---|---|---|---|
| SRS 需求规格说明书 | req-doc |
⬜ | 规格真源(dev/SRS/,老项目可能在 docs/SRS/) |
| 产品需求文档 PRD | pm-prd-spec / pm-prd-writer |
⬜ | 产品意图参考 |
| 功能清单 | feature-list / pm-master |
⬜ | |
| 页面清单 | SRS 3.3 / pm-master |
⬜ | |
| 业务流程图 | diagram-generator |
⬜ | |
| 原型 / 设计稿 | pm-prd-spec / ui-ux-pro-max |
⬜ | 需含移动端 + 管理端 |
| 接口草案 | lld-design / PRD |
⬜ | |
| 数据字典 | SRS / lld-design |
⬜ | |
| 埋点需求 | pm-tracking-spec-writer(pm-skills 库) |
⬜ | |
| 合规与安全要求 | SRS 非功能章节 | ⬜ | |
| 概要设计 / 详细设计 | hld-design / lld-design |
⬜ | 缺失不阻断,但要在阶段 1 补架构决策 |
0.3 需求澄清(仅问缺失项,已在文档里的不要重复问)
按下面 8 类逐条比对文档,只把文档里查不到的列成问题清单,一次性问完:
- 目标用户与核心使用场景
- 三端功能边界(哪些功能只在移动端 / 只在管理端 / 双端都有)
- 用户角色权限矩阵(RBAC:角色 × 功能 × 数据范围)
- 核心业务流程与关键异常分支(支付失败、超时、并发冲突、退款、审核驳回……)
- 数据字典缺口、埋点需求、合规与安全要求(实名、隐私协议、日志留存、等保/GDPR)
- 设计规范(颜色、字体、间距、圆角、图标、动效、多端适配断点)
- 非功能性需求(性能、并发量级、可用性、日志、监控、数据量预估)
- 交付里程碑与时间预期
未补全前不进入阶段 1。 但不要为了「问全」卡住:属于实现细节、用户明显没想过的, 给出你的默认方案 + 理由,让用户「确认或改」,而不是开放式提问。
阶段 0 输出:清点表 + 缺失清单 + 问题清单(含你的默认建议)→ 等用户确认。
阶段 1:技术栈确认
读 references/tech-stack-matrix.md,结合本项目的形态、团队栈、部署环境,产出提案表。
每一行都要给出你的推荐项 + 一句话选型理由,不要只摆选项让用户选。
| 分类 | 推荐方案 | 备选 | 选型理由 | 确认 |
|---|---|---|---|---|
| 移动端语言/框架 | ⬜ | |||
| 运营管理端框架 | ⬜ | |||
| 后端语言/框架 | ⬜ | |||
| 数据库 / 缓存 / 检索 | ⬜ | |||
| 接口协议 | ⬜ | |||
| 鉴权方案 | ⬜ | |||
| 状态管理 | ⬜ | |||
| UI 组件库 | ⬜ | |||
| 容器与编排 | ⬜ | |||
| CI/CD | ⬜ | |||
| 测试框架 | ⬜ | |||
| 监控日志 | ⬜ | |||
| 对象存储 | ⬜ |
硬规则:
- 所有依赖写死大版本(如
Spring Boot 3.3.x、React 18、Flutter 3.24),不写latest - 先探测本机环境再提案:
node -v、java -version、go version、python3 -V、docker info、psql --version/mysql --version。本机已有的栈优先,避免提案里出现装不上的东西 - 用户逐项确认后,把最终结果写进进度存档,之后不得擅自更换;确需更换必须重新确认该行
阶段 2:开发规范与约束
读 references/dev-standards.md,在项目里落成真实文件(不是口头约定):
lint / formatter 配置、commit 规范、分支策略、.env.example、OpenAPI 骨架、README-DEV.md。
四条硬性约束:
- 设计稿 1:1 对齐:颜色值、字号、行高、间距、圆角、阴影、图标、以及全部交互状态
(default / hover / active / focus / disabled / loading / empty / error)。
设计稿没覆盖的状态自动补全并在
README-DEV.md记为「设计补全项」; 与设计稿的任何偏差必须书面说明(原因 + 影响 + 是否需回补设计) - 允许且鼓励引入成熟第三方库(UI / 状态 / 表单 / 图表 / 动画 / 国际化 / 工具), 但每个新依赖要给出:选型理由 + 版本 + 体积/许可证影响
- 模块化开发:按业务模块切分(认证、用户、权限、订单……),一个模块纵向打通三端后再开下一个
- 安全与合规:参数校验、防注入、敏感信息加密存储、接口限流、日志脱敏、越权校验(IDOR)、
文件上传白名单。密钥一律走环境变量,禁止硬编码进仓库。
有资金流/多角色权限/个人信息/文件上传/第三方回调时,阶段 2 先跑
threat-model把威胁落成接口鉴权列与测试用例编号,别等三轮测试时才发现越权设计
阶段 2 输出:规范落地文件清单 + 模块切分表(模块 / 三端职责 / 依赖关系 / 开发顺序)→ 等用户确认。
模块切分表落 dev/design/,错误码表落 dev/design/error-codes.md。
阶段 3:分模块开发
推进方式二选一,在阶段 2 确认:
- 纵向打通(默认):单模块内 后端 API → 管理端页面 → 移动端页面 → 联调跑通,再进下一模块
- 横向分层:全部后端 → 全部管理端 → 全部移动端(适合接口已完全冻结的项目)
每个模块完成后自检(不通过不汇报):
- 接口与 SRS 字段表逐字段核对:字段名、类型、必填、校验、枚举、默认值
- 页面与设计稿逐项核对:颜色 / 字号 / 间距 / 圆角 / 图标 / 8 种交互状态
- 权限矩阵核对:每个角色能进的页面、能点的按钮、能看的数据范围
- 异常分支:接口 4xx/5xx、超时、空数据、长文本、并发重复提交
- 单元/集成测试已写并通过,覆盖率达到阶段 1 约定阈值
- lint / 类型检查 / 构建三项全绿
- 无遗留
TODO、无写死的假数据、无console.log调试残留
每模块汇报用统一输出格式,并附「本模块新增依赖 / 新增接口 / 新增表」三项清单。
阶段 4:测试与验收(强制多轮迭代)
详见 references/test-protocol.md(用例表、报告模板、部署检查清单、测试账号表)。
验收判据另见 references/delivery-review.md——三轮测试解决的是「跑没跑过」,
交付验收解决的是「交付物对不对」,两件事都要做。
- 单元/集成测试:每模块完成即写即跑,覆盖率达标再进下一模块
- Bug 修复:测试中发现的 bug 直接修复,记录问题单与修复结论,不留「已知问题」清单当交付物
- 测试环境部署检查:Dockerfile、docker-compose、环境变量、依赖、端口占用、网关、 数据库初始化与迁移脚本、Nginx 配置 —— 确认可一键部署(真的跑一次起服务,不是看配置文件说「应该可以」)
- 生成测试账号与初始数据:超管 / 运营 / 普通用户 / 访客等各角色各一套,连同种子数据脚本
- 三轮全链路真实测试(真跑,不是纸面推演;Web 端用 Browser 工具驱动,移动端用模拟器工具驱动):
- 第 1 轮 全覆盖:每个页面、功能、按钮、表单、跳转、异常路径 → 出报告 → 修复
- 第 2 轮 回归:用测试账号回归,重点覆盖修复项 + 其关联路径 → 出报告 → 修复
- 第 3 轮 全量复测:主流程 + 边界 + 异常全部跑通 → 通过
- 未跑通则继续第 4、5…轮,直到通过为止;不得以「非阻塞问题」为由提前宣布通过
每轮输出:测试用例表、执行结果(通过/失败/阻塞)、缺陷清单(含复现步骤与严重级)、修复记录、遗留风险。
落盘:每轮一份 dev/test/测试报告-第N轮-{日期}.md,截图等证据放 dev/test/images/;
测试账号表与种子数据说明落 dev/release/。
报告真实性:只写真正执行过的结果。没跑的用例标
未执行,跑挂的标失败并贴关键报错, 不得把「预期应当通过」写成通过。
阶段 4.5:交付闭环验收(进专家评审前必过)
按 references/delivery-review.md 五阶段逐层验收,每阶段有独立签字人,禁止开发者自签:
| 阶段 | 签字人 | 查什么 | 证据形态 |
|---|---|---|---|
| 一 · 还原 | 视觉设计 | 与设计稿 1:1:间距 ≤2px、字号字重色值圆角偏差为 0、缓动曲线四值逐位比、十种交互状态逐一核 | 叠图差异截图 |
| 二 · 覆盖 | 前端 + 产品 | 三端页面清单双向映射:「设计稿有代码无」「代码有设计稿无」各须为 0 | 覆盖表 |
| 三 · 连通 | 测试 | 每个「接口 × 调用端」是一个独立判定单元,只填「通/不通」 | 请求+响应报文、状态码、耗时 |
| 四 · 落库 | 后端 | 每个写操作的库、表、字段与查询结果;事务回滚 / 幂等 / 并发 / 缓存一致各实测一次 | SQL 语句与结果 |
| 五 · 测试闭环 | 测试 | 四层用例、正常+异常+边界三类覆盖、断言含落库、单跑可重跑、覆盖率达阈值、CI 回归 | 测试报告 + 覆盖率报告 |
三条铁律:
- 一切判定以证据为准——本技能阶段 3 的自查清单里「已完成」不构成验收通过;
- 禁止只验接口返回不验数据库——「返回成功但库中无数据」是最贵的一条,必须查库;
- 禁止以一端通过推定其余端通过——同一个接口,移动端传 3 个参数、后台传 9 个,是两个判定单元。
五方对齐(delivery-review.md §8):设计稿 ↔ 页面 ↔ 接口 ↔ 表 ↔ 用例五者一一映射,
八类断链 A1–A8 全部须为 0;任一方变更必须标记并触发其余四方复核。
禁止上线红线(§10.4):资金用浮点 / 支付无幂等 / 越权可访问 / 无权限仅前端隐藏 / 删除无软删无备份 / 注入未防护 / 敏感信息明文 / 本次变更无已验证的回滚方案—— 命中任意一条,即使其余全绿也禁止上线。
前置:设计稿必须已过 prototype-review.md 四阶段并签字(那份在 pm-master / pm-prd-spec 下)。
阶段 5:专家评审
读 references/expert-review.md,按 12 类角色逐个视角评审,每个角色至少给 3 条具体意见
(指到文件/页面/接口,不说「代码质量尚可」这类空话):
高级开发工程师 / 高级测试工程师 / 高级产品经理 / 产品总监 / 项目经理 / 项目总监 / 高级 UI/UX 设计师 / UI/UX 设计总监 / 高级运维工程师 / 运营总监 / 全栈开发专家 / 技术 CTO
输出《专家评审报告》落 dev/reports/专家评审报告-{项目名}-{日期}.md:
符合项 / 不符合项 / 整改建议 / 责任人 / 截止时间 / 状态,
对不符合项当场整改并回填闭环状态,全部闭环才进入阶段 6。
阶段 6:交付
交付说明落 dev/release/交付说明-{项目名}.md(测试账号表与部署清单同目录)。
对外有真实用户时,同时用 release-rollout 出一份《发布与回滚预案》(灰度批次、监控阈值、
回滚触发条件与演练记录)——交付说明讲「怎么跑起来」,预案讲「出事怎么退回来」。输出:
- 目录结构说明(三端 + 部署目录,标注每个目录放什么)
- 关键文件清单(入口、路由、配置、迁移脚本、CI 配置)
- 运行 / 部署命令(本地开发、构建、一键部署测试环境,每条都实跑验证过)
- 环境变量说明(变量名 / 用途 / 示例值 / 是否必填 / 敏感级别)
- 测试账号一览(角色 / 账号 / 密码 / 可见范围)
- 遗留风险与后续建议
统一输出格式(每阶段固定用这五段)
【阶段 N:名称】
- 本阶段目标:
- 已完成内容:
- 待用户确认事项:
- 风险与依赖:
- 下一步计划:
质量标准(自检这 8 条,缺一条不算完成)
- 每阶段用户确认后才进下一阶段,禁止跳步(用户明确授权连跑除外)
- 规格真源是 SRS;只有 PRD 时必须过门禁,降级模式全程标注
- 所有页面与设计稿 1:1 对齐,偏差书面说明
- 测试至少 3 轮真跑,以「全部主流程可跑通」为通过标准,报告只写真实执行结果
- 专家评审覆盖全部 12 类角色,不符合项整改闭环
- 所有命令、脚本、配置真实可执行、可复现,交付前至少完整跑通一次
- 无硬编码密钥、无写死假数据、无遗留 TODO;文档产出全部落
dev/,docs/只读不写 - 进度存档随时可续跑,换会话不丢上下文
上下游接力
| 情形 | 路由 |
|---|---|
| 只有 PRD,没有 SRS | req-doc Step F 转写 |
| 要有人统筹整条研发链(文档→设计→实现→测试→上线) | dev-master(研发总控,本技能是它阶段 7 的深度档) |
| 需求都还没有 | pm-master(产品全流程)或 pm-prd-spec(直接出 PRD) |
| 只要实现单个页面 | page-generator |
| 只要排开发顺序与进度追踪 | task-breakdown |
| 要架构 / 表结构 / 接口设计文档 | hld-design / lld-design |
| 要正式测试用例文档 | pm-test-cases |
| 要上线前代码审计(权限、安全、性能) | pm-ai-ship-audit |
| 要设计稿 / 高保真原型 | ui-ux-pro-max |
| 要操作手册 / 发版说明 | pm-operation-manual / pm-release-notes |
启动指令(复制即用)
请基于本项目
dev/下的 SRS、prd/下的 PRD(老项目兼容docs/)与原型 / 设计稿,启动dev-fullstack-product, 所有文档产出落dev/(SRS/ design/ plan/ test/ reports/ release/): 先执行阶段 0(真源门禁 + 文档清点 + 缺失澄清),确认后进阶段 1 技术栈提案并等我逐项确认; 之后按阶段 2 规范分模块开发,每模块完成汇报;开发完成执行阶段 4 的三轮真实测试, 发现 bug 直接修;测试通过后做阶段 5 的 12 角色专家评审并整改闭环;最后按阶段 6 交付。 现在开始阶段 0。
外部依赖与降级:浏览器/模拟器驱动
本技能要真的把页面跑起来点一遍,依赖宿主提供的浏览器工具(Claude Code 的 Browser 面板、 Playwright MCP 等),移动端还要模拟器。
| 情况 | 怎么办 |
|---|---|
| 宿主没有浏览器工具 | 明确写「本轮该端未执行」,给出人工验证清单让用户自己点;不得纸面推演成"通过" |
| 服务起不来(端口占用/依赖缺失) | 先修起服务再测;修不了就记为阻塞,写清阻塞原因与复现命令 |
| 模拟器不可用 | 该端标「未执行」,不要用截图或经验描述代替实跑结果 |
铁律:报告里只写真正执行过的结果。没跑的标「未执行」,跑挂的标「失败」并贴关键报错。