# 2026-05-11 Agent健身房复盘
一句话概括:**这次发现的不是已经自动修复的问题,而是 5 类以后会反复浪费时间的操作摩擦 / 工具缺口。**
| 优先级 | 发现的问题 | 真实含义 | 计划怎么解决 |
| --- | --- | --- | --- |
| 1 | 浏览器插件缺真实 hover 冒烟诊断链路 | 插件修复目前只能证明单测、构建和 release 同步正确,无法证明真实浏览器里 tooltip 稳定且按钮可点。 | 做 `npm run smoke:hover`:加载真实 unpacked extension、确认 extension target、hover fixture、采样 tooltip 稳定性并点击卡片按钮。 |
| 2 | i+1阅读推荐缺少源覆盖与Anki差分校准 | 每日推荐承诺结合本地活动、Odyssey、浏览器和 Anki,但缺源和缺 diff 时只能估算,会影响推荐可信度。 | 做 `diagnose_i_plus_one_sources.py`:检查各输入源 coverage,并用 Anki collection 对候选概念做新旧差分。 |
| 3 | 商品分类迭代需要可追溯重分桶工作台 | 商品类目、准入、商品类型、商品信息和特色服务正在持续重构,靠临时表格容易丢旧标签、证据和版本差异。 | 做商品 taxonomy 重分桶 CLI:规则 YAML + 旧新交叉矩阵 + 证据来源 + 待人工确认清单。 |
| 4 | 飞书和 Figma 访问需要统一预检 | Figma、飞书和本地资料源经常到执行中段才发现认证、链接或配置问题,浪费排障时间。 | 做 provider 预检 CLI:Figma/Lark/local-source 统一输出 ready、warning、blocked 和下一步。 |
| 5 | 中文聊天原型图需要模板化生成器 | 中文业务原型高频且文字长,直接生图容易错字,手写 HTML/CSS 又会重复查旧样式和导出流程。 | 做移动端聊天原型生成器:结构化 JSON 输入,HTML/CSS 模板渲染,再用浏览器导出 PNG。 |
## 下一步
| 顺序 | 先做什么 | 为什么 |
| --- | --- | --- |
| 1 | 做 `npm run smoke:hover`:加载真实 unpacked extension、确认 extension target、hover fixture、采样 tooltip 稳定性并点击卡片按钮。 | 它直接影响插件 bug 修复是否真的闭环,且今天已经出现系统 Chrome 无法加载扩展的验收空洞。 |
| 2 | 做 `diagnose_i_plus_one_sources.py`:检查各输入源 coverage,并用 Anki collection 对候选概念做新旧差分。 | 这是每日自动化任务,越早补诊断,后续每天的推荐质量越可追踪。 |
| 3 | 做商品 taxonomy 重分桶 CLI:规则 YAML + 旧新交叉矩阵 + 证据来源 + 待人工确认清单。 | 商品域标签会继续迭代,先把版本和证据链固定住,后续改口径成本会低很多。 |
| 4 | 做 provider 预检 CLI:Figma/Lark/local-source 统一输出 ready、warning、blocked 和下一步。 | 它能在正式复制、总结、写入前快速止损,避免 provider 权限问题拖垮整轮。 |
| 5 | 做移动端聊天原型生成器:结构化 JSON 输入,HTML/CSS 模板渲染,再用浏览器导出 PNG。 | 低风险高复用,适合在前面几个诊断工具后作为效率型改造。 |
## 一、候选详情
### 1.1 浏览器插件缺真实 hover 冒烟诊断链路
- 候选 id:`extension-hover-smoke-harness`
- 类型:`diagnostic-tool`
- 风险:`medium`
- 摘要:这个主题有效:片段里已经出现真实用户可感知的 hover 卡片闪烁,并定位到 MutationObserver 与 tooltip DOM 互相触发的闭环。修复后只验证了测试、构建和产物一致性,真实浏览器加载插件、悬浮单词、tooltip 稳定展示与可点击仍没有被自动化覆盖。
- 证据:
- `019e1537-12ff-7191-817d-bd474c40f1bd` / `~/Documents/product-bu`:用户先问:我的浏览器插件悬浮在单词上后,出现的卡片一直闪,无法查看,这是啥bug?随后要求修复并顺便检查其他 bug。
- `019e1537-12ff-7191-817d-bd474c40f1bd` / `~/Documents/product-bu`:诊断发现 MutationObserver 监听整个 document.body,tooltip 自己 append 到 body 后又被 walkTree 重新扫词,卡片里的词再次变成 hover 目标,形成闪烁循环。
- `019e1537-12ff-7191-817d-bd474c40f1bd` / `~/Documents/product-bu`:修复后尝试用临时 Chrome/Edge profile 加载 unpacked extension 做 hover smoke,但 Chrome/Edge 146 没有加载 --load-extension 指定目录,CDP 只看到内置扩展,真实 smoke 不成立。
- 建议改动:
- 在浏览器插件仓库新增 `scripts/smoke/extension_hover_smoke.mjs`,并在 `package.json` 增加工具入口:`npm run smoke:hover -- --extension dist --fixture test/fixtures/extension-hover.html --browser chrome-for-testing`。
- 输入来源固定为 3 类:构建后的 unpacked extension 目录(默认 `dist`)、最小复现 fixture HTML(`test/fixtures/extension-hover.html`,含普通正文和 tooltip 易误扫文本)、浏览器来源(优先 Chrome for Testing/Playwright bundled Chromium,避免系统 Chrome 版本策略导致 `--load-extension` 静默失效)。
- 核心检查步骤:启动持久化 profile 加载扩展;通过 CDP 或 extension target 列表确认目标扩展真实加载;打开 fixture;hover 指定单词;监听 console/pageerror;采样 tooltip DOM 与 bounding box,确认 2 秒内不反复 detach/attach;点击 tooltip 内按钮,确认 hover 不被卡片内部文本重新触发。
- 成功信号:扩展 id 可见、content script 注入、tooltip 稳定可见、无闪烁循环、tooltip 内交互可点击。失败信号:只看到内置扩展、tooltip 节点频繁重建、console 出现 observer/content-script 错误、点击后卡片消失或重新触发。建议落地到 `npm run smoke:hover` 的本地必跑命令,并把稳定版放进 release 前检查文档 `docs/release-checklist.md`。
### 1.2 i+1阅读推荐缺少源覆盖与Anki差分校准
- 候选 id:`i-plus-one-anki-source-coverage`
- 类型:`diagnostic-tool`
- 风险:`medium`
- 摘要:这个主题有效,问题不是单次推荐文案噪音,而是每日 i+1 阅读推荐链路缺少可观测的输入源覆盖检查,以及没有用 Anki collection 做新概念差分。结果会导致“结合昨日本地活动/浏览器/Odyssey/Anki”的承诺无法验真,新概念数也只能停留在估算。
- 证据:
- `019e148c-6a26-7d30-9dd4-55fb611efe92` / `~`:agent_reflection 明确说:昨日 Agent健身房复盘提出 i+1 推荐需要 source coverage/可降级,且新增概念数当前更多是估算。
- `019e148c-6a26-7d30-9dd4-55fb611efe92` / `~`:最终报告里写到:仍未发现可直接读取的浏览器历史导出/可用本地浏览数据;也未在本次流程里读取 Anki collection.anki2 做精确 diff,所以新概念数为保守估计。
- `019e148c-6a26-7d30-9dd4-55fb611efe92` / `~`:用户要求每日推荐结合昨日本地活动、Odyssey、浏览器历史、Anki 状态,并要求估算至少 20 个高价值新概念,还要反推 14678 张阅读词汇量 deck 的学习天数。
- 建议改动:
- 新增诊断工具入口:在 `/Users/bytedance/myCronTask/run/daily_i_plus_one_reading/diagnose_i_plus_one_sources.py` 增加只读诊断脚本,并由 `run.sh --diagnose` 或独立 `make diagnose` 调用;输出 JSON/Markdown 到 `~/.codex/night-gym/runs/<date>/out/diagnostics/i_plus_one_source_coverage.*`。
- 输入来源:检查昨日 Night Gym/Chronicle 活动摘要、Odyssey `0 收集箱/每日英语i+1阅读/` 近期产物、浏览器历史导出或可读本地 history source、Anki `~/Library/Application Support/Anki2/账户 1/collection.anki2` 中 `阅读词汇量` deck;缺源时记录 source_name、expected_path、readable、rows/files、mtime、fallback_used。
- 核心检查步骤:按目标日期聚合候选阅读材料和候选概念;对每个来源计算 coverage status(present/empty/missing/stale/permission_denied);用 Anki 官方 Python API 或只读 SQLite fallback 提取 deck 词条集合,与候选概念做 exact/normalized lemma diff,输出 new_count、known_count、ambiguous_count 和样例。
- 成功/失败信号与落地路径:成功信号是至少 2 个内容源可读、Anki deck 可读、每条推荐都有 source_refs、new_count 由 diff 得出;失败信号是浏览器源缺失、Odyssey 产物 stale、collection locked、diff 覆盖率低。落地后把诊断摘要嵌入每日 i+1 阅读 Markdown front matter,并让 Night Gym 复盘读取该诊断文件而不是靠 agent 口头估算。
### 1.3 商品分类迭代需要可追溯重分桶工作台
- 候选 id:`product-taxonomy-refactor-workbench`
- 类型:`tool-upgrade`
- 风险:`medium`
- 摘要:这个主题有效,不是噪音。片段显示用户围绕商品类目、准入限制、商品类型、商品信息和特色服务连续迭代分类规则,并在另一个 session 继续追问旧标签应如何分桶,说明当前靠一次性表格修改已经不足。更合适的升级是建立可追溯重分桶工作台:保留旧标签、候选新桶、业务名词依据、规则版本、人工确认项和迁移 diff。
- 证据:
- `019e15b3-317a-7b83-a2bc-bbc2d0cc096e` / `~/Documents/job-bu`:用户连续要求:忽略最后一级标签给表格、将类目/准入限制细分成商品品类不能上和商品类型不能上,并参考 iCloud 业务名词定义。
- `019e15b3-317a-7b83-a2bc-bbc2d0cc096e` / `~/Documents/job-bu`:用户又要求按给定方式重构分类、商品属性改名为商品信息、特色能力改名特色服务并限定只包括安心吃等 7 个能力,其他归其他类。
- `019e15b3-317a-7b83-a2bc-bbc2d0cc096e` / `~/Documents/job-bu`:围绕商品类目,用户反复追问:商品类目选不了/找不到与类目创建失败/发布受限是不是一个意思,商品类目怎么选与类目准入/经营范围要求是不是一个意思,最后给出 xx商品属于什么类目、如何新增类目、类目未通过三类。
- 建议改动:
- 在 `/Users/bytedance/Documents/job-bu/data-analysis-workspace/tools/product_taxonomy_refactor_workbench.py` 新增重分桶 CLI:输入旧标签总表、用户指定约束和 iCloud 业务名词定义,输出 `old_label/new_bucket/rule_id/evidence/source_file/needs_review` 的可追溯映射表。
- 在 `/Users/bytedance/Documents/job-bu/data-analysis-workspace/projects/product-taxonomy-refactor/taxonomy_versions/` 新增版本化规则文件,例如 `v2026-05-product-taxonomy.yaml`,显式维护商品类目、类目准入/经营范围、商品类型、商品信息、特色服务白名单、其他类的定义和边界。
- 在 `/Users/bytedance/Documents/job-bu/data-analysis-workspace/projects/product-taxonomy-refactor/reports/` 新增 diff 报告生成:每次重构输出旧桶到新桶交叉矩阵、样例 case、变更原因、分母和待人工确认清单,避免只给最终表无法复盘。
- 新增 workspace skill `/Users/bytedance/Documents/job-bu/.codex/skills/product-taxonomy-refactor/SKILL.md`:触发词包括“重构分类”“分几类合适”“旧标签映射”“类目/准入/商品类型是不是一回事”,默认先跑工作台并引用业务名词来源;需要补的概念是 faceted taxonomy、label migration、provenance-aware annotation。
### 1.4 飞书和 Figma 访问需要统一预检
- 候选 id:`provider-access-preflight`
- 类型:`diagnostic-tool`
- 风险:`medium`
- 摘要:这是一个真实且高价值的重复摩擦点:Figma 写入/复制和飞书 wiki/docx 读取都曾在任务中段才暴露 provider 身份、配置路径、资源权限或 URL/token 解析问题。应把它沉淀为统一的 provider access preflight,在正式执行前给出 ready/warning/blocked 结论,并区分“工具认证失败”“浏览器登录态不可用”“资源 ACL 不可访问”“本地资料源优先级未确认”。
- 证据:
- `019e160f-c932-7b93-ae09-b42b0edb4ad4` / `~/Documents/job-bu`:用户要求复制 Figma 组件库素材。agent 先确认有 Figma 插件能力,但插件返回 401 ReauthenticationRequired,Chrome 登录态打开链接又显示找不到文件,最终无法复制。
- `019e1617-fb92-76f3-8bb5-04fa60d7d875` / `~/Documents/job-bu`:用户要求总结飞书 docx。agent 使用 lark-doc 流程时发现旧配置路径 ~/.lark-cli/config.bytedance.json 不存在,需要先查当前 lark-cli 实际配置位置,才拉到正文。
- `019e15fa-1937-7891-ab12-c1fd41f8c36f` / `~/Documents/job-bu`:另一个飞书 wiki 查询也先遇到 skill 旧配置路径不存在,随后才解析到 wiki 是 docx、标题和真实 token,并定位定邀/报白段落。
- 建议改动:
- 新增工具入口 `~/.codex/night-gym/tools/provider_access_preflight.py`,CLI 形态为 `provider_access_preflight.py --provider figma|lark|local-source --url <url> --mode read|write|copy|summarize --cwd <cwd>`;输入来源包括用户消息中的 Figma/飞书 URL、任务类型、当前 cwd、已有 connector 错误、`lark-cli config show`、`job-bu/AGENTS.md` 与 iCloud 术语目录规则。
- 核心检查步骤:Figma 分支先复用/封装 `~/.codex/night-gym/tools/figma_auth_preflight.py`,执行最小 connector 认证探针,区分 `401/ReauthenticationRequired`、浏览器能打开但 connector 无权、资源不存在或 ACL 拒绝;Lark 分支先跑 `lark-cli config show` 获取真实 config path 和 identity,再按 URL 类型执行 `wiki spaces get_node` 或 `docs +fetch --format json`,确认 `obj_type`、真实 token、`data.title`、`data.markdown` 是否可读;local-source 分支确认 `job-bu/AGENTS.md` 和 iCloud 业务术语目录是否存在,并输出项目级资料优先级。
- 成功/失败信号统一为 exit code 与 JSON:`0=ready`,包含 provider、identity、resource_type、resolved_token/title、recommended_next_step;`1=warning/unverified`,例如浏览器可见但 connector 未验证、只命中历史 401、术语源存在但项目级数据字典未确认;`2=blocked`,例如当前 connector 返回 401、`lark-cli config show` 不可用、目标 URL resolve 失败、`docs +fetch` 无正文、Chrome 打开显示文件不存在。
- 落地路径:在 `/Users/bytedance/Documents/product-bu/tools/night-gym/` 增加 detector/fixture/test,把包含 `ReauthenticationRequired`、`~/.lark-cli/config.bytedance.json 不存在`、`lark-cli config show`、`wiki spaces get_node`、`AGENTS.md 写清楚资料源` 的片段归入 `provider-access-preflight`;同时新增或更新 `~/.codex/skills/provider-access-preflight/SKILL.md`,规定飞书/Figma/本地资料源任务先跑预检,再进入复制、总结、写入或原文抽取。
### 1.5 中文聊天原型图需要模板化生成器
- 候选 id:`chat-prototype-html-generator`
- 类型:`tool-upgrade`
- 风险:`low`
- 摘要:该主题有效:片段显示用户在同一条改品 agent 原型线上连续提出多个中文业务聊天场景,且需求偏高保真、可截图交付。长中文话术、复制板、企微按钮等元素不适合直接用 imagegen 生成图片,稳定方案应沉淀为 HTML/CSS 模板化生成器并用浏览器导出 PNG。
- 证据:
- `019e162c-c509-76d3-8b75-8f93e2843acc` / `~/Documents/job-bu`:用户在同一条改品 agent 原型线里连续提出商品搭配、套餐售卖日期、促销价、鲜花类目、商品资质、代金券头图、商品编辑动线、水果团购定邀等多个场景。
- `019e162c-c509-76d3-8b75-8f93e2843acc` / `~/Documents/job-bu`:其中水果团购定邀场景包含很长的中文话术、复制板和企微按钮;agent 先准备用 imagegen,随后判断长中文纯图片生成容易写错,改用本地 HTML/CSS 画原型再导出 PNG。
- `019e162c-c509-76d3-8b75-8f93e2843acc` / `~/Documents/job-bu`:agent 还需要先查仓库最近同类原型文件,复用移动端尺寸、底色和交互卡片风格,再手写独立 inbox 原型页并无头浏览器导出截图。
- 建议改动:
- 新增 workspace skill:`/Users/bytedance/Documents/job-bu/.codex/skills/chat-prototype-html-generator/SKILL.md`,触发词覆盖“聊天原型图/企微话术/截图同款/推荐问题/中文业务原型”,规则明确:长中文文本优先 HTML/CSS + 浏览器截图,不直接用 imagegen 承担文字渲染。
- 新增生成器目录:`/Users/bytedance/Documents/job-bu/tools/chat_prototype_generator/`,包含 `schema.json`、`templates/mobile-chat.html`、`templates/wecom-card.css`、`generate.py`;输入为结构化 JSON(消息、按钮、复制板、商品卡、推荐问题、状态栏),输出 `out/<case>.html` 和 `out/<case>.png`。
- 在 `tools/chat_prototype_generator/examples/` 增加两个回归样例:`fruit-groupbuy-invite.json` 和 `screenshot-recommend-questions.json`;每个样例保留源话术、期望尺寸、导出 PNG,方便后续同类需求复用而不是重新查旧原型文件。
- 补一页设计口径文档:`/Users/bytedance/Documents/job-bu/tools/chat_prototype_generator/README.md`,说明移动端画布尺寸、底色、卡片圆角、中文换行、按钮密度、Playwright 截图命令,以及“截图像素验收/文本不溢出”两个必检概念。