From f9351e8b61cf3f436d54dacc9d4b4fcd2dd81aaf Mon Sep 17 00:00:00 2001 From: Nixevol Date: Wed, 30 Sep 2026 06:01:08 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=AE=B0=E5=BD=95=20T0.2=20=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE=E5=8C=85=E5=AE=9E=E7=8E=B0=E5=81=8F=E5=B7=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/DEVIATIONS.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/DEVIATIONS.md b/docs/DEVIATIONS.md index 3e704f5..7c6f149 100644 --- a/docs/DEVIATIONS.md +++ b/docs/DEVIATIONS.md @@ -43,6 +43,36 @@ - 备选方案:docker 目标仅 echo 提示。 - 影响:镜像发布流程仍由 Q4 定稿。 +### T0.2 2026-09-30 + +1. **请求指纹规范化格式** + - 原条款: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 / 服务端必须共用同一布局,否则防重失效。 + +2. **指纹使用文档默认值后的有效字段** + - 原条款:指纹字段列表含 `receipt`、`offline.*`,未说明缺省如何表示。 + - 实际做法:`receipt` 缺省按 true;`offline.keep` 缺省 false;`keep` 为 true 且未给 `ttl_seconds` 时按 86400;`keep` 为 false 时 ttl 记 0;`content_type` 按 enc 补默认。 + - 原因:重试时省略与显式默认应视为同一请求。 + - 备选方案:按原始 JSON 有无字段区分,省略与显式默认算冲突。 + - 影响:SDK 省略默认字段时防重仍命中。 + +3. **JSON Encoder 去掉尾部换行** + - 原条款:用 `json.Encoder` 且 `SetEscapeHTML(false)`。 + - 实际做法:Encode 后去掉 `Encoder.Encode` 追加的 `\n`,整帧字节数不含该换行。 + - 原因:MQTT 一发布一帧,示例 JSON 无尾换行;保留换行会抬高帧长并与本地 `frame_too_large` 判断不一致。 + - 备选方案:保留换行并在 DEVELOPMENT 写明。 + - 影响:线上帧比「裸 Encoder.Encode」少 1 字节。 + +4. **协议包校验范围** + - 原条款:T0.2 要求编号规则、正文/meta 大小、`send_at_ms`/`delay_ms` 互斥、登录密码不以 `nst_` 开头。 + - 实际做法:上述必做之外,顺带校验各帧 `v`/`type`/`rid`、目标 kind、分页 limit、致命 reason 枚举等结构字段;业务错误(目标不存在、配额等)不在本包判定。 + - 原因:无结构校验则编解码测试无法覆盖「合法帧」边界。 + - 备选方案:协议包只做编解码,校验留给各 app 模块。 + - 影响:服务端应复用本包 `Validate`,避免重复规则。 + ## 平台 P 暂无。