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 限制)。