# 二期池第一批:子轨迹落库 + 来源标记(2026-10-03) > 指令源:「已确定的 自主推进」。改动已完成并全量验证,**未提交**(攒批等用户令)。 ## 目标 子代理轨迹从「纯内存零落库、会话结束即蒸发」改为「出口整轨迹落库」,origin=sub_agent 标记使桌面侧栏/miniapp 列表过滤子会话——轨迹可追溯(调试金矿 + 后续轨迹树/TaskDrawer 跳转的数据地基),不污染主会话列表。 ## 已完成(全部验证通过) | 项 | 文件 | 内容 | |---|---|---| | V44 迁移 | crates/df-storage/src/migrations.rs | ai_conversations 加 origin TEXT 列(column_exists 幂等守卫,同 V42 模式),steps 43→44,三处版本号断言同步 | | record 字段 | crates/df-storage/src/models.rs | AiConversationRecord.origin: Option(不可变列,UPDATE 不写) | | 落库链路 | crates/df-storage/src/crud/conversation_repo.rs | from_row 读 origin(unwrap_or(None) 兜底,同 message_id v21 模式)+ INSERT 加列 | | 会话内存标记 | src-tauri .../ai/mod.rs | AiSession.conv_origins: HashMap(与 deleted_convs 对称:init 写入、出口清理回收) | | save 透传 | src-tauri .../ai/conversation.rs | save 快照 lock 段取 conv_origin → record 构建落 origin(主会话恒 None) | | 列表过滤×2 | src-tauri .../commands/conversation.rs + remote_bridge.rs | 桌面侧栏 ai_conversation_list 与 miniapp list_conversations 同口径过滤 origin 非空 | | 出口落库 | src-tauri .../agentic/sub_agent.rs | 统一出口 run_sub_agent_loop:判活(deleted_convs 未重打 且 per_conv 在)→ 摘拦截 → save_conversation 整轨迹持久化 → per_conv/save_locks/conv_origins 三清;启动时 conv_origins 与 deleted_convs 对称写入;模块头文档重写为新语义 | ## 验证证据 - cargo test -p df-storage:**182+12 全绿**(含 V44 全链幂等两遍测试) - cargo check --workspace:0 error(2 个 warning 为工作区遗留改动自带:Emitter 未用导入、evaluate_ideas_batch 死代码,非本批) - cargo test -p devflow --lib:**624 过 0 失败** ## 顺手修的遗留半成品(同文件明确 bug,主动修原则) v21 断点续迁改造批(工作区未提交遗留)新增的两个测试从未跑绿: 1. `v21_crash_midway_resumes_missing_convs`:模拟 INSERT 3 占位符只绑 2 参数(seq 漏绑)+ 建表缺失 → 补 seq 参数 + execute_batch(V21_SQL) 前置 2. `v21_batch_boundary_crash_resumes_remaining_batch`:建表缺失 → 同法修复 3. `test_full_migration_on_fresh_db`:版本号断言写死 43 → 44 ## 设计要点(为何这样落) - **零新破坏性**:运行期仍零落库(deleted_convs 拦截不动),只改出口一次落库;主会话链路只多一次 HashMap get - **防空壳复活**:出口判活查两处(级联删除会重打 deleted_convs / 父删除会清 per_conv),任一命中放弃落库 - **过滤双口径**:桌面 + miniapp 两处列表同 filter,前端零改动 - Truncated/Failed 轨迹同样落库(调试价值);usage/model 落 None(宁少,轨迹树批再补) ## 待办(等用户令) - [ ] 提交(攒批授权)→ push → 换装(一字令) - [ ] 后续批:AiAgentFinished 前端展示(前端零消费已确认)→ 子代理审批挂起 → 轨迹调用树 → TaskDrawer 查看会话跳转