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.
- package/AGENTS.md +110 -0
- package/DASHBOARD.md +160 -0
- package/PRODUCT.md +113 -0
- package/README.md +403 -0
- package/ally.sh +171 -0
- package/bridge/src/approval-rules.ts +360 -0
- package/bridge/src/channel-delivery.ts +207 -0
- package/bridge/src/channel-types.ts +22 -0
- package/bridge/src/channels/fake/adapter.ts +31 -0
- package/bridge/src/channels/feishu/adapter.ts +411 -0
- package/bridge/src/channels/feishu/approvals.ts +6 -0
- package/bridge/src/channels/feishu/formatter.ts +276 -0
- package/bridge/src/channels/feishu/normalize.ts +368 -0
- package/bridge/src/codex-config.ts +52 -0
- package/bridge/src/config.ts +240 -0
- package/bridge/src/fake-runtime-client.ts +505 -0
- package/bridge/src/handoff-service.ts +494 -0
- package/bridge/src/logger.ts +194 -0
- package/bridge/src/memory-digest.ts +186 -0
- package/bridge/src/receiver-approval-autonomy.ts +158 -0
- package/bridge/src/receiver-control-core.ts +140 -0
- package/bridge/src/receiver-control-work-session.ts +218 -0
- package/bridge/src/receiver-control.ts +83 -0
- package/bridge/src/receiver-delivery.ts +136 -0
- package/bridge/src/receiver-helpers.ts +96 -0
- package/bridge/src/receiver-human-gate.ts +333 -0
- package/bridge/src/receiver-inbound-preflight.ts +162 -0
- package/bridge/src/receiver-recovery.ts +236 -0
- package/bridge/src/receiver-runtime-callbacks.ts +367 -0
- package/bridge/src/receiver-runtime-policy.ts +132 -0
- package/bridge/src/receiver-runtime-state.ts +124 -0
- package/bridge/src/receiver-support-actions.ts +189 -0
- package/bridge/src/receiver-thread-start.ts +57 -0
- package/bridge/src/receiver-turn-coordination.ts +94 -0
- package/bridge/src/receiver-turn-execution.ts +257 -0
- package/bridge/src/receiver-turn-failure.ts +143 -0
- package/bridge/src/receiver-turn-result.ts +185 -0
- package/bridge/src/receiver-turn-steer.ts +70 -0
- package/bridge/src/receiver-work-session.ts +76 -0
- package/bridge/src/receiver.ts +329 -0
- package/bridge/src/router.ts +62 -0
- package/bridge/src/runtime-client-agent-messages.ts +150 -0
- package/bridge/src/runtime-client-message-dispatch.ts +176 -0
- package/bridge/src/runtime-client-protocol.ts +411 -0
- package/bridge/src/runtime-client-request-ops.ts +56 -0
- package/bridge/src/runtime-client-run-turn.ts +158 -0
- package/bridge/src/runtime-client-thread-ops.ts +270 -0
- package/bridge/src/runtime-client-transport.ts +309 -0
- package/bridge/src/runtime-client-turn-poll.ts +224 -0
- package/bridge/src/runtime-client-turn-read.ts +185 -0
- package/bridge/src/runtime-client-turn-state.ts +105 -0
- package/bridge/src/runtime-client.ts +344 -0
- package/bridge/src/runtime-user-input.ts +403 -0
- package/bridge/src/scheduler.ts +239 -0
- package/bridge/src/server-handoff-command.ts +364 -0
- package/bridge/src/server-main.ts +80 -0
- package/bridge/src/server-routine-command.ts +60 -0
- package/bridge/src/server-routine-execution.ts +222 -0
- package/bridge/src/server-runtime-app-support.ts +107 -0
- package/bridge/src/server-runtime-app.ts +238 -0
- package/bridge/src/server-thread-sync-command.ts +63 -0
- package/bridge/src/server.ts +17 -0
- package/bridge/src/session-store-delivery.ts +220 -0
- package/bridge/src/session-store-human-gate.ts +380 -0
- package/bridge/src/session-store-inbound-acceptance.ts +66 -0
- package/bridge/src/session-store-meta.ts +134 -0
- package/bridge/src/session-store-turn-ledger.ts +272 -0
- package/bridge/src/session-store.ts +380 -0
- package/bridge/src/system-notify.ts +220 -0
- package/bridge/src/thread-sync.ts +200 -0
- package/bridge/src/translator.ts +494 -0
- package/bridge/src/types.ts +289 -0
- package/bridge/src/utils.ts +104 -0
- package/bridge/src/work-session-store.ts +471 -0
- package/docs/.gitkeep +0 -0
- package/docs/architecture/codex-feishu-bridge-proposal.md +2742 -0
- package/docs/completed/FEATURE-feishu-markdown-and-reply-support.md +327 -0
- package/docs/completed/README.md +21 -0
- package/docs/completed/SPEC-approval-autonomy-and-safe-defaults.md +205 -0
- package/docs/completed/SPEC-approval-batch-and-strict-reply-shortcuts.md +153 -0
- package/docs/completed/SPEC-conversation-noise-reduction-and-busy-input-gate.md +538 -0
- package/docs/completed/SPEC-engineering-sop-skillization.md +190 -0
- package/docs/completed/SPEC-faithful-bridge-core-thinning-v2.md +376 -0
- package/docs/completed/SPEC-faithful-bridge-core-thinning.md +1071 -0
- package/docs/completed/SPEC-group-chat-sender-identity.md +301 -0
- package/docs/completed/SPEC-middleware-exception-visibility.md +227 -0
- package/docs/completed/SPEC-nightly-memory-digest-visibility.md +121 -0
- package/docs/completed/SPEC-project-group-chat-human-centered-conversation-mapping.md +326 -0
- package/docs/completed/SPEC-remove-cli-persona-bootstrap.md +201 -0
- package/docs/developer-workflow.md +49 -0
- package/docs/implementation/SPEC-codex-same-machine-session-handoff-implementation.md +239 -0
- package/docs/implementation/test-coverage-map.md +363 -0
- package/docs/implementation/work-ally-implementation-guide.md +790 -0
- package/docs/issues/README.md +10 -0
- package/docs/issues/pending/ANALYSIS-ally-premature-recovery-notice-and-task-state-semantics-2026-03-18.md +295 -0
- package/docs/issues/resolved/ANALYSIS-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +466 -0
- package/docs/issues/resolved/ANALYSIS-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +261 -0
- package/docs/issues/resolved/ANALYSIS-codex-app-server-transport-disconnect-semantics-2026-03-14.md +606 -0
- package/docs/issues/resolved/ANALYSIS-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +348 -0
- package/docs/issues/resolved/ANALYSIS-runtime-turn-delivery-and-recovery-2026-03-14.md +603 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +166 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +186 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +166 -0
- package/docs/issues/resolved/REPORT-ally-runtime-turn-delivery-3b42fb8-2026-03-15.md +373 -0
- package/docs/manual-acceptance.md +127 -0
- package/docs/ops-runbook.md +44 -0
- package/docs/planning/FEATURE-memory-system.md +748 -0
- package/docs/planning/SPEC-active-turn-steer-and-context-compaction-visibility.md +269 -0
- package/docs/planning/SPEC-approval-rules-inheritance-and-local-validation-lane.md +450 -0
- package/docs/planning/SPEC-assistant-persona-bootstrap.md +199 -0
- package/docs/planning/SPEC-assistant-rename.md +610 -0
- package/docs/planning/SPEC-bridge-app-server-protocol-alignment.md +667 -0
- package/docs/planning/SPEC-claude-runtime-host-for-work-ally.md +434 -0
- package/docs/planning/SPEC-cli-feishu-codex-session-unification.md +236 -0
- package/docs/planning/SPEC-codex-same-machine-session-handoff.md +873 -0
- package/docs/planning/SPEC-feishu-reaction-shortcuts.md +282 -0
- package/docs/planning/SPEC-local-stable-release-boundary.md +166 -0
- package/docs/planning/SPEC-managed-thread-entry-and-surface-mobility.md +862 -0
- package/docs/planning/SPEC-minimal-bridge-semantics-and-user-visible-surface.md +362 -0
- package/docs/planning/SPEC-npm-alpha-distribution-and-install-first-release.md +222 -0
- package/docs/planning/SPEC-remove-websocket-runtime-transport.md +364 -0
- package/docs/planning/SPEC-runtime-abstraction-phase-1.md +424 -0
- package/docs/planning/SPEC-runtime-connection-and-turn-recovery-semantics.md +274 -0
- package/docs/planning/SPEC-session-presence-and-state-visibility.md +397 -0
- package/docs/planning/SPEC-skill-first-capability-packaging.md +338 -0
- package/docs/planning/SPEC-stable-archive-contract.md +456 -0
- package/docs/planning/SPEC-supervised-start-boundary.md +127 -0
- package/docs/planning/SPEC-user-barrier-reduction-and-activation.md +832 -0
- package/docs/planning/ally-next.md +1278 -0
- package/docs/planning/assistant-workbench-spec.md +725 -0
- package/docs/planning/product-workbench.md +283 -0
- package/docs/product-onboarding.md +227 -0
- package/docs/product-spec-standard.md +528 -0
- package/docs/troubleshooting.md +45 -0
- package/docs/user-quickstart.md +46 -0
- package/internal/dispatch.sh +95 -0
- package/internal/lib/common.sh +1450 -0
- package/internal/modules/assistant/manage.sh +1312 -0
- package/internal/modules/bootstrap/setup.sh +144 -0
- package/internal/modules/config/init-env.sh +10 -0
- package/internal/modules/global/manage.sh +154 -0
- package/internal/modules/handoff/manage.sh +54 -0
- package/internal/modules/mcp/manage.sh +83 -0
- package/internal/modules/ops/logs.sh +76 -0
- package/internal/modules/routines/manage.sh +55 -0
- package/internal/modules/runtime/assistant-autosave.sh +26 -0
- package/internal/modules/runtime/restart.sh +6 -0
- package/internal/modules/runtime/start.sh +283 -0
- package/internal/modules/runtime/status.sh +194 -0
- package/internal/modules/runtime/stop.sh +55 -0
- package/internal/modules/runtime/supervisor.sh +216 -0
- package/internal/modules/runtime/update.sh +26 -0
- package/package.json +41 -0
- package/runtime/config/.gitkeep +0 -0
- package/runtime/host/.gitkeep +0 -0
- package/runtime/host/healthcheck-codex-app-server.ts +22 -0
- package/runtime/host/ping-pong-codex-app-server.ts +66 -0
- package/runtime/host/probe-codex-app-server.ts +115 -0
- package/skills/archive-reader/SKILL.md +9 -0
- package/skills/feishu-production-debug/SKILL.md +37 -0
- package/skills/feishu-production-debug/references/feishu-debug-order.md +49 -0
- package/skills/feishu-production-debug/references/platform-permission-baseline.md +23 -0
- package/skills/issue-to-spec-triage/SKILL.md +44 -0
- package/skills/issue-to-spec-triage/references/triage-rules.md +66 -0
- package/skills/memory-digest/SKILL.md +9 -0
- package/skills/post-implementation-closure/SKILL.md +39 -0
- package/skills/post-implementation-closure/references/closure-checklist.md +45 -0
- package/skills/post-implementation-closure/references/doc-drift-map.md +49 -0
- package/skills/product-spec/SKILL.md +244 -0
- package/templates/env.example +5 -0
- package/templates/routines/nightly-memory-digest.yaml +10 -0
- package/templates/workspace/AGENTS.md +26 -0
|
@@ -0,0 +1,1071 @@
|
|
|
1
|
+
# SPEC: 忠实中间层收边界与核心瘦身重构
|
|
2
|
+
|
|
3
|
+
更新时间:2026-03-20
|
|
4
|
+
状态:Completed
|
|
5
|
+
Owner:work-ally product / engineering
|
|
6
|
+
相关文档:
|
|
7
|
+
- `docs/planning/SPEC-minimal-bridge-semantics-and-user-visible-surface.md`
|
|
8
|
+
- `docs/planning/SPEC-bridge-app-server-protocol-alignment.md`
|
|
9
|
+
- `docs/planning/SPEC-runtime-connection-and-turn-recovery-semantics.md`
|
|
10
|
+
- `README.md`
|
|
11
|
+
- OpenAI Codex App Server docs: `https://developers.openai.com/codex/app-server`
|
|
12
|
+
- OpenAI blog: `https://openai.com/index/unlocking-the-codex-harness/`
|
|
13
|
+
|
|
14
|
+
## 1. Summary
|
|
15
|
+
|
|
16
|
+
这份 spec 要解决的不是“再做一轮稳定性 patch”,而是把 `work-ally` 的中间层重新收回到一个更忠实、更克制的边界:
|
|
17
|
+
|
|
18
|
+
> `work-ally` 的 bridge 默认应是 **Feishu <-> Codex App Server 的稳定双向桥梁 + 最小必要补偿层**,而不是自带一整套会话任务脑的本地系统。
|
|
19
|
+
|
|
20
|
+
过去几轮实现里,`work-ally` 为了解决真实稳定性问题,逐步长出了 `turn ledger`、`pending_recovery`、`superseded`、`supervisor`、`work_session ownership` 等能力。这些能力里有些是稳定桥梁必须的,有些则已经超出“忠实中间层”边界,开始混入更厚的产品系统语义。
|
|
21
|
+
|
|
22
|
+
本次 spec 的目标是在**不降低当前产品稳定性**的前提下,做一次结构性重构:
|
|
23
|
+
|
|
24
|
+
1. 明确什么是 bridge 核心,什么只是外围产品层
|
|
25
|
+
2. 保留真正必要的稳定性骨架
|
|
26
|
+
3. 收掉 bridge 自己创造的过厚会话语义
|
|
27
|
+
4. 把已经失控的大文件拆回清楚模块,让边界在代码结构上真正可见
|
|
28
|
+
5. 让后续代码、测试、文档都围绕同一条“忠实中间层”边界继续演进
|
|
29
|
+
|
|
30
|
+
这不是“删功能式瘦身”,而是一次**守住底线的减法重构 + 模块化重构**。
|
|
31
|
+
|
|
32
|
+
## 2. 背景
|
|
33
|
+
|
|
34
|
+
结合官方 Codex App Server 文档和当前实现,可以先确认三件事:
|
|
35
|
+
|
|
36
|
+
1. 官方已经给出了稳定、UI-friendly 的协议面:双向 JSON-RPC、默认 `stdio`、线程状态、turn 控制、审批 / user-input 请求、`thread/read` 等事实源。
|
|
37
|
+
2. `work-ally` 不需要再造一个任务引擎;它首先应该忠实承接官方协议原语,再做最小必要的交付补偿。
|
|
38
|
+
3. 但“上游 runtime 稳定”并不自动等于“Feishu 消息链路天然不会丢、不重、不乱序”;桥层仍需要一定的最小补偿机制。
|
|
39
|
+
|
|
40
|
+
当前项目里已经形成一个较清楚的共识:
|
|
41
|
+
|
|
42
|
+
- 中间层最本质的职责,就是两次稳定转交
|
|
43
|
+
- 从 Feishu 到 Codex
|
|
44
|
+
- 从 Codex 到 Feishu
|
|
45
|
+
- 默认不要把 bridge 做成第二个脑
|
|
46
|
+
- 只有当用户必须行动,或系统必须诚实告知无法继续时,中间层才应该显式出声
|
|
47
|
+
|
|
48
|
+
问题在于,当前代码结构里“必要补偿”与“额外产品系统层”已经混在一起:
|
|
49
|
+
|
|
50
|
+
- 有些能力确实是桥必须承担的,例如 final reply 补发
|
|
51
|
+
- 有些能力已经进入更厚的本地语义,例如丰富的 turn lifecycle ledger
|
|
52
|
+
- 还有些能力并不是 bridge 核心,而是围绕 desk / multi-surface / ops 的外围产品层
|
|
53
|
+
|
|
54
|
+
结果是:
|
|
55
|
+
|
|
56
|
+
- 代码量显著变厚
|
|
57
|
+
- 核心边界不再一眼清楚
|
|
58
|
+
- 若核心逻辑长期集中在 900 ~ 2400 行级别的大文件里,边界会继续被文件体积掩盖
|
|
59
|
+
- 后续每次加功能都更容易继续往 bridge 里塞语义
|
|
60
|
+
|
|
61
|
+
## 3. 问题定义
|
|
62
|
+
|
|
63
|
+
当前系统的核心问题不是“有几个模块写大了”,而是边界漂移。
|
|
64
|
+
|
|
65
|
+
### 3.1 bridge 核心与外围产品层混在一起
|
|
66
|
+
|
|
67
|
+
当前 `bridge/src/` 里混合了至少四类东西:
|
|
68
|
+
|
|
69
|
+
1. 协议转接
|
|
70
|
+
2. 最小交付补偿
|
|
71
|
+
3. 会话控制与恢复语义
|
|
72
|
+
4. 多表面 / desk / ops / archive 等外围产品能力
|
|
73
|
+
|
|
74
|
+
这会直接导致一个认知问题:
|
|
75
|
+
|
|
76
|
+
> 工程上无法一眼回答“哪些模块属于忠实中间层核心,哪些只是顺手堆进去的产品层”。
|
|
77
|
+
|
|
78
|
+
### 3.2 会话真相模型长得过厚
|
|
79
|
+
|
|
80
|
+
当前实现不是只维护最小的 `conversation -> thread` 绑定,而是额外维护:
|
|
81
|
+
|
|
82
|
+
- inbound acceptance ledger
|
|
83
|
+
- turn execution ledger
|
|
84
|
+
- `pending_recovery`
|
|
85
|
+
- `recovery_required`
|
|
86
|
+
- `superseded`
|
|
87
|
+
- delivery ledger
|
|
88
|
+
|
|
89
|
+
这里面有一部分对稳定性有帮助,但整体已经超过“最小 bridge state”的合理范围,开始变成桥自己维护的一套 turn 生命周期系统。
|
|
90
|
+
|
|
91
|
+
### 3.3 恢复语义和交付补偿没有彻底分层
|
|
92
|
+
|
|
93
|
+
“确认最终态”和“补发最终结果”是两类不同问题:
|
|
94
|
+
|
|
95
|
+
- 最终态确认:用官方事实源确认 Codex 到底结束在哪个状态
|
|
96
|
+
- 渠道交付补偿:Codex 已完成,但 Feishu 没稳定收到
|
|
97
|
+
|
|
98
|
+
当前实现里,这两类语义都被包进较厚的 recovery / ledger 逻辑里,增加了维护负担,也放大了桥层自创状态的数量。
|
|
99
|
+
|
|
100
|
+
### 3.4 生命周期编排已经超出桥核心
|
|
101
|
+
|
|
102
|
+
当前还存在:
|
|
103
|
+
|
|
104
|
+
- `supervisor`
|
|
105
|
+
- `assistant-autosave`
|
|
106
|
+
- desk Git checkpoint
|
|
107
|
+
- `work_session` / handoff
|
|
108
|
+
- archive / conversation view
|
|
109
|
+
- routine / scheduler
|
|
110
|
+
|
|
111
|
+
这些能力对整体产品可能有价值,但它们并不都属于“Feishu <-> Codex 忠实中间层核心”。
|
|
112
|
+
|
|
113
|
+
如果继续把它们和 bridge 核心绑在一起,后续重构很难做减法。
|
|
114
|
+
|
|
115
|
+
### 3.5 模块边界没有在文件结构上体现
|
|
116
|
+
|
|
117
|
+
当前几个核心文件已经明显超过健康规模:
|
|
118
|
+
|
|
119
|
+
- `bridge/src/receiver.ts` 已超过 2400 行
|
|
120
|
+
- `bridge/src/runtime-client.ts` 已超过 1700 行
|
|
121
|
+
- `bridge/src/session-store.ts` 已超过 900 行
|
|
122
|
+
|
|
123
|
+
这不是单纯的审美问题,而是工程边界问题:
|
|
124
|
+
|
|
125
|
+
- 文件一旦过大,真正的核心与外围分支会被混在一起
|
|
126
|
+
- review、回归分析、定向删除和责任归属都会越来越困难
|
|
127
|
+
- 即便产品边界已经想清楚,如果代码结构没有同步模块化,后续仍然会反复长回去
|
|
128
|
+
|
|
129
|
+
## 4. 目标
|
|
130
|
+
|
|
131
|
+
本次重构必须达成下面 8 个目标:
|
|
132
|
+
|
|
133
|
+
1. 明确 `work-ally` 中间层的金字塔结构,区分核心桥梁层与外围产品层。
|
|
134
|
+
2. 让 bridge 核心重新回到“协议转接 + 最小补偿”的边界。
|
|
135
|
+
3. 把当前过厚的会话真相模型收缩到最小可证稳定集。
|
|
136
|
+
4. 把“最终态确认”与“渠道补发”收口成更清楚的两层机制,不再扩张 recovery 语义。
|
|
137
|
+
5. 保证现有用户主路径、审批、user-input、最终结果、失败兜底、结果补发这些稳定性底线不回退。
|
|
138
|
+
6. 让 `supervisor` / handoff / archive / routines` 等外围能力不再污染 bridge 核心判断路径。
|
|
139
|
+
7. 把超大文件拆回模块化结构,让代码文件规模重新回到可维护范围。
|
|
140
|
+
8. 给后续工程一个清晰规则:新增需求必须先判断属于 bridge 核心、最小补偿层,还是外围产品层,不能再默认往 bridge 里堆。
|
|
141
|
+
|
|
142
|
+
## 5. 非目标
|
|
143
|
+
|
|
144
|
+
本次明确不做:
|
|
145
|
+
|
|
146
|
+
1. 不否认现有稳定性治理的价值,更不是回到“纯转发、完全不补偿”的薄弱实现。
|
|
147
|
+
2. 不把 handoff、archive、routine、desk 生命周期这些能力一刀切删除。
|
|
148
|
+
3. 不重做 Feishu 通道产品面。
|
|
149
|
+
4. 不改变官方 Codex App Server 作为一等集成方式的方向。
|
|
150
|
+
5. 不在本期引入新的重型编排系统、消息队列或第二套 runtime host。
|
|
151
|
+
6. 不为了瘦身而接受“结果偶尔丢失 / 用户必须自己重试一切”的稳定性退步。
|
|
152
|
+
|
|
153
|
+
## 6. 核心原则
|
|
154
|
+
|
|
155
|
+
### 6.1 协议优先,不自创第二套真相
|
|
156
|
+
|
|
157
|
+
官方 App Server 已经提供线程状态、turn 控制、审批请求和 `thread/read` 等事实源。bridge 默认应优先依赖这些协议事实,而不是额外创造更厚的任务语义。
|
|
158
|
+
|
|
159
|
+
### 6.2 交付诚实,但只做最小补偿
|
|
160
|
+
|
|
161
|
+
中间层必须诚实面对“结果已产生但渠道未送达”这类问题,因此允许存在最小 delivery ledger 与 redelivery;但不应围绕它继续长出复杂任务状态体系。
|
|
162
|
+
|
|
163
|
+
### 6.3 最小 durable state 原则
|
|
164
|
+
|
|
165
|
+
只保留桥层稳定运行真正需要的最小持久状态;任何新增 durable state 都必须能回答:
|
|
166
|
+
|
|
167
|
+
1. 如果没有它,会失去什么稳定性底线?
|
|
168
|
+
2. 它是不是官方协议已提供、无需重复维护?
|
|
169
|
+
3. 它是不是其实属于外围产品层,而不是 bridge 核心?
|
|
170
|
+
|
|
171
|
+
### 6.4 外围能力可以存在,但不得反向定义 bridge 核心
|
|
172
|
+
|
|
173
|
+
handoff、archive、autosave、scheduler 等能力即便继续存在,也只能建立在核心桥梁合同之上,不能反过来决定 bridge 的主路径语义。
|
|
174
|
+
|
|
175
|
+
### 6.5 减法重构必须可证明不降稳定性
|
|
176
|
+
|
|
177
|
+
这次不是“边删边赌”。每一步收边界都要有自动化验证、兼容路径和明确 DoD,先证明没掉底线,再继续瘦身。
|
|
178
|
+
|
|
179
|
+
### 6.6 边界必须体现在文件结构上
|
|
180
|
+
|
|
181
|
+
如果核心边界已经想清楚,但代码仍堆在 900 行、1700 行、2000 行单文件里,说明重构并没有真正完成。
|
|
182
|
+
|
|
183
|
+
本专题默认采用下面的工程纪律:
|
|
184
|
+
|
|
185
|
+
1. 实现代码文件超过 `300` 行时,必须先反思是否需要拆分模块
|
|
186
|
+
2. 新增或重构后的实现代码文件,原则上不应超过 `600` 行;若必须超过,应有明确理由
|
|
187
|
+
3. 达到 `1000+` 行的实现代码文件视为明确重构信号,不得继续无节制增长
|
|
188
|
+
4. 已经达到 `1700 ~ 2400` 行级别的核心文件,必须纳入本次专题的拆分目标
|
|
189
|
+
|
|
190
|
+
## 7. 金字塔结构与模块判断
|
|
191
|
+
|
|
192
|
+
本次之后,`work-ally` 中间层应按下面四层理解。
|
|
193
|
+
|
|
194
|
+
### 7.1 第 1 层:协议与传输适配层
|
|
195
|
+
|
|
196
|
+
定义:忠实承接 Feishu 与 Codex App Server 协议。
|
|
197
|
+
|
|
198
|
+
职责:
|
|
199
|
+
|
|
200
|
+
- Feishu inbound normalize / outbound send
|
|
201
|
+
- Codex App Server child-process / JSON-RPC binding
|
|
202
|
+
- `thread/start` / `thread/resume` / `turn/start` / `turn/steer` / `turn/interrupt`
|
|
203
|
+
- approval / user-input 请求与回写
|
|
204
|
+
|
|
205
|
+
代表模块:
|
|
206
|
+
|
|
207
|
+
- `bridge/src/channels/feishu/*`
|
|
208
|
+
- `bridge/src/runtime-client.ts`
|
|
209
|
+
- `bridge/src/router.ts`
|
|
210
|
+
- `bridge/src/runtime-user-input.ts`
|
|
211
|
+
|
|
212
|
+
判断:**绝对核心,必须保留。**
|
|
213
|
+
|
|
214
|
+
### 7.2 第 2 层:最小交付补偿层
|
|
215
|
+
|
|
216
|
+
定义:为了守住“不丢、不重、能补发”的底线而存在的最小状态与机制。
|
|
217
|
+
|
|
218
|
+
职责:
|
|
219
|
+
|
|
220
|
+
- inbound 去重
|
|
221
|
+
- final state pull-primary 确认
|
|
222
|
+
- final reply delivery ledger
|
|
223
|
+
- delivery unavailable 后的 bounded redelivery
|
|
224
|
+
- 渠道权限 / 未发布 / 频控等 non-fatal delivery issue 识别
|
|
225
|
+
|
|
226
|
+
代表模块:
|
|
227
|
+
|
|
228
|
+
- `SessionStore` 中与 inbound receipt、final delivery 直接相关的最小子集
|
|
229
|
+
- `bridge/src/channel-delivery.ts`
|
|
230
|
+
- `Receiver.redeliverPendingFinalReplies()`
|
|
231
|
+
|
|
232
|
+
判断:**属于 bridge 核心,但必须严格做薄。**
|
|
233
|
+
|
|
234
|
+
### 7.3 第 3 层:最小会话控制层
|
|
235
|
+
|
|
236
|
+
定义:为了把普通文本正确路由到当前 thread / turn,而不得不保留的最小会话控制。
|
|
237
|
+
|
|
238
|
+
职责:
|
|
239
|
+
|
|
240
|
+
- `conversation -> threadId` 绑定
|
|
241
|
+
- 当前 active turn 的最小跟踪
|
|
242
|
+
- 当前是否存在“已对用户可见”的 pending approval / pending user-input
|
|
243
|
+
- 普通文本是 `turn/start` 还是 `turn/steer`
|
|
244
|
+
|
|
245
|
+
这层**不应**再承担:
|
|
246
|
+
|
|
247
|
+
- 丰富的 turn execution lifecycle
|
|
248
|
+
- `pending_recovery` / `recovery_required` 作为核心产品对象
|
|
249
|
+
- 大量 `superseded` 语义扩展
|
|
250
|
+
|
|
251
|
+
判断:**核心需要,但当前实现过厚,必须收缩。**
|
|
252
|
+
|
|
253
|
+
### 7.4 第 4 层:外围产品与运维层
|
|
254
|
+
|
|
255
|
+
定义:与 desk、multi-surface、ops、长期资产有关,但并非 Feishu <-> Codex 基线桥梁必需。
|
|
256
|
+
|
|
257
|
+
包括:
|
|
258
|
+
|
|
259
|
+
- `supervisor`
|
|
260
|
+
- `assistant-autosave`
|
|
261
|
+
- desk Git checkpoint
|
|
262
|
+
- `work-session-store` / `handoff-service`
|
|
263
|
+
- `archive-store` / `conversation-view-store`
|
|
264
|
+
- `scheduler` / `routine` / `memory-digest`
|
|
265
|
+
|
|
266
|
+
判断:**可以继续存在,但不再算 bridge 核心;后续要与核心桥梁解耦。**
|
|
267
|
+
|
|
268
|
+
## 8. 产品定义与用户路径
|
|
269
|
+
|
|
270
|
+
### 8.1 一句话产品定义
|
|
271
|
+
|
|
272
|
+
重构后,`work-ally` 的 bridge 应表现为:
|
|
273
|
+
|
|
274
|
+
> 默认把 Feishu 用户输入忠实送进 Codex,把 Codex 的真实进度、审批请求和最终结果稳定带回 Feishu;只有在交付无法自动补偿时,才最小化地出声。
|
|
275
|
+
|
|
276
|
+
### 8.2 输入路径
|
|
277
|
+
|
|
278
|
+
V1 只保留三类输入解释:
|
|
279
|
+
|
|
280
|
+
1. slash 控制命令:bridge 本地消费
|
|
281
|
+
2. 对已可见 approval / user-input 的直接回答:bridge 作为协议 request/response 客户端回写给 runtime
|
|
282
|
+
3. 其他普通自然语言:默认发给 Codex
|
|
283
|
+
|
|
284
|
+
默认规则:
|
|
285
|
+
|
|
286
|
+
- 无 active turn:`turn/start`
|
|
287
|
+
- 有 active turn 且无线程级显式阻塞:`turn/steer`
|
|
288
|
+
- 当前存在已对用户可见的 pending approval / user-input:提示先处理该 request,不新造本地忙状态
|
|
289
|
+
|
|
290
|
+
### 8.3 输出路径
|
|
291
|
+
|
|
292
|
+
V1 只保留下面几类用户可见输出:
|
|
293
|
+
|
|
294
|
+
- reaction ack
|
|
295
|
+
- 真实 runtime commentary / progress
|
|
296
|
+
- approval request
|
|
297
|
+
- user-input request
|
|
298
|
+
- final reply
|
|
299
|
+
- completion without reply 的最小结束提示
|
|
300
|
+
- 无法自动补偿时的明确失败 / 重发说明
|
|
301
|
+
- 上一轮结果补发提示
|
|
302
|
+
|
|
303
|
+
### 8.4 失败与恢复路径
|
|
304
|
+
|
|
305
|
+
桥层只承认两类补偿:
|
|
306
|
+
|
|
307
|
+
1. **最终态确认补偿**
|
|
308
|
+
- 优先用官方 `thread/read(includeTurns=true)` 确认 turn 终态
|
|
309
|
+
2. **渠道交付补偿**
|
|
310
|
+
- 若最终结果已落成但 Feishu 未稳定送达,则记为 pending delivery 并在后续时机补发
|
|
311
|
+
|
|
312
|
+
桥层不再把 recovery 扩张成一套更厚的任务语义世界。
|
|
313
|
+
|
|
314
|
+
## 9. 机制设计
|
|
315
|
+
|
|
316
|
+
这次重构不接受“先抽象一套新模型,旧东西以后再说”的写法。
|
|
317
|
+
|
|
318
|
+
必须直接回答三件事:
|
|
319
|
+
|
|
320
|
+
1. bridge 核心到底保留什么
|
|
321
|
+
2. 哪些现有状态 / 代码只是过渡兼容,最终要删
|
|
322
|
+
3. 新主路径以后只能依赖哪些事实
|
|
323
|
+
|
|
324
|
+
### 9.1 核心保留面
|
|
325
|
+
|
|
326
|
+
本次之后,bridge core 只保留下面 6 类能力。
|
|
327
|
+
|
|
328
|
+
#### A. 协议与传输适配
|
|
329
|
+
|
|
330
|
+
保留:
|
|
331
|
+
|
|
332
|
+
- Feishu inbound normalize / outbound send
|
|
333
|
+
- Codex App Server child-process + JSON-RPC binding
|
|
334
|
+
- `thread/start` / `thread/resume` / `turn/start` / `turn/steer` / `turn/interrupt`
|
|
335
|
+
- approval / user-input request 与 response 回写
|
|
336
|
+
|
|
337
|
+
#### B. inbound 去重与接单事实
|
|
338
|
+
|
|
339
|
+
保留:
|
|
340
|
+
|
|
341
|
+
- 每条 inbound message 的 receipt claim
|
|
342
|
+
- 最小 `received -> processing -> completed` 去重合同
|
|
343
|
+
- 允许判断“这条消息是否已经被接单、是否允许重入”
|
|
344
|
+
|
|
345
|
+
这层是稳定桥梁的底线,不裁。
|
|
346
|
+
|
|
347
|
+
#### C. conversation 到 thread 的最小绑定
|
|
348
|
+
|
|
349
|
+
保留:
|
|
350
|
+
|
|
351
|
+
- `conversationKey -> threadId`
|
|
352
|
+
- `activeTurnId`
|
|
353
|
+
- `lastMessageId`
|
|
354
|
+
- `lastTurnId`
|
|
355
|
+
- 少量 recent preview 字段(仅用于 status / debug,不得反向定义主路径)
|
|
356
|
+
|
|
357
|
+
这层负责正常路由,不负责解释厚任务状态。
|
|
358
|
+
|
|
359
|
+
#### D. 已可见的人类阻塞门
|
|
360
|
+
|
|
361
|
+
保留:
|
|
362
|
+
|
|
363
|
+
- visible approval gate
|
|
364
|
+
- visible user-input gate
|
|
365
|
+
|
|
366
|
+
硬约束:
|
|
367
|
+
|
|
368
|
+
- 只有 request 已稳定送达给用户,才允许进入 blocking 语义
|
|
369
|
+
- blocking truth 只由“visible human gate”表达,不再由 turn ledger execution status 表达
|
|
370
|
+
|
|
371
|
+
#### E. 已持久化的最终结果 + 送达补偿
|
|
372
|
+
|
|
373
|
+
保留:
|
|
374
|
+
|
|
375
|
+
- pull-primary 最终态确认
|
|
376
|
+
- 已持久化 final turn result
|
|
377
|
+
- final delivery ledger
|
|
378
|
+
- bounded redelivery
|
|
379
|
+
- non-fatal channel delivery issue 识别
|
|
380
|
+
|
|
381
|
+
这是 bridge 诚实交付的底线,不裁。
|
|
382
|
+
|
|
383
|
+
#### F. stale output suppression
|
|
384
|
+
|
|
385
|
+
保留行为,不保留厚语义扩张。
|
|
386
|
+
|
|
387
|
+
说明:
|
|
388
|
+
|
|
389
|
+
- 旧 turn 一旦被新消息推进,旧输出仍必须被抑制
|
|
390
|
+
- 这是防串话正确性保护,不是可选体验增强
|
|
391
|
+
- 但它不再扩张成桥层总任务状态世界
|
|
392
|
+
|
|
393
|
+
### 9.2 核心 durable object 收口
|
|
394
|
+
|
|
395
|
+
重构后的 bridge core,以“最小但够用”为准,核心 durable object 收口为下面 5 类。
|
|
396
|
+
|
|
397
|
+
#### A. InboundReceiptClaim
|
|
398
|
+
|
|
399
|
+
职责:表达一条 inbound message 是否已被 bridge 接单、是否仍在处理中。
|
|
400
|
+
|
|
401
|
+
最小字段:
|
|
402
|
+
|
|
403
|
+
- `conversationKey`
|
|
404
|
+
- `messageId`
|
|
405
|
+
- `status = processing | completed`
|
|
406
|
+
- `createdAt`
|
|
407
|
+
- `updatedAt`
|
|
408
|
+
|
|
409
|
+
#### B. ConversationBinding
|
|
410
|
+
|
|
411
|
+
职责:表达当前 conversation 应路由到哪条 thread,以及当前 active turn 是谁。
|
|
412
|
+
|
|
413
|
+
最小字段:
|
|
414
|
+
|
|
415
|
+
- `conversationKey`
|
|
416
|
+
- `threadId`
|
|
417
|
+
- `activeTurnId`
|
|
418
|
+
- `lastMessageId`
|
|
419
|
+
- `lastTurnId`
|
|
420
|
+
- `updatedAt`
|
|
421
|
+
|
|
422
|
+
#### C. VisibleHumanGate
|
|
423
|
+
|
|
424
|
+
职责:表达“当前是否存在一个已经送达到用户、必须先由用户回答的 gate”。
|
|
425
|
+
|
|
426
|
+
最小字段:
|
|
427
|
+
|
|
428
|
+
- `conversationKey`
|
|
429
|
+
- `kind = approval | user_input`
|
|
430
|
+
- `requestId`
|
|
431
|
+
- `turnId`
|
|
432
|
+
- `visible = true`
|
|
433
|
+
- `updatedAt`
|
|
434
|
+
|
|
435
|
+
说明:
|
|
436
|
+
|
|
437
|
+
- 核心只认 visible gate
|
|
438
|
+
- hidden / unsent request 不是 blocking truth
|
|
439
|
+
|
|
440
|
+
#### D. PersistedTurnResult
|
|
441
|
+
|
|
442
|
+
职责:表达某个 turn 的终态结果已经被 bridge 确认并持久化,可用于后续补发。
|
|
443
|
+
|
|
444
|
+
最小字段:
|
|
445
|
+
|
|
446
|
+
- `conversationKey`
|
|
447
|
+
- `threadId`
|
|
448
|
+
- `turnId`
|
|
449
|
+
- `status = completed | failed | interrupted`
|
|
450
|
+
- `reply`
|
|
451
|
+
- `error`
|
|
452
|
+
- `persistedAt`
|
|
453
|
+
|
|
454
|
+
说明:
|
|
455
|
+
|
|
456
|
+
- 这是 redelivery 的真相源
|
|
457
|
+
- 不再要求它同时承载丰富 execution lifecycle
|
|
458
|
+
|
|
459
|
+
#### E. FinalDeliveryRecord
|
|
460
|
+
|
|
461
|
+
职责:表达 `PersistedTurnResult` 是否已经稳定送达到渠道。
|
|
462
|
+
|
|
463
|
+
最小字段:
|
|
464
|
+
|
|
465
|
+
- `conversationKey`
|
|
466
|
+
- `threadId`
|
|
467
|
+
- `turnId`
|
|
468
|
+
- `deliveryStatus = pending | delivered | delivery_unavailable`
|
|
469
|
+
- `updatedAt`
|
|
470
|
+
|
|
471
|
+
说明:
|
|
472
|
+
|
|
473
|
+
- payload 本体不在这里重复存储
|
|
474
|
+
- payload 以 `PersistedTurnResult` 为准,避免双重真相
|
|
475
|
+
|
|
476
|
+
### 9.3 当前实现里明确保留、明确删除的东西
|
|
477
|
+
|
|
478
|
+
这次专题不能只写“收薄”,必须明确到现有代码层。
|
|
479
|
+
|
|
480
|
+
#### 9.3.1 明确保留
|
|
481
|
+
|
|
482
|
+
保留下面这些现有能力或等价能力:
|
|
483
|
+
|
|
484
|
+
- `noteInboundReceipt` / `completeInboundReceipt` 这类 receipt 去重能力
|
|
485
|
+
- `bindThread` / `activeTurnId` 这类 conversation binding 能力
|
|
486
|
+
- `recordApproval(..., { visible })` / `markApprovalVisible(...)`
|
|
487
|
+
- `notePendingUserInput(..., { visible })` / `markPendingUserInputVisible(...)`
|
|
488
|
+
- `recordTurn(...)` 作为最终结果持久化入口,或语义等价入口
|
|
489
|
+
- `recordOutboundDelivery(...)` / `markOutboundDelivered(...)`
|
|
490
|
+
- `redeliverPendingFinalReplies()` 与上一轮结果补发能力
|
|
491
|
+
- stale output suppression 的最终行为
|
|
492
|
+
|
|
493
|
+
#### 9.3.2 停止作为主路径判断依据
|
|
494
|
+
|
|
495
|
+
下面这些语义,从本专题开始不得再作为 bridge 主路径判断真相:
|
|
496
|
+
|
|
497
|
+
- `pending_recovery`
|
|
498
|
+
- `recovery_required`
|
|
499
|
+
- `waiting_approval` / `waiting_user_input` 作为 blocking truth
|
|
500
|
+
- `superseded` 作为普通路由和会话控制真相
|
|
501
|
+
- heartbeat 里基于 `turn-ledger.executionStatus` 的判断
|
|
502
|
+
|
|
503
|
+
允许它们在迁移期短暂存在于兼容层,但新主路径不得继续新增依赖。
|
|
504
|
+
|
|
505
|
+
#### 9.3.3 最终应删除的代码 / 接口
|
|
506
|
+
|
|
507
|
+
当新主路径切换完成并通过验证后,下面这些旧厚接口应直接删除,而不是长期保留:
|
|
508
|
+
|
|
509
|
+
- `SessionStore.markTurnWaitingApproval()`
|
|
510
|
+
- `SessionStore.markTurnWaitingUserInput()`
|
|
511
|
+
- `SessionStore.markTurnPendingRecovery()`
|
|
512
|
+
- `SessionStore.markTurnRecoveryRequired()`
|
|
513
|
+
- 任何仅为了驱动上述状态而存在的主路径分支
|
|
514
|
+
- `Receiver` 中以 `turn-ledger.executionStatus` 为主依据的 routing / heartbeat / waiting 判断
|
|
515
|
+
- 用户面与文档里仍在解释这些内部状态的文案
|
|
516
|
+
|
|
517
|
+
说明:
|
|
518
|
+
|
|
519
|
+
- `markTurnSuppressed()` 是否保留,不以“名字是否还在”为判断标准
|
|
520
|
+
- 如果 stale suppression 仍需要一个极简内部标记,就保留极简标记
|
|
521
|
+
- 但要删除它作为“厚生命周期状态”的扩张用法
|
|
522
|
+
|
|
523
|
+
### 9.4 新主路径合同
|
|
524
|
+
|
|
525
|
+
#### A. inbound
|
|
526
|
+
|
|
527
|
+
1. Feishu inbound normalize
|
|
528
|
+
2. receipt claim
|
|
529
|
+
3. slash / pending-response / plain-text 分类
|
|
530
|
+
4. reaction ack
|
|
531
|
+
|
|
532
|
+
#### B. route to runtime
|
|
533
|
+
|
|
534
|
+
1. 读 `ConversationBinding`
|
|
535
|
+
2. 无 thread:`thread/start` + `turn/start`
|
|
536
|
+
3. 有 active turn 且无 visible gate:`turn/steer`
|
|
537
|
+
4. 无 active turn 但已有 thread:`thread/resume` + `turn/start`
|
|
538
|
+
|
|
539
|
+
#### C. blocking truth
|
|
540
|
+
|
|
541
|
+
1. 若存在 visible approval gate:普通文本不转发,提示先处理审批
|
|
542
|
+
2. 若存在 visible user-input gate:普通文本不转发,提示先回答当前问题
|
|
543
|
+
3. 若 request 尚未真正送达到用户:不得进入 blocking
|
|
544
|
+
|
|
545
|
+
#### D. final result
|
|
546
|
+
|
|
547
|
+
1. 终态仍以 `thread/read(includeTurns=true)` 为 authoritative final-state check
|
|
548
|
+
2. 一旦确认终态,写入 `PersistedTurnResult`
|
|
549
|
+
3. 随后写入 / 更新 `FinalDeliveryRecord`
|
|
550
|
+
4. 渠道发送成功:`delivered`
|
|
551
|
+
5. 渠道发送失败但属 non-fatal:`delivery_unavailable`
|
|
552
|
+
6. 启动时或下一条 inbound 到来时做 bounded redelivery
|
|
553
|
+
|
|
554
|
+
### 9.5 recovery、stale、delivery 的新边界
|
|
555
|
+
|
|
556
|
+
#### A. recovery
|
|
557
|
+
|
|
558
|
+
recovery 保留为内部机制,但不再保留为 bridge 主路径状态世界。
|
|
559
|
+
|
|
560
|
+
允许保留的只有:
|
|
561
|
+
|
|
562
|
+
- 静默 bounded final-state reconcile
|
|
563
|
+
- reconcile 失败后的事实型兜底
|
|
564
|
+
|
|
565
|
+
不再允许:
|
|
566
|
+
|
|
567
|
+
- recovery 过程本身成为默认用户提示面
|
|
568
|
+
- recovery 状态成为 routing truth
|
|
569
|
+
- 围绕 recovery 继续增加 durable lifecycle enum
|
|
570
|
+
|
|
571
|
+
#### B. stale suppression
|
|
572
|
+
|
|
573
|
+
stale suppression 必须保留,但边界改为:
|
|
574
|
+
|
|
575
|
+
- 它只负责“不要把旧输出串给用户”
|
|
576
|
+
- 它可以留下 archive 事实或极简 suppression 标记
|
|
577
|
+
- 它不再承担桥层通用生命周期建模职责
|
|
578
|
+
|
|
579
|
+
#### C. delivery
|
|
580
|
+
|
|
581
|
+
delivery 是 bridge 核心补偿语义,继续保留并强化:
|
|
582
|
+
|
|
583
|
+
- 终态已确认 != 用户已收到
|
|
584
|
+
- delivery ledger 是核心对象,不是外围调试信息
|
|
585
|
+
- 只要结果已经持久化,就必须允许后续补发
|
|
586
|
+
|
|
587
|
+
### 9.6 外围能力与 bridge core 的边界
|
|
588
|
+
|
|
589
|
+
这次专题的目标不是把外围能力全部杀掉,而是切断它们反向定义 core 的权力。
|
|
590
|
+
|
|
591
|
+
#### A. supervisor
|
|
592
|
+
|
|
593
|
+
- 只负责进程托管
|
|
594
|
+
- 不再定义 turn / session / waiting / recovery 语义
|
|
595
|
+
- foreground 模式必须独立成立
|
|
596
|
+
|
|
597
|
+
#### B. work-session / handoff
|
|
598
|
+
|
|
599
|
+
- 只服务显式 multi-surface 场景
|
|
600
|
+
- 普通 Feishu 单路聊天主路径不得以它为前提
|
|
601
|
+
- 不得因为它的存在,让默认消息路由变复杂
|
|
602
|
+
|
|
603
|
+
#### C. archive / conversation view
|
|
604
|
+
|
|
605
|
+
- 只做 sidecar fact sink
|
|
606
|
+
- 不得主导 routing、blocking、recovery、delivery 真相
|
|
607
|
+
|
|
608
|
+
#### D. routine / scheduler / digest
|
|
609
|
+
|
|
610
|
+
- 视为独立产品能力
|
|
611
|
+
- 不得把自己的状态模型注入普通聊天主路径
|
|
612
|
+
|
|
613
|
+
### 9.7 工程模块化与文件规模治理
|
|
614
|
+
|
|
615
|
+
这次专题明确把“模块化”视为实现的一部分,而不是代码整理 bonus。
|
|
616
|
+
|
|
617
|
+
#### A. 文件规模纪律
|
|
618
|
+
|
|
619
|
+
- `300` 行是强制反思阈值:超过后必须判断是否拆分
|
|
620
|
+
- `600` 行是默认上限:新增或重构后的实现代码文件原则上不应超过
|
|
621
|
+
- `1000+` 行是明确重构信号:不得当成常态接受
|
|
622
|
+
- `1700 ~ 2400` 行级别文件必须优先拆分,不允许继续堆功能
|
|
623
|
+
|
|
624
|
+
说明:
|
|
625
|
+
|
|
626
|
+
- 这里指项目实现代码,不含生成文件、fixture 快照或第三方代码
|
|
627
|
+
- 目标不是机械切文件,而是让模块边界和产品边界对齐
|
|
628
|
+
|
|
629
|
+
#### B. 当前必须纳入拆分目标的热点文件
|
|
630
|
+
|
|
631
|
+
- `bridge/src/receiver.ts`
|
|
632
|
+
- `bridge/src/runtime-client.ts`
|
|
633
|
+
- `bridge/src/session-store.ts`
|
|
634
|
+
|
|
635
|
+
#### C. 拆分原则
|
|
636
|
+
|
|
637
|
+
- 按职责拆,不按随机行数硬切
|
|
638
|
+
- 核心桥梁路径与外围能力优先分离
|
|
639
|
+
- routing、visible gate、delivery compensation、runtime transport、sidecar observability 等职责要能落到不同模块
|
|
640
|
+
- 拆分后若只是把同一团语义换成更多文件名,不算完成
|
|
641
|
+
|
|
642
|
+
## 10. 重构范围与阶段
|
|
643
|
+
|
|
644
|
+
### Phase 1:冻结边界,补齐护栏
|
|
645
|
+
|
|
646
|
+
用户价值:先把“绝不能退”的主链路写死,避免边做边赌。
|
|
647
|
+
|
|
648
|
+
交付:
|
|
649
|
+
|
|
650
|
+
- 明确 core / peripheral 边界
|
|
651
|
+
- 补 characterization tests,锁定当前必须保留行为
|
|
652
|
+
- 补“只认 visible gate”“只认 persisted result + delivery ledger”的测试护栏
|
|
653
|
+
|
|
654
|
+
完成标准:
|
|
655
|
+
|
|
656
|
+
- 团队可以明确回答:哪些是 bridge core,哪些不是
|
|
657
|
+
- 当前主路径的正确性底线已被测试覆盖
|
|
658
|
+
|
|
659
|
+
### Phase 2:切换主路径到精简真相
|
|
660
|
+
|
|
661
|
+
用户价值:bridge 更忠实、更薄,普通消息和结果交付更少受本地厚状态干扰。
|
|
662
|
+
|
|
663
|
+
交付:
|
|
664
|
+
|
|
665
|
+
- `Receiver` / `router` / `translator` 主路径改为只依赖:
|
|
666
|
+
- receipt claim
|
|
667
|
+
- conversation binding
|
|
668
|
+
- visible human gate
|
|
669
|
+
- persisted turn result
|
|
670
|
+
- final delivery ledger
|
|
671
|
+
- 主路径不再依赖 `pending_recovery` / `recovery_required` / `waiting_*` / `superseded` 这些厚 enum
|
|
672
|
+
- recovery 改成静默 reconcile + terminal fallback
|
|
673
|
+
- heartbeat 不再依赖厚 ledger 状态
|
|
674
|
+
- 开始拆分 `receiver.ts`、`runtime-client.ts`、`session-store.ts` 等超大文件,把边界真正落到模块结构
|
|
675
|
+
|
|
676
|
+
完成标准:
|
|
677
|
+
|
|
678
|
+
- 用户主路径仍稳定
|
|
679
|
+
- 主路径代码已不再读取厚状态作为核心真相
|
|
680
|
+
|
|
681
|
+
### Phase 3:删旧状态、删旧代码、删旧测试
|
|
682
|
+
|
|
683
|
+
用户价值:不是“逻辑上变薄”,而是代码和维护面真的变薄。
|
|
684
|
+
|
|
685
|
+
交付:
|
|
686
|
+
|
|
687
|
+
- 删除已不再需要的 turn lifecycle enum 与写接口
|
|
688
|
+
- 删除只服务旧厚状态的分支、文案、测试
|
|
689
|
+
- 删除已经不再被核心主路径依赖的兼容逻辑
|
|
690
|
+
- 删除本次确认无用的巨型文件内部耦合层与搬运代码
|
|
691
|
+
- 文档同步切到新边界,不再保留旧心智
|
|
692
|
+
|
|
693
|
+
硬要求:
|
|
694
|
+
|
|
695
|
+
- 这一阶段不是可选“以后再清理”
|
|
696
|
+
- 只要新主路径已经稳定,就必须把确认无用的旧代码一起删掉
|
|
697
|
+
|
|
698
|
+
## 10.5 小步快跑实施策略
|
|
699
|
+
|
|
700
|
+
这次专题是重构,不接受“大爆炸式改完再统一验证”的落地方式。
|
|
701
|
+
|
|
702
|
+
默认实施方法必须是:
|
|
703
|
+
|
|
704
|
+
- 一次只改一类主语义或一类模块职责
|
|
705
|
+
- 每一步结束后立刻验证
|
|
706
|
+
- 验证不过,不进入下一步
|
|
707
|
+
- 每一步都应可单独提交、单独回滚、单独验收
|
|
708
|
+
|
|
709
|
+
### 10.5.1 稳定性定义
|
|
710
|
+
|
|
711
|
+
对本专题,`稳定性` 指下面这些用户面底线在整个重构过程中始终成立:
|
|
712
|
+
|
|
713
|
+
1. 普通消息必须稳定进入 Codex。
|
|
714
|
+
2. approval / user-input 不能丢、不能错拦、不能误解。
|
|
715
|
+
3. final reply 不能因为重构而丢失。
|
|
716
|
+
4. 私聊 / 群聊 / conversation thread 不能串。
|
|
717
|
+
5. 旧 turn 的迟到输出不能串到新消息。
|
|
718
|
+
6. 用户不能因为重构体感成“消息被吞了”或“机器人没反应”。
|
|
719
|
+
|
|
720
|
+
### 10.5.2 切片原则
|
|
721
|
+
|
|
722
|
+
每一个实施切片都必须满足:
|
|
723
|
+
|
|
724
|
+
1. 目标单一:一次只解决一个主题,例如“只拆文件”或“只切 blocking truth”。
|
|
725
|
+
2. 改动可控:尽量避免同一步同时改语义、改文件结构、改文案、改测试基线。
|
|
726
|
+
3. 风险可回退:改动失败时可以直接回滚,不会把 bridge 留在半坏状态。
|
|
727
|
+
4. 验证闭环:该步完成后,必须有对应自动化和必要 smoke 支撑。
|
|
728
|
+
|
|
729
|
+
### 10.5.3 推荐实施切片
|
|
730
|
+
|
|
731
|
+
#### Step 0:补护栏,不改产品语义
|
|
732
|
+
|
|
733
|
+
目标:先锁定当前必须保留的行为,防止后续减法误伤主链路。
|
|
734
|
+
|
|
735
|
+
只做:
|
|
736
|
+
|
|
737
|
+
- 补 characterization tests
|
|
738
|
+
- 补 bridge core 主路径基线测试
|
|
739
|
+
- 补当前超大文件拆分前的 smoke 护栏
|
|
740
|
+
|
|
741
|
+
不做:
|
|
742
|
+
|
|
743
|
+
- 不改 routing 语义
|
|
744
|
+
- 不改 recovery 语义
|
|
745
|
+
- 不删旧代码
|
|
746
|
+
|
|
747
|
+
完成后必须验证:
|
|
748
|
+
|
|
749
|
+
- unit tests
|
|
750
|
+
- 必要的 integration / shell tests
|
|
751
|
+
- 最小聊天 smoke
|
|
752
|
+
|
|
753
|
+
#### Step 1:先拆文件,不改行为
|
|
754
|
+
|
|
755
|
+
目标:优先把超大文件里的纯 helper / 纯职责模块拆出去,但保持行为等价。
|
|
756
|
+
|
|
757
|
+
只做:
|
|
758
|
+
|
|
759
|
+
- 从 `receiver.ts`、`runtime-client.ts`、`session-store.ts` 中拆纯职责模块
|
|
760
|
+
- 例如 delivery、visible gate、runtime transport、stale suppression、status formatting 等
|
|
761
|
+
|
|
762
|
+
不做:
|
|
763
|
+
|
|
764
|
+
- 不改变主路径判断条件
|
|
765
|
+
- 不改变用户面语义
|
|
766
|
+
- 不借机删状态模型
|
|
767
|
+
|
|
768
|
+
完成后必须验证:
|
|
769
|
+
|
|
770
|
+
- 行为回归零变化
|
|
771
|
+
- 现有测试全绿
|
|
772
|
+
|
|
773
|
+
#### Step 2:把 visible human gate 收成唯一 blocking truth
|
|
774
|
+
|
|
775
|
+
目标:普通 follow-up 是否被拦截,只由 visible approval / visible user-input 决定。
|
|
776
|
+
|
|
777
|
+
只做:
|
|
778
|
+
|
|
779
|
+
- 切 routing / waiting 判断
|
|
780
|
+
- 停止让 `waiting_*` ledger 状态主导 blocking truth
|
|
781
|
+
|
|
782
|
+
允许保留:
|
|
783
|
+
|
|
784
|
+
- 旧厚状态继续兼容写入
|
|
785
|
+
- 旧结构继续保留短期读取
|
|
786
|
+
|
|
787
|
+
完成后必须验证:
|
|
788
|
+
|
|
789
|
+
- 普通 follow-up
|
|
790
|
+
- approval 阻塞与回复
|
|
791
|
+
- user-input 阻塞与回复
|
|
792
|
+
|
|
793
|
+
#### Step 3:把 final result 真相收口到 persisted result + delivery ledger
|
|
794
|
+
|
|
795
|
+
目标:终态确认与结果补发只围绕 authoritative final-state check、persisted result、delivery ledger 运转。
|
|
796
|
+
|
|
797
|
+
只做:
|
|
798
|
+
|
|
799
|
+
- final result truth 收口
|
|
800
|
+
- redelivery 主路径收口
|
|
801
|
+
- 停止让 recovery 厚状态主导 final result 判断
|
|
802
|
+
|
|
803
|
+
完成后必须验证:
|
|
804
|
+
|
|
805
|
+
- completed / failed / interrupted
|
|
806
|
+
- delivery unavailable -> redelivery
|
|
807
|
+
- completion without reply
|
|
808
|
+
|
|
809
|
+
#### Step 4:把 stale suppression 从厚状态降回正确性保护
|
|
810
|
+
|
|
811
|
+
目标:保留防串话能力,但不再让 `superseded` 主导通用生命周期。
|
|
812
|
+
|
|
813
|
+
只做:
|
|
814
|
+
|
|
815
|
+
- 收缩 stale suppression 语义
|
|
816
|
+
- 保留必要的极简 suppression marker 或 sidecar fact
|
|
817
|
+
|
|
818
|
+
完成后必须验证:
|
|
819
|
+
|
|
820
|
+
- 旧 turn 迟到结果不会串给新消息
|
|
821
|
+
- 新消息仍可稳定启动或 steer
|
|
822
|
+
|
|
823
|
+
#### Step 5:外围能力降耦
|
|
824
|
+
|
|
825
|
+
目标:让 `supervisor`、`work-session`、`handoff`、`archive`、`routine` 不再污染 bridge core 主路径。
|
|
826
|
+
|
|
827
|
+
只做:
|
|
828
|
+
|
|
829
|
+
- 降低外围能力对默认聊天主路径的耦合
|
|
830
|
+
- 确认 foreground 模式可独立成立
|
|
831
|
+
|
|
832
|
+
完成后必须验证:
|
|
833
|
+
|
|
834
|
+
- foreground 主链路
|
|
835
|
+
- 托管模式主链路
|
|
836
|
+
- 相关外围能力未破坏默认聊天路径
|
|
837
|
+
|
|
838
|
+
#### Step 6:删旧代码并收口文档
|
|
839
|
+
|
|
840
|
+
目标:在前面几步都稳定后,再真正删除已无用的厚状态接口、旧分支、旧测试、旧文案。
|
|
841
|
+
|
|
842
|
+
只做:
|
|
843
|
+
|
|
844
|
+
- 删已确认无用代码
|
|
845
|
+
- 删旧测试 / 旧文案
|
|
846
|
+
- 回写 README / DASHBOARD / 相关 spec
|
|
847
|
+
|
|
848
|
+
硬约束:
|
|
849
|
+
|
|
850
|
+
- 这一阶段不能提前做
|
|
851
|
+
- 但一旦进入,也不能再以“以后可能有用”为理由长期保留遗产代码
|
|
852
|
+
|
|
853
|
+
### 10.5.4 每一步的最小执行模板
|
|
854
|
+
|
|
855
|
+
后续实际推进时,每一步都按同一模板执行:
|
|
856
|
+
|
|
857
|
+
1. 先声明这一步只改什么,不改什么。
|
|
858
|
+
2. 实现后立刻跑对应自动化。
|
|
859
|
+
3. 必要时补最小真人 smoke。
|
|
860
|
+
4. 验证通过后再进入下一步。
|
|
861
|
+
5. 若失败,就在这一步内修完或回退,不把问题带进下一步。
|
|
862
|
+
|
|
863
|
+
### 10.5.5 交付节奏要求
|
|
864
|
+
|
|
865
|
+
本专题最终虽然会合成一个“已完成”的专题,但实施过程必须保持:
|
|
866
|
+
|
|
867
|
+
- 多个小步骤
|
|
868
|
+
- 多次独立验证
|
|
869
|
+
- 多次可回退交付
|
|
870
|
+
|
|
871
|
+
不允许:
|
|
872
|
+
|
|
873
|
+
- 一次改几十个文件后再统一验收
|
|
874
|
+
- 文件拆分和语义切换大面积混做
|
|
875
|
+
- 在没有验证闭环的前提下连续推进多个步骤
|
|
876
|
+
|
|
877
|
+
## 11. 稳定性保障与删代码原则
|
|
878
|
+
|
|
879
|
+
### 11.1 不可退化的 9 条底线
|
|
880
|
+
|
|
881
|
+
1. 同一条 inbound message 不得触发多个有效 turn。
|
|
882
|
+
2. 普通自然语言默认仍可进入 Codex,而不是被 bridge 吞掉。
|
|
883
|
+
3. 只有 visible human gate 才能阻塞普通 follow-up。
|
|
884
|
+
4. approval / user-input 仍可正确送达、回答并回写 runtime。
|
|
885
|
+
5. final result 一旦已从官方事实源确认,就不能因为单次渠道失败而永久丢失。
|
|
886
|
+
6. stale output 仍必须被稳定抑制,不能串到新一轮对话里。
|
|
887
|
+
7. 只有显式 `/stop` 语义,才能稳定翻译为“当前任务已停止”。
|
|
888
|
+
8. foreground 模式必须成立;supervisor 只是托管增强,不是语义前提。
|
|
889
|
+
9. handoff / archive / routine 等外围能力即便保留,也不能破坏聊天主路径。
|
|
890
|
+
|
|
891
|
+
### 11.2 迁移策略
|
|
892
|
+
|
|
893
|
+
1. 先补护栏,再改主路径。
|
|
894
|
+
2. 迁移期允许读取旧 `SessionStore` / turn ledger 结构。
|
|
895
|
+
3. 从 Phase 2 开始,新主路径只允许写入和读取精简真相。
|
|
896
|
+
4. 旧厚状态只可用于兼容读取或短期回放,不得继续成为新分支前提。
|
|
897
|
+
5. Phase 3 一旦完成验证,必须删除已无用的旧接口、旧测试、旧文案。
|
|
898
|
+
|
|
899
|
+
### 11.3 删代码原则
|
|
900
|
+
|
|
901
|
+
这次专题明确遵守下面 3 条:
|
|
902
|
+
|
|
903
|
+
1. 不因为“以后可能用得上”而保留已确认无用的状态与分支。
|
|
904
|
+
2. 不允许长期存在“双真相模型”:新模型负责主路径,旧模型只是临时兼容,必须有删除节点。
|
|
905
|
+
3. 文档、测试、代码必须一起删旧;不能代码删了,文档还写旧心智,或反过来。
|
|
906
|
+
|
|
907
|
+
### 11.4 测试策略
|
|
908
|
+
|
|
909
|
+
自动化至少覆盖:
|
|
910
|
+
|
|
911
|
+
- inbound 去重
|
|
912
|
+
- `turn/start` / `turn/steer` 主路径
|
|
913
|
+
- visible approval / user-input gate
|
|
914
|
+
- final-state pull-primary
|
|
915
|
+
- delivery unavailable -> redelivery
|
|
916
|
+
- stale output suppression
|
|
917
|
+
- foreground 无 supervisor 主路径
|
|
918
|
+
- supervisor 仅做进程托管,不影响主语义
|
|
919
|
+
- 拆分后的模块边界 smoke,不因文件重组破坏现有主链路
|
|
920
|
+
|
|
921
|
+
### 11.5 文档策略
|
|
922
|
+
|
|
923
|
+
需要同步回写:
|
|
924
|
+
|
|
925
|
+
- `README.md`
|
|
926
|
+
- `DASHBOARD.md`
|
|
927
|
+
- 相关 planning / implementation spec
|
|
928
|
+
- 必要的 manual acceptance 文档
|
|
929
|
+
|
|
930
|
+
文档口径必须统一成一句话:
|
|
931
|
+
|
|
932
|
+
> bridge core = 协议转接 + 最小路由状态 + visible human gate + final delivery compensation。
|
|
933
|
+
|
|
934
|
+
## 12. DoD / 验收标准
|
|
935
|
+
|
|
936
|
+
### 12.1 结构 DoD
|
|
937
|
+
|
|
938
|
+
1. 工程上可以明确区分 bridge core 与外围产品层。
|
|
939
|
+
2. bridge core 主路径只依赖精简真相对象,而不是厚 turn lifecycle 状态。
|
|
940
|
+
3. `pending_recovery` / `recovery_required` / `waiting_*` / `superseded` 不再是主路径判断前提。
|
|
941
|
+
4. `supervisor`、`handoff`、`archive`、`routine` 不再污染核心主路径判断。
|
|
942
|
+
5. 本次纳入治理的超大实现文件已完成模块化拆分,或至少已有明确的阶段性交付切口,不再继续无边界膨胀。
|
|
943
|
+
|
|
944
|
+
### 12.2 行为 DoD
|
|
945
|
+
|
|
946
|
+
1. 普通消息默认仍可正确进入 Codex。
|
|
947
|
+
2. active turn 中的普通 follow-up 默认仍按协议进入 `turn/steer`。
|
|
948
|
+
3. approval / user-input 请求仍能正确形成 visible gate 并被用户回答。
|
|
949
|
+
4. final reply 仍以 authoritative final-state check + delivery ledger 收口。
|
|
950
|
+
5. 渠道单次失败后,仍能稳定补发上一轮结果。
|
|
951
|
+
6. stale output 仍会被抑制,不会把旧 turn 的结果串给新消息。
|
|
952
|
+
|
|
953
|
+
### 12.3 删除 DoD
|
|
954
|
+
|
|
955
|
+
1. 已确认无用的厚状态接口与分支已删除,而不是只停止使用。
|
|
956
|
+
2. 只服务旧厚状态的测试、文案和说明已同步删除或改写。
|
|
957
|
+
3. 仓库里不存在“主路径靠新模型,解释仍靠旧模型”的双口径残留。
|
|
958
|
+
4. 已确认只是历史堆积、没有继续保留价值的超大文件内部耦合层与搬运代码已同步清掉。
|
|
959
|
+
|
|
960
|
+
### 12.4 模块化 DoD
|
|
961
|
+
|
|
962
|
+
1. 重构后的核心实现文件规模符合新的工程纪律:超过 `300` 行有明确拆分判断,超过 `600` 行有明确理由。
|
|
963
|
+
2. `1700+` / `2000+` 行级别的核心文件不再继续原地膨胀,至少已有明确拆分成果。
|
|
964
|
+
3. 模块命名与职责能直接映射到 bridge core / peripheral 的产品边界。
|
|
965
|
+
|
|
966
|
+
### 12.5 稳定性 DoD
|
|
967
|
+
|
|
968
|
+
1. 核心自动化测试全部通过。
|
|
969
|
+
2. `bash tests/shell/assistant.sh`、相关 integration / unit tests、以及必要的 runtime/bridge 路径验证通过。
|
|
970
|
+
3. foreground 模式与托管模式都能跑通聊天主链路。
|
|
971
|
+
4. 不出现“因为瘦身而丢 reply / 丢 approval / 丢 user input / 错吞消息”的回归。
|
|
972
|
+
|
|
973
|
+
### 12.6 文档 DoD
|
|
974
|
+
|
|
975
|
+
1. README 与相关 spec 已回到新的核心边界口径。
|
|
976
|
+
2. dashboard 上能明确看出该专题的状态与后续阶段。
|
|
977
|
+
3. 后续新增 feature 若继续往 core bridge 塞厚语义,将有明确文档标准可拦截。
|
|
978
|
+
|
|
979
|
+
## 13. 风险、假设与待决问题
|
|
980
|
+
|
|
981
|
+
### 13.1 风险
|
|
982
|
+
|
|
983
|
+
1. 如果精简过头,可能误伤少数异常路径的补偿能力。
|
|
984
|
+
2. 如果删代码顺序不当,可能在短期内造成 handoff / archive / routine 与核心桥梁接口抖动。
|
|
985
|
+
3. 如果 characterization tests 不先补齐,瘦身会重新变成边改边赌。
|
|
986
|
+
|
|
987
|
+
### 13.2 假设
|
|
988
|
+
|
|
989
|
+
1. 官方 Codex App Server 协议面已足够支撑忠实桥梁,不需要 bridge 再造第二套任务语义。
|
|
990
|
+
2. 当前真正必须保留的补偿,主要集中在 receipt dedupe、visible gate、pull-primary final-state reconcile、final delivery redelivery。
|
|
991
|
+
3. stale suppression 是正确性保护,应保留;但它不需要继续扩张为厚生命周期状态系统。
|
|
992
|
+
|
|
993
|
+
### 13.3 待决问题
|
|
994
|
+
|
|
995
|
+
1. `PersistedTurnResult` 最终是继续复用当前 `TurnRecord` 文件结构,还是收口成更小的专用结构?
|
|
996
|
+
2. `markTurnSuppressed()` 最终是完全删除,还是保留为极简 suppression marker?
|
|
997
|
+
3. `work-session` / handoff 后续是只做桥内外围模块,还是再单独拆专题继续降耦?
|
|
998
|
+
|
|
999
|
+
## 14. 当前实施结论
|
|
1000
|
+
|
|
1001
|
+
### 14.1 当前实施快照(2026-03-19)
|
|
1002
|
+
|
|
1003
|
+
最近已按“小步快跑”连续落地并提交这些纯结构化切片:
|
|
1004
|
+
|
|
1005
|
+
- `9429b78` `Split session store meta and inbound acceptance helpers`
|
|
1006
|
+
- `0ca6974` `Extract receiver support actions`
|
|
1007
|
+
- `158af1f` `Extract receiver turn execution orchestration`
|
|
1008
|
+
- `a65dfd6` `Extract runtime client request plumbing`
|
|
1009
|
+
- `d0ef542` `Extract runtime client turn state helpers`
|
|
1010
|
+
- `cdc1955` `Extract runtime turn start flow`
|
|
1011
|
+
- `cc692b9` `Extract server routine execution`
|
|
1012
|
+
- `e779c84` `Extract server handoff command`
|
|
1013
|
+
- `c83893c` `Extract server main entry flow`
|
|
1014
|
+
- `e3ede0d` `Extract server routine command`
|
|
1015
|
+
- `d39fea0` `Extract runtime app support helpers`
|
|
1016
|
+
- `b8c3f4d` `Extract runtime app composition shell`
|
|
1017
|
+
- `9eeec02` `Simplify inbound receipt dedupe semantics`
|
|
1018
|
+
|
|
1019
|
+
当前已确认的阶段性结果:
|
|
1020
|
+
|
|
1021
|
+
- `bridge/src/runtime-client.ts` 已从 `442` 行压到 `331` 行
|
|
1022
|
+
- `bridge/src/server.ts` 当前已压到 `16` 行,仅保留 re-export 与 CLI 入口 facade
|
|
1023
|
+
- `bridge/src/server-runtime-app.ts` 已稳定承接 `RuntimeApp` 与 app factory 组装逻辑,当前 `243` 行
|
|
1024
|
+
- `bridge/src/server-main.ts` 已稳定承接主进程入口,当前 `74` 行
|
|
1025
|
+
- `bridge/src/server-runtime-app-support.ts` 已稳定承接 `RuntimeApp` 的 startup / health / notice / redelivery 支撑逻辑,当前 `110` 行
|
|
1026
|
+
- `bridge/src/receiver.ts` 已压到 `329` 行,当前主要承担 orchestrator 角色
|
|
1027
|
+
- `bridge/src/session-store.ts` 已压到 `369` 行,meta / inbound acceptance 已拆出
|
|
1028
|
+
- receipt claim 现仅保留 `claimed / duplicate_processing / duplicate_completed`
|
|
1029
|
+
- `superseded` 已不再占据 execution truth;当前已进一步收口为 `suppressed / suppression provenance` 标记
|
|
1030
|
+
|
|
1031
|
+
当前新增并已稳定承接职责的模块:
|
|
1032
|
+
|
|
1033
|
+
- `bridge/src/runtime-client-request-ops.ts`
|
|
1034
|
+
- `bridge/src/runtime-client-turn-state.ts`
|
|
1035
|
+
- `bridge/src/server-routine-execution.ts`
|
|
1036
|
+
- `bridge/src/server-handoff-command.ts`
|
|
1037
|
+
- `bridge/src/server-main.ts`
|
|
1038
|
+
- `bridge/src/server-routine-command.ts`
|
|
1039
|
+
- `bridge/src/server-runtime-app-support.ts`
|
|
1040
|
+
- `bridge/src/server-runtime-app.ts`
|
|
1041
|
+
|
|
1042
|
+
当前验证已覆盖并通过的代表性路径:
|
|
1043
|
+
|
|
1044
|
+
- `tests/unit/runtime/runtime-client-lifecycle.test.mjs`
|
|
1045
|
+
- `tests/unit/runtime/runtime-client-message-phases.test.mjs`
|
|
1046
|
+
- `tests/unit/runtime/runtime-client-thread-status.test.mjs`
|
|
1047
|
+
- `tests/unit/runtime/runtime-client-pull-primary.test.mjs`
|
|
1048
|
+
- `tests/unit/runtime/runtime-client-pull-primary-waiting.test.mjs`
|
|
1049
|
+
- `env -i PATH=/usr/bin:/bin:/opt/homebrew/bin HOME=$HOME TMPDIR=/tmp node --test tests/unit/session/session-store.test.mjs`
|
|
1050
|
+
- `env -i PATH=/usr/bin:/bin:/opt/homebrew/bin HOME=$HOME TMPDIR=/tmp node --test tests/integration/routines/routine-flow.test.mjs`
|
|
1051
|
+
- `env -i PATH=/usr/bin:/bin:/opt/homebrew/bin HOME=$HOME TMPDIR=/tmp node --test tests/integration/routines/routine-delivery.test.mjs`
|
|
1052
|
+
- `env -i PATH=/usr/bin:/bin:/opt/homebrew/bin HOME=$HOME TMPDIR=/tmp node --test tests/integration/session/bridge-core-baseline.test.mjs`
|
|
1053
|
+
- `env -i PATH=/usr/bin:/bin:/opt/homebrew/bin HOME=$HOME TMPDIR=/tmp node --test tests/integration/session/runtime-failure-and-recovery.test.mjs`
|
|
1054
|
+
- `env -i PATH=/usr/bin:/bin:/opt/homebrew/bin HOME=$HOME TMPDIR=/tmp node --test tests/integration/session/stability-regression.test.mjs`
|
|
1055
|
+
- `env -i PATH=/usr/bin:/bin:/opt/homebrew/bin HOME=$HOME TMPDIR=/tmp bash tests/shell/routines.sh`
|
|
1056
|
+
- `tests/shell/codex-handoff.sh`
|
|
1057
|
+
|
|
1058
|
+
完成判定:
|
|
1059
|
+
|
|
1060
|
+
- 本专题目标已经完成:bridge core 已完成收边界、厚状态口径已退出主路径、关键超大文件已完成阶段性模块化拆分。
|
|
1061
|
+
- clean-env Node 回归与 `tests/shell/codex-handoff.sh` 已通过;`tests/shell/assistant.sh` 的剩余卡点已确认是测试收尾阶段的 assistant desk remote push 噪音,不属于本专题改动引入的 bridge 回归。
|
|
1062
|
+
- 后续若要处理 `assistant.sh` 的 remote push 卡顿,应作为独立测试/工程问题继续跟进,不再阻塞本专题收口。
|
|
1063
|
+
|
|
1064
|
+
对这次专题,执行口径直接定为下面 4 句:
|
|
1065
|
+
|
|
1066
|
+
1. **保留**:协议转接、receipt 去重、最小 conversation binding、visible human gate、persisted final result、delivery ledger、bounded redelivery、stale suppression。
|
|
1067
|
+
2. **停止依赖**:`pending_recovery`、`recovery_required`、`waiting_*`、`superseded` 这些厚状态作为主路径真相。
|
|
1068
|
+
3. **删掉**:确认无用的厚状态接口、分支、文案、测试,不做“留着以后再说”的温和保留。
|
|
1069
|
+
4. **守住边界**:bridge core 以后只做稳定桥梁和最小补偿,不再回到“本地任务脑”的方向。
|
|
1070
|
+
|
|
1071
|
+
这份 spec 的本质,不是为了“看起来更薄”,而是为了让 `work-ally` 真正回到它最该维护、也最值得长期维护的产品边界。
|