# 2026-05-12 Agent健身房复盘
一句话概括:**这次发现的不是已经自动修复的问题,而是 5 类以后会反复浪费时间的操作摩擦 / 工具缺口。**
| 优先级 | 发现的问题 | 真实含义 | 计划怎么解决 |
| --- | ---------------------- | --------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| 1 | 长批处理靠人工盯进度、吞吐、限流和补跑 | Ark、Claude Code、Codex worker 都出现过长尾、429、并发回退、断点续跑和合并误判;没有控制台时,agent 只能临场判断该等还是该停。 | 做 `batch_job_doctor.py`:读取 raw/log/manifest,输出 ETA、429 密度、错误分类、建议并发、补跑清单和 canonical merge 前检查。 |
| 2 | 标签层级迁移反复靠一次性脚本串起来 | v26/v27/v28 多次迁移都要同步 CSV、Excel、HTML、审计表;一旦导出脚本读错版本,旧标签会回流到交付物里。 | 做规则 YAML + 迁移执行包:显式声明 move/merge/rename,自动产出明细、汇总、HTML、审计表,并断言行数守恒和旧类清零。 |
| 3 | 复核 HTML 交付缺少统一的真实验收入口 | 数据分析现在经常交付本地复核页,但验收分散在 JSON 解析、JS 检查、DOM 检查和浏览器打开;file:// 被拦截时只能静态降级。 | 做 `review_html_smoke.py`:自动解析页面 payload、校验行数/DOM/必含禁用标签,必要时启动本地 HTTP 服务给内嵌浏览器验收。 |
| 4 | 外部系统写入时证据字段和分析字段容易混在一起 | 交易复盘这类证据字段必须是用户原始笔记;agent 概括如果写进同一字段,会把推断伪装成决策依据。 | 把 evidence-only 字段写入规则沉淀到 invest-bu:证据字段只能逐字来自源任务,非连续原文一律拒绝或留空。 |
| 5 | 推文日报能抓数,但读起来像账号统计表 | 自动化已经能稳定抓推文和落 raw/markdown,但用户早上要的是值得理解的内容线索,不只是总数、账号活跃度和互动量。 | 把日报模板升级为“今日判断、三件事、为什么重要、原文索引、账号雷达”,并加结构化 digest builder。 |
## 下一步
| 顺序 | 先做什么 | 为什么 |
| --- | --- | --- |
| 1 | 做 `batch_job_doctor.py`:读取 raw/log/manifest,输出 ETA、429 密度、错误分类、建议并发、补跑清单和 canonical merge 前检查。 | 这是昨天最耗时且可复用面最广的瓶颈,能直接减少长任务失控和无效补跑。 |
| 2 | 做规则 YAML + 迁移执行包:显式声明 move/merge/rename,自动产出明细、汇总、HTML、审计表,并断言行数守恒和旧类清零。 | 标签体系仍在高频迭代,版本/审计自动化能减少返工和交付口径错误。 |
| 3 | 做 `review_html_smoke.py`:自动解析页面 payload、校验行数/DOM/必含禁用标签,必要时启动本地 HTTP 服务给内嵌浏览器验收。 | HTML 已是常规交付物,统一 smoke 能在交付前发现页面和数据错位。 |
| 4 | 把 evidence-only 字段写入规则沉淀到 invest-bu:证据字段只能逐字来自源任务,非连续原文一律拒绝或留空。 | 涉及个人投资复盘和外部系统写入,字段污染风险比一般摘要更高。 |
| 5 | 把日报模板升级为“今日判断、三件事、为什么重要、原文索引、账号雷达”,并加结构化 digest builder。 | 自动化已经跑通,模板升级成本低,能直接提升每天早上的阅读价值。 |
## 一、候选详情
### 1.1 长任务批处理控制台
- 类型:`diagnostic-tool`
- 风险:`medium`
- 摘要:这个主题有效,不是单次噪音:多个 session 都暴露出长批处理中的共性问题,包括 provider 429/TPM 限流、并发回退、断点续跑、raw 结果保留、错误补跑和错误识别误报。它适合沉淀成只读优先的批处理 doctor,让 agent 在长任务运行中快速判断“该等、该降并发、该补跑、还是该修合并脚本”。
- 建议改动:
- 新增工具入口:在 `/Users/bytedance/Documents/job-bu/data-analysis-workspace/tools/batch_job_doctor.py` 提供 CLI,例如 `python3 tools/batch_job_doctor.py --raw-glob 'raw/*.jsonl' --log run.log --provider ark --job-name 商品会话标签`。输入来源:raw JSON/JSONL、进度 manifest、stdout/stderr 日志、批处理参数(并发、模型、only-errors/断点开关)。核心检查步骤:统计 ok/error/pending、解析 provider 错误字段、计算近 5/15 分钟吞吐和 ETA、检测 429/TPM/RPM、识别长文本尾部拖慢。成功信号:输出当前状态、建议并发、可续跑命令和错误 case 清单;失败信号:raw 不可解析、任务 id 混杂、ok/error 字段缺失。建议落地路径:先做只读 report,再接入常用 runner 的 `--doctor` 子命令。
- 增加限流与并发回退建议模块:基于 429 密度、最近吞吐、错误增长速度和 provider 类型给出 `keep/wait/reduce/retry-later` 建议,避免 64 并发或 8 实例继续硬跑导致大量 case 被误记为失败。落地文件可放在 `tools/batch_job_doctor.py` 内的 `RateLimitAdvisor`,同时输出推荐重跑命令如 `--only-errors --concurrency 32`。
- 增加错误分类器和补跑清单生成:只从结构化错误字段、parse_error 字段、provider response code 判断 429,不再对整条 JSON 做字符串搜索。输出 `out/doctor/errors_retry.jsonl`、`out/doctor/errors_false_positive.jsonl` 和 `out/doctor/summary.md`,让合并脚本能区分真实 provider 限流、解析失败、长文本超时和误报。
- 沉淀一份批处理运行规范到项目级 `AGENTS.md` 或 `data-analysis-workspace/docs/long_batch_jobs.md`:要求长任务默认写 raw 断点、每 N 分钟跑 doctor、出现 429 先降并发并保留已完成结果、合并前先跑错误分类检查;同时给出 Ark/Claude Code 两类 provider 的推荐起始并发和降级策略。
- 关键证据:
- `019e1b36-7273-7450-b2ca-399583f7acac`:抽查发现 64 并发已经触发 Ark TPM 限流,raw 里出现 429 错误。我要先停掉当前全量进程,保留已成功写入的 raw,再用更低并发按 `--only-errors`/断点机制继续,避免把限流错误扩大。
- `019e1b36-7273-7450-b2ca-399583f7acac`:需要打标的非空原声 session 45,341;已成功完成 7,354;剩余 37,987;当前稳定吞吐约 200 条/分钟;预计剩余时间约 190 分钟。
- `019e1b7f-efe3-71e3-bd38-e73d1bb6a398`:8 实例开始触发 Claude Code 429 了,继续硬跑会把一批 case 误记成 `C/parse_error`。我现在把并发降下来:先停掉这 8 个父进程,保留已完成结果。
### 1.2 标签层级迁移一键包
- 类型:`tool-upgrade`
- 风险:`medium`
- 摘要:这个主题有效:片段里连续出现标签层级移动、子类合并、重命名、跨数据集复用同一套层级,以及一次因源数据仍取 v26 导致旧标签残留的返工。问题不是单点口径解释,而是缺少一个可复用、可审计的迁移执行包来保证版本输入、迁移规则、行数守恒、旧类清零和产物清单一致。
- 建议改动:
- 新增 `data-analysis-workspace/scripts/taxonomy_migration_audit_pack.py`:输入旧明细 CSV/Excel、新旧 taxonomy 规则 YAML、可选目标对象表;输出迁移后明细、汇总 Excel、复核 HTML、迁移审计表和 `manifest.json`,并在 manifest 里记录输入文件路径、mtime、版本号、总行数、session 数。
- 新增规则模板 `data-analysis-workspace/config/taxonomy_migrations/<domain>_<from_version>_to_<to_version>.yaml`:显式声明 `move`、`merge`、`rename`、`drop_old_bucket`、`child_label_from_table` 等规则,要求每条规则包含 `from_path`、`to_path`、命中条件、预期清零的旧类、预期行数或 session 数变化。
- 在迁移脚本里加入审计断言:总行数/session 数守恒;旧一级/二级标签剩余为 0;目标新类计数与规则预期一致;未命中项单独输出;复核 HTML 标题和产物文件名必须包含同一个 taxonomy 版本,防止 v28 文件误读 v26 源数据。
- 封装一个本地 skill `taxonomy-migration-audit`,写入 `SKILL.md`:当用户说“移动到某类下面”“合并这两个类”“按同一套层级重构”时,默认先生成规则 YAML,再跑迁移包和审计断言,最后只交付带版本号的 HTML/CSV/XLSX/审计表清单。
- 关键证据:
- `019e1b60-b114-7142-9df2-2d7c9bc24212`:你说得对:我上一份排序版文件名还是 v26,源数据也取的是 v26 的汇总 JSON,所以它当然还会出现旧的 `价格/库存/购买规则调整` 和 `商品信息与素材维护`。我现在直接用 v27 产物重出排序版。
- `019e1b73-3f9a-7ac1-a7c2-f17c55af3b95`:已处理成 v27: - `价格/库存/购买规则调整` + `商品信息与素材维护` 已合并为 `商品修改` - `下一级标签` 按目标对象表写入 - `未命中目标范围` 已改名为 `其他` - 原两个子领域在 v27 里已清空,不再保留 - 总行数和 session 数保持 `9335`
- `019e1b60-b114-7142-9df2-2d7c9bc24212`:已更新成 v28,`定邀/报白/白名单准入` 已移动到 `商品类目` 下面: - `商品类目` 从 `968` 变成 `1069` - `定邀/报白/白名单准入` 作为子类:`101` - 原独立子领域 `定邀/报白/白名单准入` 剩余 `0` - 总行数 / session 数仍是 `9335`
### 1.3 复核页面本地验收工具
- 类型:`diagnostic-tool`
- 风险:`low`
- 摘要:这个主题有效:多个片段显示 HTML 复核页已经成为数据分析交付的常见形态,但验收动作分散在临时口头流程里,包括 Python 编译、内嵌 JSON 解析、JS 语法检查、关键 DOM/口径检查和浏览器打开。工具化价值在于把“页面能不能打开、数据是否完整、标签迁移是否生效、浏览器受限时如何降级”变成一次可重复的 smoke test。
- 建议改动:
- 新增工具入口:在 `/Users/bytedance/Documents/job-bu/data-analysis-workspace/tools/review_html_smoke.py` 增加命令行工具,支持 `--html <path>`、`--source <xlsx|csv|jsonl>`、`--expected-count <n>`、`--required-text <text>`、`--forbid-text <text>`、`--payload-var auto|NAME`、`--serve-and-open`。输入来源优先读 HTML 内嵌 payload,其次读同目录 manifest,再对照源表行数和关键字段。
- 核心检查步骤固定化:检查文件存在和大小、HTML 关键 DOM/标题/筛选栏/卡片容器存在;自动提取 `<script>` 中 JSON payload 并解析;运行 JS 语法检查;校验明细条数、原始行号、用户/客服气泡字段、必含/禁用标签;如传入源表则抽样比对 session_id/row_no/label 字段。成功信号是所有检查 PASS 且输出 `SMOKE_OK`;失败信号是按 `FATAL/PAYLOAD/COUNT/DOM/LABEL/BROWSER` 分类报错。
- 浏览器验收降级路径:当内嵌浏览器无法打开 `file://` 时,工具自动用 `python3 -m http.server --directory <html_dir> <free_port>` 暴露本地目录,并给出 `http://127.0.0.1:<port>/<file>`;若仍无法打开,则保留静态校验结果、截图缺失原因和可直接打开的文件路径。
- 建议落地为 workspace 级 skill/checklist:新增 `.codex/skills/review-html-smoke/SKILL.md` 或在 `AGENTS.md` 写入约定:凡是交付复核 HTML,必须随附 smoke 输出;若发生标签迁移,还必须传 `--required-text` 和 `--forbid-text` 验证新旧标签是否落到页面和源表。
- 关键证据:
- `019e1b36-7273-7450-b2ca-399583f7acac`:v26 对齐版已经生成。我先做脚本语法和内嵌数据校验,再用内嵌浏览器打开看一下分栏/气泡是否正常。
- `019e1b36-7273-7450-b2ca-399583f7acac`:左侧固定筛选和标签汇总表,可以按生命周期、子领域、子类点选;右侧是 session 卡片...已做过 Python 编译、HTML 内嵌 JSON 解析、JS 语法检查。
- `019e1b3b-1a6a-7da3-9edb-4d2e3ba9175c`:内嵌浏览器拦截了 `file://` 本地页面访问...先做静态校验:确认 HTML payload、关键 DOM、行数和数据口径都写进去了,然后把文件路径给你直接打开。
### 1.4 证据字段只写原文
- 类型:`workflow-pattern`
- 风险:`medium`
- 摘要:这个主题有明确价值:用户在交易复盘场景里直接纠正了 `交易决策支点` 字段的写入规则,要求严格来自已有笔记,不允许新增、杜撰或改写。它暴露的是 Notion/外部系统同步中的字段语义问题:证据字段必须和分析字段分离,否则自动化会把 agent 的概括伪装成用户原始决策依据。
- 建议改动:
- 在 `/Users/bytedance/Documents/invest-bu/AGENTS.md` 增加“Notion 证据字段写入规则”:`交易决策支点` 只能写滴答清单原文摘录;无明确匹配时留空;agent 的判断、概括、复盘只能进入 `复盘`、`agent_notes` 或单独草稿字段。
- 新增或更新 `/Users/bytedance/Documents/invest-bu/.codex/skills/futu-notion-trade-review/SKILL.md`:把 Futu 成交记录、滴答清单 `交易` tag、Notion 交易库的字段职责写清楚,并规定 evidence-only 字段必须从 source task 逐字复制,不做同义改写。
- 在 Futu 到 Notion 的同步脚本中增加字段策略表,例如 `/Users/bytedance/Documents/invest-bu/scripts/sync_futu_trades_to_notion.py` 的 `EVIDENCE_ONLY_FIELDS = {"交易决策支点": ["dida_task.title", "dida_task.content"]}`;写入前校验字段值必须是源文本的连续子串,否则拒绝写入。
- 新增 `/Users/bytedance/Documents/invest-bu/scripts/check_notion_evidence_fields.py` 作为提交前检查:输入为待写入 Notion 的 payload 和滴答清单原始导出,输出每条交易的 pass/fail;失败信号是证据字段非空但无法在任何源任务原文中命中。
- 关键证据:
- `019e1c1b-9912-7ea2-9ef0-37da7224373b`:交易决策支点 严格按我有的笔记写,你不需要新增或者杜撰任何内容
- `019e1c1b-9912-7ea2-9ef0-37da7224373b`:已修正。`交易决策支点` 现在只放滴答清单原文,不再放我的概括或推断。
- `019e1c1b-9912-7ea2-9ef0-37da7224373b`:其他没有明确笔记匹配的交易,`交易决策支点` 保持空白。 后续我会按这个规则处理:这个字段只允许原文摘录,不做改写、总结、补全。
### 1.5 推文日报内容化模板
- 类型:`tool-upgrade`
- 风险:`low`
- 摘要:片段显示每日推文总结链路已经稳定:能按 roster 抓取自然日数据、输出 raw/markdown 路径,并生成统计区间、总数、活跃账号和主要主题。但当前日报偏统计清单,账号动态多停留在“主要在讨论...”层面,缺少事件线、原推观点、为什么重要和下一步动作,因此升级为内容化日报模板有明确价值。
- 建议改动:
- 改 `skills/tweet-analysis/SKILL.md` 的 Step 6 day 模式输出格式:新增“今日判断 / 三件事 / 为什么重要 / 账号雷达 / 原文索引 / 低信号内容”模板,要求每个高价值条目包含原推链接、观点、证据和面向 user_profile 的一句话行动建议。
- 新增 `skills/tweet-analysis/scripts/build_daily_digest.py`:输入 `twitter_fetcher_YYYYMMDD_YYYYMMDD.json`、roster 来源和目标日期,核心处理为规范化推文字段、按浏览/互动/长文/回复链/账号权重打分、聚类主题、选出 5-8 个内容条目,输出供 LLM 改写的结构化 JSON。
- 新增 `skills/tweet-analysis/prompts/daily_digest.md`:把内容化日报 prompt 从自动化口令中抽出来,固定要求“先结论后证据”,避免只复述账号计数;prompt 输入包括 raw_path、date、timezone、user_profile、digest_items_json。
- 在 `skills/config.example.json` 增加 `skills.tweet-analysis.daily_digest` 配置:`enabled`、`timezone`、`max_items`、`min_engagement_score`、`output_dir`;并加一个 smoke fixture `skills/tweet-analysis/examples/daily_digest_20260511.md`,用现有 2026-05-11 数据验证模板可读性。
- 关键证据:
- `019e19b4-5be3-77d0-8aae-d7b30d0b85ee`:完成后输出一份简明中文日报:先给出总推文数、活跃账号和主要主题,再列出最值得关注的账号动态、关键推文链接和一句话判断。
- `019e19b4-5be3-77d0-8aae-d7b30d0b85ee`:2026-05-11 共抓到 55 条推文,9 / 17 个账号活跃,主要主题是 AI/模型、开发/工程、内容/学习。
- `019e19b4-5be3-77d0-8aae-d7b30d0b85ee`:@signulll 最活跃也最出圈,21 条推文合计约 85.6 万浏览;@garrytan 集中在 agent / code-as-memory / OpenClaw x Hermes。
## 二、文件清单
| 文件 | 说明 |
| --- | --- |
| `manifest.json` | 候选结构化清单,默认 `approval=pending` |
| `examples/*.md` | 每个候选的 before/after、诊断流程或思维实验 |
| `approve.sh` | 审批某个候选:`./approve.sh <candidate-id>` |