5.4 KiB
5.4 KiB
实现与文档的偏差
开发中凡是实现和 PRD.md、DEVELOPMENT.md 不一致的地方,以及文档没写清、开发中自己拿主意的地方,都记在这里,交给负责人事后审阅。开发全程自动推进,记下来就继续,不等审阅。
每条写清:日期、原条款(文档和小节)、实际做法、原因、备选方案、影响。各线只写自己那一节,避免多条线同时改同一段。
总控 L
T0.1 2026-09-30
-
前端嵌入方式
- 原条款:DEVELOPMENT 第 3 节
web/embed.go用//go:embed all:dist;TASKS T0.1;.gitignore忽略web/dist。 - 实际做法:默认构建用
-tags以外的embed_stub.go嵌入web/stub/;task build加-tags embeddist嵌入真实web/dist。 - 原因:
web/dist不进仓库,且要求没有前端产物时也能go build。 - 备选方案:提交最小
dist;或构建前脚本生成占位目录。 - 影响:裸
go build不含真实前端;正式产物必须走task build。
- 原条款:DEVELOPMENT 第 3 节
-
listen.addr 写入时机
- 原条款:DEVELOPMENT 4.1「端口写 0 时」写
<data_dir>/listen.addr。 - 实际做法:只要
serve启动成功就写入实际监听地址。 - 原因:测试启动器统一读取该文件更简单,固定端口场景也无害。
- 备选方案:仅当配置端口为 0 时写入。
- 影响:多一个小文件;行为超集,兼容文档要求。
- 原条款:DEVELOPMENT 4.1「端口写 0 时」写
-
迁移占位
- 原条款:T0.3 才写完整表与
VACUUM INTO备份;T0.1 允许空执行器加空 0001。 - 实际做法:
internal/store.Migrate建schema_migrations并应用0001_init.sql(内容为SELECT 1;);不做迁移前备份。 - 原因:保证 serve 可跑通迁移路径,表结构留给 T0.3。
- 备选方案:完全空文件 + 只记版本。
- 影响:T0.3 需替换 0001 正文并补备份逻辑;已应用的占位版本号仍为 1。
- 原条款:T0.3 才写完整表与
-
Taskfile 引入 taskfiles
- 原条款:TASKS T0.1 / 4.2 引入
taskfiles/*.yml。 - 实际做法:
includes: '*': taskfile: taskfiles/*.yml, optional: true,并放_init.yml占位。 - 原因:空目录 glob 可能失败;各线稍后加自己的 yml。
- 备选方案:主文件逐条 optional include 各线文件名。
- 影响:无。
- 原条款:TASKS T0.1 / 4.2 引入
-
deploy/Dockerfile
- 原条款:完整多架构镜像属 Q4;T0.1 需要
task docker目标。 - 实际做法:提供单架构多阶段 Dockerfile 骨架,供
task docker使用;T0.1 验证另用官方golang镜像跑task check。 - 原因:让 docker 目标可执行,又不抢 Q4 范围。
- 备选方案:docker 目标仅 echo 提示。
- 影响:镜像发布流程仍由 Q4 定稿。
- 原条款:完整多架构镜像属 Q4;T0.1 需要
T0.2 2026-09-30
-
请求指纹规范化格式
- 原条款:DEVELOPMENT 7.3「下列字段规范化后的 SHA-256」,未规定字节布局。
- 实际做法:对
to.kind、to.id、body.enc、有效content_type、解码后正文、meta规范 JSON、send_at_ms、delay_ms、有效offline.keep/ttl_seconds、有效receipt做长度前缀(或有无标记)串联后算 SHA-256,输出小写十六进制;meta用encoding/json对map键排序序列化;不含talk_password、rid。 - 原因:文档未给规范格式,需固定、与键顺序无关、含可选字段区分。
- 备选方案:整段规范 JSON 对象再哈希。
- 影响:各语言 SDK / 服务端必须共用同一布局,否则防重失效。
-
指纹使用文档默认值后的有效字段
- 原条款:指纹字段列表含
receipt、offline.*,未说明缺省如何表示。 - 实际做法:
receipt缺省按 true;offline.keep缺省 false;keep为 true 且未给ttl_seconds时按 86400;keep为 false 时 ttl 记 0;content_type按 enc 补默认。 - 原因:重试时省略与显式默认应视为同一请求。
- 备选方案:按原始 JSON 有无字段区分,省略与显式默认算冲突。
- 影响:SDK 省略默认字段时防重仍命中。
- 原条款:指纹字段列表含
-
JSON Encoder 去掉尾部换行
- 原条款:用
json.Encoder且SetEscapeHTML(false)。 - 实际做法:Encode 后去掉
Encoder.Encode追加的\n,整帧字节数不含该换行。 - 原因:MQTT 一发布一帧,示例 JSON 无尾换行;保留换行会抬高帧长并与本地
frame_too_large判断不一致。 - 备选方案:保留换行并在 DEVELOPMENT 写明。
- 影响:线上帧比「裸 Encoder.Encode」少 1 字节。
- 原条款:用
-
协议包校验范围
- 原条款:T0.2 要求编号规则、正文/meta 大小、
send_at_ms/delay_ms互斥、登录密码不以nst_开头。 - 实际做法:上述必做之外,顺带校验各帧
v/type/rid、目标 kind、分页 limit、致命 reason 枚举等结构字段;业务错误(目标不存在、配额等)不在本包判定。 - 原因:无结构校验则编解码测试无法覆盖「合法帧」边界。
- 备选方案:协议包只做编解码,校验留给各 app 模块。
- 影响:服务端应复用本包
Validate,避免重复规则。
- 原条款:T0.2 要求编号规则、正文/meta 大小、
平台 P
暂无。
连接 N
暂无。
消息 M
暂无。
身份 I
暂无。
后台接口 A
暂无。
后台网页 W
暂无。
SDK 一 S1
暂无。
SDK 二 S2
暂无。
测试交付 Q
暂无。