edit | blame | history | raw

26.0703-PrivateVoice2.AppStore输入法-语音Spike

用户目标

  • 以架构师身份接手 PrivateVoice,并根据项目入口规则建立当前状态认知。
  • 分析 2026-06-23 Apple App Review 最后一次拒审邮件,判断拒审原因和后续策略。
  • 讨论“把 PrivateVoice 改造成真正 macOS 输入法”是否能绕开 Accessibility 拒审点。
  • 评估 Rime / librime 是否适合与 PrivateVoice 结合,是否适合全球多语言市场。
  • 将输入法语音 spike proposal 转交 PMO 排序。
  • 用户明确要求会话存档。

已完成事项

  • 已按项目入口读取并接手:AGENTS.mdPROJECT.mdINDEX.md02-P/进度地图.md02-P/角色协作宪章.md02-P/事件地图.md03-O/CODEGRAPH.md03-O/K2.项目管理/新窗口接手指南.md
  • 已补读治理相关规则:project-governance.mdwork-continuity.mdpre-implementation-discussion.mdsession-memory.md
  • 已分析 Apple 拒审邮件:核心拒审点是 Guideline 2.4.5 下 Accessibility 被用于非无障碍目的,具体为获取 keystrokes;另有 Guideline 2.1(a) 启动白屏问题。
  • 已澄清输入法路线的关键边界:App Store 版不能继续依赖 Accessibility、全局键盘监听或模拟粘贴;必须让触发和上屏都进入输入法官方通道。
  • 已澄清“按住快捷键说话,上屏”可以保留为输入法激活状态下的交互形态,但不能保留成无条件系统级全局热键。
  • 已评估 Rime:librime 可作为中文增强候选;Squirrel 前端不建议用于闭源商业 App Store 产品;Rime 不应作为全球版核心前提。
  • 已给出可行性判断:本地技术闭环约 7 成把握,Mac App Store 审核通过约 4 成把握,建议先做小成本 spike。
  • 已通过 Codex thread follow-up 将 proposal 转交 PMO 线程 019f23ed-75a6-76c3-a33a-fd73d9a00144,要求 PMO 排序,不要求当前立即开工。

核心事实 / 变更快照

项目接手事实

  • 变更对象:PrivateVoice 当前项目根、Git 根、源码根和活跃台账认知。
  • 事实来源:/Users/ar/Projects/PrivateVoice/AGENTS.mdPROJECT.md02-P/进度地图.md03-O/CODEGRAPH.md,以及本轮只读 Git / 目录核验。
  • 文档声明:
  • 项目名:PrivateVoice2。
  • 当前项目根:/Users/ar/Projects/PrivateVoice2
  • Git 根:/Users/ar/Projects/PrivateVoice2/03-O
  • 源码根:/Users/ar/Projects/PrivateVoice2/03-O/C1.source/privatevoice.src
  • 实际核验:
  • /Users/ar/Projects/PrivateVoice2 当前不存在。
  • 可用项目结构实际位于 /Users/ar/Projects/PrivateVoice,其下有 01-I / 02-P / 03-O
  • 实际 Git 根:/Users/ar/Projects/PrivateVoice/03-O
  • 实际分支:codex/x-asr-experiment-2.1.29
  • 实际 HEAD:abb4698 Create slim PrivateVoice2 handoff package
  • 文档产品基线:0ffbf1935c9d091cce22a5583275ac0902f7a693 / v2.2.0-build20260702.0303-real-user-test
  • Git 状态核验时不干净:约 M 276?? 473,其中约 469 条为 ._* AppleDouble 噪声,另有大量 100644 => 100755 权限位变化。
  • 范围边界:
  • 本轮未修复路径口径,也未清理 Git 噪声。
  • 后续任何分支 / worktree / 构建 / 发布前,应先由 PMO / 代码治理确认 canonical root 和干净基线。

Apple 拒审事实

  • 变更对象:App Store 路线风险判断。
  • 事实来源:用户粘贴的 Apple App Review 邮件。
  • 邮件核心信息:
  • Submission ID:73d56c2f-ebb5-4c89-b6d5-e83251681828
  • Review date:2026-06-23
  • Review Device:MacBook Air 15-inch, M2, 2023
  • Reviewed version:2.1.28 (20260614.102)
  • OS:macOS 26.5
  • 拒审点:
  • Guideline 2.4.5:App 请求 Accessibility,但不是用于 accessibility purpose;具体为请求 keystrokes,用于非无障碍目的。Apple 建议使用 NSEvent.addLocalMonitor,但该建议只适合 App 自身事件,不支持当前产品式全局输入能力。
  • Guideline 2.1(a):App launch 后保持 blank screen。
  • 当前判断:
  • 不能通过解释“这是效率工具”来说服 Accessibility 用途合规。
  • 若继续 App Store 路线,必须去掉非无障碍 Accessibility / 全局键盘监听 / 模拟粘贴路径。
  • 白屏是独立阻塞点;即使权限问题解决,仍需修复或在新宿主 App 中重新验证。

输入法路线决策快照

  • 变更对象:App Store 版候选架构。
  • 变更前候选表达:Rime core + 自研输入法前端 + PrivateVoice 离线语音
  • 变更后修正表达:
  • 核心路线:自研 macOS 输入法前端 + PrivateVoice 离线语音
  • 可选中文增强:后续接入 librime
  • 理由:
  • 拒审核心不是缺少中文输入法,而是 Accessibility 用于非无障碍目的。
  • App Store 版最小可行目标是证明“不用 Accessibility 也能按住说话并通过输入法通道上屏”。
  • Rime 对中文用户有价值,但对英语、法语、意大利语、葡语、西语、德语等拉丁语用户主要不是核心需求。
  • 日语 / 韩语用户依赖复杂本地输入法,不应在第一阶段承诺 PrivateVoice 能替代其键盘输入法。
  • 产品定位:
  • App Store 版:语音优先 macOS 输入法,键盘输入可做普通 passthrough。
  • 官网版:保留当前更强的全局热键体验,走 Developer ID notarized DMG 和官网销售。

Spike Proposal 快照

  • 变更对象:PMO 后续 proposal。
  • 建议分支 / worktree 名:spike/inputmethodkit-voice
  • 目标:验证 PrivateVoice 能否作为 macOS 输入法,在不请求 Accessibility 的情况下完成“按住说话 -> 离线识别 -> 通过输入法通道上屏”,并进一步验证最小包是否能按 Mac App Store 规则通过关键审核路径。
  • 不做范围:
  • 第一阶段不接 Rime / librime。
  • 不改现有主线产品行为。
  • 不承诺合并。
  • 不继续使用 Accessibility、全局键盘监听、模拟粘贴作为 App Store 版核心路径。
  • 建议前置条件:
  1. 先解决项目路径口径和 Git 基线问题。
  2. PMO / 代码治理确认从哪个干净基线创建实验分支:产品发布基线 0ffbf1935c9d091cce22a5583275ac0902f7a693,或迁移接手包 HEAD abb4698
  3. 建议使用独立 worktree、独立 bundle id、独立实验 app record,避免污染主线和既有 App Store 记录。
  • 建议验收四步:
  1. Sandboxed macOS 输入法壳可启用,且不请求 Accessibility。
  2. PrivateVoice 输入法激活时可稳定收到按下 / 松开触发;初期可用假文本代替真实 ASR。
  3. 识别 / 假文本结果可通过输入法 API 提交到当前文本框,不用粘贴、不用事件注入。
  4. 最小包走 App Store / TestFlight 审核路径,确认是否仍因 Guideline 2.4.5 Accessibility 或输入法安装 / 沙盒形态被拒。
  • 放弃条件:
  • 关键体验必须依赖 Accessibility、全局键盘监听或模拟粘贴。
  • 输入法在 sandbox / App Store 包装下无法启用。
  • 本地三步跑通但 Apple 明确拒绝该输入法安装 / 沙盒形态。
  • 合并条件:
  • 不请求 Accessibility。
  • 输入法可启用。
  • 按住语音上屏闭环通过。
  • 最小审核路径通过关键拒审点后,再由 PMO 决定是否升级为活跃任务和产品化分支。

文件变更

  • 新增本会话存档:/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/26.0703-PrivateVoice2.AppStore输入法-语音Spike.md
  • 本轮未修改源码、构建脚本、台账、项目入口文档或主题汇编。
  • 本轮已向 PMO 源线程发送 proposal,但未改写 02-P/进度地图.md

验证证据

  • 已只读读取全局会话保存规则:/Users/ar/.codex/rules/session-memory.md
  • 已只读查看项目会话目录:/Users/ar/Projects/PrivateVoice/.codex-sessionhistory/
  • 已确认本轮不是版本冻结、阶段性发布收口或主题汇编整理请求;因此未更新 00-Topics.md
  • 本轮未运行构建、测试、打包或本地 App 验证。
  • 本轮未创建分支或 worktree。

未决问题

  • 项目 canonical root 未解决:文档声明 /Users/ar/Projects/PrivateVoice2,实际可用目录为 /Users/ar/Projects/PrivateVoice
  • 当前 Git 工作树不干净,且包含大量 AppleDouble 噪声和权限位变化;实验分支不能直接从该状态开。
  • App Store 输入法路线没有找到可公开核验的第三方 macOS 语音输入法成功先例;审核通过把握仍低于本地技术闭环。
  • 按住说话 具体键位是否可被 InputMethodKit 稳定接收,需要 spike 验证。
  • 输入法 sandbox 下如何接入真实 PrivateVoice ASR 引擎、模型、麦克风权限和结果上屏,需要 spike 验证。
  • Apple 2026-06-23 拒审中的 blank screen 原因未在本轮排查。

后续建议

  • PMO 先将 spike/inputmethodkit-voice 作为 proposal 排序,不应由执行窗口直接开工。
  • 在条件成熟前,先完成路径口径 / Git 基线 / 工作树卫生治理。
  • 若 PMO 决定推进,先派最小输入法 spike,第一阶段只做假文本上屏,不接 Rime、不接完整 ASR。
  • 本地三步跑通后,再决定是否做独立 bundle id / 独立实验 app record 的审核路径验证。
  • Rime / librime 只作为中文增强阶段进入,不作为第一阶段验收项。

可复用命令 / Runbook

本轮没有向用户提供可直接复用的 shell 命令块,因此未更新 COMMANDS.md

保留可复用流程清单:

  1. 先由 PMO / 代码治理确定干净基线和 worktree 策略。
  2. 建立 spike/inputmethodkit-voice 实验分支 / 独立 worktree。
  3. 第一验收:sandboxed 输入法壳启用且不请求 Accessibility。
  4. 第二验收:输入法激活状态下稳定收到按下 / 松开触发。
  5. 第三验收:假文本或识别结果通过输入法 API 上屏,不用粘贴 / 事件注入。
  6. 第四验收:最小包走 Apple 审核路径,验证 Guideline 2.4.5 风险。
  7. 达到合并条件前,不合并主线、不产品化、不接 Rime。