diff --git a/client/electron/test/harmony-push.test.mjs b/client/electron/test/harmony-push.test.mjs index 0ad3381..492cb00 100644 --- a/client/electron/test/harmony-push.test.mjs +++ b/client/electron/test/harmony-push.test.mjs @@ -5,7 +5,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url'; import { code } from './lib/read.mjs'; /* -推送客户端契约层(pi 2026-09-14)。四条不变量里**三条是纯逻辑**,所以不需要设备就能钉: +推送客户端契约层(pi 邮件 `1f9ff3b4`)。四条不变量里**三条是纯逻辑**,所以不需要设备就能钉: 静默失败、`enabled:false` 是正常态、按 `provider+tail` 比、通知按 `mail_id` 去重。 */ @@ -73,7 +73,7 @@ test('★ 契约层必须保持"无 @ohos 依赖"(否则这些判据跑不了 }); /* -★ 线上形状(pi 2026-09-14,从 handler/push.go 读的):请求体字段名必须逐字一致 +★ 线上形状(pi 邮件 `004983bb`,从 handler/push.go 读的):请求体字段名必须逐字一致 (**未知字段直接 400**,不是静默忽略),provider 只做形状校验、**没有白名单**, 错误是 `{"error"}` 不是 `{"message"}`。这些都能在纯逻辑侧判。 */ diff --git a/client/harmony/entry/src/main/ets/model/Calendar.ts b/client/harmony/entry/src/main/ets/model/Calendar.ts index 5cbbefa..f76e6e2 100644 --- a/client/harmony/entry/src/main/ets/model/Calendar.ts +++ b/client/harmony/entry/src/main/ets/model/Calendar.ts @@ -91,7 +91,7 @@ export function monthGrid(year: number, month: number, weekStart: number, today? } /** - * 星期表头 —— **必须与 `leadingBlanks` 来自同一个 `startOfWeek`**(pi 2026-09-14)。 + * 星期表头 —— **必须与 `leadingBlanks` 来自同一个 `startOfWeek`**(pi 邮件 `f60521de`)。 * * 整月网格有两个地方依赖"周从哪天开始":**空格数**与**表头第一格**。 * 如果表头在页面里硬编码成 `['日','一',…]` 或另算一次,那就是**第二个分叉点**: @@ -121,7 +121,7 @@ function pad2(n: number): string { } /** - * "今天"的**调用侧**(pi 2026-09-14 §2,趁骨架之前定下来)。 + * "今天"的**调用侧**(pi 邮件 `f60521de` §2,趁骨架之前定下来)。 * * 为什么单独抽出来:`today` 入参化之后,`Calendar.ts` 是纯粹的, * **唯一还能错的地方搬到了调用侧** —— 而它恰好是纯逻辑判据够不着的那一格。 diff --git a/client/harmony/entry/src/main/ets/model/PushContract.ts b/client/harmony/entry/src/main/ets/model/PushContract.ts index 04520c5..db01d14 100644 --- a/client/harmony/entry/src/main/ets/model/PushContract.ts +++ b/client/harmony/entry/src/main/ets/model/PushContract.ts @@ -2,12 +2,12 @@ * 推送客户端**契约层**(纯逻辑,无 `@ohos`)—— 与 `Wallpaper.ts`/`Calendar.ts` 同模式, * 所以判据能用 node 直接跑,不需要设备。 * - * 契约来源:pi 2026-09-14(服务端半边已实现,客户端这半边归我)。四条不变量: + * 契约来源:pi 邮件 `1f9ff3b4`(服务端半边已实现,客户端这半边归我)。四条不变量: * 1. **推送是可选通道,不是依赖**:任何一步失败都**静默跳过**(不报错、不阻塞、不弹失败提示); * 2. **SSE 仍是主通道**,推送只是"App 不在前台时的第二通道"; * 3. **`enabled:false` 是正常态**(自部署常态、没配凭证)⇒ 不重试、不提示失败; * 4. **通知 `data` 按 `mail_id` 去重** —— 服务端推送是**至多一次、无幂等键** - * (`internal/push` 没有队列/重试/去重表),所以重复保护只能落在客户端(pi 2026-09-14 §三②)。 + * (`internal/push` 没有队列/重试/去重表),所以重复保护只能落在客户端(同一封 §三②)。 */ export const PROVIDER_HMS: string = 'hms'; @@ -151,7 +151,7 @@ export class NotificationLedger { } // ───────────────────────────────────────────────────────────────────────────── -// 线上形状(pi 2026-09-14,从 handler/push.go + cmd/server/main.go 读的,不是猜的) +// 线上形状(pi 邮件 `004983bb`,从 handler/push.go + cmd/server/main.go 读的,不是猜的) // // 三条端点(POST / DELETE / GET)**都挂在 `/me/*` 组下**,同一套 Bearer 鉴权; // **DELETE 也是 JSON body**(不是 query、不是 path 参数); diff --git a/docs/ALIGN-REFS.json b/docs/ALIGN-REFS.json index af9b64a..df479a1 100644 --- a/docs/ALIGN-REFS.json +++ b/docs/ALIGN-REFS.json @@ -1,6 +1,6 @@ { "_": [ - "对齐参照物的**版本登记**(pi 2026-09-14:对齐本身要有版本号)。", + "对齐参照物的**版本登记**(pi 邮件 `6e14b410`:对齐本身要有版本号)。", "为什么需要:WebUI 那边同一个文件可能同时在动(gui-lab 有未合入的改动),", "照工作副本画完之后,参照物一变,这一版就成了「照一份没人认领的草案对齐的」,", "而且**没人能判它对不对 —— 因为参照物没有版本号**。", @@ -24,7 +24,7 @@ "judgement": "**按语义对齐,不按数值对齐**:两端都表示「卡片圆角」,但取值来源不同(WebUI 自定 rem,鸿蒙用**系统**资源)。数值是否一致属于形态差异,等设备上并排看再定 —— 见 docs/DEBTS.json 的 radius-card-numeric-divergence。**鸿蒙侧不许把 0.875rem/14 抄成裸数字**(那正是当初 14 处 Material 调色板被清零的同一形态,量纲从颜色换成长度)。", "webuiValue": "0.875rem = 14px", "harmonyValue": "**本工作区读不到数值**:`toolchains/id_defined.json` 里该条目只有 name/type(没有 value),SDK 的 `ets-loader/sysResource.js` 只有**资源 ID 125829709**(btn 是 125829702)—— 实体值在**系统资源包**里(编译进 resources.index / 随设备)", - "policy": "**语义以 WebUI 为准;数值按平台各自成立**(两端数值来源不同:WebUI 自定 rem,鸿蒙用系统档)。**不相等是对的** —— 不是\"数值待补齐\"。**追认**:pi 以 WebUI 侧负责人身份追认(2026-09-14),骨架按此执行,不必再等追认。保留的是**验证**:真机并排若看出感知不一致 ⇒ 反向并**登记成决定**(那是等设备的 env 项,与策略无关,别混成一笔)。", + "policy": "**语义以 WebUI 为准;数值按平台各自成立**(两端数值来源不同:WebUI 自定 rem,鸿蒙用系统档)。**不相等是对的** —— 不是\"数值待补齐\"。**追认**:pi 以 WebUI 侧负责人身份追认(pi 邮件 `90372ca1`),骨架按此执行,不必再等追认。保留的是**验证**:真机并排若看出感知不一致 ⇒ 反向并**登记成决定**(那是等设备的 env 项,与策略无关,别混成一笔)。", "unitNote": "**px 与 vp 之间没有\"差值\"**:`px` 是桌面 CSS 像素,`vp` 是设备密度无关单位,两者只能通过屏幕密度 + 观看距离换算 —— 所以这里不是\"差值暂时未知\",而是**\"差值\"在这个比较里没有定义**。**停止追这个数**:把它当待补的数,会诱使下一个人去追一个改变不了结论的数字,最后以\"抄一个 vp 进去\"收场,而那正是这笔账要防的事。" }, { @@ -34,7 +34,7 @@ "judgement": "同「卡片圆角」:语义对齐、数值来源不同。", "webuiValue": "0.5rem = 8px", "harmonyValue": "同卡片圆角:本工作区只能读到资源 ID 125829702,读不到 vp 值", - "policy": "**语义以 WebUI 为准;数值按平台各自成立**(两端数值来源不同:WebUI 自定 rem,鸿蒙用系统档)。**不相等是对的** —— 不是\"数值待补齐\"。**追认**:pi 以 WebUI 侧负责人身份追认(2026-09-14),骨架按此执行,不必再等追认。保留的是**验证**:真机并排若看出感知不一致 ⇒ 反向并**登记成决定**(那是等设备的 env 项,与策略无关,别混成一笔)。", + "policy": "**语义以 WebUI 为准;数值按平台各自成立**(两端数值来源不同:WebUI 自定 rem,鸿蒙用系统档)。**不相等是对的** —— 不是\"数值待补齐\"。**追认**:pi 以 WebUI 侧负责人身份追认(pi 邮件 `90372ca1`),骨架按此执行,不必再等追认。保留的是**验证**:真机并排若看出感知不一致 ⇒ 反向并**登记成决定**(那是等设备的 env 项,与策略无关,别混成一笔)。", "unitNote": "**px 与 vp 之间没有\"差值\"**:`px` 是桌面 CSS 像素,`vp` 是设备密度无关单位,两者只能通过屏幕密度 + 观看距离换算 —— 所以这里不是\"差值暂时未知\",而是**\"差值\"在这个比较里没有定义**。**停止追这个数**:把它当待补的数,会诱使下一个人去追一个改变不了结论的数字,最后以\"抄一个 vp 进去\"收场,而那正是这笔账要防的事。" } ], @@ -42,6 +42,6 @@ "file": "client/harmony/entry/src/main/resources/rawfile/agconnect-services.json", "packageName": "com.jianf.agentmail", "appId": "6917616450599975320", - "note": "AGC 下发的配置(加密信封格式,非明文密钥)。**包名必须与 AppScope/app.json5 的 bundleName 完全一致** —— 不一致时 Push Kit 推不到设备,这不是风格问题而是功能性约束(pi 2026-09-14 实测:AGC 拒绝 `com.agentmail.harmony`,因为 `harmony` 是包名保留字;用户定 `com.jianf.agentmail`)。" + "note": "AGC 下发的配置(加密信封格式,非明文密钥)。**包名必须与 AppScope/app.json5 的 bundleName 完全一致** —— 不一致时 Push Kit 推不到设备,这不是风格问题而是功能性约束(pi 邮件 `1f9ff3b4` 实测:AGC 拒绝 `com.agentmail.harmony`,因为 `harmony` 是包名保留字;用户定 `com.jianf.agentmail`)。" } }