把钥匙串授权修住,并加上“以后更新也别再弹”的护栏

围绕钥匙串授权反复弹出这件事,今天有不止一轮 Codex 会话试图把它彻底了结。其中一轮先把现象摸了清楚:稳定签名修复已经在本地做完了,包括固定正式包的外层 App 证书、实际 Team 和 Apple 默认 DR,并禁止 ad-hoc、签名身份回退以及冲突环境覆盖;同时把 AJIN_APP_SIGN_IDENTITY 与 native CODE_SIGN_IDENTITY 分开,native 一侧继续走 ad-hoc 并保留现有固定 SHA-256。另一轮的目标更接近工程纪律层面——把这些验收和“必须用固定签名”的要求固化进后续正式发布的检查里,避免再因发布更新而复发。这一轮新增了一组校验器和对应的测试文件,还没有提交,记录显示 24 个合成测试通过,其中包含正式 wrapper 的端到端测试,Build 125 的原始材料离线校验也通过。

针对这次的探针、心跳和 UI 采样,会话记录里特地说明做了一个核对动作:原始材料被重新计算,版本、来源、签名身份与证据哈希逐项校验;并且把 uninterrupted_coverage 恒为 false 当成约束保留下来,明确这层采样的边界。这一系列操作都没有触碰真实的钥匙串、个人正文或相关凭据,刻意把改动范围控制在合成样本和工程口径内。会话里有人用“稳定签名修复已完成、未提交、推送或安装”这样的自述来描述今天这一段的状态——也就是说,钥匙串这条线本身已经有了一组工程上的回应,但要变成长期防线,还要等那些新增校验器和测试文件被真正提交。

让 GitLab 成为唯一远端:删 GitHub 规则、补 AGENTS.md、等 CI 跑完

另一条线是清理远端。有人在 Codex 会话里直接问过:“项目是不是还绑着 GitHub?需要断开,避免我们老推送错误,我们现在的唯一仓库是 gitlab。”对此,会话只读核对了提交 ba9c420… 里的 .gitlab-ci.yml 和 package.json,并解释了预期行为:对于推送到 main、且 GitLab 默认分支为 main 的情况,预期有两个 job,一个负责验证,一个负责生产部署。这是一次只读核对,没有动配置。

更实质的动作是把“只用 GitLab”写进项目自己的 AGENTS.md。先是一次预备性的会话把这套规则写进了 AGENTS.md 文件开头,方便后续任务优先读到,明确要求:GitLab 是唯一远端,origin 的 fetch 和 push 均指向现有 GitLab 地址,适用于本项目所有 worktree。然后是一次提交,专门把这次的 AGENTS.md 修改推到 GitLab 的 main 分支,不夹带其他改动——提交为 ba9c420,信息是 docs: 明确仅使用 GitLab 并禁止 GitHub 推送,提交范围只有 AGENTS.md 这一处,新增 8 行,已回读核验。

随后是两次“等 CI 跑完”的确认。第一次回报是“验证任务已通过,但整个 CI 还在运行,暂时不能确认全部通过”,并附了截至 2026-10-13 22:24(北京时间)pipeline #514 的状态截图式记录——验证任务 success,生产部署任务还在跑。第二次回报则把这件事彻底收口:CI 已全部通过,生产部署任务也已成功结束;提交 ba9c420 对应的 pipeline #514 最终状态显示为 success。两轮会话对同一件事给出了不同口径的判断,刚好对应 CI 实际从“部分跑完”到“全部跑完”的两个时间点。

还没真正动手的自用版:文档先到位,差距矩阵尚未收口

今天还有一段比较长的会话落在 /Volumes/Sata/Work/开发项目/ai-input-method-digital-avatar/docs/roadmap/ajin-self-use-next-plan-2026-10-12.md 上。Codex 的核验结论是:这份自用版推进计划中的工作范围和推进顺序仍然可用,但其中提到的“当前版本”已经过时,建议修改后再作为执行计划使用。这是一份只读核对,没有改文件、也没有跑构建和测试。

顺着这条线会展开一张已核验的差距表。WP-0 里,身份、预测、长文本入口、记忆抑制合同已经被校正,但当前计划与矩阵身份又落后于实物;WP-1 里,候选基线、合成用户库往返、正式包引擎探针都已通过,但真实用户库副本、IMK、实体键盘、鼠标/焦点、多宿主还摆在那里。其余工作包也各自有“已有进展”和“仍未收口”两栏。围绕 WP-0,还发生了一次只读复审:关于 resolve_auto_complete_blockers 与 automation_actions.py 中“自动 QA 派发前的扩展记录转发、Gate-B 门控”的差异,结论是接受以已提交的 dashboard_auto_pipeline.is_open_blocker 来统一终态、resolved_at 和 resolved is True 对开放状态的优先级,避免再次改写已留有解决标记的自动完成 blocker;不过 automation_actions.py 内的差异本身仍然存在,需要在后面的工作中收口。

另一组与“今天做了什么”形态不太一样、但仍属同一条线的,是四份新的 ADR:0006 谈进程与数据库拥有者边界、IPC/签名待验证、本机自用范围;0007 谈显式材料、Grant revision、旧政策保留、记忆确认及删除传播;0008 谈持久任务、机器/用户验收、幂等与部分发布、确定性文件工具;0009 谈输入各学科视角下的安全与稳定性。状态都被标为 Proposed,日期记为 2026-10-13。这几份 ADR 是今天“先把审计和方案落到仓库文档”那一轮的产物——已新增 8 份文档,并同步更新了文档索引;其中一份标题为“架构与首个闭环方案”的文档共 254 行,状态标为 Design Proposal,覆盖运行边界、最小迁移路径、领域模型与授权版本、持久任务与恢复、合成统计等内容。

一点关于“今天到底走了多远”的小结

如果只把目光盯在“钥匙串和 GitLab 单一远端”上,今天的成果相对紧凑:钥匙串的稳定签名在本地已经搭建完毕,并配了一组尚未提交的发布期校验;GitHub 远端从 AGENTS.md 规则和提交记录两层被明确剔除,pipeline #514 也已经从“还在跑”走到了 success。更远一点的自用版推进计划,今天只完成了只读核对、四份 ADR 与若干索引文档的更新,距离真正动手收口 automation_actions.py 里那批仍未消化的差异、跑通真实用户库与 IMK 等工作包,还有一段不算短的距离。这也是为什么某会话自述里会反复出现“差距矩阵又落后了”这种略带自嘲的说法——文档先到位,工程还要追。