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,190 @@
1
+ # Engineering SOP Skillization
2
+
3
+ 更新时间:2026-03-21
4
+ 状态:Implemented
5
+ Owner:Ally
6
+ 相关文档:
7
+ - `skills/issue-to-spec-triage/`
8
+ - `skills/post-implementation-closure/`
9
+ - `skills/feishu-production-debug/`
10
+ - `skills/product-spec/`
11
+ - `docs/developer-workflow.md`
12
+ - `AGENTS.md`
13
+
14
+ ## 1. Summary
15
+
16
+ 这次已经把“工程 SOP Skill 化”的第一轮正式落地了。
17
+
18
+ 交付结果不是新的用户功能,而是给项目维护者补上 3 个内部工程 Skill,让一些高频、重复、容易靠聊天记录口耳相传的工程 workflow 变成明确、可复用、可按需触发的能力包:
19
+
20
+ 1. `issue-to-spec-triage`
21
+ 2. `post-implementation-closure`
22
+ 3. `feishu-production-debug`
23
+
24
+ 这轮落地同时也把一条边界写死了:
25
+
26
+ > 基础纪律继续留在规则层;只有阶段性、按需触发、可复用的 workflow,才做成 Skill。
27
+
28
+ ## 2. 背景
29
+
30
+ 项目已经明确进入 `skill-first` 长期方向,但之前更偏“产品 capability 往哪里长”的判断,还缺一层“工程协作本身哪些东西值得 Skill 化”的收口。
31
+
32
+ 实际协作里反复出现的问题非常明确:
33
+
34
+ - 需求、想法、问题进入项目时,经常需要先分诊,再决定要不要立 spec。
35
+ - 一个实现做完后,经常需要把 `review -> 回归 -> 文档同步 -> 状态回写 -> commit readiness` 这整段闭环重新组织一遍。
36
+ - 遇到真人 Feishu 链路异常时,容易先拍脑袋怀疑 bridge,而不是先按平台权限、事件投递、路由、回投的顺序排查。
37
+
38
+ 这些都不是 bridge core 的运行合同,但又明显不是一次性对话技巧,因此适合收成 Skill。
39
+
40
+ ## 3. 问题定义
41
+
42
+ 如果不把这类工程 SOP 收成稳定能力包,会持续出现这些问题:
43
+
44
+ 1. 基础纪律和阶段性 workflow 混在一起,规则层越来越重。
45
+ 2. 高频 SOP 只留在聊天记录里,每次低上下文场景都要重新讲。
46
+ 3. 本该始终生效的纪律可能被误塞进 Skill,导致触发不稳定。
47
+ 4. 没有明确 shortlist,后续容易无节制地长出低价值 Skill。
48
+
49
+ ## 4. 这次实际交付了什么
50
+
51
+ ### 4.1 新增 3 个工程 Skill
52
+
53
+ #### A. `skills/issue-to-spec-triage/`
54
+
55
+ 用于在想法、抱怨、bug、需求和边界质疑进入项目时,先判断它到底是:
56
+
57
+ - `small-bugfix`
58
+ - `boundary-fix`
59
+ - `spec-needed`
60
+ - `hold`
61
+
62
+ 它解决的是“先分诊,再决定是否进入 spec 流”的问题。
63
+
64
+ #### B. `skills/post-implementation-closure/`
65
+
66
+ 用于在实现基本完成后,推动工程闭环,而不是半成品汇报。
67
+
68
+ 它把这几件事收成一个固定 workflow:
69
+
70
+ - self-review
71
+ - 回归 / clean-env 验证
72
+ - 文档漂移检查
73
+ - dashboard / spec 状态回写
74
+ - commit readiness 判断
75
+
76
+ #### C. `skills/feishu-production-debug/`
77
+
78
+ 用于排查真实 Feishu 生产链路问题。
79
+
80
+ 它明确要求按顺序排查:
81
+
82
+ - 先确认症状
83
+ - 再看消息有没有进入 bridge
84
+ - 再看平台权限和事件投递
85
+ - 再看路由
86
+ - 最后看回复回投
87
+
88
+ ### 4.2 每个 Skill 都采用 instruction-first 设计
89
+
90
+ 这轮没有为新 Skill 引入脚本执行层,也没有做额外 marketplace 或安装系统。
91
+
92
+ 当前统一采用:
93
+
94
+ - `SKILL.md`
95
+ - `references/`
96
+
97
+ 也就是说,先把工作流说明和参考材料收清楚,等后续真的出现高重复、强确定性的步骤,再决定是否需要 `scripts/`。
98
+
99
+ ### 4.3 项目规则已同步这条边界
100
+
101
+ 项目级规则已明确写出:
102
+
103
+ - 基础纪律、长期产品边界、表达与协作铁律继续留在规则层
104
+ - Skill 只承接阶段性、按需触发、可复用的 workflow
105
+
106
+ ## 5. 机制设计
107
+
108
+ ### 5.1 双层模型继续固定
109
+
110
+ #### A. 规则层
111
+
112
+ 继续承接必须始终生效的内容,例如:
113
+
114
+ - `faithful bridge / KISS`
115
+ - `apply_patch` 编辑纪律
116
+ - 文件规模约束
117
+ - spec 纪律
118
+ - 先闭环再汇报
119
+
120
+ 这些内容继续留在:
121
+
122
+ - `AGENTS.md`
123
+ - `SOUL.md`
124
+ - `MISTAKES.md`
125
+ - `MEMORY.md`
126
+
127
+ #### B. Skill 层
128
+
129
+ 只承接:
130
+
131
+ - 阶段性 workflow
132
+ - 需要按任务相关性触发的 SOP
133
+ - 可复用但不需要永远常驻的过程能力
134
+
135
+ ### 5.2 与现有 Skill 的关系
136
+
137
+ - `product-spec` 仍负责写 spec / refine spec / review spec。
138
+ - `issue-to-spec-triage` 负责更前一层:先决定要不要进入 spec 流。
139
+ - `post-implementation-closure` 负责实现后闭环。
140
+ - `feishu-production-debug` 负责真实 Feishu 产线链路排障。
141
+
142
+ 它们和已有 `archive-reader`、`memory-digest` 不重叠。
143
+
144
+ ## 6. 文档同步
145
+
146
+ 这次已同步更新:
147
+
148
+ - `AGENTS.md`
149
+ - `README.md`
150
+ - `docs/developer-workflow.md`
151
+ - `DASHBOARD.md`
152
+
153
+ 其中:
154
+
155
+ - `README.md` 增加了工程维护 Skills 的入口说明
156
+ - `docs/developer-workflow.md` 增加了推荐的工程 Skill 使用场景
157
+ - `DASHBOARD.md` 把该专题从规划态收进已完成
158
+
159
+ ## 7. 验收标准
160
+
161
+ ### 7.1 能力包存在
162
+
163
+ 1. 仓库内已存在 3 个新的 Skill 目录。
164
+ 2. 每个 Skill 都有 `SKILL.md`。
165
+ 3. 每个 Skill 都有最小必要的 `references/`,而不是把细节全塞进 `SKILL.md`。
166
+
167
+ ### 7.2 边界清晰
168
+
169
+ 1. 规则层和 Skill 层的分工已写入项目规则。
170
+ 2. 新 Skill 没有篡改 bridge core 或用户主路径。
171
+ 3. 新 Skill 没有把“永远都要遵守”的纪律误搬进去。
172
+
173
+ ### 7.3 维护口径一致
174
+
175
+ 1. 工程维护入口文档已能看到这些 Skill。
176
+ 2. Dashboard 已把该专题记为完成,不再停留在规划态。
177
+ 3. assistant 长期记忆已同步这条稳定判断。
178
+
179
+ ## 8. 非目标与后续
180
+
181
+ 这次没有做的事情:
182
+
183
+ 1. 不做 Skill marketplace
184
+ 2. 不做第二套插件平台
185
+ 3. 不做脚本优先的复杂 Skill runtime
186
+ 4. 不把已有旧能力大规模外迁
187
+
188
+ 如果后续继续扩展,优先问题不是“还能做多少 Skill”,而是:
189
+
190
+ > 这件事到底是不是阶段性 workflow,是否真的值得脱离规则层单独存在。
@@ -0,0 +1,376 @@
1
+ # SPEC: 忠实中间层核心瘦身重构(低上下文版)
2
+
3
+ 更新时间:2026-03-20
4
+ 状态:Completed
5
+ Owner:work-ally product / engineering
6
+ 相关文档:
7
+ - `README.md`
8
+ - `AGENTS.md`
9
+ - `docs/planning/SPEC-minimal-bridge-semantics-and-user-visible-surface.md`
10
+ - `docs/planning/SPEC-bridge-app-server-protocol-alignment.md`
11
+
12
+ ## 0. 当前进度
13
+
14
+ - Slice 1 已落地:普通自然语言主路径不再读取 `work-session ownership / attached session`。
15
+ - Slice 2 / 3 已完成第一轮减法:`SessionMeta`、`TurnLedgerRecord` 与 `/status` surface 已移除一批不再服务 bridge core 的厚状态字段,例如 `lastTurnStatus`、`pendingUserInputPrompt`、`pendingUserInputQuestionIds`、`runtimeStatus`、`resultPersistedAt`。
16
+ - Slice 4 已完成:旧厚状态与普通聊天主路径无关的判断已退出主链路,相关文档与测试已同步收口。
17
+ - 当前验证已完成:`npm run test:bridge` 全绿(206/206)。
18
+
19
+ ## 1. Summary
20
+
21
+ 这次重构只做一件事:
22
+
23
+ > 把 `work-ally` 的 bridge core 收回到“忠实桥接 Feishu <-> Codex App Server + 最小必要补偿”,删掉不该长期留在核心路径里的厚语义和外围依赖。
24
+
25
+ 这不是一次“继续拆文件”的整理,而是一次明确的减法重构。
26
+
27
+ 本次必须做到三件事:
28
+
29
+ 1. 普通聊天主路径不再依赖 `work-session / handoff / archive / supervisor` 才能成立。
30
+ 2. `turn / session / recovery` 只保留最小必要状态,不再维护一套本地任务脑。
31
+ 3. 每一刀都独立自测、回归、提交;用小步重构保稳定,不用长期保留旧路径来求稳。
32
+
33
+ ## 2. 背景
34
+
35
+ 当前 bridge 已经过一轮模块拆分,但核心问题还在:
36
+
37
+ 1. 文件拆开了,产品边界没有真正收回来。
38
+ 2. 普通聊天主路径旁边仍挂着一圈外围语义。
39
+ 3. `SessionStore`、`recovery`、`human-gate` 仍然偏厚。
40
+ 4. 某些文件已经明显过大,维护成本继续上升。
41
+
42
+ 代码现状已经说明:
43
+
44
+ - `receiver.ts` 仍直接连着 `receiver-work-session.ts`、`receiver-recovery.ts`、`receiver-human-gate.ts`。
45
+ - `server-runtime-app.ts` 仍把 bridge core、scheduler、archive、receiver、session store 黏在一起。
46
+ - `session-store-turn-ledger.ts` 不只是记录 active turn,而是在承担一套更厚的 turn lifecycle。
47
+
48
+ 所以这次不是继续讲“以后要变薄”,而是直接规定:
49
+
50
+ - 什么保留
51
+ - 什么收薄
52
+ - 什么退出主路径
53
+ - 什么确认无用后删除
54
+
55
+ ## 3. 问题定义
56
+
57
+ ### 3.1 普通聊天主路径还不够“忠实桥接”
58
+
59
+ 当前普通消息路径仍容易被外围能力影响:
60
+
61
+ - `work-session / handoff`
62
+ - `archive / conversation view`
63
+ - supervisor / hosting 语义
64
+
65
+ 这不符合产品边界。普通聊天应当只取决于:
66
+
67
+ - Feishu 入站消息
68
+ - 当前 conversation 对应的 thread
69
+ - runtime 当前 turn 状态
70
+ - 最小必要的人机 gate
71
+ - 最终结果投递
72
+
73
+ ### 3.2 bridge 自己仍然维护了偏厚的本地语义
74
+
75
+ 当前 bridge 不只是在做桥接,还在维护额外语义:
76
+
77
+ - 厚的 turn ledger
78
+ - 厚的 recovery 分支
79
+ - 厚的 waiting / gate 语义
80
+
81
+ 这会让中间层慢慢长成第二套任务系统。
82
+
83
+ ### 3.3 代码体量和模块边界仍然不健康
84
+
85
+ 这次重构也要顺手落实工程纪律:
86
+
87
+ - 触碰到的超大文件应主动拆分。
88
+ - 300 行左右就要反思是否继续拆。
89
+ - 1700~2000 行级别文件不可接受。
90
+
91
+ 重点不是为了“漂亮”,而是为了让后续继续做减法时不被文件规模拖死。
92
+
93
+ ## 4. 目标
94
+
95
+ 本次重构的完成标准只有 5 条:
96
+
97
+ 1. bridge core 重新只围绕“协议转接 + 最小补偿”成立。
98
+ 2. 普通聊天主路径不再依赖外围层语义成立。
99
+ 3. turn / recovery / gate 状态明显减少。
100
+ 4. 新代码不再围绕旧厚状态继续长分支。
101
+ 5. 相关文档、测试、代码结构对齐同一套边界。
102
+
103
+ ## 5. 非目标
104
+
105
+ 这次明确不做:
106
+
107
+ 1. 不新造第二套任务状态系统。
108
+ 2. 不为了瘦身牺牲消息稳定性。
109
+ 3. 不顺手做新的运维平台、面板或调度器。
110
+ 4. 不保留“也许以后有用”的废路径。
111
+ 5. 不把所有外围能力一次性连根拔掉;本次只要求它们退出普通聊天主路径。
112
+
113
+ ## 6. 这次重构后的 bridge core 定义
114
+
115
+ 本次之后,bridge core 的产品定义固定为:
116
+
117
+ > 接收 Feishu 消息,路由到对应 Codex thread / turn,把 Codex 的真实进度、审批请求、user input 请求与最终结果稳定送回 Feishu,并只承担最小必要补偿。
118
+
119
+ bridge core 允许保留的最小补偿只有:
120
+
121
+ 1. inbound 去重
122
+ 2. active turn 最小跟踪
123
+ 3. visible approval / user-input gate
124
+ 4. final-state authoritative confirmation
125
+ 5. final reply delivery ledger
126
+ 6. bounded redelivery
127
+
128
+ 除此之外,不再往 bridge core 里继续长:
129
+
130
+ 1. 本地任务生命周期世界
131
+ 2. 丰富 recovery 状态树
132
+ 3. 多表面 ownership 语义
133
+ 4. archive 反向主导主路径判断
134
+
135
+ ## 7. 模块边界结论
136
+
137
+ ### 7.1 必须保留在 core 的模块
138
+
139
+ 这些是 bridge core 的一部分,保留:
140
+
141
+ - `bridge/src/channels/feishu/*`
142
+ - `bridge/src/runtime-client*`
143
+ - `bridge/src/router.ts`
144
+ - `bridge/src/runtime-user-input.ts`
145
+ - `bridge/src/channel-delivery.ts`
146
+ - `bridge/src/receiver-thread-start.ts`
147
+ - `bridge/src/receiver-turn-steer.ts`
148
+ - `bridge/src/receiver-turn-result.ts`
149
+ - `bridge/src/receiver-delivery.ts`
150
+ - `bridge/src/session-store-inbound-acceptance.ts`
151
+ - `bridge/src/session-store-delivery.ts`
152
+
153
+ ### 7.2 必须收薄但仍留在 core 的模块
154
+
155
+ 这些能力仍需要,但语义必须变薄:
156
+
157
+ - `bridge/src/session-store-turn-ledger.ts`
158
+ - `bridge/src/session-store-human-gate.ts`
159
+ - `bridge/src/receiver-recovery.ts`
160
+ - `bridge/src/receiver-human-gate.ts`
161
+ - `bridge/src/receiver-turn-coordination.ts`
162
+ - `bridge/src/receiver-runtime-state.ts`
163
+
164
+ 要求:
165
+
166
+ - 只保留 core 真正需要的状态
167
+ - 不再继续长新的厚状态分支
168
+ - 触碰时顺手拆掉过大的文件段落
169
+
170
+ ### 7.3 必须退出普通聊天主路径的外围模块
171
+
172
+ 这些能力可以继续存在,但不得再参与普通聊天默认路径:
173
+
174
+ - `bridge/src/handoff-service.ts`
175
+ - `bridge/src/work-session-store.ts`
176
+ - `bridge/src/receiver-work-session.ts`
177
+ - `bridge/src/receiver-control-work-session.ts`
178
+ - `bridge/src/archive-store.ts`
179
+ - `bridge/src/conversation-view-store.ts`
180
+ - `bridge/src/scheduler.ts`
181
+ - `bridge/src/server-routine-*`
182
+ - `internal/modules/runtime/supervisor.sh`
183
+ - `internal/modules/runtime/assistant-autosave.sh`
184
+
185
+ 规则:
186
+
187
+ - 显式控制命令可继续进入这些模块。
188
+ - 普通自然语言消息默认不经过这些判断。
189
+ - 确认无调用、无产品价值后,直接删除,不保留“温和退出”状态。
190
+
191
+ ## 8. 机制设计
192
+
193
+ ### 8.1 普通消息主路径
194
+
195
+ 普通 Feishu 消息进入 bridge 后,只允许经过下面 5 个判断:
196
+
197
+ 1. 标准化 inbound,并完成去重。
198
+ 2. 基于 `conversationKey` 找到绑定的 `threadId`。
199
+ 3. 若当前存在 active turn,则走 `turn/steer`;否则按需 `thread/start` + `turn/start`。
200
+ 4. 若 runtime 发来 approval / user-input 请求,则只记录“当前可见 gate”。
201
+ 5. 当 runtime 或 authoritative pull 确认 final result 后,完成投递与必要补发。
202
+
203
+ 普通主路径禁止再读取:
204
+
205
+ - work-session ownership
206
+ - archive 事实
207
+ - routine / scheduler 状态
208
+ - supervisor 运行态
209
+
210
+ ### 8.2 human gate 语义
211
+
212
+ human gate 只表达一件事:
213
+
214
+ > 当前 conversation 上,是否存在一个已经对用户可见、且仍等待人类回复的 approval / user-input 请求。
215
+
216
+ 不再承担:
217
+
218
+ - 更丰富的 waiting 分类
219
+ - recovery 中间状态
220
+ - 与 work-session 绑定的复杂协作语义
221
+
222
+ ### 8.3 recovery 语义
223
+
224
+ recovery 只保留两类补偿:
225
+
226
+ 1. final-state reconcile
227
+ 2. final reply redelivery
228
+
229
+ 不再继续维护:
230
+
231
+ - `pending_recovery`
232
+ - `recovery_required`
233
+ - `superseded`
234
+ - 其他为了描述本地 turn 生命周期而存在的状态分支
235
+
236
+ ### 8.4 turn ledger 语义
237
+
238
+ turn ledger 只保留:
239
+
240
+ - 当前 active turn
241
+ - final result 投递所需最小记录
242
+ - 必要的 suppression / delivery 防重信息
243
+
244
+ 不再继续承担:
245
+
246
+ - 丰富 execution lifecycle
247
+ - 额外 waiting / interrupted / resumed 世界
248
+ - 与外围产品层耦合的状态表达
249
+
250
+ ## 9. 实施切片
251
+
252
+ 这次必须按切片推进。每一刀都要做到:改完、自测、review、回归、提交,再进下一刀。
253
+
254
+ ### Slice 1:切断外围层对普通聊天主路径的影响
255
+
256
+ 目标:先让普通聊天独立成立。
257
+
258
+ 本刀要改:
259
+
260
+ - `receiver.ts`
261
+ - `receiver-work-session.ts`
262
+ - `handoff-service.ts`
263
+ - `server-runtime-app.ts`
264
+ - 与 archive / supervisor 相关的主路径调用点
265
+
266
+ 完成标准:
267
+
268
+ 1. 普通自然语言消息不再依赖 work-session / handoff / archive / supervisor 判断。
269
+ 2. 显式控制命令仍可走对应控制路径。
270
+ 3. 普通聊天回归通过。
271
+
272
+ ### Slice 2:收薄 human gate 与 recovery
273
+
274
+ 目标:删掉不必要的 waiting / recovery 语义。
275
+
276
+ 本刀要改:
277
+
278
+ - `receiver-human-gate.ts`
279
+ - `session-store-human-gate.ts`
280
+ - `receiver-recovery.ts`
281
+
282
+ 完成标准:
283
+
284
+ 1. gate 只保留 approval / user-input 的当前可见阻塞。
285
+ 2. recovery 只剩 final-state reconcile + redelivery。
286
+ 3. 旧厚 recovery 状态不再被新主路径读取。
287
+
288
+ ### Slice 3:收薄 turn ledger 与 session store
289
+
290
+ 目标:把 turn state 收回最小集合。
291
+
292
+ 本刀要改:
293
+
294
+ - `session-store-turn-ledger.ts`
295
+ - `session-store.ts`
296
+ - `receiver-turn-coordination.ts`
297
+ - `receiver-runtime-state.ts`
298
+
299
+ 完成标准:
300
+
301
+ 1. active turn / final delivery 之外的厚状态明显减少。
302
+ 2. 新主路径不再依赖旧 lifecycle 状态名。
303
+ 3. 触碰到的过大文件同步拆分。
304
+
305
+ ### Slice 4:删除确认无用的旧路径,并收口文档与测试
306
+
307
+ 目标:不要留下“已经不用,但还躺着”的债。
308
+
309
+ 本刀要改:
310
+
311
+ - 删除已确认无入口、无回归价值的旧分支 / 旧状态 / 旧调用
312
+ - 更新 `README.md`、`AGENTS.md`、相关 planning / completed 文档
313
+ - 补齐或更新对应测试
314
+
315
+ 完成标准:
316
+
317
+ 1. 旧厚路径没有继续被保留成“备用分支”。
318
+ 2. 文档与代码口径一致。
319
+ 3. 测试门禁覆盖新的主路径边界。
320
+
321
+ ## 10. 测试与回归要求
322
+
323
+ 每个 slice 至少覆盖:
324
+
325
+ 1. 普通消息进入正确 thread
326
+ 2. active turn follow-up 正确走 `turn/steer`
327
+ 3. approval / user-input 请求可见且可回复
328
+ 4. final result 能稳定回 Feishu
329
+ 5. delivery unavailable 后能补发
330
+ 6. foreground bridge 不依赖 supervisor 也能跑通主链路
331
+
332
+ 如果某个 slice 触碰到相关模块,还必须补:
333
+
334
+ - 对应 unit / integration 测试
335
+ - 必要的 shell 回归
336
+ - 被改文件的结构 review,避免继续养大文件
337
+
338
+ ## 11. DoD
339
+
340
+ 整个专题完成时,必须同时满足:
341
+
342
+ 1. 普通聊天主路径只剩“桥接 + 最小补偿”。
343
+ 2. work-session / archive / supervisor 不再参与普通聊天默认路径。
344
+ 3. recovery / gate / turn ledger 的状态数量明显下降。
345
+ 4. 已确认无价值的旧路径已删除,不留长期兼容壳。
346
+ 5. 触碰到的超大文件已按需拆分。
347
+ 6. README / AGENTS / 相关 spec 已同步当前边界。
348
+ 7. 核心回归通过,没有出现消息丢失、审批失效、结果不回来的回归。
349
+
350
+ ## 12. 风险与护栏
351
+
352
+ ### 12.1 风险
353
+
354
+ 1. 删厚状态时,可能误伤异常补偿路径。
355
+ 2. 切外围依赖时,可能误伤显式控制命令。
356
+ 3. 重构如果步子过大,问题会很难定位。
357
+
358
+ ### 12.2 护栏
359
+
360
+ 1. 先切主路径依赖,再删旧结构。
361
+ 2. 每一刀都必须是可独立验证、可独立提交的完整切片。
362
+ 3. 不用“长期双轨”来求稳;只允许短暂过渡,下一刀就收掉。
363
+ 4. 任何时候只要发现普通聊天稳定性下降,立即以稳定性优先。
364
+
365
+ ## 13. 最终结论
366
+
367
+ 这份 spec 落地时,bridge core 要回到一句话:
368
+
369
+ > 它只是一个忠实、稳定、克制的中间层,不再试图变成第二套任务系统。
370
+
371
+ 这次重构真正要做的,不是“继续整理”,而是四个动作:
372
+
373
+ 1. 保留核心
374
+ 2. 收薄核心
375
+ 3. 退出外围
376
+ 4. 删除废路径