Material-intake guaranteed loop: deterministic spawn, choice chain, queue, cardflow on (Dev task feature/material-intake-flow) #161

Merged
weichen merged 4 commits from feature/material-intake-flow into main 2026-10-11 17:47:56 +00:00
Owner

feature/material-intake-flow 任务卡

任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen

基线与授权

  • 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 555fb2162fe47e13835c592013bc3a69e46239e2

  • 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-material-intake-flow(worktree);分支:feature/material-intake-flow

  • 授权与交付终点:用户 2026-10-11 会话批准本卡「方案与计划」节所载方案(含四项范围裁定),
    授权实施 I1–I4 增量、对应测试与真实模型/浏览器验收、Backend/UI/Frontend/Dev PR 创建与合入、
    任务卡闭合;高后果操作仍走双钥匙。

  • 交付模式:manual(逐阶段人工评审);实施增量 I1–I4 每增量出口人工评审

  • 自动推进授权:无(阶段间评审未授权连续推进);授权范围:阶段内实施/自检/缺陷修复;
    授权来源:用户会话计划批准 2026-10-11;授权终点:I4 验收通过;停止条件:同仓规

  • 当前阶段:正式测试与验收(待人工评审);当前增量:I4 完成

  • 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)

目标与非目标

目标:把快慢双速改为默认工作方式,补齐「上传附件直接发送」的完整闭环:系统确定性启动
材料整理后台任务(附件即保证)→ 材料完整传递给子任务 → 卡片即时展示/过程回填 →
整理完成后待确认交付物选择卡 → 选定后后台任务必启动(模型委派 + stop 兜底)且不重复派发;
容量满时系统任务排队展示;ui.cardflow 默认改为开。
验收主用例:三个附件、无文字、直接发送(用户 2026-10-11 实测暴露 22 秒 0 卡 0 委派)。
非目标:OCR/扫描件解析(MinerU 层);无附件通用意图的自动拆分兜底(用户未选);
agent-native 内核契约改动;设计系统既有约束不动。

关联方向与规划

  • 适用状态:无正式规划文档(说明:本任务是已归档任务 feature/dual-speed-real-path 的闭环延续;
    用户 2026-10-11 会话中逐项裁定默认行为规则并批准方案,方向以本任务卡为凭;
    若后续演化为长期规划再按 policy/delivery.md「长期方向」节建主记录)
  • 主记录路径/版本:本卡;前身:.task/archive/feature-dual-speed-real-path.md(PR #308)
  • 对应里程碑:无

需求分析

ID 描述 项目符合度及依据 优先级 验收条件 依赖 结论
R1 附件即保证:任何带附件发送必出现材料整理后台任务与进度卡(无文字/大材料预启动;文字+附件回合结束兜底) 符合;spawnBackground/createBackgroundCard 链路现成(runmgr.go:1753-1819),缺系统侧确定性触发(实测为零) P0 三附件无文字直接发送:即时反馈+发送后立即建卡;文字+附件场景回合结束前必有卡(预启动或兜底) — 纳入本增量
R2 材料完整传递:子任务获得原文件/解析文本路径与来源引用,不再只有一句任务描述 符合;inputs/*.md 已落盘(inputs.go:62),子代理有 fs 工具(sub_loop.go:24),但子 runCtx 无 inputPaths(runmgr.go:1667) P0 材料子任务转录/输入含材料清单与路径,能读到解析文本 R1 纳入本增量
R3 持续展示:卡片创建即显示、按真实事件更新、完成回填同一卡;「待处理」筛选不隐藏运行中/排队中任务 符合;卡片事件链现成;InboxList.tsx:19 待处理筛选只显示 action_required,运行中被隐藏 P0 卡片 created→updated→status 事件序完整;待处理筛选可见 active 卡 R1,R7 纳入本增量(筛选修复在 I3)
R4 期间可继续对话:后台处理不阻塞会话 符合;detached 子 run + 通知等待 idle 现成(runmgr.go:1636,1905+) P1 材料处理期间用户可发新消息并得到回复 R1 纳入本增量
R5 整理完成→待确认选择卡:基于整理结果发起交付物 choice(含依据选项+自由输入),不重复派发 符合;HITL choice 机制现成(runmgr.go:569-616),通知回合文案需扩展 P0 整理完成后出现选择卡;弱模型不发时系统建默认选择卡兜底 R1 纳入本增量
R6 选定后必启动:选择结果回灌要求委派;未委派则 stop 兜底强制续跑一轮;同键任务不重复派发 符合;stop 钩子 Continue 机制现成(llm_direct.go:284-294);用户裁定混合机制 P0 选定交付物后对应后台任务必启动(≤1 次兜底);重复委派同键返回既有卡 R5 纳入本增量
R7 容量与幂等:上限 3 不变;系统任务满时排队并显示;重复发送同附件幂等 需调整后符合;当前满则硬拒绝(runmgr.go:1761),无内容级去重 P1 满 3 时材料任务显示排队中,槽位释放按序启动;同附件重复发送不重建任务 R1 纳入本增量(I3)
R8 ui.cardflow 默认改为开 符合;settings.go:60,117 默认值翻转 + fail-closed 单测调整(用户 2026-10-11 拍板) P1 新会话长产物进右侧结果卡、对话留摘要;设置项可关 — 纳入本增量(I3)
R9 回归:无附件简单问答行为不变;mock #background 演示不破;cardflow 开启下输出符合 style-cardflow 契约 符合;现有单测+真实模型对照 P0 既有单测全绿 + I4 回归项通过 R1-R8 纳入本增量

方案与计划

  • 方案引用:用户 2026-10-11 会话批准(四项裁定:附件即保证/整理用 chat 档/确认后混合兜底/
    cardflow 默认开)。范围裁定映射:预启动条件=无文字或材料总量≥runtime.materialIntakeChars
    (默认 12000 字符);材料键=sha256(排序后 filename+字节数+解析字符数);
    材料子代理=代码内 fallback spec agent.sub.material(Model="chat",
    tools=fs_read_file/fs_list_dir/knowledge_search);去重=内存活跃键集+卡片 KV 材料键扫描
    (重启安全);排队=仅系统派发任务,会话级 FIFO,decBackground 释放按序启动。
  • 实施计划引用:I1 后端确定性材料整理入口(material.go、SpawnBackgroundOpts 扩展、
    startClaimedRun 接线、turn-0 提醒改写、stop 兜底、键级防重复派发;对应 R1/R2/R3/R4/R6 部分)
    → I2 待确认交付物链路(通知回合契约、选择回灌、选择后 stop 兜底、默认选择卡应急;
    对应 R5/R6)→ I3 容量排队+cardflow 默认开+UI/Frontend 跨仓+Dev pin 级联(对应 R7/R8/R3)
    → I4 正式验收(真实模型前后对照 ≥3 轮 MiniMax + ≥2 轮主推组合;浏览器端到端;对应 R9 及全部)。
  • 测试计划引用:每增量 go 单测(触发矩阵/去重/排队/兜底幂等/payload/卡片事件序/契约注入);
    I4 按政策 2026-10-09 裁定做真实模型任务级前后对照(BEFORE=当前 main 补跑 1 轮+用户已录现象;
    AFTER=新路径多轮),浏览器端到端走 8788 评审环境;make test 组合(含 pin 级联)。

阶段评审

阶段 对象版本 结论 评审人 时间 依据
需求拆解 会话方案 v1 通过 weichen(用户) 2026-10-11 目标/场景/边界/非目标随方案一并批准
需求评估 会话方案 v1 通过 weichen(用户) 2026-10-11 三代理只读探查核实现状(入口纯建议/系统派发为零/材料不传递/筛选隐藏运行中);前身任务保留限制已确认
需求表确认 本卡 R1–R9 通过 weichen(用户) 2026-10-11 四项范围裁定(AskUserQuestion 逐项拍板:附件即保证/chat 档/混合兜底/cardflow 开)
方案设计 会话方案 v1 通过 weichen(用户) 2026-10-11 ExitPlanMode 计划批准;插入点带 file:line 依据
实施计划 会话方案 v1(I1–I4) 通过 weichen(用户) 2026-10-11 同上;每增量出口人工评审
实施与自检 backend 16ed7b2 / ui bfecf8b / Dev 156c119+ 待评审(增量 I1–I4 完成,证据入卡) — — 证据表(SELF 收据 ×7)
正式测试与验收 同上 待评审(单测/组合/真实模型前后对照/浏览器 e2e 已记录) — — 结果与验证节 + 证据表
代码 Review 待定 未评审 — — —
合入 待定 未评审 — — —
合入核验与收口 待定 未评审 — — —

探索试验与迭代

增量/试验 假设 范围 判断和停止条件 批准依据 结果 变更影响 需重审补测
I1 材料整理入口 系统确定性派发可绕过模型不自判 runmgr material.go+spawn 扩展+stop 兜底 单测三态/去重/幂等绿 计划批准 2026-10-11 完成(backend 提交) 无 —
I2 交付物确认链 confirm_choice+双兜底保证链路有终点 runtime 工具+通知契约+stop 兜底 链路单测绿 同上 完成 新工具面(行为面) 真实模型对照(已做)
I3 排队+cardflow+UI 满载可见排队;默认开卡流不破回归 bgQueue+settings 默认+UI 筛选 排队测试+全组件段绿 同上 完成 ui.cardflow 默认翻转(用户拍板) cardflow 开启回归(单测绿;真实轮覆盖)
I4 真实模型+浏览器 闭环在真实模型与浏览器成立 隔离实例 BEFORE/AFTER+无头浏览器 验收用例全过 同上 AFTER 3 轮+浏览器 7/7 过;主推组合 NOT_RUN 无代码变更 主推组合补跑

同步记录

节点 sync_base_sha tested_head_sha checked_at
启动 555fb2162fe47e13835c592013bc3a69e46239e2 555fb2162fe47e13835c592013bc3a69e46239e2 2026-10-11T16:31:03Z
# feature/material-intake-flow 任务卡 任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen ## 基线与授权 - 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 555fb2162fe47e13835c592013bc3a69e46239e2 - 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-material-intake-flow(worktree);分支:feature/material-intake-flow - 授权与交付终点:用户 2026-10-11 会话批准本卡「方案与计划」节所载方案(含四项范围裁定), 授权实施 I1–I4 增量、对应测试与真实模型/浏览器验收、Backend/UI/Frontend/Dev PR 创建与合入、 任务卡闭合;高后果操作仍走双钥匙。 - 交付模式:manual(逐阶段人工评审);实施增量 I1–I4 每增量出口人工评审 - 自动推进授权:无(阶段间评审未授权连续推进);授权范围:阶段内实施/自检/缺陷修复; 授权来源:用户会话计划批准 2026-10-11;授权终点:I4 验收通过;停止条件:同仓规 - 当前阶段:正式测试与验收(待人工评审);当前增量:I4 完成 - 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) ## 目标与非目标 目标:把快慢双速改为默认工作方式,补齐「上传附件直接发送」的完整闭环:系统确定性启动 材料整理后台任务(附件即保证)→ 材料完整传递给子任务 → 卡片即时展示/过程回填 → 整理完成后待确认交付物选择卡 → 选定后后台任务必启动(模型委派 + stop 兜底)且不重复派发; 容量满时系统任务排队展示;`ui.cardflow` 默认改为开。 验收主用例:三个附件、无文字、直接发送(用户 2026-10-11 实测暴露 22 秒 0 卡 0 委派)。 非目标:OCR/扫描件解析(MinerU 层);无附件通用意图的自动拆分兜底(用户未选); agent-native 内核契约改动;设计系统既有约束不动。 ## 关联方向与规划 - 适用状态:无正式规划文档(说明:本任务是已归档任务 feature/dual-speed-real-path 的闭环延续; 用户 2026-10-11 会话中逐项裁定默认行为规则并批准方案,方向以本任务卡为凭; 若后续演化为长期规划再按 policy/delivery.md「长期方向」节建主记录) - 主记录路径/版本:本卡;前身:.task/archive/feature-dual-speed-real-path.md(PR #308) - 对应里程碑:无 ## 需求分析 | ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 | |---|---|---|---|---|---|---| | R1 | 附件即保证:任何带附件发送必出现材料整理后台任务与进度卡(无文字/大材料预启动;文字+附件回合结束兜底) | 符合;spawnBackground/createBackgroundCard 链路现成(runmgr.go:1753-1819),缺系统侧确定性触发(实测为零) | P0 | 三附件无文字直接发送:即时反馈+发送后立即建卡;文字+附件场景回合结束前必有卡(预启动或兜底) | — | 纳入本增量 | | R2 | 材料完整传递:子任务获得原文件/解析文本路径与来源引用,不再只有一句任务描述 | 符合;inputs/*.md 已落盘(inputs.go:62),子代理有 fs 工具(sub_loop.go:24),但子 runCtx 无 inputPaths(runmgr.go:1667) | P0 | 材料子任务转录/输入含材料清单与路径,能读到解析文本 | R1 | 纳入本增量 | | R3 | 持续展示:卡片创建即显示、按真实事件更新、完成回填同一卡;「待处理」筛选不隐藏运行中/排队中任务 | 符合;卡片事件链现成;InboxList.tsx:19 待处理筛选只显示 action_required,运行中被隐藏 | P0 | 卡片 created→updated→status 事件序完整;待处理筛选可见 active 卡 | R1,R7 | 纳入本增量(筛选修复在 I3) | | R4 | 期间可继续对话:后台处理不阻塞会话 | 符合;detached 子 run + 通知等待 idle 现成(runmgr.go:1636,1905+) | P1 | 材料处理期间用户可发新消息并得到回复 | R1 | 纳入本增量 | | R5 | 整理完成→待确认选择卡:基于整理结果发起交付物 choice(含依据选项+自由输入),不重复派发 | 符合;HITL choice 机制现成(runmgr.go:569-616),通知回合文案需扩展 | P0 | 整理完成后出现选择卡;弱模型不发时系统建默认选择卡兜底 | R1 | 纳入本增量 | | R6 | 选定后必启动:选择结果回灌要求委派;未委派则 stop 兜底强制续跑一轮;同键任务不重复派发 | 符合;stop 钩子 Continue 机制现成(llm_direct.go:284-294);用户裁定混合机制 | P0 | 选定交付物后对应后台任务必启动(≤1 次兜底);重复委派同键返回既有卡 | R5 | 纳入本增量 | | R7 | 容量与幂等:上限 3 不变;系统任务满时排队并显示;重复发送同附件幂等 | 需调整后符合;当前满则硬拒绝(runmgr.go:1761),无内容级去重 | P1 | 满 3 时材料任务显示排队中,槽位释放按序启动;同附件重复发送不重建任务 | R1 | 纳入本增量(I3) | | R8 | ui.cardflow 默认改为开 | 符合;settings.go:60,117 默认值翻转 + fail-closed 单测调整(用户 2026-10-11 拍板) | P1 | 新会话长产物进右侧结果卡、对话留摘要;设置项可关 | — | 纳入本增量(I3) | | R9 | 回归:无附件简单问答行为不变;mock #background 演示不破;cardflow 开启下输出符合 style-cardflow 契约 | 符合;现有单测+真实模型对照 | P0 | 既有单测全绿 + I4 回归项通过 | R1-R8 | 纳入本增量 | ## 方案与计划 - 方案引用:用户 2026-10-11 会话批准(四项裁定:附件即保证/整理用 chat 档/确认后混合兜底/ cardflow 默认开)。范围裁定映射:预启动条件=无文字或材料总量≥runtime.materialIntakeChars (默认 12000 字符);材料键=sha256(排序后 filename+字节数+解析字符数); 材料子代理=代码内 fallback spec agent.sub.material(Model="chat", tools=fs_read_file/fs_list_dir/knowledge_search);去重=内存活跃键集+卡片 KV 材料键扫描 (重启安全);排队=仅系统派发任务,会话级 FIFO,decBackground 释放按序启动。 - 实施计划引用:I1 后端确定性材料整理入口(material.go、SpawnBackgroundOpts 扩展、 startClaimedRun 接线、turn-0 提醒改写、stop 兜底、键级防重复派发;对应 R1/R2/R3/R4/R6 部分) → I2 待确认交付物链路(通知回合契约、选择回灌、选择后 stop 兜底、默认选择卡应急; 对应 R5/R6)→ I3 容量排队+cardflow 默认开+UI/Frontend 跨仓+Dev pin 级联(对应 R7/R8/R3) → I4 正式验收(真实模型前后对照 ≥3 轮 MiniMax + ≥2 轮主推组合;浏览器端到端;对应 R9 及全部)。 - 测试计划引用:每增量 go 单测(触发矩阵/去重/排队/兜底幂等/payload/卡片事件序/契约注入); I4 按政策 2026-10-09 裁定做真实模型任务级前后对照(BEFORE=当前 main 补跑 1 轮+用户已录现象; AFTER=新路径多轮),浏览器端到端走 8788 评审环境;make test 组合(含 pin 级联)。 ## 阶段评审 | 阶段 | 对象版本 | 结论 | 评审人 | 时间 | 依据 | |---|---|---|---|---|---| | 需求拆解 | 会话方案 v1 | 通过 | weichen(用户) | 2026-10-11 | 目标/场景/边界/非目标随方案一并批准 | | 需求评估 | 会话方案 v1 | 通过 | weichen(用户) | 2026-10-11 | 三代理只读探查核实现状(入口纯建议/系统派发为零/材料不传递/筛选隐藏运行中);前身任务保留限制已确认 | | 需求表确认 | 本卡 R1–R9 | 通过 | weichen(用户) | 2026-10-11 | 四项范围裁定(AskUserQuestion 逐项拍板:附件即保证/chat 档/混合兜底/cardflow 开) | | 方案设计 | 会话方案 v1 | 通过 | weichen(用户) | 2026-10-11 | ExitPlanMode 计划批准;插入点带 file:line 依据 | | 实施计划 | 会话方案 v1(I1–I4) | 通过 | weichen(用户) | 2026-10-11 | 同上;每增量出口人工评审 | | 实施与自检 | backend 16ed7b2 / ui bfecf8b / Dev 156c119+ | 待评审(增量 I1–I4 完成,证据入卡) | — | — | 证据表(SELF 收据 ×7) | | 正式测试与验收 | 同上 | 待评审(单测/组合/真实模型前后对照/浏览器 e2e 已记录) | — | — | 结果与验证节 + 证据表 | | 代码 Review | 待定 | 未评审 | — | — | — | | 合入 | 待定 | 未评审 | — | — | — | | 合入核验与收口 | 待定 | 未评审 | — | — | — | ## 探索试验与迭代 | 增量/试验 | 假设 | 范围 | 判断和停止条件 | 批准依据 | 结果 | 变更影响 | 需重审补测 | |---|---|---|---|---|---|---|---| | I1 材料整理入口 | 系统确定性派发可绕过模型不自判 | runmgr material.go+spawn 扩展+stop 兜底 | 单测三态/去重/幂等绿 | 计划批准 2026-10-11 | 完成(backend 提交) | 无 | — | | I2 交付物确认链 | confirm_choice+双兜底保证链路有终点 | runtime 工具+通知契约+stop 兜底 | 链路单测绿 | 同上 | 完成 | 新工具面(行为面) | 真实模型对照(已做) | | I3 排队+cardflow+UI | 满载可见排队;默认开卡流不破回归 | bgQueue+settings 默认+UI 筛选 | 排队测试+全组件段绿 | 同上 | 完成 | ui.cardflow 默认翻转(用户拍板) | cardflow 开启回归(单测绿;真实轮覆盖) | | I4 真实模型+浏览器 | 闭环在真实模型与浏览器成立 | 隔离实例 BEFORE/AFTER+无头浏览器 | 验收用例全过 | 同上 | AFTER 3 轮+浏览器 7/7 过;主推组合 NOT_RUN | 无代码变更 | 主推组合补跑 | ## 同步记录 | 节点 | sync_base_sha | tested_head_sha | checked_at | |---|---|---|---| | 启动 | 555fb2162fe47e13835c592013bc3a69e46239e2 | 555fb2162fe47e13835c592013bc3a69e46239e2 | 2026-10-11T16:31:03Z |
weichen added 4 commits 2026-10-11 17:44:39 +00:00
Why: the dual-speed entry hint is advisory only; real runs (MiniMax, 3 attachments, no text) end with a clarifying question and zero delegation, so background cards and result backfill never start.
Evidence: new unit tests in runmgr/material_test.go and runtime/material_flow_test.go all pass; full go test ./... exit 0 (local, SELF).
Impact: attachment-carrying runs now guarantee a material-organization background task (pre-spawn on attachment-only/heavy sends, stop-hook backstop otherwise when the model did not delegate); subagent receives inline parsed text with budget plus knowledge_search guidance; content-key dedup prevents duplicate spawns (in-flight, completed, resend); model-authored delegate_task gains a materials appendix; settings runtime.materialIntake (default on) and runtime.materialIntakeChars added.
Refs: Dev task .task/feature-material-intake-flow.md I1; user ruling 2026-10-11.
Why: after material organization completes, weak models report and end the turn without offering the user a choice of formal deliverables, and even after a user picks one the model may close the turn without starting the background task.
Evidence: new tests (notice-choice chain, deliverable backstop, free-input path, invalid args, notice contract) pass; full go test ./... exit 0 (local, SELF).
Impact: new confirm_choice tool issues a HITL choice card and routes the answer into a hard delegate instruction; material notices instruct the model to report then offer choices; stop hook adds two one-shot backstops (choice not offered in material notice runs; choice made but no background delegation).
Refs: Dev task .task/feature-material-intake-flow.md I2.
Why: at the 3-per-conversation cap the guaranteed material task was dropped silently, and long deliverables stayed in chat because cardflow defaulted off (user ruling 2026-10-11).
Evidence: new queue lifecycle test (queued card, hard-reject for model path, FIFO start on release, card promote) passes; full go test ./... exit 0 (local, SELF).
Impact: queueable system spawns create a queued progress card at capacity and start FIFO when a slot frees (memory-only queue; restart limitation noted); model delegate_task still hard-rejects; ui.cardflow default true (EffectNewRun).
Refs: Dev task .task/feature-material-intake-flow.md I3.
Merge authoritative main into the task branch
ci / vet-and-test (pull_request) Successful in 42s
409390fff1
weichen merged commit e49f165d0b into main 2026-10-11 17:47:56 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: weichen/Agent-System-Backend#161