From f41da318c495c9e2519194361a5eafd5d6de921b Mon Sep 17 00:00:00 2001 From: wangzhizhou <824219521@qq.com> Date: Mon, 9 Nov 2026 11:45:31 +0800 Subject: [PATCH] docs: write the 1.2.0 release notes and reconcile handoff and roadmap Records the verified candidate identity, the behaviour change, the learning area and practice work, the keymap module, the engineering items and the known limits, and replaces the batch table with the release checklist. Signed-off-by: wangzhizhou <824219521@qq.com> --- HANDOFF.md | 33 ++++++++--------- ROADMAP.md | 6 ++- docs/README.md | 2 +- docs/releases/1.2.0.md | 84 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 20 deletions(-) create mode 100644 docs/releases/1.2.0.md diff --git a/HANDOFF.md b/HANDOFF.md index 833b32cb..b44f0354 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -2,16 +2,17 @@ ## 0. 元信息 -- 更新:2026-11-06 / pi(**air 本机**)。阶段:**1.1.0 已发布并上线**(tag `v1.1.0` → `393318c`,站点 `v1.1.0 · 构建 38`,air 与 pro 同包 1.1.0/38);下一站 **1.2.0**(dev 已含二级简码 598 条,Cargo 1.2.0 / build 39)。 -- 分支:`dev` @ 本轮提交;`main` = `730d894`(PR #226 已合并),开放 PR **0 个**。 -- 版本:`Cargo.toml` = **1.2.0**、`packaging/build-number` = **39**;最新 tag **`v1.1.0`**(Release + 站点已上线)。 -- 最近验证:`make verify` PASS(206 产物零网络符号)、`make macos-offline-tests` **61 文件 / 320 例 PASS**。1.1.0 发布身份:ZIP `448d3170fdcb…`、源码 `e0b9536b2994…`、宿主执行 `d3c5a2efd1ae…`。 +- 更新:2026-11-09 / pi(**air 本机**)。阶段:**1.2.0 候选已通过用户验收,待 tag/Release/站点**(候选 `31fdbcd`、执行 `ef25e92b…`;1.1.0 仍是线上版本)。 +- 分支:`dev` = `main` = `31fdbcd`(1.2.0 候选提交);开放 PR **0 个**。 +- 版本:`Cargo.toml` = **1.2.0**、`packaging/build-number` = **39**;最新 tag 仍是 **`v1.1.0`**(线上版本)。 +- 最近验证:`make verify` PASS(232 产物零网络符号)、`make macos-offline-tests` **62 文件 / 328 例 PASS**、`modules/keymap/tests/test-key-roots.py` **8 例 PASS**。 +- 1.2.0 候选身份:提交 `31fdbcd`、ZIP `64eeb90f…`、源码 `3dc6f717…`、宿主执行 `ef25e92ba085ea3f556e12d477fb1b6a6cd08ebbc3b74897fdb7b2d9f6eead64`(`docs/releases/1.2.0.md`)。 ## 1. 设备与数据 | 设备 | 已装包与执行 SHA | 数据 / 输入源 | 恢复点 | |---|---|---|---| -| **air**(arm64 / macOS 27.2 / Xcode 27,用户 `joker`;pi 跑在 Background 会话,驱动不了 GUI 点击) | **1.2.0 / build 39(B4+B5 候选,2026-11-07 装机)**,宿主执行 `28e24d26…`;输入源 `Lampyris.default` 在用;`show_wubi_learning=false` | config `5d4271fb…`(`full_width=half` 已是 ADR-305 枚举形态)、词库 1139 行(用户在用,行数会变) | `uninstalled/`、`updates/` 可回滚到 1.0.0…1.0.2 | +| **air**(arm64 / macOS 27.2 / Xcode 27,用户 `joker`;pi 跑在 Background 会话,驱动不了 GUI 点击) | **1.2.0 / build 39(候选 `31fdbcd`,2026-11-09 装机)**,宿主执行 `ef25e92b…`;输入源 `Lampyris.default` 已启用(覆盖安装后常需手动再选一次,见 `docs/故障恢复.md` §4.2/§4.3) | config 与词库沿用(练习进度 `practice.tsv` 新增) | `uninstalled/`、`updates/` 可回滚 | | **pro**(Intel / macOS 13.7.8,用户 `bot`,SSH 别名 `pro`) | **1.1.0 / build 38**,宿主执行 `d3c5a2ef…`(2026-11-06 经更新程序升级,旧版备份在 `updates/upgrade-2026-11-06T14-27-15Z/backup/`) | config 与词库保持 1.0.0 基线(`show_wubi_learning=true` 是用户有意设置) | 升级前有 `uninstalled/bundle.*` | ## 2. 本轮完成 @@ -52,7 +53,8 @@ ## 3. 未决 -- **1.2.0 未定候选**:dev 已含二级简码 598 条(报告 238),但**还没做过装机验收**;发版前要定验收范围、跑 `FAST=1 make macos-auto-acceptance` 与人工走查,tag 需单独授权。 +- **1.2.0 已验收待发布**:候选 `31fdbcd`(执行 `ef25e92b…`)经用户 2026-11-09 人工验收通过(四题型、四位输入格、键位点亮/描边/位次、口诀、工具栏、亮暗外观);发版材料 `docs/releases/1.2.0.md`。 + **发布动作(tag/Release/Pages/pro 升级)需要用户单独授权**;正式验收批次(热键/五客户端/延迟/内存)以 1.1.0 结论为基线,UI-only 改动未重跑全套。 - ~~pro 本机实键入未确认~~ → **用户已在 pro 上确认:候选正常、切源顺手**(2026-11-06)。 - **air 曾出现「输入菜单里没有萤火虫」**:根因是**输入源被移出启用列表**(系统设置里加/改输入源时删掉了),已由用户重新添加恢复;排查与恢复步骤写进 `docs/故障恢复.md` §4.1(含“TIS API 从后台会话启用不持久化”的实测结论)。 - **⌥L 已定案(报告 255 §7)**:加了 Option 键诊断日志后确认——处理器收到并消费了 ⌥L(`learning=true`、HUD 切换、`inputText` 0 次),用户此前是在 **Ghostty** 里测的,Ghostty 自己把 ⌥L 映射成 `¬` 送进 pty;**TextEdit / Terminal 实测正常**。诊断开关:`~/Library/Application Support/Lampyris/hud-diag` 存在时才写日志,删掉即静默。 @@ -73,19 +75,15 @@ - **发布加固项**:签名 tag 校验仍未启用(缺 `packaging/git-allowed-signers`),当前只警告不失败(报告 248 §5)。 - ~~`ps rss` 口径~~ → **已改**(报告 251):`perf-session.sh` 与 `soak-session.sh` 的绝对硬顶统一改用 `vmmap` physical footprint(`FOOTPRINT_HARD_MB=40`),rss 降为参考;延迟统计新增 long-code / paging 两段。 -## 4. 下一步(1.2.0,按 `docs/迭代计划-1.2.0.md` 逐批推进) +## 4. 下一步(1.2.0 发布清单) -| 批次 | 内容 | 状态 | +| 步骤 | 内容 | 授权 | |---|---|---| -| **B1 工程收口** | D2 CI 数据 bootstrap、D5 footprint、D6 站点版本行、D4 延迟覆盖、E2 soak | **可立即开始**(无需授权) | -| **B2 数据地基** | B0→运行资源(3,000 字、字段子集、≤512 KiB)+ 三实测(先 ADR) | 等 B1 | -| **B3 教学只读** | L3 候选窗提示(可关,不改排序) | 等 B2 | -| **B4 教学练习** | L4 题库/练习窗/本地进度(先 ADR) | 等 B3 | -| **B5 质量项** | A4 冷首键测量、A1 观察期判断、A2/A3/A5 **关闭并写触发条件** | 等评测数据 | -| **B6 数据扩张** | C1 调研(**可与 B1 并行**)→ C2/C3/C4 | 看 C1 结论 | -| **收口** | 装包一次 + 验收 + `tag 1.2.0` + 站点 + pro | 需单独授权 | - -> D1(签名 tag 校验)卡在你定签名方式(GPG / SSH key),定了 30 分钟接上。 +| 1 | 打 **SSH 签名 tag** `v1.2.0` 到 `31fdbcd`(候选提交)→ 推 tag 触发 Release | **需用户授权** | +| 2 | 回读 Release 资产:ZIP `64eeb90f…`、DMG staple+spctl、`LampyrisUpdateCheck-1.2.0.zip`、appcast 版本号,回填 `docs/releases/1.2.0.md` §1 | 随 tag | +| 3 | dispatch Pages → 回读站点 `v1.2.0 · 构建 39` | 需授权 | +| 4 | pro(Intel / 1.1.0-38)用更新程序升级到 1.2.0,核 payload/执行 SHA/config 与词库保留 | 需授权 | +| 5 | 后续小版本:安装器交互(lsregister + 提示用户重加输入源)、三级简码数据(需 ADR)、练习深色/无障碍走查 | 排 1.2.1 | ## 4.1 换到 air 后怎么开工 @@ -127,6 +125,7 @@ make macos-offline-tests ## 9. 会话日志(最近) +- 2026-11-09 / pi(air):**1.2.0 候选通过验收 + 发版材料**。候选 `31fdbcd`(执行 `ef25e92b…`)全绿(`make verify` 232 产物零网络、离线 62 文件 / 328 例、CI 四项);用户确认练习页四题型/四位输入格/键位点亮与位次/口诀/工具栏/亮暗外观均可。写 `docs/releases/1.2.0.md`(候选身份、行为变更=二级简码 598 条、学习区与练习、键位图与口诀、工程项、已知限制),ROADMAP/HANDOFF 对账。**等待用户授权 tag/Release/Pages/pro 升级**。 - 2026-11-06 / pi(air):**1.2.0(B4+B5)候选装机(报告 259)**。PR #232 → CI 包(`exec 28e24d26…`)装 air;稳态 p95 **5.80 ms**(三段 5.12–5.97)、冷首键 28.86/33.39、0 外联、memory-gate 私有 **28.5–28.8 MiB**(限 30)PASS。待用户走查:⌥K 练习窗口(A/C 两种题型)、⌥L 学习区默认关、practice.tsv 生成与重置。 - 2026-11-06 / pi(air):**1.2.0/build 39 装机 + 首轮体验数据(报告 254)**。PR #227 合并 → CI 验收包 → 装 air:版本/执行 SHA `b152a001…`/公证全部核对,config 与 1225 行词库未变。评测 ALL 命中 98.2%/首选 86.4%(jianma2 100%/100%);三段延迟稳态 p95 6.7–8.3 ms;**冷首键 27–40 ms,比 1.1.0 的 16–26 ms 高**(待查是否学习区布局所致);soak 3 分钟 17 轮 0 外联、footprint 38.5 MiB(比 1.1.0 高约 5 MiB,待单独归因)。 - 2026-11-06 / pi(air):**B3 学习区实现(报告 253)**。`WubiLearningView` 改两行布局(完整码+简码 / 字根格+识别码两行),候选窗零改动;新增 `LearningHints`(读 `B0-runtime.tsv`,缺失退回 D14);词组按输入码位置映射到字(KWWL → 中K 华W 人W 国L)。`wubi-learning.swift` 扩到可注入资源并生成亮/暗实拍;离线回归全绿。 diff --git a/ROADMAP.md b/ROADMAP.md index 75ef5868..ddf34a2e 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -5,7 +5,7 @@ > 2026-11-06 对账过一轮:把已完成但未勾的行补齐(IT-15 / IT-22 / IT-23 / IT-25 / UI04-05 等), > 仍未勾的只剩「确实没做」或「待裁定」两类。发布流程里的勾选对账见 §发布对账。 -## 当前发布列车:1.1.0 已发布(2026-11-06)→ 下一站 1.2.0 +## 当前发布列车:1.2.0 候选已验收(2026-11-09)→ 待 tag/Release/站点 - [x] 1.1.0 **自用 3 天**(用户 2026-11-06 显式豁免,记录见 `docs/releases/1.1.0.md` §3) - [x] 1.1.0 **tag → Release**(tag `v1.1.0` → `393318c`;Release run `42225134493` success;ZIP `448d3170…` 与候选逐字节一致、DMG 公证通过、appcast `sparkle:version=38`;报告 248) @@ -17,7 +17,9 @@ - [x] **1.2.0 装机反馈修正(报告 255)**:⌥L 在无候选窗时不再漏出 `¬`(组合键前移到客户端判定之前);拆字键位按 `positionMismatch` 截断降级(「我」→ `丿T 扌R ?N`);`trnt` 不自动上屏确认是「同码不唯一」的预期行为(我/特性/选择性)。 - [x] **1.2.0 B4 练习(ADR-313,报告 257)**:`Practice.swift`(只出 full 题、判分、识别码表、进度 TSV 有界原子写)+ `PracticeWindow.swift`(独立窗口,题型 A 看字打码 / C 识别码判断);新增配置 `hotkey.open_practice`(默认 ⌥K)。 - [x] **1.2.0 B5 质量收口(ADR-314,报告 258)**:A4 冷首键实测 ~28 ms(与学习区无关,用户不可感知);A1/A2/A3/A5 全部关闭并写触发条件;内存口径按 ADR-312 双阈值。 -- [ ] **1.2.0 候选**(dev 已含二级简码 598 条,报告 238;Cargo 1.2.0 / build 39):**执行顺序见 [`docs/迭代计划-1.2.0.md`](docs/迭代计划-1.2.0.md)**:B1 工程收口 → B2 数据地基 → B3 L3 提示 → B4 L4 练习 → B5 质量项(有证据才做)→ B6 数据扩张;只换一次包,tag 需单独授权 +- [x] **1.2.0 候选**(Cargo 1.2.0 / build 39,候选 `31fdbcd`、执行 `ef25e92b…`):B1 工程收口 → B2 数据地基 → B3 L3 提示 → B4 L4 练习 → B5 质量项 全部完成; + 练习页四题型 + 键位图/口诀(ADR-316–323)、学习区改版(ADR-311)、签名 tag/站点盖章等工程项(报告 251–262)。 + 发版材料见 [`docs/releases/1.2.0.md`](docs/releases/1.2.0.md);tag 待授权。 - [ ] **pro 本机实键入确认**(SSH 驱动不了 GUI;用户打几个字确认候选与切源正常) ### 发布对账(每次 `tag` 之前/之后各做一次,5 分钟) diff --git a/docs/README.md b/docs/README.md index 85b148ef..57c92034 100644 --- a/docs/README.md +++ b/docs/README.md @@ -25,7 +25,7 @@ | [MVP单人验收清单.md](MVP单人验收清单.md) | 用户手动走查、五工作日试用、独立核验材料 | | [macos-release-checklist.md](macos-release-checklist.md) | 发布清单:已关闭/未关闭门禁 | | [更新发布流程.md](更新发布流程.md) · [更新源与镜像.md](更新源与镜像.md) | 发版流程与站点规则 | -| [releases/](releases/) | 每个版本的发布说明与实测结论:**1.1.0(候选)**、1.0.2、1.0.1、1.0.0、0.1.15、0.1.13 | +| [releases/](releases/) | 每个版本的发布说明与实测结论:**1.2.0(候选)**、1.1.0、1.0.2、1.0.1、1.0.0、0.1.15、0.1.13 | | [人工验收与多机复现.md](人工验收与多机复现.md) | 历史验收操作与双机复现步骤 | | [验收协作清单.md](验收协作清单.md) | 换包验收时"谁做什么"、15 分钟窗口顺序 | diff --git a/docs/releases/1.2.0.md b/docs/releases/1.2.0.md new file mode 100644 index 00000000..709c24df --- /dev/null +++ b/docs/releases/1.2.0.md @@ -0,0 +1,84 @@ +# 1.2.0(build 39) + +> **状态:候选已通过用户验收(2026-11-09),等待打 tag 与发布。** +> 候选提交:`31fdbcde5111c2aa6a63c89a9c5bc7ebc5841ee7`(CI `macos` / `check` / `fuzz` / `dco` 全绿) +> 候选包执行 SHA:`ef25e92ba085ea3f556e12d477fb1b6a6cd08ebbc3b74897fdb7b2d9f6eead64` +> 已装机核对:`~/Library/Input Methods/Lampyris.app` 的执行文件与候选 ZIP **逐字节一致**。 + +## 1. 候选资产(tag 前的核验口径) + +| 资产 | SHA-256 | +|---|---| +| `Lampyris-1.2.0-universal.zip` | `64eeb90f29e0fc6fc28d8b9989eeabc805a3796cfbb3681173da1020979f54d8` | +| `Lampyris-1.2.0-source.tar.gz` | `3dc6f717ac971f32af5afedc7e9701b07a06cb687c857f0b5f898089e8b12310` | +| 宿主执行(包内 `Contents/MacOS/Lampyris`) | `ef25e92ba085ea3f556e12d477fb1b6a6cd08ebbc3b74897fdb7b2d9f6eead64` | + +DMG / `LampyrisUpdateCheck-1.2.0.zip` / `appcast.xml` 由 Release 流水线生成,**发布后在此回填**(ADR-298)。 + +## 2. 内容(相对 1.1.0) + +### 2.1 判码行为(唯一影响候选顺序的改动) + +- **二级简码 598 条入表**(数据 `D17-bis`,报告 238):二级简码在精确命中里排到前面, + 全码仍精确命中、排序不变;`prefix2` 首选率 93.3%→40% 是预期让位(见 §5)。 + +### 2.2 学习区(⌥L,ADR-311) + +- 结构化的教学运行时资源 `B0-runtime.tsv`(6 列:字 / 全码 / 质量 / 字根(形:键) / 识别码 / 简码,≈121 KB,3,000 字)。 +- 学习区版面重做:**完整码 + 简码**、字根格(字形上、键位下)、识别码两行;词组按实际输入码逐位对应到字。 +- **候选窗零改动**:学习信息只在 ⌥L,学习区默认关闭;资源缺失时静默关闭(不报错、不降级候选)。 + +### 2.3 练习(⌥K,ADR-313 / 316–323) + +- 四个专项:**一级简码 / 二级简码 / 完整码 / 识别码**,题库按题型从 `B0-runtime.tsv` 过滤(缺对应简码的字不进该题库)。 +- 四位输入格(位数随题型:1 / 2 / 3–4 / 无),`Esc` / `⌘⌫` 清空,回车提交;`z` 只点亮键位图、不进答案。 +- 判分本地进行;进度写 `~/Library/Application Support/Lampyris/practice.tsv`(数据非配置,3,000 行 / 256 KiB 上限、原子写、删除即重置)。 +- 统计:题库字数、已练字数、次数、正确率、练习进度(进度条),按当前题型统计。 +- 动作统一在**窗口工具栏**:下一题 / 显示答案 / 键位图 / 重置进度(二次确认)/ 打开进度文件。 + +### 2.4 键位图与口诀(`modules/keymap`,ADR-315 / 320) + +- 25 键字根分布图:左上编码字母、右上主字根、下方其余字根(**按口诀顺序**、3×3 网格),按区着色。 +- 答完把答案用到的键位描边,并在**键位下方序号带**标出位次(重复码位合并,如 `①②③④`)。 +- 口诀:每键一句传统口诀,按 11→15 区位顺序拼成五行;开关在面板内部,**默认关闭**。 +- 数据以**标准字根表**为唯一真源(`CANONICAL`),逐键审计「语料有/标准表无、标准表有/语料未用」写入 + `modules/keymap/data/key-roots-wubi86-audit.md`;展示只含可渲染的 CJK 字根。 +- 面板自包含(方案名 + 键位图 + 口诀 + 位次),宿主只给宽度与显隐 → 可整体复用到其它窗口/项目。 + +### 2.5 工程与质量 + +- 发布 tag 改为 **SSH 签名**(`packaging/git-allowed-signers`),未签名/签名不符时流水线失败。 +- 站点版本号改由 `tools/stamp-site.py` 在 Pages 部署时盖章(不再硬编码)。 +- 内存双阈值(ADR-312):默认 ≤30 MiB、学习区开 ≤34 MiB;实测 28.5–33.3 MiB。 +- 延迟门禁沿用 ADR-307 稳态 p95 ≤16 ms;冷首键单独披露、不进门禁。 +- 覆盖安装后自动 `lsregister -f`,并警告"仍有旧宿主跑在备份 inode 上"(`docs/故障恢复.md` §4.2/§4.3)。 + +## 3. 验收结果 + +| 项 | 结果 | +|---|---| +| `make verify` | PASS(静态隐私断言:232 产物零网络符号) | +| `make macos-offline-tests` | **62 文件 / 328 例 PASS**(6 并发) | +| `modules/keymap/tests/test-key-roots.py` | 8 例 PASS(schema、只含标准字根、标准字根无遗漏、口诀顺序、幂等、体积) | +| CI(候选提交 `31fdbcd`) | `macos` / `check` / `fuzz` / `dco` 全绿 | +| 装机身份 | 已装执行 SHA `ef25e92b…` = 候选 ZIP 包内执行 SHA(逐字节) | +| 人工验收(用户) | 2026-11-09 通过:四题型、四位输入格、键位点亮/描边/位次、口诀、工具栏、亮暗两种外观 | + +## 4. 升级与回滚 + +- 升级:菜单「检查更新…」或 ⌥G → 验签 → 安装;升级前自动备份到 `updates/`。 +- 回滚:`~/Library/Application Support/Lampyris/uninstalled/` 或 `updates/` 里的旧 bundle 可原位还原; + 配置与个人词库本版无迁移改动。 +- 卸载:更新窗口「卸载萤火虫…」;保留 `config.toml` + `user-dictionary.tsv`(ADR-297)。 + +## 5. 已知限制 + +- **二级简码优先后,`prefix2` 首选率 93.3%→40%** 是预期让位:二级简码在精确命中里靠前,全码用户结果不变。 +- **三级简码专项未提供**:仓库没有「哪些字真有三级简码」的码表(ADR-314 已关闭三级简码), + 用"前 3 码"冒充会教错;开工条件写在 `docs/待办与积压.md`。 +- **冷首键 ~28 ms**(与学习区无关,用户确认不可感知);稳态 p95 5.8–7.2 ms。 +- **学习区开启 +~3 MiB**(ADR-312 双阈值,差额归因为字形缓存)。 +- **覆盖安装可能把输入源移出启用列表**(已多次实测):`scripts/ensure-input-source.sh` 可判断并给出恢复步骤; + 根治方案(安装器交互)仍在待办。 +- Terminal 里 ⌥L 与终端自身快捷键冲突(非缺陷),可改 `alt+shift+l`。 +- 浏览器地址栏组合中失焦可能残留原始编码,Esc 取消(macOS IMK 限制)。