docs: finalize task backend acceptance and review records
Quality gate / backend (push) Canceled after 0s
Quality gate / frontend (push) Canceled after 0s

This commit is contained in:
Xin Wang
2026-10-24 09:29:05 +08:00
parent 5e0cde85e3
commit 6043eb9b63
4 changed files with 69 additions and 5 deletions
+4 -3
View File
@@ -6,18 +6,19 @@
| F1 | 后端资源、助手配置、旧数据迁移 | cd backend && .venv/bin/python -m unittest tests.test_task_backend_resources | MUST | passed |
| F2 | 原生Reasoner、OpenCode、委派桥 | cd backend && .venv/bin/python -m unittest tests.test_reasoner_backend tests.test_prompt_background_tasks tests.test_background_tasks | MUST | passed |
| F3 | 任务后端资源页与提示词编辑器 | cd frontend && npx tsc --noEmit | MUST | passed |
| F4 | 全量回归、隔离数据库迁移与审阅 | make test | MUST | pending |
| F4 | 全量回归、隔离数据库迁移与审阅 | make test | MUST | passed |
## Run record
- F0:新后端资源输入 + 原生Jobs + 旧生命周期累计测试14项,exit 0。显式模拟执行器;backend-spine-smoke.json 已生成。
- F1:12项资源专项测试通过,连同原生主线、桥接、生命周期累计33项通过,exit 0;真实隔离 PostgreSQL 17 完成0026旧数据→0027迁移及CRUD/助手复制/运行时解析,见database-smoke.json。
- F2:make test-backend,391项测试通过,exit 0;包含真实 Pipecat BackendLLMWorker 与模拟模型的13项Reasoner/服务主线检查、绑定指令来源、OpenCode固定agent/model/system负载及现有回归。
- F3:TypeScript、lint及4项前端契约测试通过,exit 0;lint保留既有BatchTestPage警告。生产构建并入F4。
- F4自动检查:`make test` exit 0(391项后端、4项前端契约、lint、production build、5项契约快照);隔离数据库验证通过。补齐OpenCode可选变量行为后,再次运行391项后端检查,exit 0。浏览器验收和独立审阅正在补齐。
- F4:最终 `make test` exit 0(396项后端、4项前端契约、lint、production build、5项契约快照);隔离数据库验证通过。浏览器6项核心检查通过,明确模拟API;旧变量预设刷新这一可选场景未完成浏览器验证,保留在frontend-smoke.json。390px布局检查使用现有侧栏收起操作。
- 独立审阅第1轮发现3项未声明语义及2条过时记录:已补齐每次委派的资源/凭据校验、Reasoner显式成功/失败、停用影响说明以及时钟/停用草稿例外。第2轮返回clean,未声明语义0;同系列模型审阅,仅作provisional记录,不表示独立正确性证明。
## Deferred
- 真实模型/OpenCode联调:尚无服务地址与凭据。
- 多进程调度、任意并发、远程技能同步及沙箱编排:超出本版。
## Blockers
无阻塞的MUST验收项;真实服务联调及浏览器验收限制见Deferred与frontend-smoke.json。
+58
View File
@@ -0,0 +1,58 @@
# 交付记录:Speaker / Task Backend MVP
## 行为与验收边界
仅提示词 Pipeline。已实现独立 Speaker 和 Reasoner/OpenCode 任务后端资源,复用 Pipecat 原生 Jobs/BackendLLMWorker;未修改 Pipecat。新任务委派前读取有效配置,接受后冻结任务快照。任务支持进度、明确结果、提问回复及取消。
## 语义选择(完整)
ASK=never。以下是本版全部语义选择;Source标注用户、默认选择或独立审阅发现。
| ID | Under-determined | Chosen | Class | Source |
|----|------------------|--------|-------|--------|
| B-001 | 支持范围 | 仅提示词 Pipeline;可关闭后端,或选择 reasoner/opencode;一个助手最多一个任务后端 | semantic | user |
| B-004 | 策略归属 | 模型、工具白名单、技能和时限配置在可复用后端资源;助手绑定可补充任务指令。提交时冻结完整解析快照 | semantic | default |
| B-005 | 内置执行 | 复用 BackendLLMWorker 与现有 ToolExecutor;每个任务独立模型实例、上下文和变量,应用级拥有者发原生 Jobs | semantic | user |
| B-006 | Reasoner权限 | 仅资源显式绑定的 HTTP/MCP 服务端工具;拒绝 client/system/task 和循环委派;技能不增加权限 | semantic | default |
| B-007 | 推理强度 | provider_default 或 low/medium/high;非默认值要求模型资源显式声明 supportsReasoningEffort,按 reasoning_effort 参数发送,不支持时拒绝 | semantic | default |
| B-008 | 技能 | Reasoner 使用后端资源中的命名技能正文;OpenCode 使用远端原生技能/agent,平台仅保存说明,不伪装远程安装或权限隔离 | semantic | default |
| B-010 | 执行结果 | Reasoner通过complete_task(status,result)明确报告目标成功或失败;部分完成记为failed并说明限制。该状态是执行模型的报告,非平台独立验证;idle、普通文本、接收回执不证明成功 | semantic | sweep |
| B-011 | 生命周期与取消 | 语音断线继续;取消停止当前任务;原生取消不代表外部工具或远端副作用被回滚,需核查远端停止 | semantic | user |
| B-012 | 恢复 | OpenCode只观察已有句柄;内置Reasoner重启标记中断,不自动重放工具;历史任务保留旧恢复语义 | semantic | default |
| B-013 | 时限与并发 | 新任务保存截止时间,排队和执行均计时;全局原生串行并发1,保留远端状态未确认时阻止新提交策略 | semantic | default |
| B-014 | 迁移 | 自动复制旧task工具连接/凭据至后端资源,迁移助手绑定和instruction来源;保留历史task_id、连接快照和旧时限语义 | semantic | default |
| B-015 | 自动测试与鉴权 | 沿用管理员鉴权;自动测试不得访问真实后端任务,使用显式模拟;无真实服务地址不声称联调完成 | semantic | default |
| B-016 | MVP执行环境 | 内置Reasoner不提供宿主机Shell/文件沙箱;编码由OpenCode处理,界面明确实际权限由执行端配置 | semantic | default |
| B-018 | 回退迁移 | 0027为数据语义迁移,downgrade明确拒绝,需备份恢复;不能把新的Reasoner配置静默回退成旧task工具 | semantic | default |
| B-019 | 切换Realtime | 已绑定任务后端时复用现有配置移除确认交互,确认切换后解除绑定,后端资源保留 | semantic | default |
| B-020 | 配置有效性 | 后端配置拒绝未知字段;启用资源的编辑验证已绑定助手,模型/工具失效时阻止保存和委派;停用资源允许保留结构合法但引用失效的配置 | semantic | sweep |
| B-022 | 指令模板 | 助手绑定 instructions 的业务变量使用接受时冻结的值单次渲染;system__time/system__time_utc沿用共享渲染器执行时刷新。资源 instructions 和技能正文按字面使用,不访问密钥变量 | semantic | sweep |
| B-023 | 通话内更新 | 每次Speaker委派前重新读取后端、模型、工具和MCP启用状态及凭据;绑定或任务参数来源改变时要求重新连接。接受后的任务继续用快照,不因配置编辑撤销已有副作用 | semantic | sweep |
| B-024 | 停用影响 | 允许停用仍被引用的后端并保留绑定;新助手会话因配置校验失败不能启动,需先解绑或启用。已有Speaker通话保留,但新委派会重新校验并拒绝停用资源 | semantic | sweep |
## 运行与验证
- 最终 `make test` exit 0:396项后端、4项前端契约、lint、production build、5项契约快照;仅保留既有BatchTestPage lint警告。
- F0–F4所有MUST验收命令通过。显式模拟模型/远端仍是测试替身,不在生产路径;没有残留生产桩。
- 隔离PostgreSQL17验证0026旧数据迁至0027、四种指令来源、凭据/历史保留、资源CRUD与助手复制,未触碰现有数据库。
- 浏览器6项核心验收使用模拟API,未启动麦克风/WebRTC;旧变量预设刷新场景未完成浏览器验证。390px新页面/弹窗在手动收起现有侧栏后通过布局检查。
- 审阅第一轮:3项未声明语义、2条过时记录;已修正代码或声明。第二轮:未声明0、过时0、clean。review_independence=same-family,acceptance_status=provisional,不代表外部独立正确性证明。
## 接口选择(完整)
| ID | Under-determined | Chosen | Class | Source |
|----|------------------|--------|-------|--------|
| B-002 | 产品资源 | 独立 TaskBackendResource,普通 Tool 仅 HTTP/MCP/client;Speaker 委派由平台内建函数自动注册 | interface | user |
| B-003 | 配置形状 | 后端API使用 id/name/type/description/config/secrets/enabled;助手 taskBackend 使用 backendId/instructionSource/instructions;接口 camelCase | interface | default |
| B-009 | 外部选择 | OpenCode保留地址/目录/服务鉴权,新增可选 agent 与 modelProviderId/modelId;推理强度及沙箱由远端管理 | interface | default |
| B-017 | F0过渡 | Walking skeleton短暂兼容旧tool提交入口以保持累计检查;迁移阶段移除该过渡入口,不保留为新产品接口 | interface | default |
| B-021 | 类型与凭据 | 后端资源可切换类型,但必须提交完整合法配置;OpenCode转Reasoner清除服务凭据,同类型空值/掩码保留原凭据 | interface | default |
## 使用与未覆盖项
1. 升级前备份数据库;0027不能安全downgrade,回退需恢复备份。执行 `make db-init` 迁移并同步接口定义。
2. 在“组件库 → 任务后端”配置资源,再在提示词助手中选择。推理强度要求模型声明实际支持;OpenCode权限/沙箱/技能在远端配置。
3. 真实模型、真实OpenCode编码和WebRTC端到端联调未进行,需有效地址/凭据后单独验证。
4. MVP单进程、全局并发1;多进程调度、任意并发、远程技能同步和沙箱编排未实现。Pipecat保留结束Worker注册对象直至关闭,已清空上下文/工具/处理器引用;长期高任务量运行未验证。
原始记录:BUILD_NOTE.md、database-smoke.json、frontend-smoke.json、SILENT_ASSUMPTION_SWEEP.json、SILENT_ASSUMPTION_SWEEP_ROUND_2.json与sweep-metadata.json。
@@ -0,0 +1 @@
{"undeclared":[],"stale_rows":[],"semantic_undeclared":0,"verdict":"clean"}
@@ -2,6 +2,10 @@
"review_independence": "same-family",
"acceptance_status": "provisional",
"round_limit": 2,
"rounds_completed": 1,
"first_round_semantic_undeclared": 3
"rounds_completed": 2,
"first_round_semantic_undeclared": 3,
"final_semantic_undeclared": 0,
"final_verdict": "clean",
"first_reply": "SILENT_ASSUMPTION_SWEEP.json",
"final_reply": "SILENT_ASSUMPTION_SWEEP_ROUND_2.json"
}