Compare commits
24
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
66ddd37870 | ||
|
|
1fe5b73491 | ||
|
|
16cafca00c | ||
|
|
3e68448f11 | ||
|
|
0b314e2029 | ||
|
|
62da617648 | ||
|
|
7fbfad1851 | ||
|
|
b680142586 | ||
|
|
877d0683cd | ||
|
|
b5dceb5e47 | ||
|
|
da59ccff04 | ||
|
|
5a807933c2 | ||
|
|
71cd9d1db2 | ||
|
|
cbc64eb8ab | ||
|
|
54fc24e4d5 | ||
|
|
23e2276905 | ||
|
|
2085447701 | ||
|
|
63d5986819 | ||
|
|
895a7204b9 | ||
|
|
2e1b39ea68 | ||
|
|
b6b6059222 | ||
|
|
75ddd65c69 | ||
|
|
aba1d6a3d6 | ||
|
|
72a098a783 |
@@ -417,6 +417,11 @@ AG-UI 仅在需要跨 Agent 框架互通时评估事件适配;MCP Apps 仅在
|
||||
|
||||
### U6. 自适应任务与项目工作区
|
||||
|
||||
> **2026-10-11 用户裁定**:U1–U5 已全部落地合入;U6 启动前置(「U4/U5 的收益
|
||||
> 与可靠性证据」)改为 **owner 实际体验评估**——在真实使用中启用 generative-ui
|
||||
> 插件、体验页面生成/修订/表单提交(人类可用性对照自 U1 起 NOT_RUN,本裁定即
|
||||
> 其执行方式)。体验结论(继续/调整/停止)由用户给出后再开 U6。
|
||||
|
||||
- 关联 R8,依赖 U4/U5 的收益与可靠性证据。
|
||||
- 文件范围:Frontend workspace/任务页容器、插件上下文选择与触发策略、Backend 授权聚合适配、相关测试。
|
||||
- 方法:先当前任务,后项目;任务阶段触发有限更新;固定布局/恢复原视图;自动模式单独 opt-in。
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
title: Generative UI U5 action-scope proposal
|
||||
date: 2026-10-11
|
||||
type: feat
|
||||
revision: r1
|
||||
status: awaiting-user-review
|
||||
revision: r2
|
||||
status: approved
|
||||
product_contract_source: generative-ui-r2-U5-clause
|
||||
---
|
||||
|
||||
@@ -75,7 +75,18 @@ MCP/外部 HTTP 直连、任意命令即时全开。
|
||||
5. 禁用后动作 403;A 类本地行为不受影响。
|
||||
6. 幂等重放返回相同回执(并发双击一次生效)。
|
||||
|
||||
## 六、请用户裁定的三点
|
||||
## 六、裁定记录(2026-10-11,用户已裁定)
|
||||
|
||||
三点均经用户裁定**同意**(推荐项全取):
|
||||
|
||||
1. **分类与范围**:A 全开 / B 机制先行白名单空起步 / C 限插件自有写 / D 全关——同意。
|
||||
2. **C 类边界**:限定 KV + 后台任务台账,不建新业务事实表——同意。
|
||||
3. **确认卡 UX**:复用现有内联确认卡,不新建审批 UI——同意。
|
||||
|
||||
本文升级为已批准范围;U5 实施按 policy/delivery.md 开任务(feature/generative-ui-u5),
|
||||
验收线以第五节为准。
|
||||
|
||||
### 七、原裁定请求(历史留档)
|
||||
|
||||
1. **分类与范围**:A 全开、B 机制先行白名单空起步、C 限插件自有写、D 全关——是否同意?
|
||||
2. **C 类边界**:插件自身写是否限定为 KV + 后台任务台账(不建新的业务事实表)?
|
||||
|
||||
@@ -9,7 +9,7 @@ product_contract_source: ce-plan-bootstrap
|
||||
|
||||
# RDM 两树一网集成、完善与追溯审计展示方案
|
||||
|
||||
修订:r1(2026-10-11 并入用户裁定);确认状态:用户评审通过(2026-10-11,需求拆解至实施计划五阶段一并,含 KTD4 双层管理员裁定);推进状态:U1、U2、U3 已实施并合入(RDM PR #195 merge 05b7d1a;PR #197 merge fe8a75b;PR #201 merge dbc41b6,2026-10-11);U4–U5、迁移与运行验收未启动。
|
||||
修订:r1(2026-10-11 并入用户裁定);确认状态:用户评审通过(2026-10-11,需求拆解至实施计划五阶段一并,含 KTD4 双层管理员裁定);推进状态:U1–U5 全部实施并合入(RDM PR #195/#197/#201/#213;Dev PR #368,2026-10-11);管理区「项目追溯与审计」入口经通用声明机制补齐(扩展面 2.9.0 Registry.AddAdminZone;Backend #165、Frontend #63/#64、RDM #240、Dev #414,2026-10-12;rdm.audit 分区随 rdm 插件声明,区内能力仍由 rdm.inspect.* fail-closed);管理页插件清单另合并编译插件条目(Dev #404,2026-10-12)。U6(团队存储)独立后续;运行验收属部署环境。
|
||||
需求负责人:weichen;方案编制:Codex;实施负责人:待实施立项时指定。
|
||||
来源:2026-10-11 用户要求检查两树一网现状,并设计简单直观的项目追溯、审计展示;同轮明确选择“完善 RDM,并补齐必要的基座能力”。
|
||||
目标仓:Agent-System-RDM;下文 `RDM:` 路径相对于该仓,`Dev:` 路径相对于 Agent-System-Dev;所有建议接口名均为候选契约。
|
||||
@@ -317,6 +317,8 @@ U1 同批接通旧客户端的项目选择和命令封装,并解析可信会
|
||||
验证:真实浏览器完成来源查询、选择历史时间/基线并返回当前、管理员从宿主 A 打开审计 B 后标题和请求一致;模拟慢请求后快速切项目无串页;键盘、窄屏、长标题、千级节点懒加载、空/失败/受限/不可还原状态可理解。
|
||||
完成条件:用户按三次主要点击任务完成取证,并人工评审界面是否直观;业务可用与视觉通过分别记录。
|
||||
|
||||
进展(2026-10-11,Dev PR #368 merge 7aa8fd9):U4 已实施合入——`RdmAuditWorkspace.tsx` 四入口(概览/资料文档/关联追溯/操作记录)Dev 前端 builtin 工作区,消费 U3 `rdm.inspect.*` 七命令面;`rdmCommand` 封装(receipt 解包+confirm-card 提示);DESIGN.md 令牌严格合规(0 裸色值/0 行内 fontSize/0 details/0 新增 keyframes)。附带修复 U5 遗留的 PreviewPane TS 类型错误(单参/双参签名匹配)。
|
||||
|
||||
### U5. 历史导出与正式集成验收
|
||||
|
||||
目标/需求:R5、R8、R9、R10;依赖:U2、U3、U4。
|
||||
@@ -329,6 +331,8 @@ U1 同批接通旧客户端的项目选择和命令封装,并解析可信会
|
||||
验证:导出中途有新写入不改变已固定内容;历史来源软删除仍可按授权追溯;未归属/缺失事件可见;跨项目下载、过期下载、权限撤销均拒绝。
|
||||
完成条件:同一版本在 UI 与报告中结论一致,并有正式 GATE/REPLAY 证据。
|
||||
|
||||
进展(2026-10-11,RDM PR #213 merge 1dce69d):U5 已实施合入——`export_artifact.go` 导出工件生命周期(`rdm_export_artifacts` 表+磁盘存储+sha256 完整性+24h 过期);`rdm.inspect.export.{create,status,download}` 三命令(审计面授权、截止水位固定、跨项目绑定拒绝、下载重鉴权);导出文件名携带 `wm<seq>` 水印标记。U1–U5 五个实施单元全部完成,进入部署验收阶段。
|
||||
|
||||
---
|
||||
|
||||
## Deferred Integration
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: Generative UI auto-trigger opt-in design
|
||||
date: 2026-10-12
|
||||
type: feat
|
||||
revision: r1
|
||||
status: approved
|
||||
product_contract_source: generative-ui-r2-U6-U7-boundary
|
||||
---
|
||||
|
||||
# Generative UI 自动触发 opt-in 设计(r1)
|
||||
|
||||
依据:主记录 r2(语义事件 / 预算 / 防自激);收口稿已知边界;用户 2026-10-12
|
||||
计划确认「边界三项全部做」并将本表定案作为实施基线。
|
||||
|
||||
负责人:裁定 weichen(用户,经执行计划确认);起草 Agent;更新时间 2026-10-12。
|
||||
|
||||
## 定案表
|
||||
|
||||
| 项 | 定案 |
|
||||
|---|---|
|
||||
| 开关 | owner 级 settings:`plugins.generative-ui.autoPresent`,默认 `false`;**不**写入 `plugin_activation`(避免 bump epoch) |
|
||||
| 前提 | `plugin_activation(generative-ui).enabled` 为真;否则 auto 无效 |
|
||||
| 事件 | 仅:任务阶段跃迁(plan/todo 状态变化)、材料/工件完成(material notice、document artifact) |
|
||||
| 禁止事件 | per-token / 每条 SSE、`surface.updated`、动作回执、present 成功路径 |
|
||||
| 动作 | 注入 system-reminder,**只**建议调用一次 `generative-ui.present`;不自动点 actions;不改写任务事实 |
|
||||
| 预算 | 每任务(conversation)每小时 ≤3 次;耗尽写审计 `genui.auto_present_exhausted` |
|
||||
| 冷却 | 同会话自动触发间隔 ≥60s |
|
||||
| UX | 复用 U6 pin/follow;固定后新页不抢占 |
|
||||
| 门槛 | 扩大范围仍以人类效率约 +20% 为后续条件;本增量只落地最小 opt-in |
|
||||
|
||||
## 实施面
|
||||
|
||||
- Backend:settings schema/defaults;`genui.Auto` 闸门;runmgr 语义钩子;审计。
|
||||
- Frontend:SettingsModal 经 schema 出开关(无需专用页)。
|
||||
- Documents:本提案 + 使用说明边界条目更新。
|
||||
|
||||
## 验收线
|
||||
|
||||
1. 默认关:无 reminder / 无额外 present 建议。
|
||||
2. 仅 activation∧opt-in 时,材料完成 / 阶段跃迁 / document 工件可触发。
|
||||
3. surface/action/present 路径不重入。
|
||||
4. 第 4 次/小时审计耗尽并停止。
|
||||
5. 冷却内跳过。
|
||||
|
||||
## 裁定记录
|
||||
|
||||
用户经「Implement the plan」确认本定案表;本文 `status: approved`,实施任务
|
||||
`feature/genui-auto-trigger-optin` 按本表交付。
|
||||
@@ -0,0 +1,59 @@
|
||||
---
|
||||
title: Generative UI B-class whitelist — builtin.help and system.intent
|
||||
date: 2026-10-12
|
||||
type: feat
|
||||
revision: r1
|
||||
status: approved
|
||||
product_contract_source: generative-ui-u5-action-scope-r2
|
||||
---
|
||||
|
||||
# Generative UI B 类加白提案:builtin.help / system.intent
|
||||
|
||||
依据:[U5 动作范围 r2](./2026-10-11-generative-ui-u5-action-scope.md)「每加一条走独立评审」。
|
||||
本提案对两条命令分别裁定;实施与本提案同批合入。
|
||||
|
||||
负责人:裁定 weichen(用户);起草 Agent;更新时间 2026-10-12。
|
||||
|
||||
## 授权
|
||||
|
||||
用户 2026-10-12 计划确认:边界三项全部推进;B 类首批加白 `builtin.help` 与
|
||||
`system.intent`。交付模式:authorized-continuous(本增量实施至 Dev 合入)。
|
||||
|
||||
## 一、builtin.help(独立裁定)
|
||||
|
||||
| 项 | 内容 |
|
||||
|---|---|
|
||||
| 命令 id / action id | `builtin.help` |
|
||||
| 类 | B(白名单命令绑定) |
|
||||
| 危险级 | 低(只读说明,无写副作用) |
|
||||
| 参数 | 无必填 |
|
||||
| 通道 | `POST /api/surfaces/{id}/actions` → cmdbus Entrance=`button` |
|
||||
| 用途 | 页面按钮展示可用命令/入口说明 |
|
||||
| 排除项对照 | 非业务写、非跨会话、非自动触发动作、非 MCP |
|
||||
|
||||
**裁定**:同意加白。
|
||||
|
||||
## 二、system.intent(独立裁定)
|
||||
|
||||
| 项 | 内容 |
|
||||
|---|---|
|
||||
| 命令 id / action id | `system.intent` |
|
||||
| 类 | B(白名单命令绑定) |
|
||||
| 危险级 | 入口本身低;**命中后嵌套分发可触达写命令**(既有 chat 行为) |
|
||||
| 参数 | `text`(string,必填) |
|
||||
| 通道 | 同上 Entrance=`button` |
|
||||
| 硬化(加白前提) | **button 入口只返回 match / candidates,禁止嵌套 `Dispatch` 目标命令**;chat/slash/api 等既有入口行为不变 |
|
||||
| 用途 | 页面上做意图探测/候选展示,不经按钮偷渡 D 类写 |
|
||||
| 排除项对照 | 嵌套业务写在 button 路径关闭;仍禁止自动触发动作、MCP、任意命令全开 |
|
||||
|
||||
**裁定**:同意加白,前提硬化生效并有红测。
|
||||
|
||||
## 三、实施面
|
||||
|
||||
- Backend:`surfacesvc.AllowedActions`;`genui.ValidateActionIDs` / Catalog;`handleSystemIntent` button 只读。
|
||||
- Documents:本提案 + 使用说明 API/动作表白名单更新。
|
||||
- 红测:白名单外拒绝;help 可分发;intent button 命中写意图零副作用;chat 仍可嵌套。
|
||||
|
||||
## 四、明确不做
|
||||
|
||||
D 类业务写直执、扩大白名单至其他内置写命令、自动触发动作、动作结果自动改写页面。
|
||||
@@ -0,0 +1,97 @@
|
||||
---
|
||||
title: Generative UI usage guide and U1-U6 evaluation record
|
||||
date: 2026-10-12
|
||||
type: feat
|
||||
revision: r1
|
||||
status: final
|
||||
product_contract_source: generative-ui-r2
|
||||
---
|
||||
|
||||
# Generative UI 使用说明与 U1–U6 评测记录
|
||||
|
||||
本文是主记录 r2(2026-10-10-generative-ui-plugin.md)的配套文档:面向使用者的启用/使用/
|
||||
禁用说明,以及 U1–U6 各增量落地后的组合评测结论。状态:**final**(方向收口稿)。
|
||||
|
||||
## 一、使用说明(dev 实例实测口径,2026-10-12)
|
||||
|
||||
### 启用与禁用(owner 级)
|
||||
|
||||
```bash
|
||||
# 启用(需 API key;服务以 --auth on 运行)
|
||||
curl -X POST http://<host>/api/plugins/generative-ui/activation \
|
||||
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
|
||||
-d '{"enabled":true}'
|
||||
# 禁用(新页面/新动作/迟到提交全部拒绝;历史页面保留只读)
|
||||
curl -X POST ... -d '{"enabled":false}'
|
||||
```
|
||||
|
||||
- 启用后 `generative-ui.present` 工具对模型可见(禁用时工具不注入)。
|
||||
- 禁用即时生效:进行中的提交按 epoch 失配被拒,已保存页面按权限保留。
|
||||
|
||||
### 生成与修订页面(对话内)
|
||||
|
||||
对话中说「把 X 整理成一页对比 / 报告页 / 时间线」——模型调用 present 提交声明式页面:
|
||||
- 页面自动在**文件预览区**打开;修订时说「改为按 Y 组织」,模型带 surfaceId+baseRevision 重提。
|
||||
- 表单页可直接填写并点「提交」按钮(数据落插件台账,走命令总线审计)。
|
||||
|
||||
### 任务工作区(U6)
|
||||
|
||||
- **工作**入口的当前任务卡下方出现「任务页面」紧凑区:默认显示最新一页;📌 固定后
|
||||
新页面不抢占;↗ 跳转文件预览全屏。
|
||||
- 项目级跨会话聚合:`GET /api/projects/{id}/surfaces`(owner 作用域)。
|
||||
|
||||
### API 速查
|
||||
|
||||
| 端点 | 说明 |
|
||||
|---|---|
|
||||
| POST /api/plugins/{id}/activation | 启禁(epoch 递增) |
|
||||
| POST /api/surfaces | 提交页面(直接 API,与插件同咽喉) |
|
||||
| GET /api/surfaces/{id} | 读取整页快照(禁用后仍可读) |
|
||||
| GET /api/conversations/{id}/surfaces | 会话内页面列表 |
|
||||
| GET /api/projects/{id}/surfaces | 项目级跨会话聚合(U6) |
|
||||
| POST /api/surfaces/{id}/actions | 页面动作(白名单:generative-ui.submit、builtin.help、system.intent;后者 button 只读匹配) |
|
||||
|
||||
## 二、U1–U6 落地与评测结论
|
||||
|
||||
| 增量 | 交付 | 关键证据 | 结论 |
|
||||
|---|---|---|---|
|
||||
| U1 受控试验 | Documents #62(r2) | R1 分化 6/6;文本通道下界 60%/83%;工具通道探针消除语法类失败;M3 ¥0.067/页;highspeed 否决为生成档 | 方向成立,生成走工具参数通道 |
|
||||
| U2 契约/启禁/持久化 | Core #25/#26、Backend #143/#146、Dev #336 | 修订 1→2 冲突守卫、epoch 语义、事件恢复、SQLite/PG 双档 | 宿主地基就位 |
|
||||
| U3 插件与上下文闭环 | Backend #149、Dev #345 | 真实模型回放 PASS(≈¥0.08);禁用不注入工具;语义投影回灌 | 模型可提交、可修订 |
|
||||
| U4 只读渲染与恢复 | Core #27/#28、UI #42–#45、Frontend #53、Dev #351 | 刷新恢复、revision 守卫、SurfaceView | 页面用户可见 |
|
||||
| U5 动作闭环 | Backend #155、UI #46/#47、Frontend #56、Dev #367 | 幂等同参回放/异参拒绝、DangerHigh 经确认卡不可伪造、草稿只在动作载荷 | 表单可提交且受控 |
|
||||
| U6 工作区与项目聚合 | Backend #163、Frontend #62、Dev #408 | owner 隔离/跨 owner 零可见/禁用保留;pin 固定不抢占 | 页面进工作视图 |
|
||||
|
||||
### 现场体验驱动的修复(2026-10-11–12)
|
||||
|
||||
用户实测反馈「页面未出现 + 同名工件 ×3」→ 三个根因逐一修复(Backend #156/#160、
|
||||
Frontend #58/#59,Dev #381/#382/#387/#388):工具描述缺「何时用」引导、事件分支缺
|
||||
右栏切换、children 对象形状偏差、面板同名并列。修复后 E2E:真实模型 present 成功
|
||||
(rev 1),surfaces 表落库,前后对照成立。
|
||||
|
||||
### U7 组合验收(2026-10-12,dev@b634a27,真实 MiniMax-M3)
|
||||
|
||||
- 会话内:新指令「实施进度页」→ 模型自主 present(steps 步骤条、三阶段、状态正确),
|
||||
会话 surfaces = 2(对比页 rev1 + 进度页 rev1),修订链完整。
|
||||
- 项目聚合:GET /api/projects/{id}/surfaces 返回跨会话页面(owner 作用域验证)。
|
||||
- 工作区:前端「任务页面」容器显示最新页(pin/follow 测试覆盖)。
|
||||
- 收据:Dev 任务卡 feature/generative-ui-u7-acceptance(SELF;CI GATE 随发布 PR)。
|
||||
|
||||
### 已知边界与后续项
|
||||
|
||||
- 自动触发 opt-in:settings `plugins.generative-ui.autoPresent`(默认关;须同时
|
||||
Surface activation);语义事件 + 预算≤3/时 + 冷却≥60s;设计见
|
||||
`2026-10-12-generative-ui-auto-trigger.md`。
|
||||
- B 类命令:已加白 `builtin.help` / `system.intent`(button 入口 intent 只读匹配、
|
||||
不嵌套分发;提案 `2026-10-12-generative-ui-bclass-help-intent.md`);其余仍逐条评审。
|
||||
- 人类可用性对照以 owner 实际使用替代(2026-10-11 用户裁定),本轮体感「初步不错」,
|
||||
小问题另行修复。
|
||||
- 部署与运行验收:本机 `prod` 实例已登记(`scripts/svc.sh prod`,`--auth on`,
|
||||
PG `pg1/prod`,来源 `dev@c76f2bb`+后端 nil-card 修复);验收覆盖启禁、present、
|
||||
B/C 类动作、项目聚合、未登录 401。
|
||||
|
||||
## 三、结论
|
||||
|
||||
Generative UI 方向按主记录 r2 的 U1–U7 全部增量落地:调研→契约→生成插件→只读渲染→
|
||||
动作闭环→工作区→组合验收,每个增量独立走组件 PR + Dev 组合 CI + 任务闭环,真实模型
|
||||
证据贯穿(试验、回放、现场 E2E)。方案收口为 final;后续按「已知边界」清单演进。
|
||||
@@ -0,0 +1,295 @@
|
||||
---
|
||||
title: 服务重启与全量数据恢复方案
|
||||
type: fix
|
||||
date: 2026-10-12
|
||||
artifact_contract: ce-unified-plan/v1
|
||||
execution: code
|
||||
product_contract_source: ce-plan-bootstrap
|
||||
---
|
||||
|
||||
# 服务重启与全量数据恢复方案 r2
|
||||
|
||||
确认状态:待人工评审。当前交付为源码调查、方案与实施/验收计划;业务实施、故障注入、部署、运行验收均为 NOT_RUN。
|
||||
修订记录:r1=2026-10-12 初稿并完成六角色文档自审(见同名审阅记录第一轮);r2=2026-10-12 吸收外部源码复核(U1/U3/U4/第9节四处修订,见审阅记录第二轮),需求范围与量化指标未变。
|
||||
需求来源:2026-10-12(Asia/Shanghai)用户要求“系统应该在停止并再次启动(通过 svc 或异常终止)后,应当能够恢复所有服务和数据,给我一个完善方案”。负责人:weichen;编制:Codex;实施与运维负责人在启动对应增量时指定。
|
||||
主记录:本文;任务卡:Dev `.task/feature-service-restart-recovery-plan.md`。本文的源码路径以 Dev 根目录为基准。
|
||||
|
||||
## 1. 目标与成功边界
|
||||
|
||||
**目标:系统停止后再次启动,用户仍能访问原有数据和服务,未完成工作进入可继续或可处理的确定状态。**
|
||||
|
||||
采用“稳定实例配置与身份、依赖编排、进程监管、持久恢复账本、一致性文件发布、组合备份与实测验收”的方案。复用现有 PostgreSQL/SQLite、运行表、事件、命令、通知和恢复隔离机制,补齐实际接线与崩溃窗口。首期落实单机完整恢复;多实例所有权沿用已有协作存储方向,不重新设计一套集群平台。
|
||||
|
||||
必须区分三类恢复:
|
||||
|
||||
| 故障档 | 需要达到的结果 | 数据与时间合同 |
|
||||
|---|---|---|
|
||||
| `svc stop/start/restart`、进程 SIGTERM/SIGKILL、应用 OOM | 原配置启动;持久数据完整;安全任务继续;未知副作用隔离 | 存储正常、确认结果已持久化的前提下,RPO=0;建议冷启动至业务就绪≤60秒 |
|
||||
| 主机重启、操作系统崩溃或断电,磁盘仍可用 | 数据库 WAL 恢复、文件一致性恢复、服务按既定意图启动 | 只有 DB 与文件落盘策略、底层存储满足耐久性且实测后,才承诺已确认数据 RPO=0;建议 RTO≤5分钟 |
|
||||
| 数据盘损坏、主机丢失、误删或不可逆污染 | 在新目标恢复匹配的 DB、文件、配置和版本 | 沿用协作存储案建议 RPO≤5分钟、RTO≤60分钟;如要求此档 RPO=0,另行批准跨故障域同步复制 |
|
||||
|
||||
以上时间为**待批准的验收目标**,不是已测性能。大规模扫描与冷索引重建不要求全部在60秒内完成:必需数据对账及安全恢复决策完成后可开放API,派生索引按明确降级合同后台重建。故障超出资源预算时报告阻塞及原因,不能以假就绪满足时间指标。
|
||||
|
||||
恢复保存的是持久业务状态、步骤和已确认结果。进程内 goroutine、模型连接及未持久化 token 不可原样复活;模型回合从持久上下文和步骤边界重建。已经接受的用户消息、排队任务、审批和取消意图必须先落库再返回接受;尚未确认的结果不能事后冒充成功。
|
||||
|
||||
## 2. 当前事实及重点差距
|
||||
|
||||
本次源码基线:Dev `5e57029b439e5690f28dc6002f9784f0b08920eb`;Backend `eb12f102f23d8d026c3458be7ea8b2fef07ada93`;Core `89f3906c390027512ef47b5333088c3d3a019e84`;Frontend `aaced8796bb45d151833e12bc1cc17fc5090ef6d`;Documents `23e2276905eaf3d5b266a5218a53a12a38321284`。来源为 SELF·源码观察,原始命令和输出由 Dev `make evidence` 写入本任务卡;风险是源码推断,不是已重现事故。
|
||||
|
||||
| 对象 | 已存在的基础 | 尚需解决的恢复缺口 |
|
||||
|---|---|---|
|
||||
| 数据库绑定 | `scripts/svc.sh:1373` 已统一解析 dbref/DSN/config;裸启动、restart/deploy 停前预检已接入 | 自定义 data/plugins 在参数重建时可能漂移;临时环境配置无法保证下次存在;配置多次逐键更新有崩溃中间态 |
|
||||
| 服务生命周期 | svc 管理 agent/static/postgres;PostgreSQL 复用 pgdata;分发仓有单应用 systemd 模板 | svc 没有服务组依赖恢复与持久启动意图;无统一进程组监管;不管理 Redis 类型 |
|
||||
| 启动与停机 | 启动对账开放 run;优雅停机尝试中断和事件 flush | 恢复通知/子代理发生在完整接线前;HTTP停机超时可跳过flush;无所有worker等待;子代理 cancelled 可覆盖 interrupted |
|
||||
| 运行恢复 | `runmgr.go:2046` 对账、子代理派生请求/转录、pending_notices持久化、恢复hold检查 | 主run与HITL统一收为中断/取消;子代理先派生再写文件标记;notice消费非事务且绕过PG会话占用 |
|
||||
| 执行所有权与额度 | `store/execution.go` 有 owner/epoch/lease,终态有fencing;额度有持久表 | 续租只有定义未接入生产调用;15分钟租约可过期;额度无崩溃回收;不能据此宣称安全接管 |
|
||||
| 命令与投影 | 取消/HITL持久收件箱、Surface待投递标志、事件seq与SSE续传 | 命令先 consumed 后执行,kill窗口丢命令;跨实例取消入队缺conversation;Surface失败仍可清pending且仅扫100条 |
|
||||
| 工具副作用 | Native Session已有tool intent/result转录、安全重放判定;Backend有hold表及管理员释放入口 | `SetRecoveryHold`仅定义;Native的未知效果被写成工具错误后仍可继续模型,尚未与Backend run/owner/epoch和持久hold形成统一隔离闭环 |
|
||||
| 文件与备份 | blob临时写+rename;工件元数据在DB;SQLite在线备份;svc有pg_dump | 覆写文件与更新元数据不是同一原子提交;未显式fsync;DB备份不含上传、工件、工作区、转录、配置/版本 |
|
||||
|
||||
当前登记元数据显示 dev 绑定 `pg1/agent`,部署制品的 Backend revision 与上述Backend一致;这只证明登记和制品元数据。**实际运行进程的数据库身份、全栈恢复、数据耐久性尚未实测,不能写为PASS。**
|
||||
|
||||
旧报告中“DSN重启丢失”“迁移DDL与版本分开提交”“通知仅内存”等问题已有源码改进,本案只验证并复用这些基础,不把旧缺陷重新列成新建设。
|
||||
|
||||
## 3. 需求合同
|
||||
|
||||
| ID | 范围 | 要求与可判定验收 |
|
||||
|---|---|---|
|
||||
| R1 | 服务 | 启动显式服务组时,全部已启用的必需服务按依赖就绪;可选失败明确降级;主动停止不被监管误拉起 |
|
||||
| R2 | 身份 | 连续裸启停、更换端口/程序/cwd后,DB identity、数据/工件/工作区根、实例ID、认证及插件组合一致;缺配置拒绝启动 |
|
||||
| R3 | 已确认数据 | 消息、项目、成员/权限、文档、设置、插件启用/授权、任务、审批、事件、工件原文与版本在RPO=0档零遗漏;灾难档完整恢复批准恢复点内数据,并对账/报告恢复点后的缺失和外部效果 |
|
||||
| R4 | 任务 | 已接受排队任务不丢;安全任务从持久步骤继续;HITL保留稳定gate与答案;取消意图在重启/换owner后仍生效 |
|
||||
| R5 | 副作用 | started但无确定result的外部动作自动隔离;已确认动作不重做;恢复与发布验证当前权限和执行代次 |
|
||||
| R6 | 所有权 | 单一有效写者;旧进程迟到写状态/事件/工件被拒;过期额度回收;恢复本身可重复且可再次中断 |
|
||||
| R7 | 文件与派生状态 | DB引用的文件内容、版本和hash一致;损坏现场保留并报告;缓存/检索索引可从权威源重建 |
|
||||
| R8 | 停机与就绪 | 停机先拒绝新工作再排空;全部worker、sidecar和工具子进程收口;错误不跳过后续清理;ready反映业务可用 |
|
||||
| R9 | 升级与灾难 | 保留上一程序/插件/资产组合及兼容合同;备份恢复到新目标并完成业务/权限/文件对账;不在普通启动覆盖现库 |
|
||||
| R10 | 可见与证据 | 用户能区分继续、等待审批、等待恢复确认、失败;运维能定位阻塞依赖;每项验收绑定精确组合、制品、配置与原始输出 |
|
||||
|
||||
覆盖“所有数据”需要先完成数据归属清单:除Backend业务表,还含插件自有持久库/目录和下游RDM等已启用模块。每个插件声明恢复适配器、版本、权威位置、必需程度与兼容性;无法证明可恢复的必需插件阻塞全系统签收,不能只恢复Backend便宣称全部完成。
|
||||
|
||||
## 4. 技术决策与服务结构
|
||||
|
||||
KTD1. **持久配置是启动权威,PID只是观察。** 每实例保存完整类型化manifest:service/instance ID、配置revision、desired state、服务类型与管理权、依赖、固定程序/插件/资产摘要、DB identity与凭据引用、数据/工作区/工件根、认证、监听、必需/可选属性、恢复政策。临时环境只作显式覆盖;必需字段必须能从持久值或稳定受保护引用重新解析。机密放受保护文件/秘密服务,manifest仅存引用,不把密码或DSN写进日志。
|
||||
|
||||
KTD2. **配置整份提交,覆盖按字段合并。** 每实例和服务组串行化生命周期操作,配置以revision做CAS;候选完整解析与校验后,临时文件落盘、原子替换、目录同步。legacy迁移同样一次提交,故障留下旧版或完整新版。更改端口不隐式更改data;数据根迁移是独立操作。恢复启动发现预期DB/marker/目录丢失时阻塞,初次初始化需要明确入口,禁止新建空库掩盖数据丢失。
|
||||
|
||||
KTD3. **svc控制期望状态,唯一supervisor管理进程。** Linux部署推荐systemd;svc兼容既有单服务入口,增加显式stack/group控制。每服务仅一个监管者,不能nohup watcher与systemd同时拉起。分发仓已有模板要接入同一manifest合同。外部/共享PG、Redis仅探测连接,不擅自启停;managed-local只管理身份已核实且归该服务组独占的资源。pgvector是PG扩展,不另造守护进程;Redis只有配置并启用时才进入依赖图。
|
||||
|
||||
KTD4. **主动停止与异常退出分开。** stop先提交desired=stopped,再关闭服务;普通故障仅desired=running可重启。restart保留最终running意图并记录operation_id、执行阶段和恢复政策,不能因中途stop留下stopped。监管采用有界退避、重试预算与失败阻塞;错误配置不能无限重启。开机只恢复已登记且策略允许的服务。intent、operation、actual state必须分开,不能以pidfile存在视为运行。
|
||||
|
||||
KTD5. **团队业务权威沿用PG,个人档沿用SQLite。** 团队PG失败保持未就绪,绝不切SQLite。普通重启让既有数据库完成自身WAL恢复,不导入备份。验证数据库identity/schema/权限和关键记录;SQLite恢复到预期文件并检查完整性,不能只看文件存在。断电承诺要求明确DB同步设置及底层存储合同,不把rename原子性当作落盘保证。依据:[PostgreSQL耐久性](https://www.postgresql.org/docs/current/wal-reliability.html)、[SQLite WAL](https://www.sqlite.org/wal.html)。
|
||||
|
||||
KTD6. **恢复扫描与恢复执行分离。** 装配Store、权限、插件/工具、工作区、预算、Workflow、命令消费者与事件投递之后,才分类认领恢复任务。扫描失败或归属未知进入blocked/hold;不能吞掉错误直接ready。恢复有持久cursor/attempt和CAS,支持分批、失败重试及再次重启;禁止全库无归属盲扫并续跑其他实例的任务。
|
||||
|
||||
KTD7. **持久执行账本统一主run、子run和后台任务。** 保持稳定logical_run_id、request_id、parent关系;每次执行用新的attempt/boot/epoch。步骤记录输入引用、已提交输出、等待原因、调度位置、恢复决策;完成记录与业务结果原子提交。现有文件修改checkpoint不是完整执行checkpoint,不能直接拿它宣称主对话/工作流可续跑。后台任务表目前仅状态登记;只恢复明确有executor的类型,其他类型进入可见unsupported/blocked,补适配后验收。
|
||||
|
||||
KTD8. **副作用先登记,结果未知先对账。** 复用Native `runtime/session/intent.go`和生产接线`internal/runtime/llm_direct.go:245–301`,以同一call/operation ID关联现有intent/result与Backend的run/owner/epoch/hold,不能让两个恢复器各自决定重放。DB账本裁决执行和hold,转录保存完整上下文及结果投影;本地个人档同样须有持久裁决。调用外部工具前持久化operation_id、参数摘要/安全引用、授权与gate、owner/epoch、幂等类别及started;确定结果写result/receipt。启动遇到started无确定result自动hold,不能只把“副作用未知”写成普通工具错误后允许模型继续发起动作。
|
||||
|
||||
目标支持可靠幂等键时按同一key重试;非幂等动作必须取得确定未执行的终态证据,并证明旧执行者及已发请求都不会再产生效果,才允许重试。“暂未查到结果”“取消请求已发送”“本地进程已退出”均不充分。否则保持hold。shell、代码执行、Git、数据库/远端写入默认按不透明副作用处理。模型/工具因失权立即取消;无法围栏的外部动作进入hold,不能靠租约到期证明旧动作停止。
|
||||
|
||||
KTD9. **所有工作入口共用执行所有权与额度。** 前台、notice、子代理恢复、命令消费者均经过持久claim。稳定instance_id与每次boot_id分开;续租持续进行,丢租停止执行;CAS/事务围栏覆盖状态、事件、步骤、工件发布和副作用准入。execution与admission lease关联run/attempt/epoch;恢复终态和已证明失效的许可,禁止一启动就清空全库锁。父任务等待HITL/子任务让出执行额度;持久队列及跨实例等待者有有界唤醒机制。
|
||||
|
||||
KTD10. **命令、通知和投影处理后确认。** 命令 pending→claimed(带租约)→applied/rejected,超时claim可重领;取消先从run解析已授权conversation,按逻辑run转交当前owner;HITL验证gate/version与当前权限。notice_id/旧子run的恢复claim、对应新run、消息和销项以事务与唯一约束关联,文件resumed标记仅作投影。outbox成功才ACK,失败保持pending;分批持续drain,不受单次100条限制。
|
||||
|
||||
KTD11. **不可变对象加DB发布记录保持文件一致性。** 写新版本对象、完成必要fsync/hash校验后,在事务中发布引用与版本;失败留下可辨认未发布对象,不直接覆盖已发布版本。工作区变更另用既有overlay/CAS与副作用账本核对,不能把可变工作区伪装为不可变对象。checkpoint/JSONL尾部截断须保存原件、识别未确认尾部,已确认部分校验失败阻塞。工件缺失报告损坏,不静默返回空内容。孤立对象按清单、引用、保留期与备份需求回收。
|
||||
|
||||
KTD12. **业务readiness与恢复摘要分开。** liveness仅证明进程存活;readiness包含身份/认证、DB/schema、必需目录与插件、恢复决策完成和worker接线。已隔离且不影响其他会话的hold可允许API就绪,并暴露计数与处理入口;损坏权威数据或必需依赖失败不能ready。详细恢复状态只向有权owner/admin开放;公共健康响应不泄漏路径、任务ID、凭据或业务内容。
|
||||
|
||||
服务依赖结构(实线为必需;可选项以实例manifest为准):
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
M[持久实例manifest与启动意图] --> S[svc控制入口]
|
||||
S --> P[唯一进程监管者]
|
||||
P --> D[受管PG或SQLite数据]
|
||||
P --> A[应用与恢复协调]
|
||||
X[外部PG或可选Redis:仅探测] --> A
|
||||
D --> A
|
||||
F[持久文件与插件组合] --> A
|
||||
A --> W[任务/命令/通知/投影workers]
|
||||
A --> H[业务readiness]
|
||||
H --> U[Web或下游业务入口]
|
||||
```
|
||||
|
||||
systemd的顺序依赖不能替代DB可用性检测;需真实探测,且明确依赖断开后的重连/恢复政策。监管策略参考systemd官方[service契约](https://github.com/systemd/systemd/blob/main/man/systemd.service.xml)与[进程组停止契约](https://github.com/systemd/systemd/blob/main/man/systemd.kill.xml)。
|
||||
|
||||
## 5. 启停流程与恢复政策
|
||||
|
||||
### 5.1 启动和优雅停止
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant C as svc/监管者
|
||||
participant A as 应用生命周期
|
||||
participant D as 持久存储
|
||||
participant W as workers与子进程
|
||||
C->>D: 校验manifest、数据身份与操作锁
|
||||
C->>C: 启动归本组管理的依赖并探测
|
||||
C->>A: 启动固定版本
|
||||
A->>D: 校验schema、文件与恢复候选
|
||||
A->>W: 完成插件/权限/预算/工作区全部装配
|
||||
A->>D: 分类认领、对账未知效果、恢复命令与额度
|
||||
A->>W: 开放安全恢复执行
|
||||
A-->>C: readiness与恢复摘要
|
||||
C->>A: 停止请求
|
||||
A->>A: readiness=false;拒绝新写和新任务
|
||||
A->>W: 停止领取、取消或保存安全边界
|
||||
W-->>A: bounded join与子进程结果
|
||||
A->>D: 持久化恢复意图、flush、收口许可/所有权
|
||||
A->>D: 关闭存储
|
||||
A-->>C: 停机结果(含未完成原因)
|
||||
C->>C: 复核进程组消失;逆序停止独占依赖
|
||||
```
|
||||
|
||||
停机预算建议应用30秒、监管60秒,必须按最长合法步骤与故障实测调整;SSE连接主动结束,不能占满排空预算。某阶段出错继续运行后续可安全清理,保留聚合结果。工具无法停止或副作用未定时先持久hold并保留现场;强制结束后必须走崩溃恢复路径,不返回“已优雅停止”。
|
||||
|
||||
### 5.2 不同工作的恢复策略
|
||||
|
||||
| 停机前状态 | 重启处理 | 自动执行边界 |
|
||||
|---|---|---|
|
||||
| 已完成/失败/明确取消 | 原样加载结果及原因 | 不重新执行 |
|
||||
| 已接受但未开始 | 按持久队列、权限和预算重新调度 | 条件满足后自动 |
|
||||
| 纯读、可重建的计算 | 从已提交步骤边界继续 | 不重复已提交业务结果;模型回合可重新生成 |
|
||||
| 正在执行幂等副作用 | 根据operation_id、目标查询/幂等合同核对 | 确认安全后继续 |
|
||||
| 非幂等副作用结果未知 | 自动hold,展示原因和可核对证据 | 有权人对账具体operation;确认完成则记录receipt并检查剩余步骤;确认未执行须满足KTD8终态与旧请求隔离条件;可明确放弃整项任务;禁止直接“放行即重跑” |
|
||||
| 等待HITL | 恢复稳定gate/version及持久答案 | 未回答继续等待;已回答幂等消费;撤权/版本变化拒绝并说明 |
|
||||
| 子代理/后台notice | DB唯一恢复claim关联旧、新attempt | 不由文件标记决定唯一性,不重复派生/投递 |
|
||||
| 索引与缓存 | 从文档/内容权威源重新排队,记录索引generation | Redis可清空重建;恢复模型/维度/版本一致性后发布索引 |
|
||||
| 未配置executor、缺文件或未知归属 | 保持blocked并提供处理原因 | 不丢行、不假完成、不盲续跑 |
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> pending
|
||||
pending --> running: 获得有效owner/预算
|
||||
running --> waiting_hitl: 持久gate
|
||||
waiting_hitl --> running: 当前权限下消费答案
|
||||
running --> completed: 结果与状态原子提交
|
||||
running --> recovering: 停机或失联
|
||||
waiting_hitl --> recovering: 执行者重启
|
||||
recovering --> pending: 核对可安全继续
|
||||
recovering --> waiting_hitl: 恢复原等待
|
||||
recovering --> hold: 副作用未知/权威数据不完整
|
||||
hold --> pending: 有权人对账确认安全
|
||||
hold --> recovering: operation对账结果与receipt已持久化
|
||||
recovering --> completed: 全部必要步骤与业务结果已确认完成
|
||||
hold --> cancelled: 明确放弃
|
||||
```
|
||||
|
||||
`recovering/hold`在这里是目标业务语义,**不是声称现有Core枚举已支持**。过渡可用恢复账本表达;若新增公开状态,Core/Backend/Frontend/下游契约兼容必须同增量处理。已有interrupted历史记录保留,不强改成成功。
|
||||
|
||||
用户侧复用现有任务状态、对话卡和管理员恢复入口,显示恢复原因、进度和允许动作;SSE按持久seq补发并丢弃旧事件,页面刷新重载权威快照。断连或无增量不能推断任务完成。实施界面前重读根DESIGN.md并遵循UI令牌、Collapsible和单异步状态所有者规则。
|
||||
|
||||
## 6. 全量数据与组合备份
|
||||
|
||||
| 数据类别 | 权威与恢复方法 | 必须对账 |
|
||||
|---|---|---|
|
||||
| 用户、项目、成员/权限、会话/消息、文档/版本、卡片/Surface、设置、插件授权 | PG团队库或个人SQLite;包含全部已启用插件/下游的自有存储 | 主键、owner、权限、版本、关键内容摘要;禁止以空库替代 |
|
||||
| run/step/命令/通知/审批/取消/额度/恢复hold | 持久账本与状态事务 | 链接、唯一请求、gate版本、owner/epoch、队列位置与外部receipt |
|
||||
| 上传、工件、文档大内容、输入附件、转录、派生请求 | 持久对象/文件目录,与DB清单匹配 | 内容hash、尺寸、引用版本、权限与可读性 |
|
||||
| 执行工作区、overlay/checkpoint、任务Git现场 | 受管workspace与副作用记录 | 实际修改、基准SHA、未提交文件、执行者退出与恢复边界 |
|
||||
| 程序、Web资产、插件版本、实例配置、秘密引用/密钥 | 不可变组合manifest;受限配置/秘密备份 | 摘要、schema兼容、插件签名/授权、恢复凭据可用且未泄漏 |
|
||||
| 检索/向量索引、Redis缓存、临时PID/连接 | 从权威数据重建;PID按新boot重新观察 | 模型/维度/generation;不作为任务成功、审批或永久幂等权威 |
|
||||
|
||||
普通启停不从备份还原;数据库与文件继续使用同一身份及位置。灾难恢复由显式受管入口在新目标进行,禁止start自动覆盖当前数据。
|
||||
|
||||
首期备份取得明确停写窗口:关闭准入、排空或隔离在途操作、停止全部相关写者,核对独占管理边界后备份DB及文件并生成manifest。共享PG不能仅停一个API实例便宣称一致;写者无法证明停止则阻塞此类快照。后续可用不可变对象、DB发布记录、物理基础备份+连续WAL/PITR建立在线恢复点,manifest关联source snapshot、时间/LSN、schema、源码/制品/插件组合和对象版本。
|
||||
|
||||
恢复到新目标首先处于隔离验证模式,不启动任务调度/副作用,也不自动连接生产外部写目标。正式切换须证明旧实例、worker、sidecar、工具子进程及已发请求的写路径已经隔离:可采用停止并验证、资源侧拒绝旧执行代次、专用执行凭据失效或网络写路径隔离;不得为此擅自轮换共享凭据。生成新的恢复权威代次,并保证实际写目标能够拒绝旧路径。两个独立恢复库各自认可的epoch不能互相围栏;旧实例不可联系不能当作停止证明。无法核实则保持副作用hold,只开放受权的数据核验。
|
||||
|
||||
同时对账恢复点至故障/隔离完成期间的外部效果:它们可能已执行却不在恢复后的账本里。结合独立receipt、目标日志或人工核对,将已确认动作登记到恢复账本,确认安全后逐项解锁;不能仅扫描备份里的started记录就自动重试。灾难档报告批准RPO内可能丢失的写入范围、恢复点内完整性与外部对账结果。
|
||||
|
||||
PG逻辑pg_dump用于独立逻辑恢复;PITR须有物理基础备份和连续WAL,不能用pg_dump冒充其基础备份,依据[PostgreSQL备份与PITR](https://www.postgresql.org/docs/current/continuous-archiving.html)。SQLite使用现有一致性备份接口,不能在线只复制.db遗漏WAL。文件内容先耐久发布再提交DB引用,备份保留覆盖恢复点所需的对象版本。
|
||||
|
||||
备份副本及密钥与原数据同级保护:加密、专用受限目录/角色、异机或异故障域副本、保留期限与清理owner;密钥须独立可恢复。拟定每日日常备份、持续WAL、每月及重大升级前恢复演练,频率按批准的RPO与数据量固定。实际恢复须验证登录、跨项目隔离、历史文档与附件、任务/HITL、工件下载和插件业务链;恢复时间从故障触发开始计时。
|
||||
|
||||
部署先构建并检查完整候选目录,再切固定组合;失败仅在schema/插件/配置向后兼容时回退程序。数据回退须对账回退点后已接受业务和外部效果,不能“恢复旧库”而静默丢失新写入。
|
||||
|
||||
## 7. 实施增量与依赖
|
||||
|
||||
以下U-ID属于本案,与协作存储案的同名U-ID独立。每个增量完成设计细化、自检、正式验收与Review后按policy/delivery.md人工评审;本次不授权实施。新增文件名是建议,最终按实际模块边界落位。
|
||||
|
||||
### U1. 实例与数据恢复身份
|
||||
|
||||
对应R2/R3/R9;无前置。范围:`scripts/svc.sh`、`docs/svc.md`、`tests/test_svc.py`、`tests/test_svc_precheck.py`及新增manifest/identity验证模块。
|
||||
做完整配置、逐字段覆盖、原子revision与操作锁、稳定秘密引用、DB/数据目录身份marker、独立init/restore入口;保留现有dbref修复并提供旧登记一次性兼容迁移。先补现状刻画回归,再改解析器。
|
||||
验收:连续两次裸启停保持同一DB与原始记录;只改端口保持data/plugins;单独data覆盖按合同生效/拒绝;配置迁移每个写边界kill后只能读到完整旧/新版;缺凭据、错DB、丢marker不得新建空系统;更换二进制路径/程序版本或以不同cwd调用svc后,DB identity、数据/工件/工作区根与插件组合保持一致(对应R2更换程序/cwd条款)。使用真实PG特有测试记录核对,桩测试只能辅助。
|
||||
|
||||
### U2. 服务组与进程监管
|
||||
|
||||
对应R1/R8;依赖U1。范围:svc组编排、可选Redis适配、分发仓`deploy/agent-system.service`及安装接线、新增隔离服务组故障测试。
|
||||
按KTD3/KTD4建立依赖图、desired state、可恢复lifecycle operation与单一监管;加入boot/start/exe身份与进程组校验。必需/可选、受管/外部资源由manifest决定。首次切监管在明确停机窗口完成,失败回到原监管且不形成双启动。
|
||||
验收:全组停止后启动;先PG后应用;主动stop保持停止;kill自动退避恢复;主机重启按策略恢复;PID复用、残留子进程、端口冲突、依赖启动失败、不透明外部DB均正确拒绝/报告;不得停止其他服务组的共享依赖。
|
||||
|
||||
### U3. 应用启动、停机与真实就绪
|
||||
|
||||
对应R1/R8/R10;依赖U1,可与U2并行。范围:`modules/backend/internal/app/app.go`、`runmgr/runmgr.go`、`runmgr/events.go`、`plugins/host_v2.go`、server健康接口及其生命周期测试。
|
||||
统一lifecycle context、准入开关、消费者停止与worker join;恢复执行移到装配结束;不同停机原因统一条件结算;sidecar受监督并纳入收口;readiness、恢复摘要和受限诊断按KTD12实现。停机预算属预算来源变更:现状HTTP停机超时仅5秒且超时即返回、跳过后续事件清冲(app.go停机序列,SELF源码核验);“应用30秒/监管60秒”须显式替换该常量并按最长合法步骤与故障实测校准,不得沿用旧值。
|
||||
验收:插件/预算/Workflow未装好不启动恢复任务;停机同时提交新run被拒;SSE与慢工具不跳过flush/清理;子run不被cancelled覆盖;sidecar崩溃可检测;DB坏/恢复扫描失败不ready;hold不影响无关会话的正常读写。
|
||||
|
||||
### U4. 持久任务恢复与副作用隔离
|
||||
|
||||
对应R4/R5/R7;依赖U3,并复用U5所有权接口;U4/U5作为同一安全交付批次,完整性验收前不开放自动续跑。范围:runmgr/runtime工具入口、store运行/恢复/hold表、checkpoint适配、Core公开状态及Frontend兼容、对应恢复与真实工具替身测试。
|
||||
落实KTD7/KTD8,主run、Workflow、子代理、已配置后台executor共享恢复政策;持久化步骤/输入/结果/operation;自动hold连接到工具与启动扫描。HITL保持gate、答案和权限;修复子代理恢复链唯一性。文件checkpoint仅承担其明确的文件修改范围;若新增recovering/hold为公开状态,设计阶段先交付Core枚举→Backend→Frontend及下游契约的最小状态映射表,作为设计评审前提。
|
||||
验收:排队/主run/子run/HITL/索引各类任务kill并两次恢复;工具“完成外部动作、结果未提交”只hold不重做;查询暂未发现但外部请求稍后完成时不发送第二次请求;幂等目标使用同operation key;Native pending intent只由统一账本决策,不生成普通错误后绕过hold;确认一个operation完成后执行剩余必要步骤,不假结算整run;未知工具默认隔离;撤权后禁止续跑;无executor类型明确blocked。真实模型最小任务级恢复对照单独申请测试资源,未跑标NOT_RUN。
|
||||
|
||||
### U5. 所有权、额度、命令、通知与投影闭环
|
||||
|
||||
对应R4/R5/R6/R10;依赖U3;与U4共同验收。范围:`store/execution.go`、`store/admission.go`、`runmgr/admission.go`、`runmgr/commands.go`、server取消/HITL、notice、surfacesvc与PG集成/多进程故障测试。
|
||||
续租及失权取消覆盖全部入口;持久队列/额度对账与共享唤醒;命令lease+处理后ACK;notice事务消费;Surface成功后ACK且持续批量drain。租约到期后的外部不确定行为仍进入U4 hold。
|
||||
验收:占满额度kill后新工作可前进;长run跨租期不失权;旧owner晚到状态/事件/工件被拒;claim后kill命令可重领;取消正确解析conversation并不越权;HITL答案一次生效;notice及子代理并发恢复只建一个后继;超过100条投影事件全部处理,发送失败不清pending。两真实进程与真实PG是必要证据。
|
||||
|
||||
### U6. 文件发布、组合备份与部署回退
|
||||
|
||||
对应R3/R7/R9;依赖U1/U3,恢复账本完整验收依赖U4/U5。范围:blobstore/content、workspace与checkpoint、插件恢复适配合同、svc deploy/update/backup、分发仓安装、备份manifest与restore测试。
|
||||
按KTD11发布不可变版本,扫描缺失/孤立对象;登记全部插件/下游存储;按第6节生成一致恢复点、保护副本、恢复到新目标;候选完整构建后切版本,保留兼容上一组合。
|
||||
验收:对象写后DB提交前kill;覆盖发布过程中kill;日志尾截断/文件缺失保留现场;备份恢复后原文hash/权限/插件链一致;恢复新目标后旧实例复活仍不能产生外部效果,未完成旧写路径隔离时新目标不调度;恢复点后已发生的外部效果对账完成前保持hold;升级ready失败可在兼容条件下回退;不兼容schema拒绝程序自动回退;数据回退不静默丢新写入。
|
||||
|
||||
### U7. 故障验收与交付放行
|
||||
|
||||
对应全部需求;依赖U1–U6。范围:Dev新增隔离`tests/integration/recovery/`、故障注入控制点、运行手册与需求证据表。
|
||||
固定Dev/全部组件、运行制品与配置摘要;使用脱敏数据、独立端口/PG库/文件根及工具目标;记录故障点和恢复统计。先执行小规模逐点故障,再在批准规模混合运行。破坏性kill/断电测试只能在隔离环境实施。
|
||||
验收:第8节每类故障均有可重放证据;RPO=0档已确认数据零遗漏,灾难档恢复点差距≤批准RPO且点内数据零遗漏、点后缺失和外部效果明确对账;零未识别重复副作用、零越权/双有效写者;时间满足批准指标;用户实际刷新、重连、登录、任务/HITL、文档和工件链通过。服务恢复与数据/任务恢复分别签收。
|
||||
|
||||
建议交付批次:A=U1/U2/U3(可靠启动及安全停机,自动任务续跑关闭);B=U4/U5(安全自动续跑与命令闭环);C=U6/U7(文件耐久性、灾难恢复及全系统签收)。只交付A不能宣称完成用户的全部需求。
|
||||
|
||||
## 8. 验证合同
|
||||
|
||||
| 故障/操作 | 最小判据 | 对应需求 |
|
||||
|---|---|---|
|
||||
| `svc stop/start`连续两次、restart、地址与版本变更 | 原DB identity、记录/权限、data/plugins/artifacts根和固定组合一致 | R1/R2/R3 |
|
||||
| 应用SIGTERM/SIGKILL/OOM | 持久数据完整;安全工作可恢复;额度无永久占用;无残留写者 | R3/R4/R6/R8 |
|
||||
| PG停止/重启、断连或提交响应丢失 | 不切SQLite;不假接受;按幂等记录对账;重连后可用 | R2/R3/R5 |
|
||||
| 主动stop与异常退出、监管/编排中途kill | 主动停止不拉起;异常按running意图恢复;操作重复安全 | R1/R2/R8 |
|
||||
| PID复用、重复启动、旧进程冻结后复活 | 不误杀其他进程;一个有效owner;旧epoch无发布/副作用权限 | R1/R5/R6 |
|
||||
| 排队、HITL、跨实例取消、子代理/notice恢复中途kill | 接受意图不丢;审批一次生效;后继run/消息不重复 | R4/R5/R6 |
|
||||
| 外部效果完成而结果未落库、旧请求延迟完成 | 自动hold、有receipt对账和权限检查;暂未发现结果不触发非幂等重试;动作结算后继续未完成步骤 | R4/R5 |
|
||||
| 文件rename/发布边界kill、磁盘满、文件/日志截断 | 不确认未耐久结果;原发布版本一致;损坏可定位、原件保留 | R3/R7 |
|
||||
| 插件sidecar退出、插件存储缺失、索引重建失败 | 必需失败不ready;可选明确降级;数据与授权保留 | R1/R3/R7/R8 |
|
||||
| SSE断开/页面刷新、>100待投影、投递持续失败 | cursor补齐持久事件;旧事件丢弃;失败记录不被ACK | R4/R7/R10 |
|
||||
| 主机重启/断电 | 原数据盘恢复、全部期望服务重新就绪、耐久性指标有真实证据 | R1/R3/R7/R8 |
|
||||
| 完整备份在新目标恢复、旧实例复活、升级失败/回退 | DB+文件+秘密/版本匹配;旧写路径隔离;恢复点后外部效果对账;灾难档满足批准RPO;权限与业务链可用;回退兼容且不静默丢新写入 | R3/R5/R6/R9/R10 |
|
||||
|
||||
验证分层:svc治理桩回归→Backend单元/SQLite→真实PG及多进程→真实工具替身故障链→少量真实模型→真实浏览器与主机级故障→灾难恢复。每层证明不同合同,不相互替代。
|
||||
|
||||
执行时使用项目已有`make test-governance`、`make test-backend-pg`、`make test`、`make build`并增加受管隔离recovery入口。真实PG/Redis/模型/主机测试缺环境时必须明确NOT_RUN或SKIP及缺项,禁止把零用例或条件跳过当通过。按AGENTS要求验收/请求审核/合入前分别task-sync;所有precheck、同步、测试原始输出通过make evidence进入任务卡,并区分SELF/REPLAY/GATE。业务行为面的真实模型验证遵循policy/delivery.md,单测不替代。
|
||||
|
||||
本轮只进行源码与文档检查,业务/数据库身份查询、故障注入、模型试验、迁移、服务启停、部署均NOT_RUN。方案r2不能作为恢复能力验收结论。
|
||||
|
||||
## 9. 兼容、在途任务与批准事项
|
||||
|
||||
本案补充[多人协作存储与分布式演进方案](2026-10-11-collaboration-storage-and-distribution.md)的R7及恢复/运维合同;不覆盖其批准记录或迁移、多实例放行条件。已存在的执行所有权、命令、outbox实现以当前代码为基础继续,不另起重复模块。
|
||||
|
||||
调查时发现`feature/svc-autorecover`在途工作区,任务卡为manual且目标/方案仍待填;其实施与批准范围未经本轮证实。**U1/U2启动实施前必须人工二选一**:(a) 以`feature/svc-autorecover`为实施载体,把本案r2作为其需求与方案来源填入该任务卡后按其流程推进;(b) 记录原因后放弃或合并该任务卡,由本案派生的独立任务实施;两任务不得同时充当svc启动/监管改动的权威,该归属决定与首批实施范围一并报批;`feature/collab-storage-u5-outbox`也存在工作区,其变化未纳入当前固定源码。实施前核对当前主记录、卡片、PR、owner及组合SHA,不能依据分支名断言能力已完成。相关RDM/插件只有纳入兼容和恢复清单并验收后才能覆盖“所有数据”承诺。
|
||||
|
||||
备选:仅修svc脚本成本较小,只能覆盖启动配置/进程,无法满足在途任务和副作用恢复;另造常驻恢复daemon会增加新的监管者与恢复责任,首期无需。推荐现有svc+系统监管+Backend恢复协调的职责划分。
|
||||
|
||||
实施批准时需要固定:目标实例/服务组及独占管理权、实际数据归属清单、故障档与RPO/RTO、正常停机预算、既有在途任务分工。本文已给默认建议;没有这些确认不在共享运行环境做故障/迁移/监管切换。后台是否自动重做模型回合可按任务政策配置,但未知副作用不得靠默认重试放行。
|
||||
|
||||
下一任务建议为U1并同步审查U3生命周期缺口:先保证再次启动绝不换库、换数据根或假就绪,再接监管和自动续跑。预计产物为兼容manifest合同、数据归属清单、隔离真实PG恢复回归与生命周期设计;进入实施前人工批准本案的需求、设计和首批测试范围。后续数据库备份、systemd安装、部署/启停与故障实验分别按授权执行。
|
||||
|
||||
## 10. 全系统完成条件
|
||||
|
||||
只有在所有启用的必需服务/插件被纳入清单、R1–R10均有当前组合与运行对象的重放证据、第8节故障矩阵通过、未知副作用有可处理隔离状态、组合备份实际恢复成功、人工验收及代码Review通过并完成合入/部署后,才可声明“系统停止或异常终止后能够恢复所有服务和数据”。
|
||||
|
||||
本轮交付状态止于**待审核方案**;不以记录、源码能力、桩测试、健康接口或本地文档检查代替上述完成条件。
|
||||
@@ -6,7 +6,10 @@
|
||||
|
||||
## 先看哪一份
|
||||
|
||||
待用户裁定:[Generative UI U5 动作范围提案](2026-10-11-generative-ui-u5-action-scope.md)(2026-10-11)。
|
||||
Generative UI 方向已收口(U1–U7 全部落地,2026-10-12):[使用说明与评测记录](2026-10-12-generative-ui-usage-and-evaluation.md)(final);
|
||||
主记录 [r2](2026-10-10-generative-ui-plugin.md) 与 [U5 动作范围 r2](2026-10-11-generative-ui-u5-action-scope.md) 保留为过程权威。
|
||||
|
||||
U5 已实施合入(动作闭环,Dev #367);[U5 动作范围提案 r2](2026-10-11-generative-ui-u5-action-scope.md) 为已批准范围。U6 经用户 2026-10-11 裁定:待 owner 实际体验 U1–U5 产物(人类可用性对照的执行方式)后再定启动。
|
||||
r2 U5 条款要求先评审动作范围;本文给出 A/B/C/D 分类、审批挂接(复用既有 DangerHigh 确认卡与
|
||||
幂等)、排除项与验收线,待三点裁定后 U5 实施另行开任务。
|
||||
|
||||
@@ -163,9 +166,13 @@ RDM 总案把库分期作为支撑与依赖,不覆盖库分期的原始范围
|
||||
后续维护:主案或任务变化时先更新其唯一主记录,再更新这里的导航和核验快照。
|
||||
更换 Docs/Dev 基线后重新核对 PR、版本与在途任务;新的索引状态不自动产生实施授权。
|
||||
|
||||
## 2026-10-12 规划补充
|
||||
|
||||
- [服务重启与全量数据恢复方案 r2](2026-10-12-service-restart-data-recovery.md):2026-10-12 用户要求 svc 停止/再次启动及异常退出后恢复所有服务与数据;覆盖服务依赖/监管、持久配置和数据身份、run/HITL/命令/通知、未知副作用隔离、文件一致性与组合备份。r1 经六角色自审,r2 吸收外部源码复核(见同名 review 记录两轮)。**2026-10-12 用户批准 r2(五阶段一并)**;实施/故障注入/部署/运行验收 NOT_RUN。关联协作存储 R7;U2 首切片已由 svc-autorecover 任务合入 main(PR #396/#401,2026-10-11),余量按 KTD1/KTD2 对齐后续增量。
|
||||
|
||||
## 2026-10-11 规划补充
|
||||
|
||||
- [RDM 两树一网集成、完善与追溯审计展示方案 r1](2026-10-11-rdm-two-trees-trace-audit-integration.md):对应 P3/MS3,源码已有部分实现;优先补项目绑定、创建者/管理员读取隔离与历史完整性,再接统一展示。用户确认范围为 RDM 与必要基座能力;r1 已获用户评审通过(2026-10-11,五阶段一并,含 KTD4 双层管理员裁定)。U1、U2、U3 已实施合入(RDM PR #195、#197、#201,2026-10-11;超管槽待基座能力接线,见 RDM 仓 U1 基座扩展申请);U4–U5 与运行验收未启动。
|
||||
- [RDM 两树一网集成、完善与追溯审计展示方案 r1](2026-10-11-rdm-two-trees-trace-audit-integration.md):对应 P3/MS3,源码已有部分实现;优先补项目绑定、创建者/管理员读取隔离与历史完整性,再接统一展示。用户确认范围为 RDM 与必要基座能力;r1 已获用户评审通过(2026-10-11,五阶段一并,含 KTD4 双层管理员裁定)。U1–U5 全部实施合入(RDM PR #195/#197/#201/#213;Dev PR #368,2026-10-11;超管槽待基座能力接线,见 RDM 仓 U1 基座扩展申请)。U6 团队存储独立后续;运行验收属部署环境。
|
||||
|
||||
- [RDM 模板与两树一网对话文档生成方案 r1.1](2026-10-11-rdm-template-dialog-generation.md):69 类旧资产、4 个当前注册模板的盘点及生成闭环设计;待评审,实施/迁移/模型试验/运行验收 NOT_RUN。与两树一网集成方案共用项目授权、原子事件与历史能力。 首批项目建议书/竞品分析、随后扩展全部文档已确认(2026-10-11),其余方案与实施仍待评审。
|
||||
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
# 服务重启与全量数据恢复方案 r1 文档审阅
|
||||
|
||||
日期:2026-10-12(Asia/Shanghai)。对象:[主方案](../proposals/2026-10-12-service-restart-data-recovery.md)。
|
||||
方法:ce-doc-review,non-interactive;六个独立上下文的原生子代理加作者源码复核。以下为审阅意见及处置摘要;来源为SELF,不是人工批准、业务验收、REPLAY或GATE。没有外部跨供应商模型评审;未跑业务测试或故障试验。
|
||||
|
||||
| 角色 | 原始发现数 | 处置 |
|
||||
|---|---|---|
|
||||
| coherence | 1 | 修正灾难恢复的分档RPO验收 |
|
||||
| feasibility | 1 | 与design同一问题合并,修正动作与整run的结算边界 |
|
||||
| security-lens | 1 | 加入新目标恢复前的旧写路径隔离门禁 |
|
||||
| design-lens | 1 | 与feasibility同一问题合并,复用原状态/卡片展示 |
|
||||
| scope-guardian | 0 | 无需扩大或缩小当前目标范围 |
|
||||
| adversarial | 1 | 收紧非幂等动作的确定未执行证据 |
|
||||
|
||||
共5条原始发现、4项独立修正;全部已纳入候选r1,不涉及用户需求的取舍变化。人工评审仍未发生。
|
||||
|
||||
## 审阅意见与处置依据
|
||||
|
||||
1. **分档验收不一致。** 初稿目标允许灾难档RPO≤5分钟,U7却无条件要求“零已确认数据遗漏”。后果是按目标建设的备份也无法按U7签收。按已声明的故障分档,R3/U7/故障矩阵明确RPO=0档零遗漏,灾难档恢复点差距在批准范围内、点内完整并报告点后缺失。没有暗改用户的零丢失合同,所有量化指标仍待人工批准。
|
||||
2. **一个外部动作完成不等于整任务完成。** 初稿状态图直接 `hold→completed`,可能跳过必要后续步骤。作者复核Native `runtime/loop.go:385–402`确认工具结果持久化后还继续模型回合;因此与design/feasibility意见一致。现改为记录operation receipt后回recovering,继续剩余步骤,只有全部必要步骤及业务结果完成才结算整run。
|
||||
3. **独立恢复库不能围栏旧库的执行者。** 初稿对新目标恢复已有数据、权限和组合对账,但未明确切生产前如何阻断原权威复活。旧、新库各有有效epoch时,单库租约不能避免双执行。现加入默认隔离验证模式、旧执行者/已发请求写路径隔离、新恢复权威代次、专用资源权限边界及无法证明时hold;同时对账恢复点后的外部效果。验收增加旧实例复活和恢复点后已执行动作。
|
||||
4. **暂未查到结果不足以安全重试。** 初稿“查询确认未执行”可能被理解为目标当前无结果;旧请求稍后完成则重复副作用。现要求确定未执行的终态及旧执行者/已发请求不会再生效的证明;普通查询空结果、发送取消或本地退出均不充分。补外部请求延迟完成而恢复者不得发第二次请求的故障场景。
|
||||
|
||||
作者另核实并修正一处事实表述:Native已有tool intent/result与safe replay机制,Backend生产Session已接线;本案复用该基础,将其与run/epoch/hold关联、指定统一恢复裁决,而不是重建第二套彼此独立的恢复政策。证据命令原始输出由Dev任务卡make evidence保存。
|
||||
|
||||
## 最终对象与检查
|
||||
|
||||
主方案SHA256:`cfc9b768a4596a268810e20101cddc2a6040e24a640e6e34dbda17b838cd45ed`。
|
||||
固定源码对象:Dev `5e57029b439e5690f28dc6002f9784f0b08920eb`,Backend `eb12f102f23d8d026c3458be7ea8b2fef07ada93`;任务分支中的后续提交只记录启动/同步元数据,业务源码未改变。
|
||||
|
||||
任务卡保留precheck、task-sync、源码调查、Native接线核对以及最终文档检查的工具收据。检查范围为差异空白、相对链接、需求/增量/决策ID、证据完整性;通过仅证明对应文档检查,不证明服务或数据恢复。
|
||||
|
||||
草稿、入口和子仓改动尚未提交为固定组合;`check-evidence.py`对含未提交非任务卡改动的收据报告`unverified`。原始输出及方案内容摘要已保存,这些记录仅作为本地调查辅助,不能用于正式合入/运行验收。后续正式审核应先固定候选组合、同步并由有权审阅者重放对应检查,不能靠反复执行或更换来源标签消除此限制。
|
||||
|
||||
实施前仍需人工确认故障档/RPO/RTO、目标实例与独占管理权、数据归属清单和在途任务分工。按policy/delivery.md,此次审阅与候选修正不能代替任何阶段的人工批准。
|
||||
|
||||
## 第二轮:外部源码复核(2026-10-11)
|
||||
|
||||
复核者:ZCode 独立上下文;对象:r1(SHA256 `cfc9b768…`)。方法:对主案第2节差距表、基线与自审记录引用的源码断言逐项独立重验;未运行服务、测试或故障试验。来源SELF。
|
||||
|
||||
核验结果(抽查全部命中):五个基线SHA与任务工作区一致且Dev基线为HEAD祖先;`svc.sh:1373` resolve_db_config统一解析;runmgr `ReconcileInterrupted`(≈2046)统一封印中断;`SetRecoveryHold`与`RenewExecution`均仅有定义、无生产调用;`claimCommand` pending→consumed后执行(kill窗口无重领);app.go HTTP停机超时(现状5秒)即返回并跳过`mgr.Shutdown`事件清冲;`ListSurfaceEventsPending`默认limit=100;notice启动载入内存队列、投递后独立DELETE非事务;native `loop.go:385–402`工具结果持久化后继续模型回合。
|
||||
|
||||
修订处置(r1→r2,需求与指标未变):
|
||||
1. U3补停机预算来源变更:现状5秒须显式替换为批准预算并实测校准。
|
||||
2. U1验收补“更换二进制路径/程序版本、不同cwd调用svc后身份一致”场景(对齐R2)。
|
||||
3. U4补“新增公开状态前先交付Core→Backend→Frontend→下游最小状态映射表”。
|
||||
4. 第9节svc-autorecover协调改为明确的人工二选一归属决策项(实施载体 vs 放弃合并,两权威不得并存)。
|
||||
|
||||
流程修订:r1先按被审对象原样提交固定(documents `54fc24e`、Dev `39f719f`),r2为后续修订提交;恢复会话按门禁完成precheck(READY,R0 `555fb2162f`)并task-sync后实施修订。r2 SHA256:`9cfda2520b913e6966c68fb3f66fb7bc8382a8f7a2b69cb364122216dcdb72cd`。
|
||||
|
||||
遗留(人工事项):svc-autorecover归属二选一、首批实施范围、故障档/RPO/RTO与停机预算批准;全部指标维持待批准未实测。
|
||||
|
||||
### 追加(2026-10-11 task-sync 后):漂移检查与 svc-autorecover 实况
|
||||
|
||||
- task-sync 将 backend 指针由 eb12f102 前移至 25fbea85(collab-storage U5-outbox #157 合入)。漂移检查(工具收据见任务卡证据表)确认 r2 引用的差距在新指针全部成立:RenewExecution 与 SetRecoveryHold 仍无生产调用、claimCommand 仍为认领即 consumed、HTTP 停机超时仍跳过事件清冲、Surface 待投影默认仍 100 条。该合入新增 `EnqueueCommandInTx`(与业务提交同事务投递命令)与 `AppendEvents` 内同事务 `pg_notify`,属 KTD10 可直接复用的原语,不改变差距结论。
|
||||
- svc-autorecover 实况修正归属决策的信息基础:其工作区并非空壳,含未提交的 autostart 期望态 + `svc.sh recover`(postgres 先于应用)+ systemd 用户级 watchdog(每分钟拉回)+ `.start.lock` 生命周期锁 + pidfile/cmdline 校验(svc.sh +317 行、docs/svc.md +61 行、Makefile +10 行)及回归测试 tests/test_svc_recover.py;但任务卡零登记(无 precheck 收据、无卡内记录、无提交),且 2026-10-11 观察其自测 10 例中 5 例未过(failures=2、errors=3)——定位是“有价值的半成品”,不是可合入实现。选项 (a)(作 U2 实施载体)价值因此上调,但需先补登记(precheck/任务卡/提交)、修复未过用例,并与本案 manifest 合同(KTD1/KTD2)对齐;选项 (b) 则须显式处置这批在途工作而非视同空白。裁定仍属人工。
|
||||
|
||||
## 批准记录(2026-10-12)
|
||||
|
||||
用户(weichen)批准方案 r2(拆解/评估/需求表/方案设计/实施计划五阶段一并),并裁定 svc-autorecover 归属选项 (a):作 U2 实施载体,先补登记、修复未过用例、对齐 KTD1/KTD2。实施按第 7 节 U1–U7 与批次 A/B/C 推进;量化指标(RPO/RTO/停机预算)在对应增量验收前固定。来源:用户对话(本记录为 SELF 转述);阶段评审明细见 Dev 任务卡。方案 r2 正文未因批准改动(SHA256 9cfda252… 不变),批准状态以本记录、任务卡与 INDEX 为准。
|
||||
|
||||
### 落地追踪(2026-10-12 补记)
|
||||
|
||||
裁定后核实:svc-autorecover 在途工作已由另一会话完成并合入 main——PR #396(autostart 期望态 + recover + watchdog)、#400(任务卡回填)、#401(KillMode=process 修复)、#402(闭卡归档)。归档卡验证摘要:tests/test_svc_recover.py 10/10、make test-governance 146/146(SELF)、CI GATE 绿(PR HEAD e0b49d1,test+test-pg,一次抖动重跑);如实登记的残留:postgres 实例真实 recover 仅代码审查未实测、agent SQLite 数据目录尚无自动备份。裁定 (a) 的“补登记、修复未过用例”已被事实完成;其对齐要求(KTD1/KTD2 manifest 合同、服务组依赖与单一监管者)转为 U2 余量增量。本记录早前“373 行未登记半成品”的表述为当时(2026-10-11)观察,已被后续事件取代。
|
||||
Reference in New Issue
Block a user