# 2026-05-22 Agent健身房复盘 一句话概括:**这次发现的不是已经自动修复的问题,而是 4 类以后会反复浪费时间的操作摩擦 / 工具缺口。** | 优先级 | 发现的问题 | 真实含义 | 计划怎么解决 | | --- | --- | --- | --- | | 1 | 定时任务会出现“有 session 但没有输出/没有落盘”的假启动 | 每日英语任务只有 user/event 日志,没有 assistant 输出,目标 Markdown 也没找到;如果不单独检查,系统会把触发当成功。 | 给 Night Gym 加完成度哨兵:解析消息计数和 Report target,检查文件存在、非空、mtime 与标题,当天失败直接进晨检候选。 | | 2 | 本地 HTML 交付缺截图级验收 | 页面已经给用户看,但只校验了文件和关键文本存在,没有确认首屏、移动端、布局溢出和搜索交互。 | 做 `local_html_smoke_check.py`:打开本地 HTML,输出桌面/移动截图和 `smoke_report.json`;浏览器不可用时也给机器可读失败信号。 | | 3 | 商品 skill 的文档数、skill 数、承接 case 排行缺统一索引 | 用户连续问 44/22/261/258/130 等口径、需求落点和 case 排行,agent 反复在 memory、README、DB、CSV 间追溯,容易慢且混口径。 | 在客服知识 skill 化项目里生成 `product_skill_inventory_index_YYYY_MM_DD.json`,每个指标带分母、来源路径、构建脚本和更新时间。 | | 4 | 飞书 wiki 评论到新文档链路依赖手工 token/配置判断 | 同一任务里暴露了 wiki token 不能当 doc token、lark-cli 配置路径漂移、评论定位和创建后回读验收四个风险点。 | 做 `lark-wiki-comment-preflight`:输入 wiki URL 和 comment id,dry-run 输出真实 doc token、账号配置、评论摘录;create 后自动回读标题和核心章节。 | ## 一、下一步 | 顺序 | 先做什么 | 为什么 | | --- | --- | --- | | 1 | 先做 session completion sentinel | 它能抓到真实漏产出,价值高、落地小,且可覆盖所有定时任务。 | | 2 | 补 HTML smoke check | 商品知识 HTML 这类交付会反复出现,截图级验收能直接提升交付可信度。 | | 3 | 做商品 skill inventory index | 这是用户高频业务问答,索引器能把一次性排查变成可复跑数据产品。 | | 4 | 做飞书 wiki/comment 预检 | 能减少飞书文档创建类任务的隐性失败,但涉及账号配置和写入权限,放在两个低风险诊断之后。 | ## 二、候选详情 ### 2.1 定时任务需要零输出和落盘完成度哨兵 - 类型:`diagnostic-tool` - 风险:`low` - 候选 id:`scheduled-session-completion-sentinel` - 摘要:该主题有价值:片段显示存在定时/自动启动会话只有 user/event 记录、没有 assistant 输出的形态,且其中一个明确指定的 Report target 未落盘。Night Gym 应补一个完成度哨兵,把“任务被触发”与“任务真正产出并写入目标文件”分开判定,避免把空会话误认为成功。 - 关键证据: - `019e4d32-5a84-7a13-9b1f-a8c274cef662` / `~`:每日英语 i+1 阅读任务的 session 只有 1 条 user message、0 条 assistant message、1 条 event message;prompt 指定 Report target 为 Odyssey 下的 2026-05-22 每日英语i+1阅读.md。 - `019e4dea-6279-7580-b5b2-cfcc88fa74d1` / `~/Documents/info-bu`:另一个幽门螺杆菌咨询 session 也出现 3 条重复 user message、0 条 assistant message、3 条 event message,随后才有另一个完整 session 正常回答。 - `019e4d32-5a84-7a13-9b1f-a8c274cef662` / `~`:本轮主分析复核发现 Report target 对应本机文件不存在:~/Library/Mobile Documents/com~apple~CloudDocs/odyssey/0 收集箱/每日英语i+1阅读/2026-05-22 每日英语i+1阅读.md。 - 计划改动: - 新增诊断工具入口:在 Night Gym run pipeline 中增加 `scripts/check_session_completion_sentinel.py`,由父进程在汇总前调用;输入来源为 session 元数据 JSONL、event/user/assistant 消息计数、prompt 中解析出的 Report target 路径、以及本机文件系统的实际落盘状态。 - 核心检查步骤:按 session_id 聚合消息计数,标记 `assistant_message_count == 0` 的零输出会话;从 user prompt 或任务配置中抽取目标产物路径;对目标路径执行存在性、非空、mtime 是否晚于任务开始时间、文件头部是否包含当日/任务标题等轻量检查。 - 成功/失败信号:成功信号为有 assistant 输出或目标产物存在且非空、更新时间合理;失败信号为只有 user/event 无 assistant、重复 user 消息但无 assistant、Report target 不存在或为空、目标文件 mtime 早于 session start。失败时在 `out/diagnostics/session_completion_sentinel.json` 写入 session_id、cwd、target_path、failure_reason。 ### 2.2 本地HTML交付缺少截图级验收 - 类型:`diagnostic-tool` - 风险:`low` - 候选 id:`local-html-smoke-check` - 摘要:这个主题有价值,不是噪音:片段中的交付物是面向用户阅读的本地 HTML 页面,但最终验收只确认文件存在、数字和章节写入,未确认首屏是否可读、布局是否溢出、搜索清单是否正常呈现。可沉淀为一个本地 HTML smoke check 工具,在浏览器能力缺失时也给出明确失败信号和替代验收产物。 - 关键证据: - `019e4f1f-821b-79b1-917d-e00b7a1d7997` / `~/Documents/job-bu`:HTML 已生成后,agent 计划用内嵌浏览器打开本地文件看首屏是否正常;但工具未暴露,Playwright 也不在当前 Node 运行时里,所以没做截图级验收。 - `019e4f1f-821b-79b1-917d-e00b7a1d7997` / `~/Documents/job-bu`:交付的是面向用户查看的商品领域客服知识 skill 化阅读页,包含核心数字、口径差异、明细、场景库分布和可搜索清单;最终仍说明没有截图级浏览器验收。 - 计划改动: - 新增工具入口:`/Users/bytedance/.codex/night-gym/tools/local_html_smoke_check.py`,CLI 形态为 `python tools/local_html_smoke_check.py --html <html_path> --out <artifact_dir> --expect-text <text> --expect-text <text>`;输入来源是最终交付的本地 HTML 路径、交付摘要中的关键数字/章节名、以及默认 viewport 配置。 - 核心检查步骤:解析 HTML 路径并启动临时静态服务,优先通过内嵌浏览器能力打开;若不可用则自动检测 `npx playwright`/本地 Playwright/Python screenshot 后端;检查 HTTP/文件加载、首屏截图、正文可见文本、关键数字、页面标题、横向溢出、明显空白屏、控制台错误和搜索输入框基础交互。 - 成功/失败信号:成功时输出 `smoke_report.json`、桌面和移动两张截图、检查项表格,并返回 exit 0;失败时返回非 0,报告中标明 `browser_unavailable`、`missing_expected_text`、`blank_screenshot`、`layout_overflow`、`console_error` 等可定位原因。 ### 2.3 商品skill口径和承接排行需要索引器 - 类型:`tool-upgrade` - 风险:`medium` - 候选 id:`product-skill-inventory-index` - 摘要:这个主题有效,不是噪音。相关片段显示用户围绕客服文档数、skill 数、需求落点和承接 case 排行连续追问,agent 反复在 memory、README、DB 和大范围 CSV 中切换,说明当前缺的是一个可复跑的商品 skill 口径索引入口,而不是单次回答能力。 - 关键证据: - `019e4f1f-821b-79b1-917d-e00b7a1d7997` / `~/Documents/job-bu`:用户连续追问:多少个客服文档、多少个 skill;打标看过哪些需求落在哪些 skills 上;哪些 skill 能够承接的 case 多。 - `019e4f1f-821b-79b1-917d-e00b7a1d7997` / `~/Documents/job-bu`:agent 需要多次查 memory、收窄项目 README/DB、区分 44/22/261/258/130 等相近口径。 - `019e4f1f-821b-79b1-917d-e00b7a1d7997` / `~/Documents/job-bu`:整个数据目录搜得太宽,CSV 输出很大;需要收窄到项目级 README/DB 来复核数字。 - 计划改动: - 新增 `/Users/bytedance/Documents/job-bu/data-analysis-workspace/projects/2026-05-15-客服知识skill化/scripts/build_product_skill_inventory_index.py`:读取项目 README、`analysis/商品wiki文档场景关系_2026-05-18_v2.db`、`analysis/窄口径商品主类目22篇_skill抽取清单_2026-05-15_v1.csv` 和两份 2026-05-22 承接排行 CSV,生成统一的 `analysis/product_skill_inventory_index_YYYY_MM_DD.json`。 - 在 `/Users/bytedance/Documents/job-bu/data-analysis-workspace/projects/2026-05-15-客服知识skill化/README.md` 增加「口径索引」表:每个数字必须包含 `metric_name`、`value`、`denominator_scope`、`source_path`、`build_script`、`last_verified`,显式区分 44 篇商品 SOP 参考文档、22 篇窄口径商品主类目文档、261 个抽取 skill、商品创建 130 个 skill 和承接 case 排行。 - 改造 `/Users/bytedance/Documents/job-bu/data-analysis-workspace/projects/2026-05-15-客服知识skill化/scripts/build_product_skill_reading_html_2026_05_22.py`:优先消费索引 JSON 来渲染文档数、skill 数和排行入口,避免在阅读页脚本里重新散落计算或手选 CSV。 ### 2.4 飞书wiki评论到新文档链路需要预检 - 类型:`diagnostic-tool` - 风险:`medium` - 候选 id:`lark-wiki-comment-preflight` - 摘要:这个主题不是噪音:片段里同一条链路连续暴露了 wiki URL token 误用、lark-cli 配置路径漂移、评论上下文定位、创建后验收四类可复现风险。适合沉淀成一个只读预检加可选创建验收的诊断工具,减少每次从 URL 手工推断 token 和账号配置的成本。 - 关键证据: - `019e4ea9-a8f7-7860-9f90-6988b746fc3c` / `~/Documents/job-bu`:用户给飞书 wiki 链接和 preview_comment_id,要求设计埋点方案并给新文档。agent 先确认链接是知识库节点,不能直接拿 URL token 当文档 token 用,需要解析 wiki 节点拿真实文档 token。 - `019e4ea9-a8f7-7860-9f90-6988b746fc3c` / `~/Documents/job-bu`:agent 发现 lark-cli skill 说明里的配置路径和当前机器不完全一致,需要定位现有工作账号配置;同时评论接口可用,能按 URL 里的 comment id 精确找上下文。 - `019e4ea9-a8f7-7860-9f90-6988b746fc3c` / `~/Documents/job-bu`:新文档创建成功后,agent 又拉取一次新文档内容做快速校验,确认标题和核心章节都在。这个人工链路可沉淀成 wiki/comment/doc 创建预检和验收工具。 - 计划改动: - 新增 Codex skill:`/Users/bytedance/.codex/skills/lark-wiki-comment-preflight/SKILL.md`。工具入口定义为 `lark-wiki-comment-preflight --wiki-url <url> --preview-comment-id <id> --title <title> [--dry-run|--create]`;输入来源为用户粘贴的飞书 wiki URL、URL 或页面里的 preview_comment_id、目标新文档标题/目录;核心检查步骤为解析 wiki node、换取真实 doc token、读取评论上下文、检查当前账号权限、可选创建文档并回读验收;成功信号为输出 account/doc_token/comment_excerpt/new_doc_url/verification=pass;失败信号为 stage 化错误,如 `wiki_node_unresolved`、`account_config_missing`、`comment_not_found`、`created_doc_verify_failed`;落地路径为先做 dry-run,再允许 create。 - 新增脚本:`/Users/bytedance/.codex/skills/lark-wiki-comment-preflight/scripts/preflight.py`。脚本优先读取 `~/.lark-cli/config.json`,并探测 `~/Library/Application Support/lark-cli/*.enc` 与 `~/.lark-cli/logs/`,解决 skill 文档路径和本机真实账号配置不一致的问题;输出机器可读 JSON,便于父流程把诊断结果写入 Night Gym 报告。 - 更新现有 Lark 文档说明:在 `/Users/bytedance/.claude/skills/lark-wiki/SKILL.md` 与 `/Users/bytedance/.claude/skills/lark-doc/SKILL.md` 增加前置规则:遇到 wiki URL 加 comment id 且要生成新文档时,必须先跑预检,不允许直接把 URL 片段当文档 token;同时记录当前机器实际配置路径 `~/.lark-cli/config.json` 和 `~/Library/Application Support/lark-cli/`。