work-ally 0.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/AGENTS.md +110 -0
  2. package/DASHBOARD.md +160 -0
  3. package/PRODUCT.md +113 -0
  4. package/README.md +403 -0
  5. package/ally.sh +171 -0
  6. package/bridge/src/approval-rules.ts +360 -0
  7. package/bridge/src/channel-delivery.ts +207 -0
  8. package/bridge/src/channel-types.ts +22 -0
  9. package/bridge/src/channels/fake/adapter.ts +31 -0
  10. package/bridge/src/channels/feishu/adapter.ts +411 -0
  11. package/bridge/src/channels/feishu/approvals.ts +6 -0
  12. package/bridge/src/channels/feishu/formatter.ts +276 -0
  13. package/bridge/src/channels/feishu/normalize.ts +368 -0
  14. package/bridge/src/codex-config.ts +52 -0
  15. package/bridge/src/config.ts +240 -0
  16. package/bridge/src/fake-runtime-client.ts +505 -0
  17. package/bridge/src/handoff-service.ts +494 -0
  18. package/bridge/src/logger.ts +194 -0
  19. package/bridge/src/memory-digest.ts +186 -0
  20. package/bridge/src/receiver-approval-autonomy.ts +158 -0
  21. package/bridge/src/receiver-control-core.ts +140 -0
  22. package/bridge/src/receiver-control-work-session.ts +218 -0
  23. package/bridge/src/receiver-control.ts +83 -0
  24. package/bridge/src/receiver-delivery.ts +136 -0
  25. package/bridge/src/receiver-helpers.ts +96 -0
  26. package/bridge/src/receiver-human-gate.ts +333 -0
  27. package/bridge/src/receiver-inbound-preflight.ts +162 -0
  28. package/bridge/src/receiver-recovery.ts +236 -0
  29. package/bridge/src/receiver-runtime-callbacks.ts +367 -0
  30. package/bridge/src/receiver-runtime-policy.ts +132 -0
  31. package/bridge/src/receiver-runtime-state.ts +124 -0
  32. package/bridge/src/receiver-support-actions.ts +189 -0
  33. package/bridge/src/receiver-thread-start.ts +57 -0
  34. package/bridge/src/receiver-turn-coordination.ts +94 -0
  35. package/bridge/src/receiver-turn-execution.ts +257 -0
  36. package/bridge/src/receiver-turn-failure.ts +143 -0
  37. package/bridge/src/receiver-turn-result.ts +185 -0
  38. package/bridge/src/receiver-turn-steer.ts +70 -0
  39. package/bridge/src/receiver-work-session.ts +76 -0
  40. package/bridge/src/receiver.ts +329 -0
  41. package/bridge/src/router.ts +62 -0
  42. package/bridge/src/runtime-client-agent-messages.ts +150 -0
  43. package/bridge/src/runtime-client-message-dispatch.ts +176 -0
  44. package/bridge/src/runtime-client-protocol.ts +411 -0
  45. package/bridge/src/runtime-client-request-ops.ts +56 -0
  46. package/bridge/src/runtime-client-run-turn.ts +158 -0
  47. package/bridge/src/runtime-client-thread-ops.ts +270 -0
  48. package/bridge/src/runtime-client-transport.ts +309 -0
  49. package/bridge/src/runtime-client-turn-poll.ts +224 -0
  50. package/bridge/src/runtime-client-turn-read.ts +185 -0
  51. package/bridge/src/runtime-client-turn-state.ts +105 -0
  52. package/bridge/src/runtime-client.ts +344 -0
  53. package/bridge/src/runtime-user-input.ts +403 -0
  54. package/bridge/src/scheduler.ts +239 -0
  55. package/bridge/src/server-handoff-command.ts +364 -0
  56. package/bridge/src/server-main.ts +80 -0
  57. package/bridge/src/server-routine-command.ts +60 -0
  58. package/bridge/src/server-routine-execution.ts +222 -0
  59. package/bridge/src/server-runtime-app-support.ts +107 -0
  60. package/bridge/src/server-runtime-app.ts +238 -0
  61. package/bridge/src/server-thread-sync-command.ts +63 -0
  62. package/bridge/src/server.ts +17 -0
  63. package/bridge/src/session-store-delivery.ts +220 -0
  64. package/bridge/src/session-store-human-gate.ts +380 -0
  65. package/bridge/src/session-store-inbound-acceptance.ts +66 -0
  66. package/bridge/src/session-store-meta.ts +134 -0
  67. package/bridge/src/session-store-turn-ledger.ts +272 -0
  68. package/bridge/src/session-store.ts +380 -0
  69. package/bridge/src/system-notify.ts +220 -0
  70. package/bridge/src/thread-sync.ts +200 -0
  71. package/bridge/src/translator.ts +494 -0
  72. package/bridge/src/types.ts +289 -0
  73. package/bridge/src/utils.ts +104 -0
  74. package/bridge/src/work-session-store.ts +471 -0
  75. package/docs/.gitkeep +0 -0
  76. package/docs/architecture/codex-feishu-bridge-proposal.md +2742 -0
  77. package/docs/completed/FEATURE-feishu-markdown-and-reply-support.md +327 -0
  78. package/docs/completed/README.md +21 -0
  79. package/docs/completed/SPEC-approval-autonomy-and-safe-defaults.md +205 -0
  80. package/docs/completed/SPEC-approval-batch-and-strict-reply-shortcuts.md +153 -0
  81. package/docs/completed/SPEC-conversation-noise-reduction-and-busy-input-gate.md +538 -0
  82. package/docs/completed/SPEC-engineering-sop-skillization.md +190 -0
  83. package/docs/completed/SPEC-faithful-bridge-core-thinning-v2.md +376 -0
  84. package/docs/completed/SPEC-faithful-bridge-core-thinning.md +1071 -0
  85. package/docs/completed/SPEC-group-chat-sender-identity.md +301 -0
  86. package/docs/completed/SPEC-middleware-exception-visibility.md +227 -0
  87. package/docs/completed/SPEC-nightly-memory-digest-visibility.md +121 -0
  88. package/docs/completed/SPEC-project-group-chat-human-centered-conversation-mapping.md +326 -0
  89. package/docs/completed/SPEC-remove-cli-persona-bootstrap.md +201 -0
  90. package/docs/developer-workflow.md +49 -0
  91. package/docs/implementation/SPEC-codex-same-machine-session-handoff-implementation.md +239 -0
  92. package/docs/implementation/test-coverage-map.md +363 -0
  93. package/docs/implementation/work-ally-implementation-guide.md +790 -0
  94. package/docs/issues/README.md +10 -0
  95. package/docs/issues/pending/ANALYSIS-ally-premature-recovery-notice-and-task-state-semantics-2026-03-18.md +295 -0
  96. package/docs/issues/resolved/ANALYSIS-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +466 -0
  97. package/docs/issues/resolved/ANALYSIS-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +261 -0
  98. package/docs/issues/resolved/ANALYSIS-codex-app-server-transport-disconnect-semantics-2026-03-14.md +606 -0
  99. package/docs/issues/resolved/ANALYSIS-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +348 -0
  100. package/docs/issues/resolved/ANALYSIS-runtime-turn-delivery-and-recovery-2026-03-14.md +603 -0
  101. package/docs/issues/resolved/ANALYSIS-self-test-gap-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +166 -0
  102. package/docs/issues/resolved/ANALYSIS-self-test-gap-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +186 -0
  103. package/docs/issues/resolved/ANALYSIS-self-test-gap-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +166 -0
  104. package/docs/issues/resolved/REPORT-ally-runtime-turn-delivery-3b42fb8-2026-03-15.md +373 -0
  105. package/docs/manual-acceptance.md +127 -0
  106. package/docs/ops-runbook.md +44 -0
  107. package/docs/planning/FEATURE-memory-system.md +748 -0
  108. package/docs/planning/SPEC-active-turn-steer-and-context-compaction-visibility.md +269 -0
  109. package/docs/planning/SPEC-approval-rules-inheritance-and-local-validation-lane.md +450 -0
  110. package/docs/planning/SPEC-assistant-persona-bootstrap.md +199 -0
  111. package/docs/planning/SPEC-assistant-rename.md +610 -0
  112. package/docs/planning/SPEC-bridge-app-server-protocol-alignment.md +667 -0
  113. package/docs/planning/SPEC-claude-runtime-host-for-work-ally.md +434 -0
  114. package/docs/planning/SPEC-cli-feishu-codex-session-unification.md +236 -0
  115. package/docs/planning/SPEC-codex-same-machine-session-handoff.md +873 -0
  116. package/docs/planning/SPEC-feishu-reaction-shortcuts.md +282 -0
  117. package/docs/planning/SPEC-local-stable-release-boundary.md +166 -0
  118. package/docs/planning/SPEC-managed-thread-entry-and-surface-mobility.md +862 -0
  119. package/docs/planning/SPEC-minimal-bridge-semantics-and-user-visible-surface.md +362 -0
  120. package/docs/planning/SPEC-npm-alpha-distribution-and-install-first-release.md +222 -0
  121. package/docs/planning/SPEC-remove-websocket-runtime-transport.md +364 -0
  122. package/docs/planning/SPEC-runtime-abstraction-phase-1.md +424 -0
  123. package/docs/planning/SPEC-runtime-connection-and-turn-recovery-semantics.md +274 -0
  124. package/docs/planning/SPEC-session-presence-and-state-visibility.md +397 -0
  125. package/docs/planning/SPEC-skill-first-capability-packaging.md +338 -0
  126. package/docs/planning/SPEC-stable-archive-contract.md +456 -0
  127. package/docs/planning/SPEC-supervised-start-boundary.md +127 -0
  128. package/docs/planning/SPEC-user-barrier-reduction-and-activation.md +832 -0
  129. package/docs/planning/ally-next.md +1278 -0
  130. package/docs/planning/assistant-workbench-spec.md +725 -0
  131. package/docs/planning/product-workbench.md +283 -0
  132. package/docs/product-onboarding.md +227 -0
  133. package/docs/product-spec-standard.md +528 -0
  134. package/docs/troubleshooting.md +45 -0
  135. package/docs/user-quickstart.md +46 -0
  136. package/internal/dispatch.sh +95 -0
  137. package/internal/lib/common.sh +1450 -0
  138. package/internal/modules/assistant/manage.sh +1312 -0
  139. package/internal/modules/bootstrap/setup.sh +144 -0
  140. package/internal/modules/config/init-env.sh +10 -0
  141. package/internal/modules/global/manage.sh +154 -0
  142. package/internal/modules/handoff/manage.sh +54 -0
  143. package/internal/modules/mcp/manage.sh +83 -0
  144. package/internal/modules/ops/logs.sh +76 -0
  145. package/internal/modules/routines/manage.sh +55 -0
  146. package/internal/modules/runtime/assistant-autosave.sh +26 -0
  147. package/internal/modules/runtime/restart.sh +6 -0
  148. package/internal/modules/runtime/start.sh +283 -0
  149. package/internal/modules/runtime/status.sh +194 -0
  150. package/internal/modules/runtime/stop.sh +55 -0
  151. package/internal/modules/runtime/supervisor.sh +216 -0
  152. package/internal/modules/runtime/update.sh +26 -0
  153. package/package.json +41 -0
  154. package/runtime/config/.gitkeep +0 -0
  155. package/runtime/host/.gitkeep +0 -0
  156. package/runtime/host/healthcheck-codex-app-server.ts +22 -0
  157. package/runtime/host/ping-pong-codex-app-server.ts +66 -0
  158. package/runtime/host/probe-codex-app-server.ts +115 -0
  159. package/skills/archive-reader/SKILL.md +9 -0
  160. package/skills/feishu-production-debug/SKILL.md +37 -0
  161. package/skills/feishu-production-debug/references/feishu-debug-order.md +49 -0
  162. package/skills/feishu-production-debug/references/platform-permission-baseline.md +23 -0
  163. package/skills/issue-to-spec-triage/SKILL.md +44 -0
  164. package/skills/issue-to-spec-triage/references/triage-rules.md +66 -0
  165. package/skills/memory-digest/SKILL.md +9 -0
  166. package/skills/post-implementation-closure/SKILL.md +39 -0
  167. package/skills/post-implementation-closure/references/closure-checklist.md +45 -0
  168. package/skills/post-implementation-closure/references/doc-drift-map.md +49 -0
  169. package/skills/product-spec/SKILL.md +244 -0
  170. package/templates/env.example +5 -0
  171. package/templates/routines/nightly-memory-digest.yaml +10 -0
  172. package/templates/workspace/AGENTS.md +26 -0
@@ -0,0 +1,790 @@
1
+ # `work-ally` 实施指南
2
+
3
+ > 当前已落地实现以 **assistant desk(办公桌)** 为中心。
4
+ >
5
+ > 当前 shipped model:
6
+ > - `ally setup <name> --workspace <path>` 负责创建并初始化 assistant desk,并显式绑定项目
7
+ > - `ally start --assistant <name>` / `ally status --assistant <name>` / `ally stop --assistant <name>` 可在任意目录显式操作目标 assistant
8
+ > - assistant desk 默认位于 `~/.work-ally/assistants/<name>/`
9
+ > - 办公桌根目录保存 assistant 可见资产:`AGENTS.md`、`SOUL.md`、`NOW.md`、`MEMORY.md`、`MISTAKES.md`、`journal/`、`conversations/`
10
+ > - `.system/` 保存内部运行资产:`config.env`、`codex-home/`、`runtime/`、`logs/`、`runs/`、`cache/`、`routines/`、`archive/`
11
+ > - 项目目录默认不再生成 `.work-ally/` 运行态,也不默认承载 assistant 长期记忆
12
+ > - 项目只负责自己的代码与项目级规则;assistant 进入项目工作,但不拥有项目本体
13
+ > - assistant desk 根目录默认初始化为独立 Git 仓库,并由产品层自动 checkpoint / 可选 push
14
+ >
15
+ > 因此,若后文仍出现早期的“项目内 `.work-ally/.env`、项目内 `memory/daily` / `memory/long-term`、`work-ally.workspace.yaml` 承载长期记忆映射”等表述,应以本节描述的**当前 shipped model**为准。
16
+
17
+
18
+ ## 0. 文档定位
19
+
20
+ 这份文档不是方案提案,而是**交付给实施者的执行文档**。
21
+
22
+ 它属于过程性文档:
23
+
24
+ - 可以保留阶段、专题、DoD、实施顺序与演进痕迹
25
+ - 但不能把已经失效的现状继续写成当前系统模型
26
+ - 如遇“历史阶段描述”和文档顶部 shipped model 冲突,一律以前者为历史、以后者为现状
27
+
28
+ 它与灯塔文档 `codex-feishu-bridge-proposal.md`(位于 `../architecture/`)的关系必须明确:
29
+
30
+ - `codex-feishu-bridge-proposal.md` 是**灯塔文档**,负责说明第一性原理、架构边界、目标与取舍。
31
+ - `work-ally-implementation-guide.md` 是**实施指南**,负责把完整产品拆成可逐章推进、可逐章验收的实施阶段。
32
+ - 实施过程中如果发现当前做法与灯塔文档冲突,**不能偷偷偏航**;要么先更新灯塔文档,要么把冲突显式记录为待决问题。
33
+ - 只有当本指南的全部阶段 DoD 完成,且 `codex-feishu-bridge-proposal.md` 中的验收标准成立时,才可以对外宣布:**产品开发完成**。
34
+
35
+ 这份文档的使用对象包括:
36
+
37
+ - 负责实现 `work-ally` 产品、交付 `ally.sh` 门面的工程师
38
+ - 负责协助实现的 coding agent
39
+ - 负责看进度、对齐阶段、做阶段验收的人
40
+
41
+ 它的目标不是讲概念,而是回答三件事:
42
+
43
+ 1. 先做什么
44
+ 2. 后做什么
45
+ 3. 什么时候算真的做完
46
+
47
+ ---
48
+
49
+ ## 1. 全局实施原则
50
+
51
+ 在所有阶段里,都必须同时遵守下面这些原则。
52
+
53
+ ### 1.1 产品边界原则
54
+
55
+ - 一个工作空间就是一个助手,不在单实例内部再造多助手、多角色、多组抽象。
56
+ - `ally.sh` 只是编排层与交互层,**官方 Codex runtime 才是唯一的大脑**。
57
+ - `ally.sh` 不重写 agent loop,不重写推理引擎,不维护第二套模型配置。
58
+ - IM 入口与远程文档产物表面必须分离;前者负责对话,后者负责长文呈现。
59
+
60
+ ### 1.2 资产与运行态分离原则
61
+
62
+ - 项目长期资产留在项目本身;assistant 长期资产留在 assistant desk 或官方 Codex 家目录中。
63
+ - assistant desk 下的 `.system/` 是**可替换运行态**,不是长期资产仓库。
64
+ - 记忆、对话、规则、主动任务定义、黑匣子原材料与长期成果都必须在项目或 desk 的可见层可迁移、可备份。
65
+ - 删除实现缓存后,应能重新恢复;删除整个产品实现仓库后,也应能重新接回同一个项目与 assistant desk 绑定。
66
+
67
+ ### 1.3 文件优先原则
68
+
69
+ - 第一选择是文本文件与可人工查看的目录结构,而不是数据库。
70
+ - session、run、archive、memory 都应尽量以 JSON / Markdown / YAML 落地。
71
+ - 所有关键状态都应当“人能看懂、人能修复、人能 diff”。
72
+
73
+ ### 1.4 抽象边界原则
74
+
75
+ - 架构层不把渠道名字写进抽象名。
76
+ - `Channel Adapter`、`Runtime Client`、`Scheduler`、`Archive Store` 等都应保持供应商无关命名。
77
+ - `Feishu`、远程文档平台、远程 MCP 只出现在实现层。
78
+ - 当前只实现一种 IM 通道并不矛盾,但抽象层必须提前隔离好。
79
+
80
+ ### 1.5 TDD 与阶段验收原则
81
+
82
+ - 每个阶段都必须有自己的自动化验证与人工验收动作。
83
+ - 先写契约、夹具、假实现,再接真实外部系统。
84
+ - 先完成小范围稳定闭环,再向更真实的外部集成推进。
85
+ - 未通过本阶段 DoD,不进入下一阶段主线开发。
86
+
87
+ ### 1.6 安全默认原则
88
+
89
+ - 缺少 Feishu 凭据或关键配置时,系统应**失败关闭**,不能“先跑起来再说”。
90
+ - 默认不额外限制发送者;如果配置了 allowlist,则只服务白名单授权对象。群聊仅依赖飞书平台正确配置后的显式 `@` 机器人消息,不额外支持控制命令或 reply assistant 触发。
91
+ - 默认不暴露公网入口,优先走个人电脑上的长连接模式。
92
+ - 默认最小权限,尤其是远程文档写入能力必须受明确范围限制。
93
+
94
+ ### 1.7 进度对齐原则
95
+
96
+ 这份文档要能直接用于多人协作或人与 agent 协作时的进度同步,因此后续所有进度汇报都应以“阶段”为单位。
97
+
98
+ 标准进度汇报格式建议统一为:
99
+
100
+ - 当前阶段
101
+ - 本阶段已完成事项
102
+ - 本阶段未完成事项
103
+ - 当前阻塞
104
+ - 下一条验证动作
105
+
106
+ ---
107
+
108
+ ## 2. 完整实施地图
109
+
110
+ ## 2.1 当前实施进度看板
111
+
112
+ | 阶段 | 状态 | 说明 |
113
+ | --- | --- | --- |
114
+ | Stage 0 | 已完成 | 灯塔文档、实施指南、协作边界已经建立 |
115
+ | Stage 1 | 已完成 | `work-ally/` 实现仓库骨架、测试地基与开发合同已建立 |
116
+ | Stage 2 | 已完成 | `ally.sh`、assistant desk bootstrap、update、恢复路径已经成立 |
117
+ | Stage 3 | 已完成 | Bridge Core、session、archive、fake channel、fake runtime 已跑通 |
118
+ | Stage 4 | 已完成 | 当前 IM adapter、reaction 即时 ack、格式化与 allowlist 已落地;真实 Feishu 联调已跑通 |
119
+ | Stage 5 | 已完成 | 官方 Codex Runtime 已接入,并通过真实 `codex app-server` 探针验证 |
120
+ | Stage 6 | 已完成 | 连续 thread、`/new` 上下文切换、审批、停止、恢复、状态编排已落地 |
121
+ | Stage 7 | 已完成 | routine、scheduler、run 记录、nightly memory digest 已落地 |
122
+ | Stage 8 | 已完成 | Feishu Remote MCP 已改为 Codex 直连路线;`work-ally` 仅保留薄的 MCP 安装/检查封装与默认只读策略 |
123
+ | Stage 9 | 已完成 | update、重建恢复、前台服务模式、排障文档已落地;生命周期按工作空间归属收口 |
124
+ | Stage 10 | 已完成 | 真人验收、交接文档、黑匣子复盘路径与交付口径已经收口 |
125
+
126
+ 截至 2026-03-15,第一阶段已经完成,当前稳定结论只保留这些:
127
+
128
+ - `cd work-ally && npm test` 通过
129
+ - `cd work-ally && npm run test:maintainer` 通过
130
+ - 真实 Codex Runtime + Feishu IM 闭环已完成
131
+ - 真实 Feishu Remote MCP 只读 / 显式写回边界已完成
132
+ - 生命周期、channel lock、全局实例可观测性、日志时间线与黑匣子契约已收口
133
+ - 用户主入口、维护者文档、人工验收路径已经统一到 `ally` 与 `docs/` 交付面
134
+ - assistant desk memory system v1 已收口:`SOUL.md` / `NOW.md` / `MEMORY.md` / `MISTAKES.md` / `journal/` / `conversations/`
135
+ - archive raw layer 与 conversation view layer 已分层;稳定原材料在 `.system/archive/`,可读聊天链路在 `conversations/`
136
+ - 会话降噪与忙时输入门控、自测默认授权、中间层异常透明化三条近期体验专项已落地并通过自动化回归
137
+ - runtime recovery 专项已进入终态对账主路径:bridge 会主动对账 turn 终态,并在上一轮结果已产生但未稳定送达时优先自动补发
138
+
139
+ ### 2.2 Stage 10 收口结果
140
+
141
+ Stage 10 已按三批收口:
142
+
143
+ - **A 批:当前 IM 主闭环** 已通过
144
+ - **B 批:远程文档闭环** 已通过
145
+ - **C 批:交接与恢复闭环** 已通过
146
+
147
+ 因此,第一阶段当前不再保留“待执行”的人工验收分批计划。
148
+
149
+ ### 2.3 非阻塞但必须记住的产品注意点
150
+
151
+ 这些点当前不阻塞 Stage 10 收尾,但必须继续守住:
152
+
153
+ - **上下文与 compaction 继续坚持 Runtime 原生优先**
154
+ - 已通过 `codex app-server generate-json-schema --experimental` 确认协议侧存在 `thread/tokenUsage/updated`、`thread/compact/start` 与 `contextCompaction` / `thread/compacted` 原语
155
+ - 这说明 Codex 侧已经有“上下文占用 / 主动 compact”的原生表面;ally 不需要自造本地 token 估算器或压缩器
156
+ - 当前版本先不新增 `/context` 或 `/compact`;如果未来要做,只能做对 Runtime 原生能力的薄透传
157
+ - **`/status` 已经收敛为桥接层合理 UX**
158
+ - 当前固定分成 `Thread` / `Turn` / `Queue` / `Recent` / `Runtime` 五段
159
+ - 后续可以继续微调排版,但不要把 bridge 继续做成 dashboard 系统
160
+ - **实施文档继续保持瘦身**
161
+ - 保留阶段、DoD、关键决策变化与验收口径
162
+ - 删除纯过程噪音,但保留关键历史拐点,方便未来回溯
163
+
164
+ 下面这张地图用于总览全产品的实施顺序。
165
+
166
+ | 阶段 | 章节主题 | 核心结果 | 前置依赖 |
167
+ | --- | --- | --- | --- |
168
+ | Stage 0 | 开工合同与验收基线 | 灯塔、实施、测试、协作合同统一 | 方案方向已确定 |
169
+ | Stage 1 | 实现仓库骨架与开发地基 | 仓库结构、工具链、测试地基成立 | Stage 0 |
170
+ | Stage 2 | 门面、Bootstrap 与运行态外壳 | `ally.sh` 与 assistant desk 初始化闭环成立 | Stage 1 |
171
+ | Stage 3 | Bridge Core 与假闭环 | 核心事件流、session、archive 在本地跑通 | Stage 2 |
172
+ | Stage 4 | 当前 IM 实现接入 | 当前 IM 通道真实收发、即时回执成立 | Stage 3 |
173
+ | Stage 5 | 官方 Codex Runtime 集成 | 真实 Runtime 闭环成立 | Stage 4 |
174
+ | Stage 6 | 连续对话、审批与恢复 | thread 连续性、审批、停止、恢复成立 | Stage 5 |
175
+ | Stage 7 | 主动能力与记忆闭环 | routine、scheduler、nightly digest 成立 | Stage 6 |
176
+ | Stage 8 | Codex 直连远程文档能力 | Feishu 文档能力由 Codex 直接通过 Remote MCP 使用,`work-ally` 只保留薄封装 | Stage 7 |
177
+ | Stage 9 | 运维、安全与交付封装 | 更新、常驻、硬化、排障与重建流程成立 | Stage 8 |
178
+ | Stage 10 | 发布验收与完工出门 | 完整产品通过最终验收,可宣布完成 | Stage 9 |
179
+
180
+ 这张地图有两个硬规则:
181
+
182
+ - 不能跳过前置依赖,直接把后面的复杂特性硬接进来。
183
+ - 一个阶段的 DoD 不通过,下一个阶段就只能做预研,不能算正式推进。
184
+
185
+ ---
186
+
187
+ ## 3. Stage 0:开工合同与验收基线(已完成)
188
+
189
+ ### 3.1 目标
190
+
191
+ 把“怎么做、做到什么算完成、文档以谁为准”在真正写代码前一次说清。
192
+
193
+ ### 3.2 范围
194
+
195
+ 本阶段不追求可运行功能,只建立完整产品实施的共同基线。
196
+
197
+ ### 3.3 依赖
198
+
199
+ - `codex-feishu-bridge-proposal.md` 已达到可作为灯塔的状态
200
+ - 产品工作名、核心边界与核心思路已经稳定
201
+
202
+ ### 3.4 实施任务
203
+
204
+ - 确认 `codex-feishu-bridge-proposal.md` 是唯一灯塔文档。
205
+ - 创建并维护本实施指南,作为后续工程执行与进度对齐文档。
206
+ - 在计划中的实现仓库根目录准备 `AGENTS.md` 与 `CLAUDE.md`,并保持二者内容一致。
207
+ - 明确实现仓库与工作空间的分工:
208
+ - 实现仓库负责 `work-ally` 产品本身。
209
+ - 工作空间负责身份、记忆、知识、archive 与 routines。
210
+ - 明确产品完成定义:全部阶段 DoD 通过 + 灯塔文档验收标准通过。
211
+ - 明确阶段验收方法:自动化验证、组件集成验证、人工端到端验收三级并存。
212
+ - 明确“当前 IM 通道实现”和“未来可扩展通道”之间的边界,不把当前实现写死到抽象层里。
213
+
214
+ ### 3.5 验证与测试
215
+
216
+ - 检查灯塔文档与实施指南之间没有互相打架的表述。
217
+ - 检查 `AGENTS.md` / `CLAUDE.md` 的职责是否面向实施者,而不是面向最终用户。
218
+ - 检查文档是否已经清楚写明:用户长期资产不留在产品内部目录。
219
+
220
+ ### 3.6 DoD
221
+
222
+ - 实施者只看这两份文档,就能知道“为什么做、先做什么、做到哪里才算完工”。
223
+ - 后续每一阶段都有明确前置依赖、测试要求与出门条件。
224
+ - 没有再使用 “MVP / 最小实施 / 先随便做一个” 这样的项目目标表述。
225
+
226
+ ---
227
+
228
+ ## 4. Stage 1:实现仓库骨架与开发地基(已完成)
229
+
230
+ ### 4.1 目标
231
+
232
+ 把真正可开发、可测试、可逐步交付的实现仓库地基立起来。
233
+
234
+ ### 4.2 范围
235
+
236
+ 本阶段建立仓库结构、脚手架、测试骨架、夹具与基础文档,但不要求真实接通 IM 与 Runtime。
237
+
238
+ ### 4.3 依赖
239
+
240
+ - Stage 0 完成
241
+
242
+ ### 4.4 实施任务
243
+
244
+ - 当前阶段的实现放在本仓库下的 `work-ally/` 目录中;后续如需独立迁出,保持该目录可整体移动。
245
+ - 建立实现仓库目录骨架,至少包含:
246
+ - `ally.sh`
247
+ - `internal/`
248
+ - `bridge/`
249
+ - `templates/`
250
+ - `skills/`
251
+ - `tests/` 或等价测试目录
252
+ - 在根目录建立 `AGENTS.md` 与 `CLAUDE.md`,内容一致。
253
+ - 在 `bridge/` 下建立 TypeScript 工程、构建脚本、测试脚本与最小入口文件。
254
+ - 在 shell 层建立最小脚本骨架:
255
+ - `internal/dispatch.sh`
256
+ - `internal/modules/bootstrap/`
257
+ - `internal/modules/config/`
258
+ - `internal/modules/runtime/`
259
+ - `internal/modules/routines/`
260
+ - `internal/modules/ops/`
261
+ - 准备最小模板文件:
262
+ - `templates/env.example`
263
+ - `templates/work-ally.workspace.example.yaml`
264
+ - `templates/routines/*.yaml`
265
+ - 准备测试夹具:
266
+ - fake workspace fixture
267
+ - fake inbound message fixture
268
+ - fake runtime event fixture
269
+ - routine fixture
270
+ - 约定统一测试入口,至少能分成:
271
+ - shell 语法/静态校验
272
+ - bridge 单元测试
273
+ - bridge 集成测试
274
+ - 在 `README.md` 中写清当前仓库是实现仓库,不是用户工作空间。
275
+
276
+ ### 4.5 验证与测试
277
+
278
+ - 运行 shell 语法检查,例如 `bash -n` 覆盖门面与内部脚本。
279
+ - 运行 bridge 的最小测试命令,确认测试框架与构建框架成立。
280
+ - 在空目录 clone 后,能够安装依赖并跑通最小测试。
281
+
282
+ ### 4.6 DoD
283
+
284
+ - 仓库可以被一个新的实施者 clone 下来并直接开始开发。
285
+ - 根目录文档已经清楚区分“实现仓库”和“用户工作空间”。
286
+ - 测试基础设施已可用,后续阶段不需要重新搭地基。
287
+
288
+ ---
289
+
290
+ ## 5. Stage 2:门面、Bootstrap 与运行态外壳(已完成)
291
+
292
+ ### 5.1 目标
293
+
294
+ 让 `ally` / `ally.sh` 这一层门面入口成立,并让 assistant desk 的初始化、更新与重建路径成立。
295
+
296
+ ### 5.2 范围
297
+
298
+ 本阶段聚焦 shell 门面与本地运行态外壳,不要求 Bridge Core 已接通真实通道。
299
+
300
+ ### 5.3 依赖
301
+
302
+ - Stage 1 完成
303
+
304
+ ### 5.4 实施任务
305
+
306
+ - 实现根门面 `ally.sh`,保持极薄,只做:
307
+ - 定位当前项目根目录
308
+ - 解析 assistant 名称与目标 desk
309
+ - 转发命令给 `internal/dispatch.sh`
310
+ - 实现 `internal/dispatch.sh` 路由,不把业务逻辑堆到门面中。
311
+ - 实现 `setup / help / start / stop / restart / status / logs / update / routine ...` 的基础分发。
312
+ - 实现 `internal/modules/bootstrap/setup.sh`:
313
+ - 初始化 `~/.work-ally/assistants/<name>/`
314
+ - 生成 assistant desk 的可见骨架:`AGENTS.md`、`SOUL.md`、`NOW.md`、`MEMORY.md`、`MISTAKES.md`、`journal/`、`conversations/`
315
+ - 初始化 `.system/config.env`、`.system/codex-home/`、`.system/runtime/`、`.system/logs/`、`.system/runs/`、`.system/cache/`
316
+ - 初始化 assistant / project registry,并记录项目到 assistant 的绑定
317
+ - 在 desk 根目录执行独立 `git init`,为后续自动 checkpoint 做准备
318
+ - 实现 `internal/modules/config/`,把 assistant desk 内部运行配置与项目现场彻底分开。
319
+ - 实现 `update` 路径:
320
+ - 更新产品内部实现
321
+ - 不覆盖 assistant 已生成的长期记忆与对话资产
322
+ - 不重新发明用户的模型配置
323
+ - 明确项目目录不再承载 assistant 运行态;项目只作为工作现场被挂载使用。
324
+ - 明确 `.system/config.env` 的角色:只描述 assistant desk 的本地 bridge/runtime 配置。
325
+
326
+ ### 5.5 验证与测试
327
+
328
+ - 在临时工作空间连续执行多次 `ally setup`,验证幂等性。
329
+ - 手动删除实现缓存后重新运行 `ally setup` 或 `ally update`,验证可恢复。
330
+ - 验证当 Feishu 凭据或关键配置缺失时,`start` 应明确失败而不是含糊启动;allowlist 留空时应允许启动。
331
+ - 验证已有工作空间中的 `AGENTS.md`、记忆、知识、归档文件不会被 `setup` 覆盖。
332
+
333
+ ### 5.6 DoD
334
+
335
+ - 用户只需要理解一个入口:`ally <command>`。
336
+ - assistant desk 的初始化、状态目录与恢复路径已经成立。
337
+ - 产品内部实现与工作空间资产已经被结构性分开。
338
+
339
+ ---
340
+
341
+ ## 6. Stage 3:Bridge Core 与假闭环(已完成)
342
+
343
+ ### 6.1 目标
344
+
345
+ 先不接真实外部系统,把 Bridge 的核心事件流、会话台账与黑匣子归档在本地跑通。
346
+
347
+ ### 6.2 范围
348
+
349
+ 本阶段实现 Bridge Core、自定义契约、fake channel、fake runtime,不接真实 IM 与真实 Codex Runtime。
350
+
351
+ ### 6.3 依赖
352
+
353
+ - Stage 2 完成
354
+
355
+ ### 6.4 实施任务
356
+
357
+ - 定义统一的 channel contract,至少覆盖:
358
+ - `conversation_ref`
359
+ - `inbound_message`
360
+ - `ack_received`
361
+ - `progress_update`
362
+ - `approval_requested`
363
+ - `approval_resolved`
364
+ - `final_reply`
365
+ - `stop_requested`
366
+ - 实现 `bridge/src/receiver.ts`,把标准化入站事件送入后续流程。
367
+ - 实现 `bridge/src/translator.ts`,把 runtime 事件翻译为统一的对外语义。
368
+ - 实现 `bridge/src/session-store.ts`:
369
+ - conversation -> thread 映射
370
+ - `meta.json`
371
+ - `current-thread.json`
372
+ - `turns/*.json`
373
+ - `approvals/*.json`
374
+ - `events.ndjson`
375
+ - 会话原材料采集已演进为按 `thread/read(includeTurns=true)` 的 thread-sync 快照写入(`bridge/src/thread-sync.ts`)。
376
+ - 实现 fake runtime:
377
+ - 能模拟进度事件
378
+ - 能模拟审批事件
379
+ - 能模拟最终回复
380
+ - 实现 fake channel adapter:
381
+ - 输入标准消息
382
+ - 接收标准回包
383
+ - 为后续真实 IM 和真实 Runtime 预留相同接口。
384
+
385
+ ### 6.5 验证与测试
386
+
387
+ - 编写单元测试覆盖 session-store 的文件读写与恢复。
388
+ - 编写单元测试覆盖 translator 的事件翻译。
389
+ - 编写集成测试:fake inbound message -> receiver -> fake runtime -> translator -> fake outbound reply。
390
+ - 编写集成测试验证 archive 文件是否稳定落盘。
391
+
392
+ ### 6.6 DoD
393
+
394
+ - 不接真实外部系统,Bridge Core 也能完整走通一次假闭环。
395
+ - `.system/runtime/sessions/`、`.system/archive/` 与 `conversations/` 的职责边界已经稳定、可读、可人工检查。
396
+ - 失败、审批、进度三类事件在 Core 层已经有一致语义。
397
+
398
+ ---
399
+
400
+ ## 7. Stage 4:当前 IM 通道实现接入(已完成)
401
+
402
+ ### 7.1 目标
403
+
404
+ 把当前 IM 通道真实接入进来,让用户真的能发消息、收到即时回执、再收到结果回复。
405
+
406
+ ### 7.2 范围
407
+
408
+ 本阶段只实现**当前 IM 通道**的真实适配层,不把通道特有逻辑污染到 Bridge Core。
409
+
410
+ ### 7.3 依赖
411
+
412
+ - Stage 3 完成
413
+
414
+ ### 7.4 实施任务
415
+
416
+ - 在 `bridge/src/channels/<current-impl>/` 下实现当前 IM adapter。
417
+ - 实现长连接接入方式,避免依赖公网回调地址。
418
+ - 实现基础验签、消息识别、事件去重与最小异常处理。
419
+ - 实现 1:1 使用边界与 allowlist 校验。
420
+ - 实现 **Immediate Ack**:
421
+ - 消息一进入系统,在通过最小校验后立即给出 reaction 级回执
422
+ - 让用户立刻知道“消息已收到”
423
+ - 实现消息格式化层:
424
+ - Markdown 转通道展示格式
425
+ - 表格/长文拆分
426
+ - 文本降级与安全截断
427
+ - 借鉴 `nanobot` 中已被验证过的行为,但不要把它的整体架构搬进来。
428
+ - 保持 Core 层仍只依赖标准 channel contract。
429
+
430
+ ### 7.5 验证与测试
431
+
432
+ - 为格式化器编写测试,覆盖 Markdown、表格拆分、长文本拆分。
433
+ - 为 adapter 编写测试,覆盖授权用户、未授权用户、重复消息、异常消息、Immediate Ack 与长消息拆分。
434
+ - 人工真实联调一次:
435
+ - 发出消息
436
+ - 立即收到回执
437
+ - 收到正式回复
438
+ - 验证全流程不需要公网地址、域名或回调 URL。
439
+
440
+ ### 7.6 DoD
441
+
442
+ - 当前 IM 通道可以稳定收消息、回 Ack、发结果。
443
+ - 未授权对象会被稳定拒绝。
444
+ - 通道逻辑没有反向污染 Core 抽象。
445
+
446
+ ---
447
+
448
+ ## 8. Stage 5:官方 Codex Runtime 集成(已完成)
449
+
450
+ ### 8.1 目标
451
+
452
+ 把真实的官方 Codex Runtime 接入进来,让 `work-ally` 真正围绕官方大脑工作。
453
+
454
+ ### 8.2 范围
455
+
456
+ 本阶段只做 Runtime 集成,不重新解释或接管官方 Codex 的模型配置、认证与提示词体系。
457
+
458
+ ### 8.3 依赖
459
+
460
+ - Stage 4 完成
461
+
462
+ ### 8.4 实施任务
463
+
464
+ - 实现 `bridge/src/runtime-client.ts`,对接 `codex app-server`。
465
+ - 明确官方 Codex runtime 的启动契约:
466
+ - 与 `work-ally` 在同一系统用户上下文运行
467
+ - 共享同一个 HOME
468
+ - 共享官方 Codex 可见的环境变量与认证上下文
469
+ - 由 `work-ally` 负责:
470
+ - 检查 `codex app-server` 是否可启动
471
+ - 启动、停止、健康检查与日志管理
472
+ - 明确 `work-ally` 不负责:
473
+ - 解析 `~/.codex/config.toml` 的业务含义
474
+ - 复制 API key 到自己的 `.env`
475
+ - 发明第二套模型/provider 配置
476
+ - 重写官方系统提示或运行循环
477
+ - 实现 Runtime 事件映射:
478
+ - 普通回复
479
+ - 进度
480
+ - 审批
481
+ - 错误
482
+ - 停止
483
+ - 确保所有正式对话都进入官方 Runtime,而不是桥接层自己假装在思考。
484
+
485
+ ### 8.5 验证与测试
486
+
487
+ - 对 `runtime-client.ts` 编写接口层测试,覆盖 thread 创建、消息发送、事件流处理。
488
+ - 在本机环境做 healthcheck smoke test,确认 `codex app-server` 可被拉起并可响应。
489
+ - 执行一条真实 IM 消息 -> 真实 Runtime -> 真实回复的人工联调。
490
+
491
+ ### 8.6 DoD
492
+
493
+ - 当前 IM 消息已经由真实官方 Runtime 处理并给出正式回复。
494
+ - `ally.sh` 没有长出第二套模型配置与 agent loop。
495
+ - Runtime、工作空间与用户本地官方 Codex 环境三者边界清晰。
496
+
497
+ ---
498
+
499
+ ## 9. Stage 6:连续对话、审批与恢复(已完成)
500
+
501
+ ### 9.1 目标
502
+
503
+ 让远程使用不只是“发一次消息拿一次回复”,而是真正具备连续 thread、审批闭环、长任务观察与基础恢复能力。
504
+
505
+ ### 9.2 范围
506
+
507
+ 本阶段补齐使用连续性与运行恢复,不引入主动任务调度。
508
+
509
+ ### 9.3 依赖
510
+
511
+ - Stage 5 完成
512
+
513
+ ### 9.4 实施任务
514
+
515
+ - 建立稳定的 conversation -> thread 绑定规则。
516
+ - 实现命令语义:
517
+ - `/new`
518
+ - `/status`
519
+ - `/approve`
520
+ - `/deny`
521
+ - `/stop`
522
+ - 实现审批记录与审批回传。
523
+ - 实现长任务阶段性进度摘要与消息回送。
524
+ - 完善 `session-store.ts` 的 turn 生命周期记录。
525
+ - 实现 `start / stop / status / restart` 的真实进程编排。
526
+ - 实现恢复语义:
527
+ - 识别陈旧 pid / lock
528
+ - Runtime 活、Bridge 死时只补 Bridge
529
+ - Bridge 活、Runtime 死时先修 Runtime
530
+ - 保留日志、session 与审批台账,不在停止时顺手清空历史。
531
+
532
+ ### 9.5 验证与测试
533
+
534
+ - 编写集成测试覆盖 `/new`、审批流、停止流。
535
+ - 编写恢复测试,模拟 Bridge 进程死掉、Runtime 进程死掉、pid 残留等情况。
536
+ - 人工联调:
537
+ - 在同一会话中连续对话
538
+ - 触发一次审批
539
+ - 处理中途停止
540
+ - 重启后继续工作
541
+
542
+ ### 9.6 DoD
543
+
544
+ - 同一个远程会话能够连续工作,而不是每次都像第一次见面。
545
+ - 高风险动作可以进入审批闭环。
546
+ - 进程异常、重启、残留状态都有可解释的恢复路径。
547
+ - `/new`、`/status`、`/approve`、`/deny`、`/stop` 已有自动化回归覆盖。
548
+ - `/status` 不是只看本地 thread 绑定;它还会优先读取 Runtime 原生状态(`thread/read`,并可被 `thread/status/changed` 缓存兜底)。
549
+ - runtime 断连恢复语义继续坚持薄桥接:bridge 只在有限窗口内确认 turn 是否已完成,无法确认时明确要求用户重发,而不自造厚重的任务续跑系统。
550
+
551
+ ---
552
+
553
+ ## 10. Stage 7:主动能力与记忆闭环(已完成)
554
+
555
+ ### 10.1 目标
556
+
557
+ 把 `work-ally` 从“被动回复”推进到“能主动做事”,并建立原材料 -> 每日记忆 -> 长期记忆的闭环。
558
+
559
+ ### 10.2 范围
560
+
561
+ 本阶段实现 routines、scheduler、run 记录、nightly memory digest 与相关技能装配点。
562
+
563
+ ### 10.3 依赖
564
+
565
+ - Stage 6 完成
566
+
567
+ ### 10.4 实施任务
568
+
569
+ - 实现 `routines_path` 任务定义契约,推荐 YAML。
570
+ - 实现 `routine list / run / enable / disable` 命令。
571
+ - 实现 `bridge/src/scheduler.ts`:
572
+ - 扫描 routine 定义
573
+ - 合并本地启停覆盖
574
+ - 计算下一次触发点
575
+ - 做 dedupe、防重、busy 保护
576
+ - 实现 assistant desk `.system/runtime/routines-state.json`。
577
+ - 实现 assistant desk `.system/runs/` 记录:
578
+ - `latest.json`
579
+ - 按次落盘的 run 记录
580
+ - 实现主动执行时的 thread 选择语义:`reuse` / `new`。
581
+ - 实现 `writeback` 的第一批安全能力:
582
+ - `append_markdown`
583
+ - `none`
584
+ - 实现 `push` 的第一批能力:
585
+ - `none`
586
+ - 推送到默认 IM 目标
587
+ - 实现 nightly `memory-digest`:
588
+ - 原材料只来自自动沉淀的黑匣子 archive 与 session 记录
589
+ - 不依赖模型在白天“自己记得写备忘”
590
+ - 产出 `journal/<date>.md` 与 `MEMORY.md` 的可审阅更新
591
+ - 把 `archive-reader`、`memory-digest` 这类机制做成 skills 或等价装配点,而不是第二人格提示。
592
+
593
+ ### 10.5 验证与测试
594
+
595
+ - 编写 scheduler 单元测试,覆盖下次触发时间、dedupe、busy 跳过。
596
+ - 编写 routine 集成测试,覆盖手动运行、定时运行、push/writeback 行为。
597
+ - 用一批样例 archive 文件执行 nightly digest,验证能稳定生成每日记忆与长期记忆。
598
+ - 人工联调:
599
+ - 手动触发一条 routine
600
+ - 等待一条定时 routine
601
+ - 查看 run 记录
602
+ - 查看记忆文件输出
603
+
604
+ ### 10.6 DoD
605
+
606
+ - 产品具备主动例行能力,而不只是被动聊天入口。
607
+ - 原材料、run 记录、每日记忆、长期记忆已经形成可解释闭环。
608
+ - 记忆生成依赖黑匣子原材料,而不是依赖模型白天临时自觉。
609
+ - `routine list / run / enable / disable`、`push`、`append_markdown`、stale running 恢复均已有自动化回归。
610
+
611
+ ---
612
+
613
+ ## 11. Stage 8:Codex 直连远程文档能力(已完成)
614
+
615
+ ### 11.1 目标
616
+
617
+ 把 Feishu 文档能力收口为 **Codex 直接使用 Feishu Remote MCP**,避免在 `work-ally` 内再造一套文档 provider 子系统。
618
+
619
+ ### 11.2 范围
620
+
621
+ 本阶段只做四件事:
622
+
623
+ - 为当前系统用户提供薄的 MCP 安装、检查、移除封装
624
+ - 把“已有文档链接默认只读,除非用户明确要求修改”写成稳定产品规则
625
+ - 把 Codex 针对 Feishu MCP 工具调用弹出的那类确认提示,收口为默认自动处理的实现策略
626
+ - 从实现与文档中删除已废弃的旧文档发布路线
627
+
628
+ ### 11.3 依赖
629
+
630
+ - Stage 7 完成
631
+
632
+ ### 11.4 实施任务
633
+
634
+ - 新增并稳定 `ally mcp` 命令面:
635
+ - `status`
636
+ - `install-feishu`
637
+ - `remove-feishu`
638
+ - `list`
639
+ - 约定 assistant desk 的 `.system/config.env` 中只保留一个远程文档相关入口:
640
+ - `FEISHU_MCP_SERVER_URL`
641
+ - `install-feishu` 的本质应明确为:
642
+ - 对当前系统用户执行 `codex mcp add feishu --url ...`
643
+ - 不在 bridge 内再包一层远程文档读写实现
644
+ - 删除已不再采用的旧实现与测试资产:
645
+ - 旧文档发布子系统
646
+ - streamable MCP provider
647
+ - local-file provider
648
+ - 旧预检入口及相关脚本、测试、文档
649
+ - 把文档使用规则写进模板与维护文档:
650
+ - 用户给出已有飞书文档链接时,默认按只读参考处理
651
+ - 只有当用户明确要求“更新这个文档”时,才应写回
652
+ - “具备写能力”不等于“默认允许写”
653
+ - 把工具调用确认策略写成稳定行为:
654
+ - `WORK_ALLY_MCP_TOOL_APPROVAL_ALLOWLIST=feishu:*` 默认开启
655
+ - ally 只自动处理受信任 MCP(当前默认 Feishu)发起的工具确认与对应 elicitation
656
+ - Runtime 的命令 / 文件审批仍保留人工确认边界
657
+ - 保持架构边界:
658
+ - IM bridge 继续只做聊天、控制命令、编排、记忆闭环
659
+ - Feishu 文档读写能力属于 Codex 工具层,不属于 bridge 第二套实现
660
+
661
+ ### 11.5 验证与测试
662
+
663
+ - shell 回归覆盖:
664
+ - `tests/shell/mcp.sh`
665
+ - `tests/shell/security.sh`
666
+ - 至少验证这些行为:
667
+ - 缺少 `FEISHU_MCP_SERVER_URL` 时失败关闭
668
+ - `ally mcp install-feishu` 能写入当前用户的 Codex MCP 配置
669
+ - `ally mcp status` 能读取当前配置
670
+ - `ally mcp remove-feishu` 能移除该配置
671
+ - 默认不会把 Feishu MCP 工具调用确认抛给最终 IM 用户
672
+ - 真实文档读链路与一次最小追加写入链路可独立自测
673
+ - 文档同步验证:
674
+ - README、快速开始、排障、实施指南、灯塔文档中不再出现旧文档发布路线
675
+ - 工作空间模板中已写明“已有远程文档链接默认只读”
676
+
677
+ ### 11.6 DoD
678
+
679
+ - `work-ally` 不再保留自建远程文档 provider 实现或入口。
680
+ - Feishu 文档能力的产品路线已统一为:**Codex 直接使用 Feishu Remote MCP**。
681
+ - `.system/config.env` 与 `ally mcp *` 已足以让维护者完成 MCP 安装与排障。
682
+ - “已有文档链接默认只读,明确要求后才修改”的规则已经写入模板与文档。
683
+ - Feishu MCP 工具确认与对应 elicitation 已默认由 ally 自动处理,不再成为最终用户噪音。
684
+
685
+ ---
686
+
687
+ ## 12. Stage 9:运维、安全与交付封装(已完成)
688
+
689
+ ### 12.1 目标
690
+
691
+ 让产品从“功能能跑”提升到“用户能长期放心使用、升级、恢复、排障”。
692
+
693
+ ### 12.2 范围
694
+
695
+ 本阶段补齐交付封装、更新路径、服务化、可观测性与安全硬化。
696
+
697
+ ### 12.3 依赖
698
+
699
+ - Stage 8 完成
700
+
701
+ ### 12.4 实施任务
702
+
703
+ - 完成 `update` 语义:
704
+ - 更新产品内部实现
705
+ - 不污染工作空间资产
706
+ - 出错时能回滚或至少明确止损
707
+ - 补齐日志、状态与诊断输出:
708
+ - `logs`
709
+ - `status`
710
+ - 状态文件
711
+ - 健康检查
712
+ - 补齐工作空间级生命周期语义:
713
+ - `bridge.pid` 仅作为句柄,不作为唯一事实来源
714
+ - `start` / `stop` / `status` 能按工作空间归属发现并清理孤儿 bridge
715
+ - 重复 bridge 不再导致 stop 漏停与持续噪音
716
+ - 为个人电脑模式准备常驻方案:
717
+ - 手动 `start`
718
+ - 可选服务化接管(如 `launchd` / `systemd` 等)
719
+ - 但无论何种方式都必须与官方 Codex 使用同一系统用户上下文
720
+ - 补齐安全基线:
721
+ - allowlist 默认关闭,填写后严格生效
722
+ - 关键配置缺失时失败关闭
723
+ - 群聊默认走显式触发,不接受普通噪音消息
724
+ - 默认不开放公网回调
725
+ - 默认限制远程文档工具范围
726
+ - 明确 kill switch:`ally stop`
727
+ - 补齐重建与恢复手册:
728
+ - 删除实现缓存后恢复
729
+ - 更换机器后恢复
730
+ - 凭据轮换与重新授权
731
+ - 补齐运维文档:
732
+ - 启动
733
+ - 停止
734
+ - 更新
735
+ - 排障
736
+ - 恢复
737
+
738
+ ### 12.5 验证与测试
739
+
740
+ - 做一次“从零初始化 -> 启动 -> 更新 -> 重启 -> 停止”的运维 smoke test。
741
+ - 做一次“删掉内部实现 -> 恢复”的重建测试。
742
+ - 做一次“缺失关键配置 / 凭据过期 / 未授权用户”的负向测试。
743
+ - 做一次“远程文档权限受限目录 / 缺失 target node”的安全边界测试。
744
+
745
+ ### 12.6 DoD
746
+
747
+ - 用户侧的交付形态已经清晰、稳定、可重建。
748
+ - 出错时有清晰排障入口,而不是只能靠猜。
749
+ - 安全基线已经从设计要求落实到默认行为。
750
+ - 真实 `codex app-server` 探针、codex routine shell 验收与前台服务模式均已纳入自动化回归。
751
+
752
+ ---
753
+
754
+ ## 13. Stage 10:发布验收与完工出门(已完成)
755
+
756
+ ### 13.1 收口结论
757
+
758
+ 第一阶段最终已经完成下面四件事:
759
+
760
+ - 自动化回归通过,`npm test` 与 `npm run test:maintainer` 都可作为稳定基线
761
+ - 真人验收通过,覆盖 Feishu IM 闭环、控制命令、审批、routine / scheduler、nightly digest,以及 Feishu Remote MCP 的只读 / 显式写回边界
762
+ - 干净工作空间交接通过,使用者可仅凭 `docs/user-quickstart.md` 完成接入、启动、恢复
763
+ - 交付文档收口完成:用户快速开始、运维、排障、开发协作、人工验收、灯塔、实施指南口径已经统一
764
+
765
+ ### 13.2 关键验证结论
766
+
767
+ - 工作空间资产与产品运行态已经分离
768
+ - 用户只做必要动作,不需要理解内部实现模块
769
+ - 黑匣子日志可以独立支撑维护者复盘,不再默认依赖用户手工回贴整段聊天记录
770
+ - Runtime 原生能力边界已经明确:上下文、审批、MCP、thread 生命周期继续坚持“官方能力优先,ally 只做薄路由”
771
+
772
+ ### 13.3 DoD
773
+
774
+ - 方案文档、实施指南、实现仓库与用户交付形态已经闭环
775
+ - 一个新的实施者或用户仅靠交付文档(尤其是 `docs/user-quickstart.md`)就能完成接入、运行、更新与恢复
776
+ - 可以对你汇报:**第一阶段产品开发完成**
777
+
778
+ ---
779
+
780
+ ## 14. 阶段推进硬规则
781
+
782
+ 为了防止项目又回到“想做很多,但每一块都没有封口”的状态,最后再把推进规则写死:
783
+
784
+ - 每个阶段必须先过本阶段 DoD,再进入下一阶段主线。
785
+ - 每个阶段都必须同步更新文档、测试与夹具,不能只交代码。
786
+ - 每个阶段都必须保持模块边界,不允许把临时逻辑塞进门面或单个巨型脚本。
787
+ - 如果阶段中发现灯塔文档需要修订,先修灯塔,再继续代码推进。
788
+ - 如果某阶段尚未通过,但确实要预研后续阶段,预研结果不能冒充“已完成”。
789
+
790
+ 这份实施指南不是附属材料,而是完整产品开发的执行主线。