| name | by-tech-plan |
| description | 辅助书写高质量技术方案文档。用户要写技术方案、技术设计、方案评审、研发设计文档、接口方案、库表变更方案、上线方案、交付执行方案,或希望把 PRD/需求/代码上下文整理成可评审方案时,必须使用本 skill。它会先识别需求复杂度,按 L0 交付执行单、L1 轻量技术方案、L2 标准技术方案、L3 深度评审方案选择输出结构;再结合代码、领域词汇、ADR、接口、SQL schema、分布式高并发与上线约束进行必要澄清,避免简单需求被完整模板拖慢,也避免高风险需求被轻量化。 |
by-tech-plan
使用本 skill 辅助研发同学产出可评审、可落地、可上线的技术方案文档。重点不是把模板填满,而是先识别需求复杂度,暴露隐藏假设、澄清关键取舍,并留下能让研发、测试、发布和运维团队共同执行的方案。
最终文档必须先按 方案类型识别 选择输出结构。风险判断必须完成,但只有命中的风险维度才需要在正文展开;未命中的维度可以省略,或用一句话说明“不涉及,原因是...”。L2/L3 使用完整模板,L0/L1 使用轻量模板。
启动前置动作
开始拷问或起草前,先明确用户本次真正要完成的事情。
- 先用一句话复述你理解的需求目标,例如:“我理解本次是要为{需求/项目}产出一份可评审的技术方案,重点解决{核心问题}。”
- 如果用户没有提供材料,主动要求补充可用输入:PRD/需求文档、飞书文档、接口文档、代码仓库地址、目标分支、相关模块、历史方案或线上问题链接。
- 如果用户已经提供部分材料,先确认这些材料分别承担什么角色:PRD、技术背景、现有实现、接口约束、测试依据或上线约束。
- 如果代码仓库地址或文档地址暂时没有,也不要阻塞。说明你会基于当前上下文先推进,并把缺失材料记录到 问题记录。
- 明确交付物形态:只要 Markdown 草稿、要更新飞书文档、要生成可复制到模板的正文,还是要继续陪用户逐轮完善。
方案前置校准
进入拷问或起草前,先做一次简短校准,避免静默选择错误方向。
- 复述你理解的需求目标:本次到底要解决什么问题。
- 明确本期成功标准:什么结果出现,才算本期方案可验收。
- 区分当前信息状态:哪些是已确认事实,哪些是推荐假设,哪些是待确认问题。
- 如果存在多种理解,列出不同理解及影响,不要替用户静默选择。
- 如果 P0 阻塞决策无法从材料中确认,先问;如果只是 P1/P2 信息,给出推荐假设并继续推进。
方案类型识别
起草前先给出推荐方案类型,并说明判断依据。默认从轻量类型开始,命中风险触发条件后再升级;不要一上来默认套完整模板。
| 类型 | 适用场景 | 输出重点 |
|---|
| L0 交付执行单 | 需求明确、单点改动、无架构取舍、无库表/接口契约/跨系统影响 | 改动明细、执行步骤、验收方式 |
| L1 轻量技术方案 | 单系统或单模块,有少量流程、接口、配置或页面调整,但风险局部可控 | 方案细节、核心流程、涉及项设计、验证上线 |
| L2 标准技术方案 | 多模块或多系统协作,涉及库表、接口契约、兼容、灰度、数据迁移或运维观察 | 使用完整 9 章模板,展开关键设计和取舍 |
| L3 深度评审方案 | 核心交易/资金/履约链路,强一致性、高并发、安全权限、外部依赖或复杂回滚 | 在 L2 基础上强化 ADR、压测、监控、应急预案和人工恢复 |
命中下列任一条件时,不能使用 L0;命中多项或影响核心链路时优先升级到 L2/L3:
- 新增或修改数据库表、索引、状态机、缓存结构、消息体或定时任务。
- HTTP/RPC/MQ/Event 等外部契约变化,或需要兼容旧客户端、旧数据、旧配置。
- 跨系统、跨仓库、跨团队发布,或存在明确发布顺序依赖。
- 涉及异步、重试、补偿、幂等、并发一致性、分布式锁、限流降级。
- 涉及历史数据迁移、回填、清洗、权限、隐私、安全、审计、风控。
- 回滚成本高,或失败会影响核心业务链路、资金、订单、履约、计费、结算。
如果用户明确要求轻量输出,但材料命中升级条件,先指出升级原因,再给出“轻量正文 + 风险附录”或建议使用 L2/L3。
L0/L1 方案细节优先
L0/L1 不是缩小版完整技术方案,而是面向交付的方案细节文档。正文优先回答“具体怎么改、按什么步骤做、怎么验收、怎么上线/回滚”,其他模块尽量省略。
- 背景、目标、非目标只保留必要信息,通常 1-3 句话即可。
- 不单独展开修改历史、人力安排、运维方案、方案优缺点、完整架构图、容量压测、ADR,除非风险扫描命中。
- 不为了模板完整性写“暂无”“不涉及”的长段落;确需说明时,用一句话放在相关细节下。
- L0/L1 的“方案细节”必须靠前,不能把主要篇幅放在背景、需求拆分或管理信息上。
- 如果方案细节写不清,优先补充改动表、步骤、输入输出、状态变化、配置项、接口字段或验收样例,而不是补充泛化章节。
工作模式
根据当前上下文选择模式。
1. 拷问模式
当用户只有粗略想法、PRD 链接、半成品方案,或明确说“帮我梳理/帮我完善/帮我拷问方案”时,使用拷问模式。
- 不要机械地“一次只问一个问题”。先把问题分为三类,再决定交互节奏:
- P0 阻塞决策:不确认会影响方案方向、系统边界、数据归属、主方案取舍、库表设计、兼容策略或上线回滚。P0 问题逐个确认,单轮最多提出 1-3 个。
- P1 重要假设:影响方案质量,但可以先按推荐答案推进。P1 问题批量确认,每批最多 5-8 个。
- P2 非阻塞信息:负责人、精确排期、指标阈值、数据量精确值等暂不影响初稿方向的信息,直接采用推荐假设并写入 问题记录。
- 每个问题都先给出你的推荐答案、判断依据和如果判断错误会影响什么,再请用户确认或修正。
- 批量确认时允许用户回复“全部按推荐继续”。用户只修正部分问题时,未修正项默认采用推荐答案,并在 问题记录 标记为“待确认假设”。
- 当 P0 已明确,且 P1/P2 都已有推荐判断时,进入合成模式先做信息回放;用户确认、修正或要求继续后,再按推荐方案类型产出初稿,不要为了逐项确认所有问题阻塞文档起草。
- 如果答案能从代码库、现有文档、接口文档、数据库表结构、日志或 ADR 中找到,就先查证,不要直接问用户。
- 按依赖顺序推进决策树:业务目标 → 影响系统 → 数据模型与 SQL schema → 核心流程 → 重点难点与伪代码 → 接口 → 分布式/高并发/一致性/幂等 → 兼容 → 测试 → 上线 → 可观测性 → 风险。
- 当用户使用“账号”“订单”“状态”“回调”“补偿”“异步”“兼容”“灰度”等模糊或重载词时,按影响范围归类:影响核心链路的作为 P0,局部字段或表述的作为 P1/P2。
- 当用户描述的行为与代码或文档冲突时,作为 P0 立即指出冲突,并询问哪个来源更权威。
- 持续维护一个未解决问题清单,不要在对话推进中遗失。
2. 合成模式
当当前对话、PRD、代码库和文档已经提供足够信息时,使用合成模式,但不要直接起草方案。先把已经掌握的信息和推荐方案类型简要复述给用户,给用户一次校正机会,再进入对应模板起草。
- 起草前先做一次“信息回放”:需求目标、本期成功标准、本期非目标、推荐方案类型、已知材料、涉及系统/代码仓库、核心链路、关键约束、已确认事实、推荐假设和待确认问题。
- 信息回放要简洁,重点用于校准理解,不要提前展开成方案正文。
- 信息回放必须区分“已确认事实”“推荐假设”“待确认问题”。如果用户回复“全部按推荐继续”,直接按推荐方案类型起草文档。
- 不要为了非阻塞细节反复访谈。对未知信息做显式假设,并记录到 问题记录。
- 如果方案依赖代码现状,先探索代码库再起草。
- 如果存在
CONTEXT.md / CONTEXT-MAP.md,使用其中的项目领域词汇。
- 尊重相关 ADR。若 ADR 已经约束了边界、技术选型或集成方式,不要轻易提出相反方案。
- 将实现拆成职责稳定的模块。优先识别深模块:外部接口简单、内部承载较多行为、可以独立测试。
- 产出与方案类型匹配的成稿文档,不要只给松散大纲。
代码库与文档感知
在询问用户架构或现状行为之前,先查找本地证据:
CONTEXT-MAP.md:用于识别多上下文仓库。
- 根目录或上下文目录下的
CONTEXT.md:用于确认规范领域语言。
docs/adr/:用于确认已经存在的技术决策。
- 现有接口文档、schema、数据库迁移、配置、controller、service、client、测试和部署脚本。
- 类似链路或相邻业务的已有实现。
如果没有 CONTEXT.md,不要主动创建,除非当前正在和用户共同解决领域术语问题。若某个术语已经被明确,并且后续会继续影响方案,请按 CONTEXT-FORMAT.md 创建或更新 CONTEXT.md。
谨慎提出 ADR。只有同时满足下面三个条件时,才建议创建 ADR:
- 决策难以逆转。
- 如果没有上下文,未来读者会疑惑为什么这样做。
- 这是一个真实取舍的结果,而不是显而易见的选择。
写 ADR 时使用 ADR-FORMAT.md。
方案设计原则
最小可落地方案优先
- 优先给出能满足当前需求的最小可落地方案。
- 不提前设计扩展能力,不为了未来可能性引入配置、抽象、状态机、任务系统或表结构。
- 如果存在更简单方案,先说明它是否可行;如果不采用,说明它为什么不能满足当前需求。
- 如果复杂方案更合理,必须解释复杂性来自哪里,例如一致性、兼容性、性能、审计、安全或跨系统发布约束。
- 不把“未来可能会用到”作为本期设计理由。后续演进可以写入非目标或问题记录。
改动范围约束
- 每个改动点必须能追溯到一个明确需求点、验收口径或风险控制目标。
- 不做顺手重构,不改无关模块,不调整无关格式、命名或注释。
- 发现无关问题时,只记录到 问题记录,不要并入本期方案。
- 涉及多个仓库时,按仓库列出必要改动;无法说明必要性的改动应从方案中移除。
质量门禁
质量门禁是风险扫描清单,不是正文展开清单。所有方案都要先扫描;L0/L1 只展开命中的风险维度,L2/L3 才按完整模板逐项展开。没有命中的维度不要硬写长段落,可以省略,或用一句话说明“不涉及,原因是...”。
- 业务适配:解决什么问题、面向谁、哪些事情不在本期范围内?
- 前置校准:是否说明了需求目标、本期成功标准、本期非目标、已确认事实、推荐假设、待确认问题和多种理解的取舍?
- 方案类型:是否说明了推荐使用 L0/L1/L2/L3 的判断依据?是否检查了升级触发条件?
- 需求拆分:有哪些子需求、边界、依赖和边缘场景?L0/L1 可合并到目标、改动明细或验收口径里,不单独成章。
- 方案最小化:是否优先选择最小可落地方案?如果采用复杂方案,是否说明简单方案为什么不够?
- 改动范围:每个改动点是否能追溯到需求点或风险控制目标?是否排除了顺手重构和无关改动?
- 系统影响:是否说明上下游、应用边界和数据流?L2/L3 是否先用高维度系统关系图,再逐项列出应用/模块、接口、任务、消息、缓存、数据库、配置、权限、监控、发布和回滚影响?
- 代码仓库改动:涉及多个工程或代码仓库时,是否列出每个仓库/工程的改动模块、主要改动、联动依赖、发布顺序和验证方式?
- 核心流程:正常路径、失败路径、重试路径和补偿路径分别是什么?
- 数据设计:新增或修改哪些表、模型、字段、状态、索引?涉及库表修改时,是否完整列出了 DDL、索引、初始化 SQL、迁移/回填 SQL、回滚 SQL 和兼容读写策略?未命中时 L0/L1 不展开。
- 接口契约:HTTP、RPC、事件、消息或定时任务有哪些变化?是否包含请求、响应、错误码、幂等字段和兼容策略?未命中时 L0/L1 不展开。
- 一致性:哪里需要事务、最终一致性、去重、加锁或顺序保证?
- 重点难点:关键算法、状态流转、幂等判断、补偿流程或复杂分支是否用符合 Java 8 风格的伪代码表达清楚?
- 分布式与高并发:是否已扫描多实例部署、并发请求、重复消息、分布式锁、缓存一致性、限流降级、热点数据和故障重试?命中风险时是否展开处理策略?
- 并发处理:重复点击、重复回调、重试、并行任务、竞态更新时会发生什么?
- 数据量与性能:预估数据规模是多少?哪些查询或调用可能成为热点?
- 兼容性:哪些旧行为必须继续可用?哪些客户端、版本、配置或下游会受影响?
- 安全与权限:是否涉及鉴权、数据权限、隐私、审计或风控约束?
- 测试方案:哪些外部可观察行为需要单测、集成测试、回归测试、契约测试或人工验证?
- 上线方案:发布顺序、配置开关、数据初始化、灰度、回滚和上线验证如何设计?
- 运维方案:需要哪些指标、日志、告警、看板、巡检、预案和手工恢复步骤?
- 风险识别:最可能失败的点是什么?团队如何发现并处理?
文档模板
按推荐方案类型选择模板。L0/L1 聚焦方案细节,只保留“目标、方案细节、验收上线、问题记录”;背景、人力、运维、架构图等模块默认省略。L2/L3 使用完整 9 章结构,一级标题保持不变。
L0 交付执行单
用于需求非常明确、无明显技术取舍、无升级触发条件的交付任务。
# 一、目标与验收
**需求目标:** {一句话说明本次要交付什么}
**验收口径:**
- {可被产品/测试/业务验证的结果}
# 二、方案细节
**改动明细:**
| 改动项 | 当前情况 | 目标结果 | 具体做法 | 验证方式 |
| --- | --- | --- | --- | --- |
| {页面/接口/配置/脚本/文档/代码模块} | {现状} | {交付后结果} | {具体怎么改} | {如何验证} |
**执行步骤:**
1. {步骤 1}
2. {步骤 2}
3. {步骤 3}
**关键约束:** {没有则省略;例如配置值、开关、输入输出、数据处理边界}
# 三、测试与上线
**测试范围:**
- {测试点}
**上线方式:**
- {发布/配置/脚本执行方式}
**回滚方式:**
- {如何回滚;如果不需要,说明原因}
# 四、问题记录
| 问题 | 当前判断/推荐答案 | 状态 | 负责人 |
| --- | --- | --- | --- |
| {问题} | {推荐答案或假设} | 待确认/已确认 | {负责人} |
L1 轻量技术方案
用于单系统或单模块的局部变更。不要引入完整架构图、伪代码、SQL、压测等章节,除非风险扫描命中。
# 一、目标与范围
**PRD/需求来源:** {链接或“暂无”}
**目标:** {1-3 句话说明本次要交付什么}
**范围边界:** {只写本期关键边界;没有则省略}
**推荐方案类型:** L1 轻量技术方案,原因:{判断依据}
# 二、方案细节
**改动明细:**
| 影响对象 | 当前行为 | 目标行为 | 具体做法 | 验收口径 |
| --- | --- | --- | --- | --- |
| {模块/接口/页面/配置/数据项} | {现状} | {目标} | {具体怎么改} | {可验证结果} |
**核心流程:**
{用步骤说明正常路径和必要异常路径;如有复杂分支再补 Mermaid。}
**涉及项设计:**
- 数据:{只写新增/修改/读取规则;不涉及则省略}
- 接口:{只写接口、字段、错误码、兼容点;不涉及则省略}
- 配置:{只写配置项、默认值、开关策略;不涉及则省略}
- 任务/消息:{只写触发、重试、幂等、补偿;不涉及则省略}
# 三、测试与上线
**测试重点:**
- {测试点}
**上线方式:**
- {发布顺序、配置、验收}
**回滚方式:**
- {回滚动作或“不涉及,原因是...”}
# 四、问题记录
| 问题 | 当前判断/推荐答案 | 状态 | 负责人 |
| --- | --- | --- | --- |
| {问题} | {推荐答案或假设} | 待确认/已确认 | {负责人} |
L2 标准技术方案 / L3 深度评审方案
L2 使用下面完整结构。L3 在 L2 基础上必须强化 ADR/取舍背景、容量与压测、监控告警、应急预案、人工恢复和跨团队发布协同。
# 一、修改历史
| 版本 | 变更日期 | 变更人 | 变更内容 |
| --- | --- | --- | --- |
| v0.1 | YYYY-MM-DD | {姓名/角色} | 初稿 |
# 二、项目背景
**PRD:** {PRD 链接或“暂无”}
**接口文档:** {接口文档链接或“暂无”}
**背景说明:**
{说明业务背景、现状问题、目标用户/业务方、为什么现在要做。}
**目标:**
- {目标 1}
- {目标 2}
**非目标:**
- {本期不做的事项}
# 三、需求细分
| 需求点 | 说明 | 优先级 | 依赖/约束 | 验收口径 |
| --- | --- | --- | --- | --- |
| {需求点} | {说明} | P0/P1/P2 | {依赖或约束} | {可验证结果} |
**边界与场景:**
- 正常场景:{...}
- 异常场景:{...}
- 兼容场景:{...}
# 四、方案设计
## 1. 方案一(主)
### 方案概述
{用几段话说明整体思路、涉及系统、关键链路、主要取舍。}
### 方案取舍与最小化说明
{说明为什么当前方案是最小可落地方案;如果没有采用更简单方案,说明原因;如果没有采用更复杂方案,说明不做的原因。}
### 系统影响范围
{先说明本次变更的系统边界、上下游依赖、是否影响存量链路。不要只写服务名。}
| 影响对象 | 类型 | 影响方式 | 具体变化 | 兼容/迁移策略 | 验证方式 | 负责人 | 风险等级 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| {系统/模块/资源} | 应用/模块/接口/任务/消息/缓存/数据库/配置/权限/监控/发布 | 新增/修改/依赖/废弃/无影响 | {具体影响} | {兼容、灰度、回滚、迁移或“不涉及”} | {单测/联调/回归/观测项} | {负责人} | 高/中/低 |
### 代码仓库改动清单
{涉及多个工程或代码仓库时必须填写;单工程也写一行。若无代码改动,写“不涉及”。仓库名未知时写当前假设,并同步记录到 **九、问题记录**。}
| 代码仓库/工程 | 所属系统/应用 | 改动模块 | 改动类型 | 主要改动 | 依赖/联动仓库 | 发布顺序 | 验证方式 | 负责人 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| {repo/project} | {系统/应用} | {模块/包/目录或“不涉及”} | 新增/修改/删除/配置/脚本/无代码改动 | {具体改动点} | {依赖的 repo/project 或“不涉及”} | 第 1/2/3 步或“不限制” | {单测/集成/联调/回归/观测项} | {负责人} |
### 流程设计
{先给出高维度整体架构图,再给出核心业务流程。若目标文档平台不支持 Mermaid,说明需要转成图片贴入。}
#### 1. 整体架构图
{用 Mermaid flowchart 表达系统、模块、上下游、存储、缓存、消息和外部依赖之间的关系,帮助评审者先理解系统边界。}
```mermaid
flowchart LR
User[用户/业务方] --> Entry[入口系统/页面/接口]
Entry --> Core[核心服务/领域模块]
Core --> DB[(数据库)]
Core --> Cache[(缓存)]
Core --> MQ[[消息/任务]]
Core --> External[外部系统]
```
#### 2. 核心业务流程
{用 Mermaid sequenceDiagram / flowchart 表达正常路径、关键分支、失败路径、重试路径和补偿路径。}
```mermaid
sequenceDiagram
participant User as 用户/业务方
participant Entry as 入口系统
participant Core as 核心服务
participant Store as 存储/外部依赖
User->>Entry: 发起请求/操作
Entry->>Core: 参数校验与业务调用
Core->>Store: 读写数据或调用依赖
Store-->>Core: 返回结果
Core-->>Entry: 业务处理结果
Entry-->>User: 返回响应/状态
```
### 模型与表结构设计
{说明新增/变更表、字段、索引、状态流转、数据迁移/回填。若涉及库表修改,必须重点罗列 SQL schema 和关键 SQL,不能只用文字概括。}
```sql
-- 1. 新增表 / 修改表结构
CREATE TABLE / ALTER TABLE ...
-- 2. 索引与唯一约束
CREATE INDEX / CREATE UNIQUE INDEX ...
-- 3. 初始化数据
INSERT INTO ...
-- 4. 数据迁移 / 回填
UPDATE ... / INSERT INTO ... SELECT ...
-- 5. 回滚 SQL
ALTER TABLE ... / DROP INDEX ... / DELETE FROM ...
```
### 重点难点与伪代码
{对关键算法、复杂状态流转、幂等判断、补偿流程、并发控制或核心分支给出 Java 8 风格伪代码。伪代码要表达主要判断、事务边界、锁释放、异常处理和数据写入顺序,不需要贴真实业务代码。}
```java
public class CoreFlowService {
public Result handleCoreFlow(Request request) {
validateRequest(request);
String idempotencyKey = buildIdempotencyKey(request);
Optional<Result> processedResult = idempotencyRepository.findResult(idempotencyKey);
if (processedResult.isPresent()) {
return processedResult.get();
}
LockResult lockResult = lockService.tryLock(idempotencyKey, 10, TimeUnit.SECONDS);
if (!lockResult.isSuccess()) {
return Result.pending("request is processing");
}
try {
return transactionTemplate.execute(status -> {
BizRecord record = bizRepository.selectForUpdate(request.getBizId());
if (!record.canProcess()) {
return Result.fail("invalid state");
}
record.markProcessing();
bizRepository.update(record);
OutboxEvent event = OutboxEvent.create(record.getId(), EventType.BIZ_PROCESSING);
outboxRepository.insert(event);
Result result = Result.success(record.getId());
idempotencyRepository.saveResult(idempotencyKey, result);
return result;
});
} catch (RetryableException ex) {
retryTaskRepository.insert(RetryTask.from(request, ex));
return Result.pending("retry later");
} finally {
lockService.unlock(lockResult);
}
}
}
```
### 接口设计
{列出 HTTP、RPC、MQ/Event、定时任务等契约。包含入参、出参、错误码、幂等字段、兼容策略。}
### 幂等、并发与一致性
{说明重复请求、重复回调、并发更新、事务边界、锁、去重、重试、补偿。所有方案都要按分布式、高并发、多实例部署场景审视,明确是否需要唯一索引、乐观锁、分布式锁、消息去重、顺序消费、限流、降级、熔断和缓存一致性策略。}
### 数据量、性能与扩展性
{说明预估量级、热点路径、缓存、分页、批处理、限流、降级。}
### 原有逻辑兼容
{说明对现有业务、历史数据、老客户端、旧接口、配置开关的影响。若暂无,写“暂无”。}
### 方案优缺点与取舍
| 方案 | 优点 | 缺点 | 结论 |
| --- | --- | --- | --- |
| 方案一 | {...} | {...} | 主方案 |
### 接口文档
```plaintext
1. HTTP: {method} {path}【{接口说明}】
param:
{name} {type} {required} {description}
result:
{示例 JSON}
2. RPC: {interface}#{method}
dependency:
{依赖包/版本}
param:
{name} {type} {required} {description}
result:
{示例 JSON}
```
# 五、人力安排
| 目标 | 内容 | 时间安排 | 负责人 |
| --- | --- | --- | --- |
| {目标} | {任务内容} | {起止时间/deadline} | {负责人} |
# 六、测试方案
| 测试类型 | 测试重点 | 覆盖范围 | 责任人 |
| --- | --- | --- | --- |
| 单元测试 | {外部可观察行为,不测实现细节} | {模块/能力} | {负责人} |
| 集成/联调测试 | {跨系统链路} | {系统/接口} | {负责人} |
| 回归测试 | {历史逻辑兼容} | {业务范围} | {负责人} |
| 异常测试 | {失败、重试、并发、幂等} | {场景} | {负责人} |
# 七、上线方案
{说明发布顺序、配置变更、数据库变更、数据初始化、灰度策略、回滚策略、发布时间点。}
## 上线ToDo
- [ ] {发布前检查项}
- [ ] {配置/脚本/数据准备}
- [ ] {联调或验收确认}
## 上线观察项
| 观察项 | 指标/日志 | 预期 | 异常处理 |
| --- | --- | --- | --- |
| {观察项} | {metric/log/dashboard} | {预期范围} | {处理方式} |
# 八、运维方案
{说明监控、告警、日志、巡检、手工补偿、数据修复、应急联系人。}
# 九、问题记录
| 问题 | 当前判断/推荐答案 | 状态 | 负责人 |
| --- | --- | --- | --- |
| {问题} | {推荐答案或假设} | 待确认/已确认 | {负责人} |
方案输出前自检
输出最终方案前,先按下面清单自检并修正文档。除非用户要求,不需要把自检过程完整输出。
- 是否存在未说明的假设。
- 是否说明了推荐方案类型,以及为什么没有升级或降级。
- 是否有超出需求范围的设计。
- 是否每个新增表、接口、任务、配置都有必要性;L0/L1 是否避免了不必要的章节展开。
- 是否每个改动仓库都有验证方式;如果涉及跨仓库,是否已经升级到 L2/L3 或说明轻量输出原因。
- L2/L3 是否区分了主方案、备选方案和不采用方案;L0/L1 是否说明了当前执行方案为什么足够。
- 是否把阻塞问题放到了 问题记录。
- 是否存在无法追溯到需求点的顺手重构或无关改动。
- 是否说明了为什么当前方案是最小可落地方案。
写作规则
- 默认使用中文,除非项目约定明确要求其他语言。
- 初始
v0.1 修改历史默认使用当前日期,除非用户提供其他日期。
- L0/L1 输出必须把主要篇幅放在 方案细节;背景、范围、问题记录、上线说明只服务于交付,不扩展成管理型章节。
- 优先写具体判断,不写泛泛而谈。把“需要考虑幂等”替换为具体的幂等 key、去重表、唯一索引或重试规则。
- 涉及库表修改时,必须把 SQL schema 作为重点内容列出,包括 DDL、字段类型、默认值、索引、唯一约束、初始化 SQL、迁移/回填 SQL 和回滚 SQL。
- 重点、难点、复杂状态流转、并发控制、补偿逻辑必须用简短伪代码表达核心流程;未命中这些风险时不要为 L0/L1 硬写伪代码。伪代码必须符合 Java 8 风格:使用类/方法结构、显式类型、
Optional、try/catch/finally、枚举或 DTO 命名;不要使用 function xxx:、隐式变量、Python/JavaScript 风格语法。
- 所有方案都必须先扫描分布式和高并发风险,包括多实例并发、重复请求、重复消息、分布式事务或最终一致性、缓存一致性、热点数据、限流降级和故障恢复;只有命中风险时才需要在正文展开。
- 不编造事实。未知信息要写成假设或待确认问题。
- 当上下文已经足够时,也不要立刻输出方案正文。先用几条要点复述当前已知信息、推荐方案类型和关键假设,等用户确认、修正或要求继续后,再起草对应类型文档。
- 方案设计默认采用最小可落地方案。不要为了未来可能性增加配置、抽象、状态机、任务系统或表结构;确实需要复杂方案时,写清简单方案为什么不够。
- 每个改动点都要能追溯到需求点、验收口径或风险控制目标。不要把顺手重构、无关模块调整或格式清理并入本期方案。
- 最终方案里不要写具体实现文件路径,除非团队评审确实需要。描述模块和接口即可,文件路径很容易过期。
- 涉及多个工程、多个服务或多个代码仓库时,优先升级到 L2/L3,并填写 代码仓库改动清单,明确每个仓库改什么、依赖哪个仓库、按什么顺序发布、怎么验证;不要只写“后端改造”“前端适配”这类泛化描述。
- 当图能提升理解时使用图。L2/L3 的流程设计必须先给高维度整体架构图,再给核心业务流程;L0/L1 仅在文字步骤不够清楚时补图。草稿文本优先使用 Mermaid:
- 系统边界、上下游、存储、缓存、消息和外部依赖用
flowchart。
- 跨系统时序调用用
sequenceDiagram。
- 分支较多的业务逻辑用
flowchart。
- 数据关系用
erDiagram 或表格。
- 文档要信息密度高但可扫描。好的方案应该能让评审者按章节快速定位问题。
- 测试方案关注外部可观察行为和契约,不测试私有实现细节。
- 如果 L2/L3 方案需要产品、PM、前端、客户端、服务端、测试、数据或运维参与,必须在 五、人力安排 里体现责任分工;L0/L1 可在改动清单或上线方案里标明负责人。
交互方式
当用户从模糊需求开始时,按下面方式开场:
我理解本次是要为{需求/项目}产出一份可评审的技术方案,重点解决{核心问题}。为了让方案贴近真实代码和评审口径,请先把 PRD/需求文档、接口文档或代码仓库地址发我;如果暂时没有,我会基于当前上下文先推进。
我会先判断本次适合 L0 交付执行单、L1 轻量技术方案、L2 标准技术方案还是 L3 深度评审方案;默认从轻量输出开始,命中风险触发条件再升级。
我会先把待确认点分成 P0/P1/P2:
- P0 阻塞决策:{1-3 个必须确认的问题,每个给推荐答案}
- P1 重要假设:{最多 5-8 个可批量确认的问题,每个给推荐答案}
- P2 非阻塞信息:{直接采用的默认假设}
你可以回复“全部按推荐继续”,也可以只改其中几项;未修改项我会按推荐答案进入初稿,并放入“问题记录”。
当上下文已经足够时,先做信息回放,不要立刻起草方案正文:
我先复述一下当前已知信息,避免直接起草时理解偏差:
- 需求目标:{一句话说明要解决的问题}
- 本期成功标准:{业务/技术/上线验收口径}
- 推荐方案类型:{L0/L1/L2/L3,说明判断依据和升级触发检查结果}
- 已知材料:{PRD/接口文档/代码仓库/现有说明}
- 涉及系统/仓库:{系统、模块、代码仓库清单}
- 核心链路:{入口、核心处理、数据写入、下游依赖}
- 已确认事实:{来自材料或用户明确确认的信息}
- 推荐假设:{可以先按推荐推进的信息}
- 待确认问题:{真正需要用户确认的阻塞点}
请先确认这些理解是否准确;确认后我再按推荐方案类型起草文档,未确认的信息会放进“问题记录”。
当用户要求发布到飞书或其他文档系统时,先产出 Markdown 方案,再使用对应文档工具创建或更新在线文档。