Sozai Agent-Native · Design Review
把快速检索和反馈系统从"写死的流程 + LLM 打分"改造成两个真正会自己思考、能跟你对话的 Agent。这一页是完整设计稿,每一项都等你逐条确认后才开工。
现在两条路上 LLM 都只是"被动打分器",怎么找、怎么改,全是代码写死的:
| 哪里 | 现在的样子 | 问题 |
|---|---|---|
| fast-search-fetch.ts | 写死"搜一页 → LLM 挑一批 → 不够翻页,最多 5 轮"。LLM 只回答"这批留哪几条"。 | 不会换关键词、不会判断"这个平台没货该停了"、找不好也说不出为什么。 |
| cron.ts 消化引擎 | 把所有待处理反馈拼成一个超大 prompt,一锤子输出 JSON。 | 反馈指向的素材/方案只有标题进 prompt——AI 看不到你点踩的东西长什么样,只能靠标题猜。 |
| 反馈页 | 单向提交,交完等后台慢慢消化。 | 没有对话。你说了话,Agent 不回应、不追问、不告诉你它打算怎么改。 |
另有两处 Codex 走查发现的暗伤,这次一并修:① 快搜/竞品的运行记录没盖当时的基因版本号(guidance_version 为空),"这批素材是哪一版检索文档找来的"答不上来;② 手动触发的快搜整个跑在 HTTP 请求结束后的 waitUntil 里,平台随时可能掐掉(7/10 消化引擎就是这么死的,§23.42)。
要点在右下那条空隙:管家(实时、有人在)和检索工人(后台、慢慢跑)从不直接调用对方——中间永远隔一张 Postgres 队列表。这样任何一边挂了都不拖累另一边,而且两边的进展都落库,谁都能查。
| 对话模式 | 批量模式 | |
|---|---|---|
| 在哪跑 | DO 实例内,你发消息当场跑 | 分钟 tick 认领队列后跑(现有 F5 通道改入队) |
| 触发 | 你在反馈页发一句话 | 待消化反馈满 3 条,或最老一条超 3 天 |
| 响应 | 流式,逐字回,点了就有反应 | 无人值守,跑完在版本时间线留一条 |
| 改基因 | 出 diff 卡片,你点确认才写库 | 自主写入(乐观锁保护,和现在一致) |
| 反馈记录 | 聊天中识别出的反馈照样落反馈表并盖"已消化"回执 | 消化后给每条反馈盖回执(现逻辑复用) |
| 工具 | 做什么 | 代码层硬约束(模型绕不过) |
|---|---|---|
| read_gene() | 读当前检索文档 + 创意规则 + 最近 5 个版本的变更摘要 | 只读 |
| read_feedback() | 读待消化反馈 + 上次消化以来的点赞点踩 | 只读,上限 200 条(现有 SQL 原样复用) |
| view_object(type, id) | 新能力:读反馈指向对象的"认知层"——各源已有的视频理解字段归一化(见下方 3.5) | 只读;只能看本 Agent 名下的对象(product_key 校验) |
| read_performance() | 读行为统计:这一版基因找回的素材被采用了多少、点踩集中在哪 | 只读(四期上线,之前返回"暂无数据") |
| propose_update({...}) | 提议修改检索文档和/或创意规则,附一句话理由 | 对话模式:只生成卡片,写库必须等人点确认;批量模式:直接走现有事务(乐观锁 + 版本铸造 + 回执,一字不改);新旧文本全等时自动降级为"本轮不改" |
| order_search(brief) | 应你要求下单一次快速检索("再帮我找一批更新的") | 只 INSERT 一条 queued run,不直接执行;每对话每分钟限 1 次 |
| no_update(reason) | 判断本轮不需要改,给反馈盖回执 | 批量模式专用 |
| analyze_video(id) | 兜底:存量/漏网素材缺理解时当场看(聊天显示"我去看一下这条视频…") | 对话每轮 ≤2 次、批量每 run ≤5 次;触发即打日志 |
这些全部是 PM 已拍板的原则,从现在散落的 prompt 里升格为一份独立的版本化文件:
反馈引用的是视频,但管家"看"对象不需要现场跑视频理解——各源的理解产物早就落库了(2026-07-11 查共享测试库真实数据确认):
| 对象 | 已有认知字段(真实 meta) | 产出方 |
|---|---|---|
| 热点素材 | analysis_excerpt · construction_beats(拆解节拍)· frames/frame_urls(抽帧)· description_md · review_score | tobatsu 深搜 |
| 竞品素材 | visual_summary(覆盖 82%,136/166)· content 基本只是广告标题 · impression/ads_days/region(投放数据) | 桥(18% 裸奔,走补齐) |
| 方案 | summary · hook_plan · blocks(故事板)· refs | 构造自带 |
| 成片 | 标题 + 关联方案故事板 + 创作载荷 | 构造自带 |
| 快搜素材 | 只有 author/plays/likes/platform——唯一缺口 | — |
| 工具 | 做什么 | 代码层硬约束 |
|---|---|---|
| search_fast(platform, keyword, cursor?) | TikHub 搜一页(tiktok / instagram / twitter),返回瘦身摘要:每条只有 140 字文案 + 播放/点赞数 | 整个 run 最多 12 次调用;单次 10s 超时 + 1 次重试(现有) |
| search_competitor(query) | 竞品桥搜一轮(submit 后内部等结果,最多等 3 分钟) | 没等到就返回 task_id 让它先干别的,稍后用 check_competitor 回来取——不空转烧墙上时间 |
| check_competitor(task_id) | 回头取竞品桥的结果 | 只读;桥每轮 8 分钟超时沿用现有值 |
| analyze_video(candidate_ids) | 前置分析(PM 拍板:选货之前先看货):对粗筛后的短名单并行调 mai 视频分析,带着真实内容理解做取舍 | 每 run 分析数 ≤ 2× 目标 N;必须先粗筛出短名单才准调(防全量烧钱) |
| save_materials(ids, reason) | 把选中的候选写进素材库 + 选择理由 + 分析结果随行入 meta(入库即带认知,"回填"工序消失) | 去重、凑满即止(预算 ≤ 目标 N)、product_key 隔离、R2 转存——全在工具代码里,模型无权越界 |
| finish(report) | 收工并写一段小结:找到多少、换过几次词、哪个方向没货 | 强制收尾;不调它超预算时由框架代为收尾 |
| 闸门 | 数值(首版) | 触发后 |
|---|---|---|
| 最大轮数 | 40 轮 LLM 往返 | 注入"预算将尽"消息,强制走 finish |
| 累计 token | 200k(约 ¥3/run 上限) | 同上 |
| 墙上时间 | 10 分钟/run | 框架收尾,已入库的素材保留 |
| 卡死兜底 | sweep:running 超 15 分钟 | 按已写入的素材结算 done/failed(现有逻辑) |
| 入口 | 触发什么 | 路径 | 和现在比的变化 |
|---|---|---|---|
| ① 创建 Agent 首搜 | 检索 run | POST /api/crawl/slots → INSERT queued | 原来在 waitUntil 里整跑 ⚠ → 改为只入队 |
| ② 按钮"再找一批" | 检索 run | POST /api/runs → INSERT queued | 同上 |
| ③ 聊天里下单 | 检索 run | 管家 order_search 工具 → INSERT queued | 新增 |
| ④ 每日自动(prod 北京 00:00) | 检索 run | daily planner → INSERT queued | 不变(本来就是入队) |
| ⑤ 反馈攒够阈值 | 批量消化 run | 反馈落库 → 满3条或超3天 → INSERT queued | 原来在 waitUntil 里直接跑 LLM ⚠ → 改为只入队 |
规矩一句话:HTTP 请求里的 waitUntil 只准做一次 INSERT,永远不准跑 LLM。所有重活由分钟 tick(scheduled handler,15 分钟墙上时间)认领后 await 整跑。对话模式例外——它在请求存续期间流式跑,客户端连着就没有时限,本来就不走 waitUntil。⑤ 带来的唯一代价:反馈提交到消化开始多 0–60 秒,后台事,无感。
没有 DO 会怎样
DO 给什么
| 东西 | 存哪 | 为什么 |
|---|---|---|
| 聊天记录、反馈、基因、版本、行为事件 | Postgres(Neon) | 唯一事实源。DO 实例被平台迁移/重启,什么都不丢 |
| 热对话上下文、diff 卡片的待确认状态、在线标签页名单 | DO 内存 + storage | 串行化和广播用的热态,可随时从库里重建 |
| 检索 run 的排队和转录 | agent_runs(jsonb) | 检索工人不进 DO;DO 只是轮询转录把进度贴进聊天 |
| 对比点 | WebSocket | SSE |
|---|---|---|
| DO 休眠计费(决定性) | Hibernation API 只支持 WS:页面整天开着,DO 睡着、连接保持、基本不计费 | SSE 长连把 DO 钉在内存里持续计费——每个开着页的 Agent 实例整天活着 |
| 双向 | 一条通道收发 | 发言另走 POST,自己的话从流里回来还要去重对时序,两通道全是边角 bug |
| 多标签广播 | 原生:遍历 sockets 推 | 能做,但叠上第一条已无意义 |
SSE 唯一优势是纯 HTTP 好穿企业代理;内部工具走 443 的 wss 不存在此问题。
| 哪种"多" | 怎么办 |
|---|---|
| 同一人开 N 个标签页 | 全连同一 DO,每个 socket 只是订阅者,广播同帧刷新(单实例连接上限 3 万+,随便开) |
| 多个人同时在线 | 同一实例;WS 握手时从 mb_auth cookie 取 user_id 打在 socket 上——发言带署名、头部在线名单。两人同时发言 → mailbox 排队,后一条回答时已看得到前一条往返 |
| 同时开多个不同 Agent 的页 | 各连各的 DO 实例(idFromName 按 agentId 分),天然隔离 |
| 对话历史越攒越长 | 首版不设 session 概念:每 Agent 一条永续线程。每轮只装载"宪法 + 当前基因 + 最近 N 条",老历史留库里滚动懒加载。将来要分段,chat 表加一列 conversation_id 即可 |
附带定一个细节:管家正在回答时又进来几条消息,不逐条跑 LLM——下一轮合并一起读,省钱且回答更连贯。
CREATE TABLE agent_chat_messages ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), agent_id uuid NOT NULL, -- crawl_slots.id,一个 Agent 一条共享线程 role text NOT NULL CHECK (role IN ('user','assistant','system')), user_id uuid, -- role=user 时记谁说的(团队共聊,区分发言人) content jsonb NOT NULL, -- 文本块 / 工具调用摘要块 / 卡片引用块 gene_card_id uuid, -- 这条消息挂的 diff 卡片(如有) created_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX idx_chat_agent_time ON agent_chat_messages (agent_id, created_at DESC);
CREATE TABLE agent_gene_cards ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), agent_id uuid NOT NULL, proposed_search text, -- 提议的新检索文档(不改则 NULL) proposed_steer text, -- 提议的新创意规则(不改则 NULL) base_version int NOT NULL, -- 基于哪一版提的(应用时乐观锁校验) reason text NOT NULL, -- 管家的一句话理由 status text NOT NULL DEFAULT 'pending', -- pending/applied/rejected/expired resolved_by uuid, resolved_at timestamptz, applied_version int, -- 应用后铸出的版本号 created_at timestamptz NOT NULL DEFAULT now() );
CREATE TABLE agent_behavior_events ( id bigserial PRIMARY KEY, agent_id uuid NOT NULL, user_id uuid, event_type text NOT NULL, -- material_viewed / material_ignored / delivery_downloaded object_type text, object_id uuid, source_run_id uuid, -- 顺着它能查到当时的基因版本 meta jsonb DEFAULT '{}'::jsonb, created_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX idx_behavior_agent_time ON agent_behavior_events (agent_id, created_at DESC);
只埋 viewed / ignored / downloaded 三个前端事件。"素材入方案""方案被派发"不用埋——从 creative_boards、deliveries 的现有引用关系就能算出来。
| 表 | 改什么 | 迁移? |
|---|---|---|
| agent_runs.inputs.agent | jsonb 里加 transcript[]:每轮 {role, content, tool, tokens, at},每轮落盘一次 | 不用(jsonb) |
| agent_runs.guidance_version | 快搜/竞品的 INSERT 补上这一列(列本来就有,是代码没写)——断了的血统接上 | 不用(改代码) |
| agent_guidance_versions.origin | 新增来源值 'chat'(聊天确认制产生的版本,区别于 digest/manual/seed) | 看约束——若有 CHECK 需一条小迁移 |
| agent_stage_feedback | 聊天识别出的反馈照常落行 + 盖回执,meta 里标 from_chat | 不用 |
| 产品表(hot_materials / creative_boards / deliveries) | 一个字段都不加——血统照旧走 source_run_id,遵守项目红线 | — |
| 层 | 存哪 | 活多久 |
|---|---|---|
| 一次 run / 一轮对话的工作记忆 | 内存跑,每轮快照进库(chat 表 / transcript) | run 结束封存,只用于回放和审计 |
| Agent 的长期记忆 | 就是创意基因本身:检索文档 + 创意规则 + 版本史 + 行为事件 | Agent 一生 |
刻意的设计:run 和 run 之间不传对话——"上次学到的"必须沉淀成基因文档的修订才算数。基因是用户可见、可编辑、可回滚的,Agent 的记忆不藏在任何黑盒里。
| 层 | 内容 | 变化频率 | cache 断点 |
|---|---|---|---|
| L0 | 工具定义(按名排序序列化)+ 宪法 | 随代码版本 | 断点① |
| L1 | 基因文档快照 + 本 run 任务参数 | 每 run 开跑时快照,中途不刷新(新版本下个 run 生效——与乐观锁语义一致) | 断点② |
| L2 | 对话/工具轮次 | 每轮增长 | 断点③滚动打在最新一条 |
铁律:前缀禁止时间戳、随机 ID、未排序 JSON——一个字节漂移,断点之后全部白给。agent-loop.ts 必须内建"断点装配器",且每轮把 cache_read / cache_creation / input / output 四个 usage 数记进转录——成本可审计是 P1 验收项。
| 存储 | 干什么 | 不干什么 |
|---|---|---|
| Anthropic prompt cache | 轮间前缀复用(TTL 5min) | 不是持久层 |
| KV SEARCH_CACHE | 幂等小调用结果(提词,1 天 TTL) | 不放对话/转录(最终一致,不做真源);不做并发锁 |
| DO 内存/storage | 热对话上下文、卡片状态、频控偏好 | 不做真源——随时可从 PG 重建 |
| Postgres | 一切真源(聊天/转录/基因/分析全文/行为) | — |
分析幂等不靠 KV:靠 meta 已有检查 + DB ON CONFLICT。对话模式每轮装配 = L0 + L1(当前基因)+ 最近 N 条聊天(按 ≈8k tok 预算倒推);老历史只在 UI 懒加载展示、不进上下文;基因被他人手动改掉时 DO 收到版本事件 → 下一轮 L1 刷新、接受一次冷写——正确性优先于缓存命中。
不另开新页——管家对话页顶替当前反馈中心的入口和位置,细节 PM 后续迭代。旧反馈中心的内容去处:版本时间线 → 右栏常驻;历史反馈与版本推送 → 以时间线卡片出现在对话流开头(反馈本来就成为对话的一部分)。
整页只有一处要你做决定:那张墨蓝卡片。其它一切(它翻了什么、搜到哪一轮)都是可看可不看的过程信息,默认折叠,不抢注意力。
| 组件 | 行为细节 |
|---|---|
| 流式回复气泡 | 逐字出现;工具调用期间显示动词短语("正在翻你点踩的素材…")不留白屏 |
| 动作折叠条 | Agent 每次调工具收起为一行灰条,点开看参数和返回摘要——透明但不聒噪 |
| 基因 diff 卡片 | 旧/新对照 + 理由 + 应用/驳回。应用后原位变为"已应用 · V5 · 由谁确认";其它标签页同帧更新;过期卡(底版本被超)自动置灰标"已过期" |
| 检索进度条 | 聊天下单后进度直播在对话流里(轮次/换词/已收条数),来源是转录轮询,完成后变成结果卡链去素材库 |
| 右栏基因面板 | 检索文档 + 创意规则常驻可见、可手动编辑(走现有 F2 润色);版本时间线每版标采用率(四期数据接入后) |
| 在线标记 | 头部显示几人在线——既然是共享线程,谁在场应当可见 |
| 输入框 | 沿用 7/10 修的 isComposing 防护,中文输入法组词回车不误发 |
没有行为记录,管家只能听你"说"了什么;有了它,管家还能看你"做"了什么——两边对照才知道怎么改。
| 事件 | 怎么来 | 信号强度 |
|---|---|---|
| material_viewed | 前端埋点:点开素材详情 | 弱正 |
| material_ignored | 前端埋点:展示多次从未点开 | 弱负 |
| material_adopted | 不埋点,从"素材被选进方案"的现有引用推导 | 强正——检索质量的真实成绩 |
| plan_dispatched / revised | 从派发/修改记录推导 | 方案质量 |
| delivery_downloaded | 前端埋点:成片被下载 | 最强正——最终被拿去用了 |
检索文档 V4 ──> 当时的检索 run(guidance_version=4,本次补上) ──> 这批素材 ──> 采用了几条 / 点踩几条 ──> V4 比 V3 是变好还是变差 ──> 写进 V5 版本行的效果快照 ──> 管家 read_performance() 读到 ──> 下次消化拿证据说话
每次铸新版时把上一版的成绩快照进版本行——版本时间线自动变成"每次改动有没有用"的成绩单,你看得到,管家也读得到。
| 选择 | 定论 | 理由 |
|---|---|---|
| LLM 调用 | @anthropic-ai/sdk 官方 SDK | 纯 fetch 实现 Workers 原生跑,baseURL 指 ZenMux,白得重试 + 类型(现在的裸 fetch 连重试都没有) |
| Agent 框架 | 不用 LangChain / LangGraph | 两个 Agent 各 4-7 个工具,循环本体 ~150 行;框架的编排能力用不上,bundle 和兼容坑倒是白背 |
| 结构化输出 | 全走 tool call 参数 | schema 由 API 层校验,现在的"正则抠 JSON"整段删除 |
| 实时通道 | WebSocket(DO Hibernation) | 多标签广播是硬需求,SSE 做不了双向 |
| 后台执行面 | Postgres 队列 + 分钟 tick(现有模式) | 已被快搜/竞品验证;不引入 CF Queues/Workflows 新部件 |
| 模型分层 | 沿用 env 配置 | 判断活 anthropic/claude-sonnet-5,提词起名 gemini-3.5-flash,随时可换不改代码 |
| thinking | tick 上下文里放开,对话模式看延迟实测 | §23.42 关 thinking 是为了挤 30 秒窗口;tick 里 15 分钟,约束消失 |
| 视频理解 | mai video-analysis-worker(同账号 binding) | 已实测 200/29s、输出即广告创意拆解格式;零 prompt 改造、零新 key |
ZenMux 网关能力冒烟——4 项全绿才动工
执行方式:不需要本地 key——往 sozai-st 部一个临时冒烟路由(新 secret SMOKE_TOKEN 门禁,跑完即删),用环境自己的 ANTHROPIC_API_KEY 打 ZenMux。你手头有 key 直接给的话本地调试更快(可选)。ZenMux 此前在 thinking 字段上坑过(§23.37/23.42),兼容性只信实测。
| 文件 | 装什么 | 谁写 |
|---|---|---|
| src/lib/agent-loop.ts | 通用 tool-loop:SDK 调用、每轮转录落盘、双预算闸、滑动窗口修剪 | 我 |
| src/lib/agents/prompts/*.ts | 全部 system prompt:管家宪法、检索工人指令、各工具描述文案。版本化、带注释说明每条规则来自哪个 PM 决定 | 只能我 |
| src/lib/agents/butler.ts | 管家工具实现(read_gene / read_feedback / view_object / propose_update / order_search / no_update)+ 对话/批量两个入口 | Codex(按施工图) |
| src/lib/agents/search-runner.ts | 检索工人工具实现(search_fast / save_materials / finish)+ 入队/认领接线 | Codex(按施工图) |
| src/do/agent-butler-do.ts | DO class:WS Hibernation、消息排队、广播、diff 卡状态、断线补发 | 骨架我,管道 Codex |
| src/routes/agent-chat.ts | /api/agents/:id/ws 升级路由 + 聊天历史 REST + 埋点接收(P4) | Codex |
| migrations/0035~0037_*.sql | chat 表、gene_cards 表、behavior_events 表 + origin 加 'chat' | Codex 初稿,我审,你过目后才执行 |
| scripts/e2e-agent-native-*.mjs | 四期各一套端到端脚本(见第十四节) | 用例我定,脚本 Codex 写,验收我跑 |
| 文件 | 改什么 |
|---|---|
| src/lib/cron.ts | F5 从"waitUntil 里跑 LLM"改为"阈值命中只 INSERT 队列";tick 加认领消化 run;flag 开时走管家批量模式,关时走旧大 prompt(旧代码保留) |
| src/routes/guidance.ts | 反馈 POST 的 waitUntil 只做入队判断;聊天来源反馈盖回执带 from_chat 标记 |
| src/routes/v7.ts | recordRevisionFeedback 同上改入队 |
| src/lib/fast-search-fetch.ts | flag 开时 runFastSearchAgent 换成检索工人;INSERT 补 guidance_version |
| src/routes/api.ts · runs.ts | 创建首搜 / "再找一批"从 waitUntil 整跑改为只入队 |
| src/lib/competitor-fetch.ts | P3 起被检索 Agent 收编:现有"每 tick 推进一轮 + LLM 选 search|stop"的控制器换成 runner 的工具(flag 控制,旧路径保留);INSERT 补 guidance_version |
| wrangler.jsonc | 5 个环境加 DO binding + migration 声明;新增 flag 环境变量 |
| package.json · src/lib/env.ts | 引入 @anthropic-ai/sdk;Bindings 类型加新 env |
| 位置 | 改什么 | 谁写 |
|---|---|---|
| 反馈页(pm-loop.tsx 一带) | 整页改造成第九节的样子:对话流 + 右栏基因面板 + 版本时间线。这是体验大头 | 我 |
| 聊天客户端 JS | WS 连接/重连(带 last_msg_id 补发)、流式气泡渲染、折叠条、diff 卡交互、多标签状态同步、在线标记 | 我,Codex 辅助 |
| 素材卡(hot 页) | 曝光/点开两个埋点(P4);卡片上显示"来自检索文档 V4"角标 | Codex |
| 成片卡 | 下载按钮埋点(P4) | Codex |
| 检索进度 | 素材库页和聊天里共用的 run 进度组件(轮次/换词/已收)——数据来自转录轮询 | 我 |
| styles.css(tailwind) | 聊天气泡、卡片、时间线样式 | 我 |
验收只认一种证据:部署到 sozai-st(sozai-st-test.funplus-marketing.ai)之后,从真实入口打进去、走完整条路、在库里和页面上看到正确结果。typecheck 和单测只是提交门槛,不算验收。
执行模型:Codex 全量跑(token 便宜,用例宁多勿少),每例出证据(SQL 输出 / 转录摘录 / 截图);我抽验 ★ 号关键例亲手复跑后签收。完整编号目录在 docs/rfc-agent-native.md §14,这里列每期覆盖面:
| 期 | 例数 | 覆盖面(正向 + 边界/负向) |
|---|---|---|
| P0 | 10 | tools 单轮/多轮链/并行、SSE、流式+工具、cache 命中计费★、thinking+tools(§23.42 回归)、max_tokens 边界、错误路径、图片块透传(为看抽帧留路) |
| P1 | 14 | 三 stage 路由★、view_object 证据★、回执/时间线推送、纯点击不触发、超3天路径、乐观锁中途手改★、全等降级、LLM 失败留 pending、flag=off 回归★、无 unit 分支、200 条上限、总闸、并发认领互斥 |
| P2 | 17 | 流式对话★、折叠条、diff 卡应用★、双标签同帧★、多人署名在线、聊天反馈落表、order_search、断线补发★、卡片过期★、两页同点互斥★、驳回流、消息合并、休眠唤醒、未登录 401、实例隔离、输入法回归、长历史懒加载 |
| P3 | 15 | 三个入口端到端★、换词重试★、跨源互补★、guidance_version 血统★、去重、R2 转存、源故障收尾(§23.25 回归)、预算闸、sweep、桥失败三路径、产品隔离★(§23.32 回归)、并发认领、waitUntil 无 LLM 静态断言 |
| P4 | 7 | 三埋点落表、推导事件、read_performance 数字核对★、版本快照、时间线 UI、消化引用行为证据★、埋点鉴权 |
| R组 | 4/期 | 现有 smoke 主流程、typecheck、反馈中心原功能、红线静态检查(无绕过端点 / bearer 不可触发 manual) |
进度看板(2026-07-11 更新)
分工铁律(先立规矩再开工)
| 期 | 内容 | 分工 | 验收标准 |
|---|---|---|---|
| P0 | ZenMux 4 项冒烟 + agent-loop.ts 核心(循环/转录落盘/预算闸/修剪) | 冒烟=Codex 执行;loop=我写 | P0 冒烟 4 项断言全绿(14.1) |
| P1 | 批量消化换管家批量模式(flag 控制),F5 改入队;view_object 上线 | 施工图+prompt=我;实现=Codex | 部署 sozai-st 后 P1 E2E 全绿(14.1),含 flag=off 回归旧路径 |
| P2 | DO + WebSocket + 对话模式 + 聊天 UI(含 diff 卡确认流、多标签同步) | UI+DO 骨架+prompt=我;管道与表=Codex | 部署 sozai-st 后 P2 E2E 全绿:双标签同帧、确认互斥、断线补发,agent-browser 截图存证 |
| P3 | 检索执行 Agent(双源:TikHub + 竞品桥)替换两套手写循环;5 个触发口全部入队化;guidance_version 补链 | 施工图+prompt=我;实现=Codex | 部署 sozai-st 后 P3 E2E 全绿:实搜换词/停手可见于转录、guidance_version 非空、无 waitUntil 整跑 |
| P4 | 行为事件表 + 3 个埋点 + read_performance + 版本效果快照 + 时间线标注 | 埋点与 UI=我;统计 SQL=Codex | 部署 sozai-st 后 P4 E2E 全绿:事件落表、时间线显示真实采用率、消化转录引用行为证据 |
全程规矩:每期完成记 handoff §23.x;typecheck 必过;部署目标只有 sozai-st 测试环境(随便部),生产不碰;migration SQL 先给你过目(共用测试库,建表全环境可见)。Codex 走施工图制——我给图纸和自证清单,它实现并跑完自证,我再亲手复跑一遍才签收。