# 26.0703-PrivateVoice2.AppStore输入法-语音Spike ## 用户目标 - 以架构师身份接手 PrivateVoice,并根据项目入口规则建立当前状态认知。 - 分析 2026-06-23 Apple App Review 最后一次拒审邮件,判断拒审原因和后续策略。 - 讨论“把 PrivateVoice 改造成真正 macOS 输入法”是否能绕开 Accessibility 拒审点。 - 评估 Rime / librime 是否适合与 PrivateVoice 结合,是否适合全球多语言市场。 - 将输入法语音 spike proposal 转交 PMO 排序。 - 用户明确要求会话存档。 ## 已完成事项 - 已按项目入口读取并接手:`AGENTS.md`、`PROJECT.md`、`INDEX.md`、`02-P/进度地图.md`、`02-P/角色协作宪章.md`、`02-P/事件地图.md`、`03-O/CODEGRAPH.md`、`03-O/K2.项目管理/新窗口接手指南.md`。 - 已补读治理相关规则:`project-governance.md`、`work-continuity.md`、`pre-implementation-discussion.md`、`session-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.md`、`PROJECT.md`、`02-P/进度地图.md`、`03-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。