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,362 @@
1
+ # SPEC: 极简桥梁语义与前台可见面收口
2
+
3
+ 更新时间:2026-03-18
4
+ 状态:Shipped / 2026-03-18 baseline
5
+ Owner:work-ally product / engineering
6
+ 相关文档:
7
+ - `docs/planning/SPEC-bridge-app-server-protocol-alignment.md`
8
+ - `docs/planning/SPEC-session-presence-and-state-visibility.md`
9
+ - `docs/issues/pending/ANALYSIS-ally-premature-recovery-notice-and-task-state-semantics-2026-03-18.md`
10
+ - `PRODUCT.md`
11
+ - `AGENTS.md`
12
+
13
+ ## 1. Summary
14
+
15
+ 这份 spec 要把 `work-ally` 的 bridge 前台语义进一步收回到一个更克制、更稳定的边界:
16
+
17
+ > `work-ally` 默认不是“任务解释器”,而是 **Feishu <-> Codex App Server 的稳定桥梁 + 最小必要辅助层**。
18
+
19
+ 这次收口不解决“桥能不能恢复”这个底层能力问题,而是解决另一个更根的问题:
20
+
21
+ 1. 哪些信息真的应该让用户看到
22
+ 2. 哪些只是 bridge 内部的收敛过程,不该变成前台提示
23
+ 3. 哪些提示属于必要协作信号,哪些提示只是中间层在解释自己
24
+
25
+ 本次完成后,bridge 用户面默认只保留:
26
+
27
+ - reaction ack
28
+ - 真实 runtime 中间输出
29
+ - 审批 / 补充输入 / 明确等待用户动作
30
+ - 最终结果
31
+ - 明确不可自动补偿时的兜底失败提示
32
+ - 上一轮结果未稳定送达时的补发提示
33
+ - 显式 slash 控制命令的结果
34
+
35
+ 除此之外,bridge 不再默认暴露自己的内部任务语义、内部 recovery 过程和内部状态清理过程。
36
+
37
+ ## 2. 背景
38
+
39
+ 最近几轮稳定性治理已经证明两件事:
40
+
41
+ 1. 内部 ledger、pull-primary、recovery、redelivery 这些骨架是必要的
42
+ 2. 但如果把这些内部状态继续翻译成大量用户提示,中间层就会重新变厚
43
+
44
+ 用户当前对产品边界的要求已经很明确:
45
+
46
+ - `work-ally` 最本质的工作,是在 Feishu 和 Codex App Server 之间稳定转交消息与结果
47
+ - bridge 只做必要的辅助工作,不做第二套“任务脑”
48
+ - 只有在用户必须行动,或系统必须诚实告知无法继续时,才应该前台出声
49
+
50
+ 此前的 recovery notice 问题已经暴露出一个典型风险:
51
+
52
+ - bridge 明明只是内部在补确认
53
+ - 但前台却先收到了“任务状态暂未确认”这类中间层自创解释
54
+ - 这会让用户误以为 bridge 掌握了一套高于协议事实的权威状态
55
+
56
+ 所以,这次不是单纯修一句文案,而是继续把 bridge 前台语义收薄。
57
+
58
+ ## 3. 问题定义
59
+
60
+ 当前系统还存在 4 类偏厚点。
61
+
62
+ ### 3.1 bridge 仍在前台解释自己的内部 recovery 过程
63
+
64
+ 例如:
65
+
66
+ - `系统正在继续确认这一轮结果。`
67
+ - 其他 recovery / unconfirmed 解释型提示
68
+
69
+ 这些文案虽然比“任务状态”更克制,但本质上仍然是 bridge 在解释自己的内部收敛过程。
70
+
71
+ ### 3.2 bridge 仍在前台解释自己的内部状态清理动作
72
+
73
+ 例如:
74
+
75
+ - `检测到上一轮残留的未完成状态;已清理旧状态,改为处理你刚发的新消息。`
76
+
77
+ 这类文案描述的是实现层行为,不是用户真正需要掌握的协作事实。
78
+
79
+ ### 3.3 文档口径仍把“任务语义状态”当作稳定产品面
80
+
81
+ 当前 README / quickstart / manual acceptance / presence spec 仍带有:
82
+
83
+ - 任务语义状态
84
+ - 恢复中提示
85
+ - 用户应该看到哪些中间状态
86
+
87
+ 这会把 bridge 往“轻量工作流状态机”方向继续推厚。
88
+
89
+ ### 3.4 “什么该前台可见”没有一条更硬的统一原则
90
+
91
+ 虽然已有 KISS 原则,但在 bridge 用户面这一层,还缺一条足够明确的执行规则,导致后续遇到故障或新 feature 时,很容易再往前台塞解释性提示。
92
+
93
+ ## 4. 目标
94
+
95
+ 本次收口必须达成下面 6 个目标:
96
+
97
+ 1. 明确 bridge 前台默认只转发协议事实、协作事实和必要动作提示
98
+ 2. 去掉默认用户语汇里的“任务状态”与等价厚语义心智
99
+ 3. 默认不再把短暂 recovery、内部 reconciliation、内部状态清理过程暴露给用户
100
+ 4. 保留审批、补充输入、重发兜底、补发兜底、slash 控制结果这些必要用户信号
101
+ 5. 让 README / quickstart / manual acceptance / planning spec 一起回到同一条边界
102
+ 6. 给后续工程一个清晰规则:除非满足“必须让用户现在行动或现在知道”,否则不要新增系统提示
103
+
104
+ ## 5. 非目标
105
+
106
+ 本次明确不做:
107
+
108
+ 1. 不删除内部 ledger / recovery / redelivery / pull-primary 机制
109
+ 2. 不改变审批、自测默认授权、handoff、same-machine session 等现有产品合同
110
+ 3. 不重做 UI 卡片协议
111
+ 4. 不在本期讨论桌面端诊断面要展示哪些内部状态
112
+ 5. 不否认“少量事实型提示”在某些场景下的必要性,但要把默认边界收紧
113
+
114
+ ## 6. 核心产品原则
115
+
116
+ 本次之后,bridge 前台统一遵守下面这条总原则:
117
+
118
+ > 默认只转发事实,不解释内部状态;只有用户必须行动,或系统必须诚实告知无法继续时,才显式打断。
119
+
120
+ 这里的“事实”,只允许来自三类来源:
121
+
122
+ 1. 官方协议事实
123
+ - approval request
124
+ - user input request
125
+ - turn 最终结果
126
+ 2. 桥接交付事实
127
+ - 上一轮结果当时未稳定送达
128
+ - 现在正在补发 / 补发失败
129
+ 3. 显式用户控制结果
130
+ - `/stop`
131
+ - `/new`
132
+ - `/takeover`
133
+ - `/codex`
134
+ - `/approve` / `/deny`
135
+
136
+ 凡是不属于这三类的,默认都应先视为 bridge 内部实现细节,而不是用户提示候选。
137
+
138
+ ## 7. 用户可见面的最小集合
139
+
140
+ V1 收口后,用户前台只保留下面 6 类可见信号。
141
+
142
+ ### 7.1 已收到
143
+
144
+ - 保留 reaction ack
145
+ - 不额外补“已收到,开始处理”文本状态
146
+
147
+ ### 7.2 Codex 真实进度
148
+
149
+ - 有真实 runtime commentary / progress 时,转发
150
+ - 没有真实进度时,不为了“显得系统没死”而编造一般性说明
151
+ - heartbeat 只作为极少数必要兜底,不作为主状态面
152
+
153
+ ### 7.3 等待用户动作
154
+
155
+ 必须保留:
156
+
157
+ - approval card
158
+ - user input prompt
159
+ - 对应的“现在轮到你了”最小说明
160
+
161
+ 因为这类信息直接决定用户是否需要立即行动。
162
+
163
+ ### 7.4 显式控制结果
164
+
165
+ 必须保留:
166
+
167
+ - `/stop` 的明确结果
168
+ - `/new` 的明确结果
169
+ - `/takeover` / `/codex` / `handoff attach` 相关结果
170
+ - `/approve` / `/deny` 的结果
171
+
172
+ 因为这类信息直接对应用户明确下达的控制动作。
173
+
174
+ ### 7.5 最终结果与明确失败
175
+
176
+ 必须保留:
177
+
178
+ - final reply
179
+ - completion without reply 的最小结束提示
180
+ - 在完整补偿后仍无法确认这一轮是否完成时,明确要求用户重发上一条消息
181
+
182
+ ### 7.6 上一轮未稳定送达
183
+
184
+ 必须保留:
185
+
186
+ - 上一轮结果未稳定送达时的补发提示
187
+ - 补发失败时的最小说明
188
+
189
+ 因为这是 bridge 作为稳定桥梁必须诚实告诉用户的交付事实。
190
+
191
+ ## 8. 默认不再前台暴露的内容
192
+
193
+ 下面这些内容,在默认用户路径里应收回内部:
194
+
195
+ ### 8.1 内部 recovery 尝试过程
196
+
197
+ 默认不再提示:
198
+
199
+ - bridge 正在补确认
200
+ - bridge 正在做 final-state reconciliation
201
+ - bridge 正在做内部 recovery attempt
202
+
203
+ 除非超过明确阈值后仍未收敛,并且已经进入必须对用户诚实告知的阶段。
204
+
205
+ ### 8.2 内部状态清理动作
206
+
207
+ 默认不再提示:
208
+
209
+ - 发现残留状态
210
+ - 已清理旧状态
211
+ - 已改为处理新消息
212
+
213
+ 正确做法应是:
214
+
215
+ - bridge 内部完成清理
216
+ - 然后直接进入新一轮正常处理
217
+ - 除非这个清理动作改变了用户必须知道的产品语义,否则不出声
218
+
219
+ ### 8.3 transport / reconciliation / ledger 术语
220
+
221
+ 默认不在用户前台出现:
222
+
223
+ - reconnecting / disconnected / recovered 这类实现层术语
224
+ - reconciliation / ledger / pending_recovery / delivery_unavailable 这类内部术语
225
+ - “任务状态”这类 bridge 自创总括语义
226
+
227
+ ## 9. 机制设计
228
+
229
+ ### 9.1 内外分层
230
+
231
+ 要明确分成三层:
232
+
233
+ 1. 内部稳定性层
234
+ - turn ledger
235
+ - recovery
236
+ - redelivery
237
+ - pull-primary
238
+ - pending_recovery / recovery_required / delivery_unavailable
239
+ 2. 协议 / 交付事实层
240
+ - approval / user input / turn result / delivery outcome
241
+ 3. 用户前台层
242
+ - 只取第 2 层中用户现在必须知道的部分
243
+
244
+ 这三层必须继续分离,不能再用前台文案直接暴露第 1 层内部状态。
245
+
246
+ ### 9.2 recovery 的默认策略
247
+
248
+ 默认流程应是:
249
+
250
+ 1. 内部先自动 recovery
251
+ 2. 在短暂窗口内静默收敛
252
+ 3. 如果成功,直接交付结果
253
+ 4. 只有在完成补偿后仍无法确认,才给用户发明确兜底说明
254
+
255
+ 换句话说:
256
+
257
+ - `recovery` 是内部机制
258
+ - `请重发上一条消息` 才是用户级结果
259
+ - 中间不应默认再插一层“我正在恢复”的解释提示
260
+
261
+ ### 9.3 stale / 残留状态的默认策略
262
+
263
+ 默认流程应是:
264
+
265
+ 1. 内部识别 stale / 残留状态
266
+ 2. 内部清理并切到正确路由
267
+ 3. 正常继续处理用户新消息
268
+ 4. 不额外宣布“我刚清理了什么”
269
+
270
+ 只有当 stale 行为已经影响到用户输入是否被接收、是否必须重发时,才补用户提示。
271
+
272
+ ### 9.4 waiting 的默认策略
273
+
274
+ waiting 场景继续保留,但边界更明确:
275
+
276
+ - approval / user-input 是用户必须行动的场景,所以必须提示
277
+ - artifact 尚未可见时,可以保留最小必要兜底,但不应扩成更厚的状态叙事
278
+
279
+ ## 10. 需要调整的代码面
280
+
281
+ ### 10.1 `bridge/src/translator.ts`
282
+
283
+ 目标:进一步删掉解释型状态文案,只保留最小事实型文案。
284
+
285
+ 重点:
286
+
287
+ 1. 去掉“任务状态”及等价词汇
288
+ 2. 审查 recovery / infrastructure / connection lifecycle 相关文案
289
+ 3. 只保留:
290
+ - 等待用户动作
291
+ - 明确不可确认时请重发
292
+ - 上一轮未稳定送达的补发说明
293
+ - 显式控制结果
294
+
295
+ ### 10.2 `bridge/src/receiver.ts`
296
+
297
+ 目标:把更多内部状态处理收回后台。
298
+
299
+ 重点:
300
+
301
+ 1. recovery attempt 默认静默
302
+ 2. stale active turn 清理默认静默
303
+ 3. 只有用户必须知道时,才发 `status_reply` / `error_reply`
304
+ 4. 检查现有 `status_reply` / `progress_update` 路径,逐个判断是否真的还该保留
305
+
306
+ ### 10.3 文档口径
307
+
308
+ 需要同步回写:
309
+
310
+ - `README.md`
311
+ - `docs/user-quickstart.md`
312
+ - `docs/manual-acceptance.md`
313
+ - `docs/planning/SPEC-session-presence-and-state-visibility.md`
314
+ - 必要时补充 `PRODUCT.md` / `DASHBOARD.md`
315
+
316
+ 目标是把“bridge 是稳定桥梁,不是任务解释器”写成长期口径。
317
+
318
+ ## 11. 验收标准
319
+
320
+ 满足下面条件,才算本专题完成。
321
+
322
+ ### 11.1 前台默认不再暴露内部 recovery 过程
323
+
324
+ 1. fresh turn 的短暂 recovery 不再默认出现在用户前台
325
+ 2. 只有完整补偿后仍无法确认,才明确提示用户重发
326
+ 3. 自动化测试覆盖“内部 recovery 成功但用户前台静默”的主路径
327
+
328
+ ### 11.2 前台默认不再暴露内部状态清理过程
329
+
330
+ 1. stale / 残留状态清理不再默认发“已清理旧状态”之类提示
331
+ 2. 清理后直接进入新消息正常处理
332
+ 3. 自动化测试覆盖该路径
333
+
334
+ ### 11.3 用户必须行动的提示仍完整保留
335
+
336
+ 1. approval / user-input 相关提示不丢
337
+ 2. `/stop`、`/new`、`/takeover`、`/codex` 等控制结果不丢
338
+ 3. delivery unavailable / redelivery 相关提示不丢
339
+
340
+ ### 11.4 文档口径一致
341
+
342
+ 1. README / quickstart / manual acceptance 不再把“任务状态”当作稳定产品面
343
+ 2. presence / protocol alignment 文档明确写出“默认只转发事实,不解释内部状态”
344
+
345
+ ## 12. 风险 / 假设 / 待决问题
346
+
347
+ ### 12.1 风险
348
+
349
+ 1. 如果收得过猛,可能把某些用户其实仍然需要的提示也一起删掉
350
+ 2. 某些 waiting artifact pending 场景,是否还需要一条最小兜底提示,需要结合真实 Feishu 表现再判断
351
+ 3. 部分旧测试、旧文档、旧思路会和新边界冲突,需要系统性清理
352
+
353
+ ### 12.2 假设
354
+
355
+ 1. 用户真正需要知道的是“我要不要现在行动”和“结果有没有稳定回来”,而不是 bridge 内部状态机细节
356
+ 2. bridge 内部 ledger / recovery 足够支撑静默补偿,不需要靠大量中间提示维持可信度
357
+
358
+ ### 12.3 待决问题
359
+
360
+ 1. `connectionLifecycleMessage` 在 active turn 下是否也应进一步静默,还是保留极少数事实型提示
361
+ 2. waiting artifact sync pending 是否完全收回内部,还是保留单条最小兜底
362
+ 3. `completion without reply` 的结束提示是否还要继续保留现状,还是再进一步收薄
@@ -0,0 +1,222 @@
1
+ # SPEC: NPM Alpha Distribution & Install-First Release Model
2
+
3
+ 更新时间:2026-03-31
4
+ 状态:Draft / Ready for review
5
+ Owner:work-ally product / engineering
6
+ 相关文档:
7
+ - `docs/product-spec-standard.md`
8
+ - `docs/planning/SPEC-local-stable-release-boundary.md`
9
+ - `internal/modules/runtime/release.sh`
10
+ - `README.md`
11
+
12
+ ## 1. Summary
13
+
14
+ 这份 spec 定义 `work-ally` 的发布模型切换:
15
+
16
+ > 从“本机 stable release 副本”切换为“npm 包发布 + install-first 使用模型”。
17
+
18
+ 第一阶段明确目标:
19
+
20
+ 1. 先支持 `macOS arm64`(M 系列)作为首发正式目标平台。
21
+ 2. 发布通道先走 `alpha`(例如 `0.x.y-alpha.n`),用于快速迭代和真实安装验证。
22
+ 3. 用户与维护者都通过 `npm install` / `npm update` 方式使用,不再依赖 `ally release` 产出本机 stable 副本。
23
+
24
+ 一句话:以后“发布”= 推到 npm;“使用/自测”= 从 npm 安装。
25
+
26
+ ## 2. 背景
27
+
28
+ 当前 `work-ally` 的稳定使用路径依赖本机 release 副本:
29
+
30
+ - `ally release` 会把源码树复制到 `~/.work-ally/releases/stable/`
31
+ - 默认 `ally` 入口优先消费这个本机 stable 目录
32
+
33
+ 这条路径在内部打磨阶段有效,但在接近公开发布阶段存在明显问题:
34
+
35
+ 1. 发布与分发不统一:外部用户拿不到“标准安装路径”,仍需理解源码仓库与本地 release 概念。
36
+ 2. 维护者心智分裂:开发态、发布态、使用态不是同一条链路。
37
+ 3. 可传播性弱:无法直接用 npm 版本号和 dist-tag 管理 alpha 节奏。
38
+ 4. 验证偏差:维护者常在源码树路径下验证,和真实用户安装形态不一致。
39
+
40
+ 当前产品已经接近可发布阶段,分发模型需要从“本机复制”升级到“包管理器分发”。
41
+
42
+ ## 3. 问题定义
43
+
44
+ 本专题要解决四个核心问题。
45
+
46
+ ### 3.1 发布入口不统一
47
+
48
+ 当前“发布”实质是本机目录替换,不是对外分发,无法形成标准版本传播路径。
49
+
50
+ ### 3.2 使用入口不统一
51
+
52
+ 维护者可以绕过真实安装链路直接跑源码,导致“我本机可用”与“用户可安装可用”之间存在偏差。
53
+
54
+ ### 3.3 版本语义不统一
55
+
56
+ 缺少 npm 层的 alpha 版本节奏与 tag 管理,无法用标准方式表达“可试用但仍在快速迭代”。
57
+
58
+ ### 3.4 平台支持边界不清晰
59
+
60
+ 理论上 Node 脚本跨平台可跑,但当前未验证矩阵不完整。产品需要先明确首发支持边界,避免“名义支持很多、实际上不稳”。
61
+
62
+ ## 4. 目标 / 非目标
63
+
64
+ ## 4.1 目标
65
+
66
+ 1. 建立 npm 发布为唯一正式发布动作(至少在首发阶段)。
67
+ 2. 建立 install-first 模型:维护者和用户都通过 npm 安装包来使用 `ally`。
68
+ 3. 首发明确支持 `macOS arm64`;其他平台默认不做承诺,后续按验证逐步放开。
69
+ 4. 发布节奏默认走 `alpha` dist-tag,支持快速迭代。
70
+ 5. 用户文档明确:当前不支持用户侧定时任务,默认不会在无用户触发时后台自行跑任务。
71
+
72
+ ## 4.2 非目标
73
+
74
+ 1. 本专题不承诺 Windows 支持。
75
+ 2. 本专题不承诺 Linux 正式支持(可做探索验证,但不写入首发承诺)。
76
+ 3. 本专题不引入新的 GUI 安装器。
77
+ 4. 本专题不重做 runtime 内核或 bridge 语义。
78
+ 5. 本专题不讨论收费/授权模型。
79
+
80
+ ## 5. 产品定义与用户路径
81
+
82
+ ## 5.1 产品定义
83
+
84
+ 发布模型定义为:
85
+
86
+ - `发布`:将 `work-ally` CLI 包发布到 npm(alpha tag)。
87
+ - `安装`:用户通过 npm 安装包获得 `ally` 命令。
88
+ - `升级`:用户通过 npm 更新版本。
89
+ - `使用`:所有正式路径都基于已安装包,而非本地源码副本。
90
+
91
+ ## 5.2 用户路径 A(普通用户)
92
+
93
+ 1. 在支持平台(首发:macOS arm64)执行 npm 安装命令。
94
+ 2. 直接使用 `ally setup/start/status/...`。
95
+ 3. 新版本发布后,执行 npm 更新命令。
96
+
97
+ ## 5.3 用户路径 B(维护者自测)
98
+
99
+ 1. 在源码仓库开发与测试。
100
+ 2. 发布 alpha 到 npm。
101
+ 3. 在本机清理旧安装并从 npm 安装该 alpha 包。
102
+ 4. 用“真实安装形态”执行回归与验收。
103
+
104
+ 关键约束:维护者日常可在源码仓库开发,但对“发布可用性”结论必须基于 npm 安装形态。
105
+
106
+ ## 6. 机制设计
107
+
108
+ ## 6.1 发布渠道与版本语义
109
+
110
+ 1. npm 包采用 prerelease 版本语义(例如 `0.2.0-alpha.1`)。
111
+ 2. 首发阶段默认使用 `alpha` dist-tag 发布。
112
+ 3. 当版本达到可稳定使用标准后,再引入 `latest` 策略(不在本 spec 首期目标内强制落地)。
113
+
114
+ ## 6.2 入口命令与安装形态
115
+
116
+ 1. npm 包必须暴露标准 CLI bin:`ally`。
117
+ 2. 文档主路径统一为“安装后直接运行 `ally`”。
118
+ 3. 明确不再把 `ally release` 作为正式发布动作。
119
+
120
+ ## 6.3 现有本机 stable release 语义迁移
121
+
122
+ 1. `ally release` 直接移除,不保留兼容期。
123
+ 2. `~/.work-ally/releases/stable/` 不再作为长期主路径依赖。
124
+ 3. `ally status` 中与本机 stable release 强耦合的文案与字段需收口为“当前安装版本/来源”。
125
+
126
+ ## 6.4 平台支持声明
127
+
128
+ 1. 首发支持声明写死:`macOS arm64`。
129
+ 2. Linux 可作为“实验可用”状态,不进入正式承诺与对外口径。
130
+ 3. 文档中避免“理论可用=正式支持”的表述。
131
+
132
+ ## 6.5 自动化发布(一条龙)
133
+
134
+ 发布流程应收口成单入口自动化流水线(CI 或脚本),至少包含:
135
+
136
+ 1. 版本校验(alpha 语义校验)。
137
+ 2. 测试门禁(最小测试集 + 必要发布前 smoke)。
138
+ 3. npm publish 到 `alpha` tag。
139
+ 4. 发布结果回显(版本号、tag、安装命令)。
140
+
141
+ 这条流水线是正式发布入口;手工临时发布不作为长期主路径。
142
+
143
+ ## 6.6 用户侧资源消耗承诺
144
+
145
+ 面向用户必须明确表达:
146
+
147
+ 1. 当前不支持用户侧定时任务能力。
148
+ 2. 默认不会在用户无触发时自行发起任务执行。
149
+ 3. 不会因为“安装了工具”就持续后台消耗执行资源。
150
+
151
+ 注:内部记忆压缩等系统机制属于实现层,不作为用户“可配置定时任务”能力对外承诺。
152
+
153
+ ## 6.7 Core / Hybrid / Skill 分类判断
154
+
155
+ 本能力属于 **Core**,不是 Skill。
156
+
157
+ 原因:
158
+
159
+ 1. 它改变的是产品分发与默认使用路径,是全局主合同。
160
+ 2. 它涉及 `ally` 入口语义、发布机制、文档与状态口径,不是按需触发工作流。
161
+ 3. 若做成 Skill,会让“是否可安装可发布”依赖可选能力,破坏产品稳定边界。
162
+
163
+ ## 7. Scope / Phase(按用户价值)
164
+
165
+ ### Phase 1:NPM Alpha 首发闭环(必须)
166
+
167
+ 用户价值:用户可按标准 npm 路径安装并使用 `ally`,无需理解源码 release 机制。
168
+
169
+ 交付内容:
170
+
171
+ 1. npm alpha 发布可用。
172
+ 2. `ally` bin 安装后可直接运行。
173
+ 3. 首发支持声明与文档收口到 macOS arm64。
174
+ 4. `ally release` 完整下线。
175
+
176
+ ### Phase 2:安装与升级体验收口(建议)
177
+
178
+ 用户价值:用户能清楚知道如何升级、如何确认当前版本来源。
179
+
180
+ 交付内容:
181
+
182
+ 1. `ally status` 显示安装版本和渠道信息。
183
+ 2. 文档补齐升级、回滚、已知平台边界。
184
+ 3. 原本地 stable release 相关遗留说明清理完成。
185
+
186
+ ### Phase 3:Linux 支持评估(可选)
187
+
188
+ 用户价值:在不降低稳定性的前提下扩大平台覆盖。
189
+
190
+ 交付内容:
191
+
192
+ 1. Linux 兼容性验证报告。
193
+ 2. 若达标,升级支持声明;若不达标,保持“非承诺平台”并公开限制。
194
+
195
+ ## 8. 验收标准
196
+
197
+ 1. 存在可用 npm 包发布流程,且可发布 `alpha` 版本。
198
+ 2. 在 macOS arm64 上,用户可通过 npm 安装后直接运行 `ally` 主命令。
199
+ 3. 产品文档不再把 `ally release` 作为正式发布主路径。
200
+ 4. 维护者可通过“发布后再 install 验证”的方式完成真实安装链路回归。
201
+ 5. 对外文档明确写出:当前不支持用户侧定时任务,默认无触发不执行。
202
+ 6. 对外文档明确写出:首发正式支持平台为 macOS arm64。
203
+ 7. 现有与本机 stable release 强绑定的文档/状态口径已完成迁移或下线说明。
204
+
205
+ ## 9. 风险 / 假设 / 待决问题
206
+
207
+ ## 9.1 风险
208
+
209
+ 1. 代码与文档若清理不彻底,可能残留本机 stable release 旧口径,造成认知不一致。
210
+ 2. 若 npm 包入口与当前目录结构耦合过深,可能出现安装后路径问题。
211
+ 3. 首发只承诺 macOS arm64 可能引发 Linux 用户预期落差。
212
+
213
+ ## 9.2 假设
214
+
215
+ 1. 当前实现不依赖必须编译的本地 C/C++ 产物,可走 npm 分发主路径。
216
+ 2. 团队可提供最小 CI/自动化能力支撑 alpha 发布。
217
+
218
+ ## 9.3 待决问题
219
+
220
+ 1. npm 包名最终确定为 `work-ally-cli` 还是其他命名?
221
+ 2. npm 安装推荐形态:`npm i -g`、`npx`、还是两者并行?
222
+ 3. Linux 何时从“可探索”升级为“正式支持”?需要哪些验证门槛?