Files

162 lines
8.2 KiB
Markdown
Raw Permalink Normal View History

# 编码规则(Coding Rules)
> 每次写代码前先读完本文。
> 与技术细节冲突时,以[技术栈](03-tech-stack.md) / [架构设计](04-architecture.md) 的事实为准;
> 与「该不该做」冲突时,以[需求](02-requirements.md)为准。
## 0. 黄金法则
1. **不臆造**:数据字段、接口、页面判据、依赖,不确定就查证或询问。
2. **守范围**:只做当前任务要求的事,不顺手加后续功能。
3. **照架构**:使用既定技术栈和模块边界,不擅自引入新框架。
4. **小步改**:一次只解决一个问题,不夹带无关重构。
5. **可验证**:改完必须能构建、能测试、对得上验收标准。
## 1. 本项目特有的红线
违反以下任意一条的改动一律拒绝,无论出于什么理由。
### 1.1 资金与不可逆动作
- **绝不**编写点击支付、免密支付、先用后付或任何扣款控件的代码。
- **绝不**在订单确认页上点击除「提交订单」与返回外的任何控件。
- 「提交订单」只在**四个前置条件**同时满足时点击一次:授权未消费且服务端提交围栏已
明确建立、闸门二通过、闸门三通过、控件唯一。
- 围栏接口超时、冲突、网络失败或响应不明时不得点击;围栏建立后不得释放授权、重新领取
或再次点击,只能恢复同一 `order_submission` 并调和结果。
- 点击后无论超时、跳外部支付还是遇安全校验,**一律转人工、禁止重试**,授权立即标记
已消费。
- **第一趟试选的代码路径不得引用 `go_to_order_confirm()` 与 `submit_order()`**,
必须有测试证明不可达。
### 1.2 匹配纪律
- 规格按维度**等值**匹配,必须防前缀碰撞(`红`/`粉红`、`1`/`10`)。
- 找不到精确值就停止转人工,**绝不选相近项、绝不猜测**。
- 「提交订单」控件必须文本精确相等且可点击祖先唯一,否则停止。
- 数量设置后必须读回复核精确等于要求值。
### 1.3 价格读取边界
- 价格**只在规格面板(闸门一 / 二)和订单确认页(闸门三)读**。
- **不从商品详情页正文、搜索结果卡片或任何其他位置读价格。**
- 读不到就转人工,**不用别处的数字凑合**。
- 第二趟重读的单价**必须与授权锁定价一致**,不一致即停——人确认的是那个价格,
不是那个商品。
- 图片搜索(V2)的唯一产出是 `goods_id`,同样不读价。
### 1.4 安全与隐私
- 检测到验证码、风控、人脸、短信校验时立即停止,**不尝试绕过**。
- 检测到外部支付交接立即停止,**不读取、不保存、不输入任何凭据**。
- 只读非敏感摘要,**不提取收货地址原文、手机号、支付凭据**。
- 上传服务端的证据必须先脱敏。
### 1.5 页面判据
- **不得从前序项目、旧文档或推理直接写页面判据。** 必须有本项目的真机取证。
- 每条判据必须记录取证时的**拼多多 App 版本**。
- 判据失效时先重新取证,不要靠加兜底分支硬扛。
> 这些红线不是建议。[`04-architecture.md`](04-architecture.md) 第四节列出的每一条都必须有
> 单元测试证明。确需变更时先改架构文档并说明理由,再动代码。
## 2. 动手前
- 按链路确认:`vision` → `requirements` → `tech-stack` → `architecture` → `tasks`。
- 找到本任务对应的验收标准,写之前就知道「怎么算做对」。
- 涉及界面时先读 `07-user-stories.md`、`08-interaction-checklist.md`、`routes.md`。
- 涉及真机页面判据时,**先取证,把证据路径和 App 版本写进任务文件**,再写代码。
- 复杂任务先把方案、不可变约束、`write_paths` 和验证层级写入任务文件。
- 先找现有函数、组件、工具和测试,复用优先。
- 需求含糊或改动会偏离架构,先问。
## 3. 事实来源纪律
- 只相信本目录文档、数据库迁移、`admin/internal/domain/`、真机取证产物和当前代码。
- **前序项目 `cmroubao` / `cmpdd` 是设计依据,不是事实来源。** 引用其结论必须重新验证。
- 不从备份、草稿、旧导出文件里推断当前事实。
- 不虚构字段、接口、状态码、配置项。
- 数据结构变化必须同步更新 `04-architecture.md`、`api.md` 和相关任务。
## 4. 范围纪律
- MVP 只做 `02-requirements.md` 中列为 P0 的功能。
- V2 / V3 只记录,不实现。**图搜、Excel、ERP、订单自动核对、AI 辅助全部不在 MVP。**
- 需求明确排除的非目标不得实现。
- 不为「将来可能用到」提前抽象。
- **Phase 1 真机结论出来之前不写 Phase 2 的页面**——确认页显示什么,取决于真机上
能读到什么,尤其是规格面板上的单价。
## 5. 架构纪律
- 技术栈以 `03-tech-stack.md` 为准;新增依赖前先说明用途、替代方案和维护成本。
- 双端职责以 `04-architecture.md` 第二节为准:**采购工具不持有业务权威**,不自行决定
买哪个、不自行放宽金额上限。
- HTTP 契约以 `api.md` 为准,**这是双端之间的唯一权威**;契约改动必跑完整门禁。
- `client/` 中的采购工具执行器只依赖 `TaskSource` / `ResultSink` 抽象,不认识来源。
- 两端校验结果不一致时**转人工**,不取任一方结论。
## 6. 代码规范
- 标识符使用英文。
- UI 文案、注释、文档使用中文,与现状保持一致。
- 金额一律用十进制字符串,**不用浮点数**。
- 错误必须处理,不吞错。真机自动化的失败必须可区分原因,不返回笼统的「失败」。
- 注释解释「为什么」,不复述「做了什么」。**护栏必须连同理由一起注释**,否则后人会
当它是碍事的代码删掉。
- 遵守项目已有格式化工具,不手工制造风格分裂。
## 7. 测试与验证
任务所有者必须亲自完成最终复核:
1. `git status --short` 核对实际修改集合,审阅 `git diff` 和 `git diff --cached`,对照
任务的 `write_paths`、不可变约束和验收要点。
2. `git diff --check` 检查空白与意外行尾变化。
3. 按 [`03-tech-stack.md`](03-tech-stack.md) 验证矩阵独立重跑任务相关验证;命中完整门禁
触发条件时再跑完整门禁。
4. 执行者、子 agent、工具或 CI 的摘要只能作为线索,**不能替代任务所有者看到的差异和
可复现验证结果**。
5. 需要真机验收但尚未完成时,记录等待事项并保持 `DOING` 或 `BLOCKED`,**不得标 `DONE`**。
完成前至少检查:
- [ ] 构建通过。
- [ ] 相关测试通过。
- [ ] 已按验证矩阵判断是否需要完整门禁,并完成所有已触发层级。
- [ ] 对得上需求验收标准。
- [ ] 没有夹带无关改动。
- [ ] **第 1 节的红线一条都没被放宽**;涉及的红线有测试覆盖。
- [ ] `git status`、未暂存 / 已暂存 diff 与任务 `write_paths` 一致,无意外行尾变化。
- [ ] 涉及真机的判据已记录设备型号、Android 版本、**拼多多 App 版本**和证据路径。
- [ ] 涉及文档事实变化时,文档已同步。
- [ ] 涉及界面时,已验证关联 US / IX 的正常、加载、异常、权限和无障碍要求。
- [ ] 已在任务文件的 `## 执行记录` 记录跑过的命令和结果。
- [ ] 回复里如实说明跑了什么命令、结果如何。
```bash
# 采购服务(admin/)
go test ./...
go vet ./...
# 采购工具(client/)
python -m unittest discover -s tests -t .
python -m compileall -q src tests
```
## 8. 绝不
- 绝不把密钥、token、密码写进代码或文档样例的真实值里。
- 绝不为了让测试通过而删除断言、降低验收标准。
- 绝不为了让流程跑通而放宽第 1 节的任何红线。
- 绝不擅自删除用户已有文件或重置工作区。
- 绝不在没说明的情况下改公共接口、迁移数据结构或升级依赖。
- 绝不把「代码写完了」「看起来能跑」当作 `DONE` 的证据。
## 9. 拿不准就问
问题要具体:说明卡在哪里、有哪些选项、倾向哪个以及原因。
涉及资金边界、平台风控或真机不可逆动作的疑问,**一律先问,不要先试**。