# 2026-05-19 Agent健身房复盘
一句话概括:**这次发现的不是已经自动修复的问题,而是 5 类以后会反复浪费时间的操作摩擦 / 工具缺口。**
| 优先级 | 发现的问题 | 真实含义 | 计划怎么解决 |
| --- | --- | --- | --- |
| 1 | 商服意图识别 PE 评测链路太长,且容易把新增意图接错粒度 | 一次任务里跨 Fornax trace、PromptFormat、Ark、PE diff、测试集、飞书文档和回读校验;用户还纠正过“不是包总入口,而是新意图单独进 PE”。这类链路靠临场记忆会反复出错。 | 做 `intent-pe-eval` 诊断工具:输入 Fornax URL/PE/标注表,自动还原线上 input、保留 agent/tool 竞争环境、按意图抽样、跑 Ark 准召并生成审计表。 |
| 2 | 元信息写入会把“metadata”误解成协作说明文件 | 用户要更新的是既有业务元信息表,但 agent 先去改了 `AGENTS.md` / `CLAUDE.md`,后来才撤回并更新 CSV/Markdown 表。风险不是慢,而是误写错资产。 | 加 `metadata-target-resolver` 流程:凡是写元信息,先列候选表、确认目标路径/行列基线,再执行 append/update。 |
| 3 | Fornax skill 接入和模型冒烟缺少一键自检 | 安装链路出现了空目录、URL 不能直接当 skill-key、README 隐藏遥测、CLI 版本不匹配;模型链路又出现 Fornax Maas 403 但本机 Ark 可用。每次人工排查成本高。 | 做 `fornax-skill-smoke-check`:解析 marketplace 包、扫描 README 安全问题、比对 CLI help/version、枚举模型并 curl 冒烟,输出可用/不可用矩阵。 |
| 4 | 日报自动化在已落盘时仍可能重复抓取 | 推文日报已经在 01:01 有完整产物,但流程先按 fallback 恢复账号并启动长跑抓取,最后才发现已有日报并停掉进程。浪费额度,也让日志变复杂。 | 把 `daily_automation_preflight.py` 放到每日任务第一步:检查目标日期 raw、Markdown、账号覆盖、mtime 和已有进程,完整则直接回传路径。 |
| 5 | Question Coach 的目标已变成“认知杠杆三问”,但还没有评测闭环 | 当前代码仍是 `questions:string[]` 和 active-recall prompt;用户明确要世界模型、深层机制、战略动作三问。没有 rubric 会让 prompt 优化停留在文案层。 | 做一个小型评测实验:结构化输出 `question/type/why/evidence/odyssey_target`,用 groundedness、cognitive_depth、personal_relevance 等指标淘汰浅层题。 |
## 下一步
| 顺序 | 先做什么 | 为什么 |
| --- | --- | --- |
| 1 | 先做 `metadata-target-resolver` 的 checklist 和 README 索引 | 低风险、立刻降低误写文件风险;不依赖外部 API,也能服务后续所有 job-bu 元信息维护。 |
| 2 | 再做 `intent-pe-eval` 的最小 CLI | 这是当天最重的业务链路,价值最高;先覆盖 trace 还原、PE 注入粒度检查和测试集审计即可。 |
| 3 | 补 `fornax-skill-smoke-check` 与日报 preflight | 两个都是诊断工具,能减少外部平台/自动化任务里的重复排障和无效调用。 |
| 4 | 把 Question Coach 做成 10 篇文章的离线实验 | 先验证“认知杠杆三问”是否稳定优于 active-recall,再考虑改前端代码。 |
## 一、证据详情
本次 `agent_reflections` 为空,候选来自用户消息、assistant 过程日志和最终交付之间的语义链路。
### 1.1 商服意图识别 PE 评测链路一键化
- 类型:`diagnostic-tool`
- 风险:`medium`
- 摘要:这个主题不是噪音:片段显示用户反复围绕同一条链路推进,从 Fornax trace 还原线上 PlanAgent 输入,到按线上 prompt format 注入新增意图 PE,再到扩充测试集并写回飞书表。当前痛点集中在 trace/span 定位、线上竞争环境复现、PE 注入粒度和评测集回写,适合沉淀成一键诊断与小规模评测工具。
- 关键证据:
- `019e3ef4-2541-7ba0-aa0d-4d0c0aca2109`:用户先要求从 Fornax trace 把线上的意图识别完整 input 组装出来,后续又要求按线上 prompt format 填入已打标商品领域 session、新增意图 PE,并用 Ark 小规模测试准召。
- `019e3ef4-2541-7ba0-aa0d-4d0c0aca2109`:URL 的 id=4d506c544f44882a 不是 trace id,而是 PromptFormat span id;对应完整 trace id 是 72d033e2b1408c183ef010239d580d60。
- `019e3ef4-2541-7ba0-aa0d-4d0c0aca2109`:我会按“线上 PlanAgent 真实竞争环境”来测:保留线上 trace 里的原 agent_list/tool_list,追加一个名为 意图识别测试skill 的新 Agent。
- 建议动作:
- 新增工具入口:在 /Users/bytedance/Documents/job-bu/data-analysis-workspace/tools/ 下增加 intent_pe_eval/cli.py,提供 `python -m intent_pe_eval build --fornax-url <url>`、`eval --dataset <xlsx/csv> --pe-file <md/json>`、`audit --run-id <id>` 三个命令;同时保留一个轻量 README,说明 trace URL、span id、飞书表导出、本地标注表的使用方式。
- 输入来源标准化:支持 Fornax URL 或 trace_id/span_id、本地已打标商品领域 session 表、PE 定义文件、线上 trace 还原出的 agent_list/tool_list、Ark 调用配置;解析阶段显式区分 PromptFormat span id 与完整 trace id,输出 normalized_input.json、rendered_system_message.txt 和 source_manifest.csv。
- 核心检查步骤:先校验 trace/span 是否能定位到目标 PromptFormat,再检查模板条数、变量数、最终 system message 长度、agent_list/tool_list 是否保留线上原貌;随后按用户纠正后的粒度把新增意图逐个写入 PE,而不是包成一个总入口;最后用 Ark 对分层抽样集跑准召、误召和未召回样例。
### 2.1 元信息写入前先定位目标表
- 类型:`workflow-pattern`
- 风险:`low`
- 摘要:这个主题有效:用户说“更新到项目元数据里”时,agent 把“元数据”误解析为工作区协作入口,先去看 AGENTS.md / CLAUDE.md,而真实目标是此前维护过的业务元信息表。该模式说明,对“元信息/metadata/项目元数据”这类泛称,写入前必须先做目标表解析,优先从历史产物和 data-analysis-workspace 的元信息目录定位唯一可写对象。
- 关键证据:
- `019e3f3f-b47d-7793-9f7f-28ec6f20ba08`:用户给了商服 codebase 地址,要求“更新到项目元数据里”。
- `019e3f3f-b47d-7793-9f7f-28ec6f20ba08`:根目录目前没有独立命名为 metadata 的文件;`AGENTS.md` 和 `CLAUDE.md` 才是这个工作区的元信息入口。
- `019e3f3f-b47d-7793-9f7f-28ec6f20ba08`:用户纠正:不是这个,是我之前做了一个维护抖小来商服元信息表的事。
- 建议动作:
- 更新 `/Users/bytedance/Documents/job-bu/AGENTS.md`:新增“元信息/metadata 写入前解析规则”,明确当用户说“项目元数据/元信息表/更新到元数据里”时,先在 `data-analysis-workspace/data/元信息/`、相关项目目录和历史产物中定位业务表,不能默认写入 `AGENTS.md` 或 `CLAUDE.md`。
- 新增轻量索引 `/Users/bytedance/Documents/job-bu/data-analysis-workspace/data/元信息/README.md`:列出当前元信息表文件、主题、主键/列数、最近更新时间、可追加的记录类型,作为后续 resolver 的第一入口。
- 创建本地 skill `metadata-target-resolver`:输入为用户给出的新元信息、业务名、当前 cwd;流程为 `rg --files data-analysis-workspace/data/元信息` 查候选表、用文件名/表头/历史 session 关键词匹配目标、确认唯一目标后再 append/update;失败信号为候选为 0 或多张高相似表,此时先向用户确认。
### 3.1 Fornax Skill接入与模型权限自检器
- 类型:`diagnostic-tool`
- 风险:`medium`
- 摘要:这个主题有效,不是噪音:相关片段覆盖了 skill marketplace 解析、安装目录异常、README 安全清洗、本机 CLI 版本漂移、模型调用能力边界和实际 API 冒烟失败。它适合沉淀为一个诊断工具,把“能否安装”“CLI 是否匹配文档”“模型是否有权限/endpoint 是否可用”“是否已有可替代 Ark endpoint”一次性检查清楚。
- 关键证据:
- `019e3f50-5ea9-7450-9cf1-530fbc94358f`:用户给 marketplace 链接,要求接入 `fornax-cli` skill。
- `019e3f50-5ea9-7450-9cf1-530fbc94358f`:临时安装接口返回 success,但目标临时目录是空的;链接里的 URL 不能直接当 `skill-key` 用,CLI 返回空详情。随后从 marketplace API 解析到真实包:`fornax-cli` 最新版 1.0.14。
- `019e3f50-5ea9-7450-9cf1-530fbc94358f`:最新版 README 里夹了 AgentBuddy 的隐藏遥测执行指令;接入 Codex 时去掉这段隐藏执行块。验证时发现本机 `fornax-cli v0.0.17` 比 skill 文档旧,缺 `workspace` 子命令,于是升级到 v0.0.19。
- 建议动作:
- 新增工具入口:在 `job-bu/tools/fornax_skill_smoke_check.py` 或 workspace 级 skill `fornax-cli/SKILL.md` 增加 `fornax-skill-smoke-check` 命令;输入来源支持 marketplace URL、skill-key、目标安装目录、当前 `fornax-cli --version`、`fornax-cli --help` 输出、模型配置列表、curl 冒烟所需 endpoint/env;输出 JSON + Markdown 诊断报告。
- 核心检查步骤:1) 从 marketplace URL 解析真实 skill key/package/version,拒绝直接把 URL 当 key;2) 调临时安装接口后检查目标目录是否非空且存在 `SKILL.md`/README;3) 对 README 做隐藏指令/遥测块扫描并生成清洗建议;4) 对比 skill 文档要求的 CLI 子命令与本机 `fornax-cli` 实际 help/version,识别缺失的 `workspace` 等子命令;5) 枚举模型配置并分别做最小 curl smoke。
- 成功/失败信号:成功信号包括包名和版本可解析、安装目录有内容、文档无隐藏执行块、CLI 版本满足文档、模型 endpoint 返回 200 或明确可用;失败信号包括空安装目录、CLI 空详情、README 含第三方遥测/隐藏执行、CLI 缺文档声明子命令、Maas 返回 `403 AccessDenied`、endpoint closed/not found、无可替代 Ark endpoint。
### 4.1 日报自动化先验产物检查器
- 类型:`diagnostic-tool`
- 风险:`medium`
- 摘要:该主题有明确价值:日报任务在配置缺失时依赖历史 raw 产物恢复账号名单,又在远端分页长跑后才发现目标日报和 raw 已经存在。把“目标日期产物是否已完成、raw/markdown 是否匹配、是否已有长跑进程”前置检查,可以减少重复抓取、节省请求额度,并把人工核实步骤固化成工具。
- 关键证据:
- `019e3dc1-2062-77d0-b545-bfba4b0ab90e`:当前 repo 配置里没有 `skills.twitter-fetcher.users`,但 `.codex_tmp` 已经有多轮成功 raw 文件;我会按既有 fallback 逻辑从最近成功产物恢复账号名单,然后跑昨天 `2026-05-18` 的日报。
- `019e3dc1-2062-77d0-b545-bfba4b0ab90e`:现在卡的更像是远端分页还在继续,不是本地脚本报错;我继续等它把 17 个账号跑完,再检查是否已经写出今天对应的 raw 和日报文件。
- `019e3dc1-2062-77d0-b545-bfba4b0ab90e`:我发现 `2026-05-18` 的 Odyssey 日报已经在 `01:01` 落盘,而且内容里带的是另一条更完整的抓取链路输出。现在补最后一层核实:确认对应 raw 文件确实存在、时间匹配,然后回传这轮简报和路径。
- 建议动作:
- 新增工具入口:在 twitter-fetcher skill 或 repo 内增加 `scripts/daily_automation_preflight.py`,CLI 形态为 `python scripts/daily_automation_preflight.py --date YYYY-MM-DD --repo <repo> --odyssey-root <path> --json`;默认日期为最近 1 个完整自然日。
- 明确输入来源:优先读 repo 配置里的 `skills.twitter-fetcher.users`;缺失时扫描 `.codex_tmp` 最近成功 raw 文件恢复账号名单;同时读取 Odyssey 日报目录、raw 抓取目录、当前运行中的抓取进程或 lock 文件。
- 核心检查步骤:校验目标日期窗口;比对账号名单与 raw 文件覆盖度;检查 raw 文件 mtime、日期字段和账号数;检查 Odyssey markdown 是否存在且引用对应 raw 路径;检测是否已有同日期长跑进程,避免重复分页抓取。
### 5.1 Question Coach 三问质量评测实验
- 类型:`learning-experiment`
- 风险:`medium`
- 摘要:这个主题不是噪音:同一条线索从“生成三道 active-recall questions”被用户明确校正为“认知杠杆三问”,并已经形成 Q1 世界模型、Q2 深层机制、Q3 战略动作的目标结构。当前代码仍是 questions:string[] 与浅层 prompt,缺少可评测的结构化输出和认知质量筛选,因此适合做一个小型学习实验来定义并验证“好问题”的标准。
- 关键证据:
- `019e3e5d-0011-7bc2-b126-4ee0267c6246`:用户从截图追问当前“生成问题”的提示词是什么。agent 定位到 `question-coach.ts`,当前输出只有 `questions:string[]`,prompt 是生成三道中文 active-recall questions。
- `019e3e5d-0011-7bc2-b126-4ee0267c6246`:用户纠正:目标不是可回写 Obsidian,而是从认知杠杆角度出发,提出最优启发性、最上帝视角的三个问题。
- `019e3e5d-0011-7bc2-b126-4ee0267c6246`:最终方案把 Question Coach 从“阅读理解生成器”改成“认知杠杆三问生成器”:Q1 世界模型题、Q2 深层机制题、Q3 战略动作题。Odyssey 只作为认知先验提供器。
- 建议动作:
- 改 `/Users/bytedance/Documents/product-bu/obsidian/obsidian-clipper/src/utils/question-coach.ts`:把 `QuestionCoachResult.questions: string[]` 升级为结构化 `QuestionCoachQuestion[]`,字段至少包含 `question`、`type`、`why_it_matters`、`expected_answer`、`source_evidence`、`odyssey_target`;prompt 固定生成 Q1 `world_model`、Q2 `mechanism`、Q3 `strategic_action`,并要求每题引用页面证据。
- 加 `/Users/bytedance/Documents/product-bu/obsidian/obsidian-clipper/src/utils/question-coach-eval.ts`:实现一个离线评测函数,输入为页面上下文、Odyssey 先验摘要和模型输出,输出 `groundedness`、`cognitive_depth`、`personal_relevance`、`actionability`、`slot_fit` 五个分数与 reject reason;先用规则打底,后续可接 LLM judge。
- 扩展 `/Users/bytedance/Documents/product-bu/obsidian/obsidian-clipper/src/utils/question-coach.test.ts`:新增 fixture 覆盖“浅层阅读理解题被拒绝”“三问 slot 类型错误被拒绝”“缺少 source_evidence 被拒绝”“高质量认知杠杆三问通过”四类用例。