# 2026-05-03 Agent健身房复盘 一句话概括:**这次发现的不是已经自动修复的问题,而是 5 类以后会反复浪费时间的操作摩擦 / 工具缺口。** | 优先级 | 发现的问题 | 真实含义 | 计划怎么解决 | | --- | --------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | | 1 | Viva 的 Anki 状态和下划线判断太分散 | 同一个词是否该划线,要同时看 Anki、knownWords、learning、页面重扫和选词动作;现在靠人工追链路,容易修一处漏一处。 | 做 `viva-state-doctor`:输入词、页面 URL、storage snapshot 和 Anki note,输出为什么划线/不划线,以及应触发的重扫/状态覆盖。 | | 2 | Viva 改完代码后运行态不一定是新版 | 源码、dist、两个 release 目录、Edge 实际加载目录、helper 运行拷贝和 LaunchAgent 可能漂移,导致“测试绿但页面还是旧行为”。 | 做 `viva-runtime-doctor`:比对 manifest/hash、release 目录、helper 路径、17331 端口和 launchctl 状态。 | | 3 | 每日推文总结失败前缺少预检 | 自动化运行到中途才发现 roster 缺失、skill 被删、provider DNS 失败、iCloud 目录不可写,最后只能产出失败日报。 | 加 twitter-fetcher preflight:先查 roster、脚本存在性、provider DNS/API、目标目录写权限,再决定抓取或写可补跑失败态。 | | 4 | Agent健身房自己的定时运行也需要审计 | plist 文件、launchctl 已加载配置、输出目录、中文化包和 token 消耗分散在多处;人工核验容易漏掉 reload 或空包。 | 做 Night Gym run doctor:一条命令检查 LaunchAgent、日志、包结构、审批脚本、token 汇总和 5 小时窗口占用。 | | 5 | Viva UI 迭代缺少设计系统契约 | 用户已经明确否定“直接从 mockup 到实现”;如果没有先固化 token、组件、状态和异步反馈契约,Figma、CSS、文案和截图回归会各自漂移。 | 把 `viva-design-system-first.md` 升级为唯一 UI contract,并新增 Viva UI skill:任何视觉改动都必须先更新 token/component/state/async contract,再生成 Figma realization,最后跑 CSS/DOM/截图回归。 | ## 下一步 | 顺序 | 先做什么 | 为什么 | | --- | --- | --- | | 1 | 先做 Viva 状态/运行态 doctor 的最小版本 | 昨天最长会话几乎都耗在同一个插件的状态链和发布运行态核验上,直接影响自用体验。 | | 2 | 给 twitter-fetcher 自动化加 preflight | 这是无人值守任务,失败要尽早、可解释、可补跑,不能每次靠人工追 DNS、roster 和写权限。 | | 3 | 把 Night Gym 自审计脚本化 | 它已经成为日常基础设施,必须能自证昨晚是否跑了、跑到哪里、花了多少额度。 | ## 一、候选详情 ### 1.1 Viva Anki状态和下划线链路诊断工具 - 类型:`diagnostic-tool`;风险:`medium`;审批:`pending`。 - 摘要:这个主题有效,问题不是单个 UI bug,而是 Anki 快照、本地 learning、knownWords/knownPhrases 与页面重扫之间的状态优先级冲突。它反复造成“删除后仍不下划线”“还不确定后仍不下划线”等现象,且人工排查必须跨 content/background/storage 多处读状态,适合做成 read-only doctor 工具。成功判据应对齐用户真实体验:当前页面选词后立刻能重新学习,未知词下划线、学习中状态优先、Anki active/suspended 表现一致。 - 关键证据: - `019decf0-adde-7db0-88bf-9229c65cc9f3` `~/Documents/product-bu`:用户反复反馈:这个词删除以后没有看到下划线;还不确定后也没看到下划线。后续排查发现删除 Anki 后原词仍在 knownWords,重扫时又被本地已知词状态拦下。 - `019decf0-adde-7db0-88bf-9229c65cc9f3` `~/Documents/product-bu`:根因是 `还不确定` 加了本地 learning 记录,但页面重扫时 Anki 的 `mastered/known` 快照优先级更高,所以它又被压回“不划线”。 - 建议动作: - 工具入口:在 Viva 插件仓库新增 `tools/viva-anki-state-doctor/diagnose.ts`,并在 `package.json` 增加 `viva:doctor` 脚本;命令形态建议为 `pnpm viva:doctor --word "还不确定" --tab current --profile dev --json`,默认只读,不修改任何 Anki 或 chrome.storage 状态。 - 输入来源:读取 content script 当前页 token/phrase 扫描结果、background 侧 AnkiConnect card 状态、chrome.storage.local/sync 中的 `knownWords`、`knownPhrases`、本地 learning 记录、Anki mastered/known 快照,以及最近一次 rescan timestamp;输出统一 state graph,标明每个状态来自哪个来源。 ### 2.1 Viva扩展发布包和运行态一致性检查 - 类型:`diagnostic-tool`;风险:`low`;审批:`pending`。 - 摘要:这个主题有明确价值,不是噪音:片段反复指向同一种故障模式,即源码、构建产物、Edge 实际加载目录、LaunchAgent 运行拷贝之间出现漂移。建议沉淀为一个 Viva runtime doctor,在发布或排障前一次性检查扩展目录、manifest/hash 文件、helper 脚本路径、launchd 状态和 17331 端口,避免“代码已改但运行态仍旧”的误判。 - 关键证据: - `019decf0-adde-7db0-88bf-9229c65cc9f3` `~/Documents/product-bu`:Edge 当前绑定的是 `40-release/edge-extension-unpacked`,不是刚同步的 `edge-extension-anki-local`;需要把新版构建同步到 Edge 实际加载目录再重载。 - `019decf0-adde-7db0-88bf-9229c65cc9f3` `~/Documents/product-bu`:专名音标能力上线时发现 17331 helper 实际跑的是 `~/Library/Application Support/VivaAnkiHelper/anki_concept_helper.py` 这份拷贝,不是源码目录里的 helper。 - 建议动作: - 在 `/Users/bytedance/Documents/product-bu/20-products/viva/30-rd/anki-local-extension/scripts/viva-runtime-doctor.mjs` 新增诊断工具,入口为 `npm run doctor:runtime -- --json`;输入来源包括 `dist/manifest.json`、`/Users/bytedance/Documents/product-bu/20-products/viva/40-release/edge-extension-anki-local/manifest.json`、`/Users/bytedance/Documents/product-bu/20-products/viva/40-release/edge-extension-unpacked/manifest.json`、helper plist 与 `~/Library/Application Support/VivaAnkiHelper/anki_concept_helper.py`。 - 修改 `/Users/bytedance/Documents/product-bu/20-products/viva/30-rd/anki-local-extension/package.json`,增加 `doctor:runtime` 和 `release:sync:clean`;核心检查步骤为解析 manifest 引用、比对 dist 与两个 release 目录的 checksum/mtime、扫描未被 manifest 引用的旧 hash asset。成功信号是 Edge 实际加载目录与最新 dist 一致且无旧 bundle 残留,失败信号是 release 目录落后、manifest 指向新文件但旧 hash 文件仍存在。 ### 3.1 每日推文总结自动化预检和失败补跑链路 - 类型:`diagnostic-tool`;风险:`medium`;审批:`pending`。 - 摘要:这个主题有效,不是单次抓取失败的噪音,而是同一条自动化链路连续暴露出配置、代码现态、网络和写权限四类前置风险。应把 twitter-fetcher 日报从“直接开跑后碰错”升级为“预检、分类失败、产出可补跑状态”的诊断工具,避免每次都重新人工排障。 - 关键证据: - `019deb5a-c152-7de3-9056-6c3d2ddfb7a1` `~/Documents/Codex/2026-04-21-https-github-com-haopenglau-skills/repo`:自动化要求用 `.claude/skills/config.json` 里的 twitter-fetcher.users 抓最近 1 个完整自然日,但当前配置只有 API key,没有 users roster。 - `019deb5a-c152-7de3-9056-6c3d2ddfb7a1` `~/Documents/Codex/2026-04-21-https-github-com-haopenglau-skills/repo`:根因补全:`skills/twitter-fetcher` 文件不是仓库没有,而是当前 worktree 里被删掉;agent 只能从 HEAD 读取脚本临时执行,不能回滚用户改动。 - 建议动作: - 新增工具入口 `scripts/twitter_fetcher_preflight.py`。输入来源:repo-local `.claude/skills/config.json`、环境变量 `TWITTERAPI_IO_KEY` / `SOCIALDATA_API_KEY`、当前 git worktree、目标输出目录。核心检查步骤:验证 `skills.twitter-fetcher.users` 非空,检查 `skills/twitter-fetcher/*` 是否存在或能否用 `git show HEAD:...` 读取 canonical 版本,对 `api.twitterapi.io` / `api.socialdata.tools` 做 DNS 解析,对 `~/Downloads/twitter_output` 与 Odyssey research 目录做 touch/delete 写入测试。成功信号:输出 `status=ok` JSON 并返回 0;失败信号:返回非 0,写出 `failed_checks`、`resume_hint`、`safe_fallback_dir`。建议落地路径:放在当前流程仓库的 `scripts/`,作为日报脚本和 LaunchAgent 的前置步骤。 - 改造 `scripts/run_daily_tweet_summary.sh` 和 `~/Library/LaunchAgents/com.bytedance.daily-tweet-summary.plist` 对应入口,先执行 `scripts/twitter_fetcher_preflight.py --date <完整自然日>`,预检成功才调用 `scripts/daily_tweet_summary.py`。输入来源:LaunchAgent 环境、repo 配置、日期窗口。核心检查步骤:校验 roster/provider/DNS/写权限,并把检查摘要写入日志。成功信号:继续抓取并产出 raw JSON + `推文总结_YYYY-MM-DD.md`;失败信号:不启动真实抓取,落 `.codex_tmp/twitter_fetcher_runs/<date>/preflight_failed.json` 和失败态 markdown。建议落地路径:把 plist 的 ProgramArguments 保持指向 shell wrapper,只在 wrapper 里插入 preflight。 ### 4.1 Agent健身房定时运行和候选包审计工具 - 类型:`diagnostic-tool`;风险:`low`;审批:`pending`。 - 摘要:这个主题有效,不是噪音:同一轮会话里连续出现了定时任务是否真正执行、磁盘 plist 与 launchctl loaded 状态漂移、输出目录迁移后包完整性、以及 5 小时额度消耗核算。它适合沉淀成 Night Gym 自检工具,避免每次靠人工分别查 LaunchAgent、日志、输出包和本地 rate_limits。 - 关键证据: - `019decee-0f1f-7113-a8e7-5a6e148bc793` `~/Documents/learning-bu`:昨晚这个 `Agent健身房` 跑成功了。系统层面:LaunchAgent:`~/Library/LaunchAgents/Agent健身房.plist`,launchd 状态:`runs = 1`,`last exit code = 0`,日志显示:`Codex exec rc: 0`。 - `019decee-0f1f-7113-a8e7-5a6e148bc793` `~/Documents/learning-bu`:磁盘上的 plist 现在写的是 `04:00`,但 `launchctl print` 里当前已加载的触发器还是 `01:00`。所以昨晚实际按 `01:00` 跑了;如果期望以后固定 `04:00`,需要 reload。 - 建议动作: - 新增诊断工具入口:在 Night Gym 项目里加 `scripts/night_gym_doctor.py`,支持 `python scripts/night_gym_doctor.py --date YYYY-MM-DD --plist ~/Library/LaunchAgents/Agent健身房.plist --output-dir <Agent健身房目录>`。输入来源包括 LaunchAgent plist、`launchctl print gui/$UID/Agent健身房`、对应 run 目录的 `master.log`、`out/sub/*.log`、候选包 `候选清单.json/manifest.json`、本地 Codex session 里的 `rate_limits.primary`。 - 核心检查步骤:解析磁盘 plist 的 `StartCalendarInterval`、`ProgramArguments` 和 `--output-dir`;读取 launchctl loaded job 的触发器、command、runs、last exit code;对比磁盘配置与 loaded 配置是否漂移;检查主日志 `Codex exec rc`、master/subagent `tokens used`、`SUBAGENT_DONE` 标记;检查目标日期候选包是否包含 `早间复盘.md/候选清单.json/审批.sh/示例/子分析`,并标出空目录或缺文件原因。 ### 5.1 Viva UI 设计系统优先工作流 - 类型:`workflow-pattern`;风险:`medium`;审批:`pending`。 - 摘要:这个主题不是“设计品味”问题,而是 Viva UI 迭代缺少可执行契约。用户已经否定普通三案 mockup,并用 open-design / design-system-first 方法论纠偏;后续也已经产出 `07 Design System First - Viva DS` 和本地 contract。下一步应把它升级成强约束工作流:所有 Viva UI 视觉改动先更新 token、typography、component、state、async timeline,再用同一套系统生成 Figma realization,前端实现和回归测试只认 contract,不再从截图反推 CSS。 - 关键证据: - `019decf0-adde-7db0-88bf-9229c65cc9f3` `~/Documents/product-bu`:用户在三案原型后直接反馈:`不满意,参考这里https://github.com/nexu-io/open-design`,并贴出“take the mockup and first build a design system out of it”的方法论。 - `019decf0-adde-7db0-88bf-9229c65cc9f3` `~/Documents/product-bu`:我看了 open-design 的 README 和核心 prompt 文件,它不是单纯“好看的 UI”,而是有一套很硬的结构:先定方向卡、用确定的 palette/font/posture,显示 live progress。 - 建议动作: - 把 `/Users/bytedance/Documents/product-bu/20-products/viva/10-pm/ui-design/viva-design-system-first.md` 升级成唯一 UI contract,页首固定写入 contract version、Figma node-id、对应 release/version、最近一次截图回归路径;正文固定为 principles、tokens、typography、layout、components、states、async timeline、copy rules、examples、acceptance checklist。 - 新增 Codex skill `/Users/bytedance/.codex/skills/viva-design-system-first/SKILL.md`,触发词覆盖 Viva UI、Figma、插件视觉迭代、音标样式、队列样式、Anki 状态文案。skill 的硬规则是:先读现有 contract 和最新反馈,输出 DS delta 表;只允许改 contract 后再画 Figma realization;前端实现必须引用同名 CSS vars、组件类名和状态名;最后用截图、DOM 和 CSS var 检查证明没有偏离 contract。 - 在前端仓库补一个 contract regression:校验 IPA 字号层级、Anki/ROI 状态名、queue/retry/optimistic UI 文案、核心 CSS vars 与 `viva-design-system-first.md` 一致。验收标准是用户提出“音标再大一点”或“队列弱一点”时,只需要改 contract 的一个局部区块,就能同步影响 Figma、CSS 和测试。