[
 {
  "cid": "ai_session_search_archive#0",
  "target": "ai_session_search_archive",
  "question": "我想在归档里用语义搜索找一条大概记得内容的会话。我手头有几周前导出的文件列表 txt，可以直接拿来跑吗？缓存里已经有向量的话会不会漏结果？",
  "excerpt": "Generate the file list from the current source scope at query time. Do not reuse an old `tmp/*files*.txt`: a semantic-search file list is also a result allowlist, so an omitted file cannot be returned even if its vectors exist in the cache.",
  "fact": "语义搜索的文件列表必须在查询时现生成，不能复用旧列表；该列表是结果白名单，遗漏文件即使已有向量也不会返回。",
  "rubric": {
   "must_include": [
    "不得复用旧的文件列表，需按当前范围在查询时重建",
    "文件列表是结果白名单，遗漏文件不会返回（即使缓存有向量）"
   ],
   "reference_answer": "不能复用旧列表；每次查询都要现生成当前范围的文件清单，因为它就是结果白名单，漏掉的文件即使缓存有向量也不会出现在结果里。"
  }
 },
 {
  "cid": "ai_session_search_archive#1",
  "target": "ai_session_search_archive",
  "question": "我想给一条只有 UUID 会话编号的记录生成 iOS 上可点的 opencode://session/... 深链，可以吗？如果不行，ID 必须满足什么条件？",
  "excerpt": "Antigravity / Claude Code / Codex / Second Mind IDs (UUIDs or non-`ses_` prefixes) do not satisfy this contract and cannot produce a deep link.",
  "fact": "只有以 ses_ 开头的 OpenCode 会话 ID 才能生成 opencode 深链；UUID 或非 ses_ 前缀的 ID 无法生成。",
  "rubric": {
   "must_include": [
    "UUID 或非 ses_ 前缀的 ID 不能生成 opencode 深链",
    "只能使用以 ses_ 开头的 OpenCode 会话 ID"
   ],
   "reference_answer": "不行；opencode 深链只接受以 ses_ 开头的 OpenCode 会话 ID，UUID 或非 ses_ 的编号不符合约定，无法生成。"
  }
 },
 {
  "cid": "bestpractice_ai_debugging_diagnosis#0",
  "target": "bestpractice_ai_debugging_diagnosis",
  "question": "我把报错的那个文件发给 AI 了，但它还是改不对。除了这个文件，我还需要一并提供哪些具体材料，才能让它更准确？请给出完整清单。",
  "excerpt": "解决：\n- 提供相关文件（不只是报错的那个）\n- 提供项目结构概览\n- 提供类似的正确实现作为参考",
  "fact": "在上下文不足时，需同时提供相关文件集合、项目结构概览以及类似的正确实现作为参考。",
  "rubric": {
   "must_include": [
    "相关文件（不止报错文件）",
    "项目结构概览",
    "类似的正确实现作为参考"
   ],
   "reference_answer": "需要提供相关文件（不只是报错的那个）、项目结构概览，以及类似的正确实现作为参考。"
  }
 },
 {
  "cid": "bestpractice_ai_debugging_diagnosis#1",
  "target": "bestpractice_ai_debugging_diagnosis",
  "question": "现在我觉得这个问题可能真得大修架构。按你们的建议，在动大刀子之前应该先做哪三件具体措施？请逐项列出。",
  "excerpt": "即使如此，也先尝试：\n- 局部重构而非大规模重写\n- 增加测试覆盖\n- 改善文档和注释",
  "fact": "即便判断接近架构问题，也应先尝试局部重构、增加测试覆盖、并改进文档与注释。",
  "rubric": {
   "must_include": [
    "局部重构而非大规模重写",
    "增加测试覆盖",
    "改善文档和注释"
   ],
   "reference_answer": "先做局部重构（而非大规模重写）、增加测试覆盖，并改善文档和注释。"
  }
 },
 {
  "cid": "bestpractice_ai_product_design#0",
  "target": "bestpractice_ai_product_design",
  "question": "我们在做车道偏离预警，想把告警阈值和时机微调一下。需要重训模型，还是可以直接改规则配置就生效？",
  "excerpt": "### 解耦收益\n\n1. **快速迭代**：产品规则可独立修改，无需重新训练模型\n2. **个性化**：不同客户/地区可有不同规则\n3. **可审计**：规则变更可追溯，模型输出稳定\n4. **LLM 集成**：未来可用 LLM 灵活组合信号",
  "fact": "解耦后，修改业务规则无需重训模型，可独立快速迭代。",
  "rubric": {
   "must_include": [
    "不需要重新训练模型",
    "通过修改规则/配置即可生效"
   ],
   "reference_answer": "不需要重训模型，直接改规则参数/配置即可生效。"
  }
 },
 {
  "cid": "bestpractice_ai_product_design#1",
  "target": "bestpractice_ai_product_design",
  "question": "我在做多模型协作的文档分析助手：如果当前模型老是不按指示把任务交给另一个模型，该怎么处理才能确保切换一定发生？",
  "excerpt": "### 设计启示\n\n1. **利用互补优势**：让不同模型做自己擅长的事\n2. **不要模仿人类角色划分**：PM/QA/Dev 是人类组织模式，不适用于 Agent\n3. **上下文窗口分离**：不同 Agent 负责不同上下文子集\n4. **必要时强制交接**：当模型抗拒指令时，通过代码强制切换",
  "fact": "在多Agent协作中，当模型不服从指令时应通过代码强制交接切换。",
  "rubric": {
   "must_include": [
    "通过代码强制切换/强制交接"
   ],
   "reference_answer": "当模型抗拒时，直接用代码强制把控制权切换给目标 Agent。"
  }
 },
 {
  "cid": "bestpractice_ai_programming_mindset#0",
  "target": "bestpractice_ai_programming_mindset",
  "question": "我在做一个本地多代理编码助手的编排，最近老是因为上下文窗口太小卡住。具体应当怎么拆分与并行这些子代理？请给出推荐的数量、职责划分以及结果整合方式。",
  "excerpt": "### 4. Divide and conquer 应对 context window saturation\n\n- 8 个 sub-agent 并行处理\n- 每个 sub-agent 职责单一\n- 最后汇总而非一次性塞入所有信息",
  "fact": "应对上下文窗口饱和时，推荐并行使用 8 个单一职责的子代理，并在最后汇总结果而非一次性塞入所有信息。",
  "rubric": {
   "must_include": [
    "并行使用 8 个子代理",
    "每个子代理职责单一",
    "最后汇总而不是一次性塞入全部信息"
   ],
   "reference_answer": "并行启用 8 个子代理，每个只负责一类任务，最后把各自结果汇总，而不是把所有信息一次性塞进上下文。"
  }
 },
 {
  "cid": "bestpractice_ai_programming_mindset#1",
  "target": "bestpractice_ai_programming_mindset",
  "question": "我要给我的本地 Coding Agent 设计状态管理方案。到底是把状态主要放内存里再定期保存，还是直接以文件系统为主？有哪些做法是需要避免的？",
  "excerpt": "本地 Agent 模式的核心设计原则：\n- 文件系统本身就是最可靠的状态持久化层\n- 状态变更 = 文件操作，天然可审计、可回滚\n- 避免「内存状态 + 手动持久化」的复杂性",
  "fact": "在本地 Agent 中应以文件系统作为状态持久化层，状态变化以文件操作表达，并避免“内存状态+手动持久化”的复杂性。",
  "rubric": {
   "must_include": [
    "以文件系统作为主要的状态持久化层",
    "用文件操作表示状态变更",
    "避免“内存状态 + 手动持久化”的方案"
   ],
   "reference_answer": "把文件系统当作主要的状态持久化层，用文件操作表示状态变更，并避免“内存状态+手动持久化”的设计。"
  }
 },
 {
  "cid": "bestpractice_api_key_management_1password_cli#0",
  "target": "bestpractice_api_key_management_1password_cli",
  "question": "我想先确认 deepseek 的密钥字段名字有没有写对，再用命令行去读。有什么命令可以把那个条目里现有的字段名都列出来给我核对？",
  "excerpt": "4. 如果不确定 field 是否存在，先列出现有 field 确认：`op item get dev-api-keys --vault dev --format json` 后检查 `fields[*].label`。避免因拼写（如 `olama` vs `ollama`）静默失败。",
  "fact": "不确定字段名时，应先用 `op item get dev-api-keys --vault dev --format json` 列出并检查 fields[*].label。",
  "rubric": {
   "must_include": [
    "给出完整命令：op item get dev-api-keys --vault dev --format json",
    "说明需要查看 fields[*].label 以确认字段名"
   ],
   "reference_answer": "运行 op item get dev-api-keys --vault dev --format json，并查看输出中的 fields[*].label 列表确认字段名。"
  }
 },
 {
  "cid": "bestpractice_api_key_management_1password_cli#1",
  "target": "bestpractice_api_key_management_1password_cli",
  "question": "我要把 Node 服务用 PM2 跑在生产机上，系统重启后还能自动取到密钥、不弹窗。应该在服务器上放哪个环境变量？以及要怎么把 OPENAI_API_KEY 注入给 PM2 才能生效？",
  "excerpt": "2. 在服务器安全保存 `OP_SERVICE_ACCOUNT_TOKEN`（如 systemd EnvironmentFile）。\n3. 启动脚本内使用 `op read` 拉取密钥后启动进程管理器（如 PM2）。\n\n示意：\n\n```bash\nexport OPENAI_API_KEY=\"$(op read 'op://dev/dev-api-keys/openai_api_key')\"\npm2 start ecosystem.config.js --env production --update-env",
  "fact": "生产环境需保存 OP_SERVICE_ACCOUNT_TOKEN，并用 op read 导出 OPENAI_API_KEY 后以 pm2 --update-env 启动。",
  "rubric": {
   "must_include": [
    "明确环境变量名 OP_SERVICE_ACCOUNT_TOKEN",
    "使用 op read 导出 OPENAI_API_KEY 的命令行形式",
    "PM2 启动需带 --update-env 使新环境变量生效"
   ],
   "reference_answer": "在服务器保存 OP_SERVICE_ACCOUNT_TOKEN，并先执行 export OPENAI_API_KEY=\"$(op read 'op://dev/dev-api-keys/openai_api_key')\"，再用 pm2 start ... --update-env 启动。"
  }
 },
 {
  "cid": "bestpractice_gui_automation#0",
  "target": "bestpractice_gui_automation",
  "question": "我在做一个资讯网站的无限下拉抓取，但页面上的旧内容会被动态清掉，常规爬 DOM 抓不到。用浏览器自带工具的话，具体要按什么步骤把后台请求完整导出来做成可编程的数据源？",
  "excerpt": "动态页面（如无限滚动）的 HTML 元素会被动态移除。解决方案：\n\n1. 打开 Dev Tools → Network Tab\n2. 执行操作\n3. Export HAR\n4. 编程解析 HAR 文件",
  "fact": "处理动态页面应通过开发者工具的网络面板导出 HAR，再编程解析 HAR，而不是直接抓 DOM。",
  "rubric": {
   "must_include": [
    "打开开发者工具的 Network 面板",
    "执行相应操作后导出 HAR",
    "对 HAR 文件进行编程解析"
   ],
   "reference_answer": "打开浏览器开发者工具的 Network 面板，执行你要的操作后导出 HAR，然后对 HAR 文件进行编程解析。"
  }
 },
 {
  "cid": "bestpractice_gui_automation#1",
  "target": "bestpractice_gui_automation",
  "question": "我在做一个网页端自动化流程，有一步需要同事手动截图再粘贴，流程老是在这一步卡住。怎样把这一步也实现成全自动，避免人工介入？",
  "excerpt": "当需要人工截图粘贴时，自动化链条断裂。解决方案：\n\n- 让 AI 自己截图（Playwright）\n- 使用 screenshot utilities 自动捕获",
  "fact": "人工截图会让流程断裂，应该改为由 AI 自行截图或用自动截图工具自动捕获。",
  "rubric": {
   "must_include": [
    "改为由 AI 自动截图（如用 Playwright）",
    "使用自动截图工具/实用程序进行捕获"
   ],
   "reference_answer": "别再人工截图，改用让 AI 自己截图（例如用 Playwright）或使用自动截图工具自动捕获。"
  }
 },
 {
  "cid": "bestpractice_internal_visuals#0",
  "target": "bestpractice_internal_visuals",
  "question": "我在写团队的内部备忘录，想给一个状态小标签加样式。CSS 类名只写 ok 可以吗，还是必须和组件的基类组合使用？担心主题色把它覆盖。",
  "excerpt": "### 约束三：语义类必须使用复合选择器\n装饰性的行内元素（如 chip/badge/pill）在设置 CSS 类时，必须绑定双类（如 `.vx-chip.ok` 或 `.chip.ok`），而不能只使用裸单类（如 `.ok`）。这样可以保证特异性高，不被父容器的 `--fg` 覆盖。\n*   *正确示范*：`class=\"vx-chip ok\"`\n*   *错误示范*：`class=\"ok\"`",
  "fact": "装饰性状态类必须用复合选择器（双类），不能只用单个状态类。",
  "rubric": {
   "must_include": [
    "必须使用复合类/双类（例如 class='vx-chip ok' 或 .chip.ok）",
    "不能只用单个状态类（如 class='ok'）"
   ],
   "reference_answer": "不能只写一个状态类，必须和组件基类组成复合类，例如 class=\"vx-chip ok\"（而不是 class=\"ok\"）。"
  }
 },
 {
  "cid": "bestpractice_internal_visuals#1",
  "target": "bestpractice_internal_visuals",
  "question": "周报里我想直接把一段 SVG 代码内嵌当图用，可以吗？在手机上浏览会不会有坑？如果不行应该用什么格式替代？",
  "excerpt": "4.  **内联 SVG 图片**：不要在最终 Markdown 中夹带内联 SVG 代码，移动端渲染极其不稳定。需要图时，渲染成 PNG/JPG 引用。",
  "fact": "最终 Markdown 禁止内联 SVG；应转成 PNG/JPG 引用，因移动端渲染不稳定。",
  "rubric": {
   "must_include": [
    "不要在最终 Markdown 内联 SVG",
    "改为渲染 PNG/JPG 并引用",
    "原因是移动端渲染不稳定"
   ],
   "reference_answer": "不要内联 SVG；移动端渲染极不稳定，应先渲染为 PNG/JPG 再以图片引用。"
  }
 },
 {
  "cid": "bestpractice_interview_evaluation#0",
  "target": "bestpractice_interview_evaluation",
  "question": "我准备面一位工程师，想试探他是不是在用外部AI实时辅助回答。有没有一个简单直接的试法？给我一个可以当场操作的点子。",
  "excerpt": "1. **Knowledge Cutoff 钓鱼**：捏造不存在的模型/框架/版本，观察候选人反应",
  "fact": "以编造不存在的模型/框架/版本作为诱饵，观察候选人反应来识别AI辅助。",
  "rubric": {
   "must_include": [
    "捏造一个不存在的模型/框架/版本",
    "观察候选人反应"
   ],
   "reference_answer": "编个并不存在的模型或框架版本当作话题，观察对方的反应。"
  }
 },
 {
  "cid": "bestpractice_interview_evaluation#1",
  "target": "bestpractice_interview_evaluation",
  "question": "我在做 Magic Leap 的视觉定位落地，特征匹配到底该优先选传统方案还是流行的深度匹配网络？给个明确推荐。",
  "excerpt": "Magic Leap 实践中 ORB 特征优于 Superglue 等前沿方案——经典算法在特定场景仍有价值。",
  "fact": "在 Magic Leap 的实践中，ORB 比 Superglue 表现更好。",
  "rubric": {
   "must_include": [
    "ORB 优于 Superglue"
   ],
   "reference_answer": "在 Magic Leap 的实践里优先用 ORB，效果优于 Superglue。"
  }
 },
 {
  "cid": "bestpractice_markdown_html_conversion#0",
  "target": "bestpractice_markdown_html_conversion",
  "question": "用 Pandoc 把一段说明后面紧接着的星号列表转成 HTML，结果没变成项目符号，被当成普通文本了。Markdown 应该怎么改，具体需要在什么位置加什么？",
  "excerpt": "Markdown 转换器（如 Pandoc）通常需要列表（无序或有序列表）与其上方的段落之间有一个**完整的空行**。",
  "fact": "段落与其后列表之间必须留出一个完整的空行，否则列表会被当作普通文本。",
  "rubric": {
   "must_include": [
    "在段落和列表之间插入一整行空白/完整的空行"
   ],
   "reference_answer": "在段落与后面的列表之间插入一整行空白（一个完整的空行），再用 Pandoc 转换即可。"
  }
 },
 {
  "cid": "bestpractice_markdown_html_conversion#1",
  "target": "bestpractice_markdown_html_conversion",
  "question": "我用 cat 把多个 Markdown 拼起来再用 Pandoc 转网页，有时下一个文件开头的 # 标题会粘到上一个段落里。合并时文件之间该插入多少个换行？脚本里应该怎么写？",
  "excerpt": "当合并多个 Markdown 文件为一个大文档时，必须在文件之间插入**至少两个换行符**（即一个空行）。\n\n- **原因**：如果前一个文件以文本结束，而下一个文件以 `#` 标题开始，且中间没有空行，解析器可能会将标题逻辑混淆。\n- **最佳实践**：在 `cat` 或脚本合并时显式添加 `\\n\\n`。",
  "fact": "合并多个 Markdown 文件时，文件之间必须插入至少两个换行符（一个空行）；在合并脚本中应显式添加 \\n\\n。",
  "rubric": {
   "must_include": [
    "至少两个换行符（一个空行）",
    "在合并脚本中显式添加 \\n\\n"
   ],
   "reference_answer": "在每个文件之间插入至少两个换行符（一个空行）；在合并脚本里显式追加“\\n\\n”。"
  }
 },
 {
  "cid": "bestpractice_pdf_to_markdown#0",
  "target": "bestpractice_pdf_to_markdown",
  "question": "我在用 uv 建的 .venv 里，执行 venv/bin/python -m pip install docling 提示 No module named pip。正确的安装方式是什么？",
  "excerpt": "**venv 里 pip 不存在**。在用 uv 创建的 venv 里通常没装 pip，`venv/bin/python -m pip install` 会报 `No module named pip`。改用 `uv pip install --python .venv/bin/python <pkg>`。",
  "fact": "在 uv 创建的 venv 里没有 pip，需用 uv 的命令并通过 --python 指向 .venv/bin/python 安装包。",
  "rubric": {
   "must_include": [
    "使用 uv pip install",
    "包含 --python .venv/bin/python 参数",
    "给出要安装的包名（例如 docling）"
   ],
   "reference_answer": "用 uv 安装：uv pip install --python .venv/bin/python docling"
  }
 },
 {
  "cid": "bestpractice_pdf_to_markdown#1",
  "target": "bestpractice_pdf_to_markdown",
  "question": "想用你们的 PDF→Markdown CLI 检查本机的 LM Studio 是否在线并且已加载目标模型，应该运行哪条命令（要 JSON 输出）？",
  "excerpt": "python rules/skills/pdf_to_markdown_cli.py doctor --check-lmstudio --format json",
  "fact": "用 CLI 的 doctor 子命令加 --check-lmstudio，并配合 --format json 可检测 LM Studio 与模型加载状态并输出 JSON。",
  "rubric": {
   "must_include": [
    "使用 doctor 子命令",
    "包含 --check-lmstudio 选项",
    "包含 --format json"
   ],
   "reference_answer": "运行：python rules/skills/pdf_to_markdown_cli.py doctor --check-lmstudio --format json"
  }
 },
 {
  "cid": "bestpractice_product_decision_analysis#0",
  "target": "bestpractice_product_decision_analysis",
  "question": "我在用这套方法评估一个新功能，做到“成本结构里的位置”这一步时，最后到底要分清哪件事，才能下判断？",
  "excerpt": "**核心判断**：它是在创造新的可能性（0→1），还是在降低已有能力的门槛（专家→大众）？这两者的战略含义完全不同。",
  "fact": "在第 5 步，必须判断它是创造新可能性还是降低已有能力门槛。",
  "rubric": {
   "must_include": [
    "明确区分“创造新可能性”与“降低已有能力门槛”",
    "指出这是在“成本结构位置”这一步要做的关键判断"
   ],
   "reference_answer": "要判断它是创造了新的可能性，还是把已有能力的门槛降下来了。"
  }
 },
 {
  "cid": "bestpractice_product_decision_analysis#1",
  "target": "bestpractice_product_decision_analysis",
  "question": "当我想判断某个功能处在技术采用的哪个阶段时，这个框架建议我参考哪条公理来校准分析？",
  "excerpt": "| 第 5 步：成本结构定位 | A13（技术采用三阶段） | 当需要判断功能处于 Driver/Co-pilot/Architect 哪个阶段时 |",
  "fact": "判断功能所处采用阶段时，应在第 5 步使用公理 A13。",
  "rubric": {
   "must_include": [
    "明确回答使用 A13",
    "将其与“判断采用阶段”这一条件关联起来"
   ],
   "reference_answer": "用 A13（技术采用三阶段）。"
  }
 },
 {
  "cid": "bestpractice_skill_writing#0",
  "target": "bestpractice_skill_writing",
  "question": "我刚起草了一份新的 agent 能力说明，“坑与教训”这一节需要现在就填满一些可能出错的点吗？还是可以先留空，等以后遇到问题再补？",
  "excerpt": "这里要特别强调：**不要在一开始凭空预测“可能的坑”来凑这一节。** 已知陷阱应该来自实际失败、返工、误判或多轮迭代中的真实教训。一个新 skill 在初版时完全可以没有这一节，或者只留一个很短的占位说明。只有当某个错误真的发生过，且未来高概率会重复发生时，它才值得被写进 meta 层的已知陷阱。",
  "fact": "已知问题章节不要凭空编造，初版可留空或占位，只记录真实发生且可能复现的错误。",
  "rubric": {
   "must_include": [
    "不要预先罗列假想的“坑”",
    "初版可以没有或仅保留很短的占位",
    "仅当错误真实发生且高概率复现时才写入"
   ],
   "reference_answer": "不要提前编造“坑”；初版可以不写或只放占位，只有真实发生且可能重复的问题才写进这一节。"
  }
 },
 {
  "cid": "bestpractice_skill_writing#1",
  "target": "bestpractice_skill_writing",
  "question": "我在仓库里新增了一份技能文档，提交前为了让别人能在目录里发现它，我需要更新哪个索引文件？请给出相对路径。",
  "excerpt": "| 忘记更新 INDEX.md | 新 skill 没人能找到 | 写完 skill 后立即更新 `rules/skills/INDEX.md` |",
  "fact": "新增 skill 后必须立即更新 rules/skills/INDEX.md 索引文件。",
  "rubric": {
   "must_include": [
    "rules/skills/INDEX.md"
   ],
   "reference_answer": "`rules/skills/INDEX.md`。"
  }
 },
 {
  "cid": "bestpractice_staged_approach#0",
  "target": "bestpractice_staged_approach",
  "question": "我准备用脚本批量对我们的数据库做清理操作，先做一次“试运行”的话，需要具体核对哪些事项才能放心正式执行？",
  "excerpt": "Dry Run 检查清单：\n- [ ] 确认操作范围（影响哪些文件/记录）\n- [ ] 确认操作内容（具体变更是什么）\n- [ ] 确认可回滚（有备份或版本控制）\n- [ ] 确认执行环境（不是生产环境）",
  "fact": "Dry Run 的检查清单要求核对操作范围、变更内容、可回滚性以及执行环境必须非生产。",
  "rubric": {
   "must_include": [
    "操作范围与受影响对象",
    "具体变更内容",
    "可回滚（有备份或版本控制）",
    "执行环境不是生产环境"
   ],
   "reference_answer": "需要核对操作范围、具体变更内容、是否可回滚（有备份/版本控制）、以及确认执行环境不是生产环境。"
  }
 },
 {
  "cid": "bestpractice_staged_approach#1",
  "target": "bestpractice_staged_approach",
  "question": "我在做一批日志转换，源数据还在不断更新；为了提速，能否边从线上抓取边在本地开始处理，还是必须满足什么条件才能开始下一步？",
  "excerpt": "- 完整拉取源数据到本地\n- 与线上系统隔离\n- 数据落盘后才进入下一阶段\n- 目标：确保后续处理有稳定的数据基础",
  "fact": "进入处理阶段前，必须先完整拉取源数据到本地并确认已落盘，不能边拉边处理。",
  "rubric": {
   "must_include": [
    "源数据要完整拉到本地",
    "必须在数据已落盘后才能进入下一阶段"
   ],
   "reference_answer": "必须先把源数据完整拉到本地并确认已落盘，然后再进入处理阶段，不能边拉边处理。"
  }
 },
 {
  "cid": "bestpractice_temporal_info_verification#0",
  "target": "bestpractice_temporal_info_verification",
  "question": "我这边有个看起来很新的库版本号，想让你在线核实一下是否已发布。你会用哪种搜索服务来查，并把搜索深度和最多返回条数具体设成多少？",
  "excerpt": "## 搜索模板\n\n```\n{产品名} {版本号} release date\n{产品名} {版本号} official announcement\n```\n\n使用 Tavily 搜索，`search_depth=\"advanced\"`，`max_results=5`。",
  "fact": "核实时要用 Tavily，并将 search_depth 设为 advanced，max_results 设为 5。",
  "rubric": {
   "must_include": [
    "使用 Tavily 搜索",
    "search_depth=advanced",
    "max_results=5"
   ],
   "reference_answer": "用 Tavily 搜索，深度设为 advanced，最多取 5 条结果。"
  }
 },
 {
  "cid": "bestpractice_temporal_info_verification#1",
  "target": "bestpractice_temporal_info_verification",
  "question": "我给你一组设备参数，担心有些数值违反基本物理规律。你通常会按哪三步去做快速校验，尤其发现异常时会如何处理？",
  "excerpt": "### 执行方式\n\n1. 识别输出中涉及物理量的部分\n2. 用已知物理常识（单位换算、量级、定律）做快速校验\n3. 发现异常时要求 AI 重新解释或搜索验证",
  "fact": "物理锚点校验需按三步执行：识别物理量、用物理常识做快速校验、异常时要求重新解释或搜索验证。",
  "rubric": {
   "must_include": [
    "识别涉及物理量",
    "用已知物理常识做快速校验",
    "发现异常时要求重新解释或搜索验证"
   ],
   "reference_answer": "先识别涉及的物理量，再用物理常识做快速校验，若发现异常则要求重新解释或发起搜索验证。"
  }
 },
 {
  "cid": "compressor#0",
  "target": "compressor",
  "question": "我用 Compressor 的命令行监控一个批次，把输出为 JSON 的参数放在命令最后就报错。这个参数应该放在命令的哪个位置才不会出错？",
  "excerpt": "On at least some Compressor versions, `-format json` must be placed immediately after `-monitor`. Placing it at the end can fail with `Invalid parameter: -format`.",
  "fact": "在部分版本中，-format json 必须紧跟在 -monitor 之后，放在命令末尾会报无效参数。",
  "rubric": {
   "must_include": [
    "明确说明 -format json 要紧跟在 -monitor 之后",
    "指出放在命令末尾会导致参数无效错误"
   ],
   "reference_answer": "把 -format json 紧跟在 -monitor 后面（不要放在命令末尾）。"
  }
 },
 {
  "cid": "compressor#1",
  "target": "compressor",
  "question": "用 Compressor CLI 提交转码时，我给 -locationpath 只传了输出目录，结果不是报错就是没有可验证的产物。这个参数到底要怎么写才对？",
  "excerpt": "`-locationpath` must be a complete output file path, including the output file name. It cannot be only an output directory.",
  "fact": "-locationpath 必须是包含文件名的完整输出文件路径，不能只给目录。",
  "rubric": {
   "must_include": [
    "要求提供包含文件名的完整输出路径",
    "明确不能只传输出目录"
   ],
   "reference_answer": "为每个目标用 -locationpath 指定包含文件名的完整输出路径（例如 ~/Downloads/output.mov），不能只给目录。"
  }
 },
 {
  "cid": "delayed_execution#0",
  "target": "delayed_execution",
  "question": "不安装进程管理器的情况下，我想用你们推荐的临时方案，让一个命令在 1 小时后自动执行，退出终端也不受影响，并把标准输出和错误都写到固定的日志文件。应该怎么写这条命令？",
  "excerpt": "```bash\n# 语法：nohup bash -c 'sleep <秒数> && <命令>' > /tmp/delayed_task.log 2>&1 &\nnohup bash -c 'sleep 3600 && /path/to/script.sh' > /tmp/delayed_task.log 2>&1 &\ndisown\n```",
  "fact": "用简易方案时，应使用 nohup bash -c 'sleep <秒数> && <命令>' 将输出与错误重定向到 /tmp/delayed_task.log 后台运行，并执行 disown；1 小时示例为 sleep 3600。",
  "rubric": {
   "must_include": [
    "使用 nohup bash -c 'sleep 3600 && <命令>'",
    "将输出与错误重定向到 /tmp/delayed_task.log（> … 2>&1）",
    "运行后执行 disown"
   ],
   "reference_answer": "运行 nohup bash -c 'sleep 3600 && <命令>' > /tmp/delayed_task.log 2>&1 & 后再执行 disown。"
  }
 },
 {
  "cid": "delayed_execution#1",
  "target": "delayed_execution",
  "question": "我要在明天自动提交一个需要 AI 判断的 OpenCode 任务，应该先后用哪些工具来预检和定时触发？请给出明确的先后顺序。",
  "excerpt": "对于需要 AI 判断的延时任务，正确组合是：先用 `opencode_skill submit --dry-run` 预检提交链路，再用 `process-launcher` 在未来时间触发真实 `opencode_skill submit`。不要在本 starter skill 里维护私有 OpenCode endpoint、模型、agent 或本地路径。",
  "fact": "需要 AI 判断的延时任务应先用 opencode_skill submit --dry-run 预检，再由 process-launcher 在未来时间触发真实的 opencode_skill submit。",
  "rubric": {
   "must_include": [
    "先用 opencode_skill submit --dry-run 做预检",
    "再用 process-launcher 定时触发真实的 opencode_skill submit"
   ],
   "reference_answer": "先用 opencode_skill submit --dry-run 做预检，再用 process-launcher 定时触发真实的 opencode_skill submit。"
  }
 },
 {
  "cid": "deployment_github_actions_koyeb#0",
  "target": "deployment_github_actions_koyeb",
  "question": "用 GitHub Actions 部署到 Koyeb 时，它老是按语言检测走了 buildpack 而不是用我的 Dockerfile。要在那一步里填哪个入参、具体值是什么，才能强制按容器构建？",
  "excerpt": "## 核心原则\n\n1. **关闭 Koyeb Autodeploy**——部署时机由 GitHub Actions 控制\n2. **`needs` 门控**——所有测试通过后才触发部署\n3. **显式指定 `git-builder: \"docker\"`**——否则 Koyeb 会检测到 Python/Node 文件而回退到 buildpack",
  "fact": "在 Koyeb 的 Git 部署中必须把 git-builder 显式设为 docker，否则会回退到 buildpack。",
  "rubric": {
   "must_include": [
    "git-builder",
    "docker"
   ],
   "reference_answer": "把部署步骤的 git-builder 入参明确设置为 \"docker\"，即可强制走 Docker 构建而不是 buildpack。"
  }
 },
 {
  "cid": "deployment_github_actions_koyeb#1",
  "target": "deployment_github_actions_koyeb",
  "question": "我要把 FastAPI 容器部署到 Koyeb，Dockerfile 里的启动命令端口该怎么写，才能用平台动态分配的端口而不是固定 8000？请给出确切写法。",
  "excerpt": "## 前提\n\n- Koyeb 控制台已创建应用和服务，且 **Autodeploy 已关闭**（Settings → Source → Autodeploy）\n- 项目根目录有 `Dockerfile`，包含 `EXPOSE` 和 `CMD`\n- `Dockerfile` 的 `CMD` 使用 `${PORT:-8000}` 以适配 Koyeb 动态端口",
  "fact": "Dockerfile 的 CMD 必须使用 ${PORT:-8000} 来适配 Koyeb 的动态端口。",
  "rubric": {
   "must_include": [
    "Dockerfile 的 CMD",
    "${PORT:-8000}"
   ],
   "reference_answer": "在 Dockerfile 的 CMD 中把端口写成 ${PORT:-8000}，以适配 Koyeb 动态分配的端口。"
  }
 },
 {
  "cid": "growth_analytics#0",
  "target": "growth_analytics",
  "question": "我有两个站点，想用同一套脚本拉 GSC 报表。默认会查哪个 property？如果要切到另一个域名，命令里该怎么写，有没有环境变量可以用？给出具体写法。",
  "excerpt": "- 默认 Site URL：`sc-domain:example.com`（域名级 property，替换为你的实际域名）\n- 若有多个域名，可通过 `GSC_SITE_URL` 环境变量或 `--site sc-domain:<your-domain>` 直接查询",
  "fact": "GSC 默认用域名级 property（sc-domain:前缀），可通过 GSC_SITE_URL 或命令参数 --site sc-domain:<your-domain> 指定其它域名。",
  "rubric": {
   "must_include": [
    "默认是域名级 property（sc-domain:前缀）",
    "可用 GSC_SITE_URL 环境变量切换",
    "或用 --site sc-domain:<your-domain> 在命令行切换"
   ],
   "reference_answer": "默认用域名级 property（sc-domain:example.com）；换域名要么设 GSC_SITE_URL，要么在命令里加 --site sc-domain:<你的域名>。"
  }
 },
 {
  "cid": "growth_analytics#1",
  "target": "growth_analytics",
  "question": "我想把短链点击直接和支付订单对上，能不能在一条 SQL 里把短链数据表和支付表直接连接？如果不行，请说出正确的关联路径，并说明需要声明的口径限制。",
  "excerpt": "3. **short_url -> 支付**：没有直接 join。要经过 `circle_tag_name -> 社区 member -> email -> 支付平台` 这条间接链路，并明确写出口径局限",
  "fact": "短链与支付不能直接关联，必须走 circle_tag_name→社区成员→email→支付平台的间接链路，并需声明口径局限。",
  "rubric": {
   "must_include": [
    "说明没有直接 join",
    "给出完整链路：circle_tag_name -> 社区 member -> email -> 支付平台",
    "强调需要明确口径局限"
   ],
   "reference_answer": "不能直接连；需走 circle_tag_name → 社区成员 → email → 支付平台这条链路，并在分析中明确口径局限。"
  }
 },
 {
  "cid": "mac_universal_clipboard#0",
  "target": "mac_universal_clipboard",
  "question": "我的 Mac 和 iPhone 之间复制粘贴经常不同步，重启也不行。我愿意用终端执行一条命令，你能给出包含要修改的具体偏好项位置，以及需要重启的所有相关后台进程名称的完整命令吗？",
  "excerpt": "defaults write ~/Library/Preferences/com.apple.coreservices.useractivityd.plist ClipboardSharingEnabled 1; \\\nkillall useractivityd 2>/dev/null; \\\nkillall sharingd 2>/dev/null; \\\nkillall pboard 2>/dev/null; \\",
  "fact": "将 ClipboardSharingEnabled 写为 1，并重启 useractivityd、sharingd、pboard 三个进程以重置通用剪贴板。",
  "rubric": {
   "must_include": [
    "将 ~/Library/Preferences/com.apple.coreservices.useractivityd.plist 的 ClipboardSharingEnabled 设为 1",
    "重启/killall 这三个进程：useractivityd、sharingd、pboard"
   ],
   "reference_answer": "在终端把 ~/Library/Preferences/com.apple.coreservices.useractivityd.plist 的 ClipboardSharingEnabled 写成 1，然后依次 killall useractivityd、sharingd、pboard 让它们由 launchd 重启即可。"
  }
 },
 {
  "cid": "mac_universal_clipboard#1",
  "target": "mac_universal_clipboard",
  "question": "我打算在 zsh 里查看这类问题的系统日志，直接敲 log show 有时行为异常。应该用哪个精确的可执行路径来运行它？",
  "excerpt": "在 zsh 里用 `/usr/bin/log`，不要直接用 `log`，因为某些环境里 `log` 可能解析成 shell builtin 或 function。",
  "fact": "在 zsh 下应显式调用 /usr/bin/log，而不是裸用 log，以避免被内建或函数遮蔽。",
  "rubric": {
   "must_include": [
    "使用 /usr/bin/log（不要直接用 log）"
   ],
   "reference_answer": "用 /usr/bin/log（不要直接调用 log，zsh 里可能被内建或函数覆盖）。"
  }
 },
 {
  "cid": "openreview#0",
  "target": "openreview",
  "question": "我在跑 papers 命令时加了 -o 保存到文件，为什么终端不再显示整份结果？它会在屏幕上输出什么内容？",
  "excerpt": "默认 stdout JSON。加 `-o path.json` 写文件（stdout 只返回 `{\"status\":\"ok\",\"file\":\"...\",\"summary\":\"...\"}`）。",
  "fact": "使用 -o 保存到文件时，标准输出不再打印完整数据，只输出包含 status、file、summary 的简要 JSON。",
  "rubric": {
   "must_include": [
    "说明加 -o 后不会打印完整结果",
    "指出只会输出包含 status、file、summary 的简要 JSON"
   ],
   "reference_answer": "加 -o 后，终端只会打印一个包含 status、file、summary 的简要 JSON，而不是完整数据。"
  }
 },
 {
  "cid": "openreview#1",
  "target": "openreview",
  "question": "我连续执行了几次查询后现在所有请求都报 403，账号没变，怎么立刻恢复？需要删哪个本地缓存再重试？",
  "excerpt": "4. **Login rate limit。** 每个时间窗口最多 3 次登录。CLI 已做 token 缓存，正常使用不会触发。如果 token 过期导致 403，删除 `tmp/openreview_token.json` 后重试一次即可。",
  "fact": "出现 403 时删除 tmp/openreview_token.json 再重试一次即可恢复。",
  "rubric": {
   "must_include": [
    "明确要删除 tmp/openreview_token.json",
    "说明删除后重试一次即可"
   ],
   "reference_answer": "删除 tmp/openreview_token.json 后重试一次即可。"
  }
 },
 {
  "cid": "playwright_ajax_capture#1",
  "target": "playwright_ajax_capture",
  "question": "我想用 requests 复现一个已登录站点的内部接口：列表类 GET 要不要带防跨站 token？发帖/删帖具体该加哪个请求头，token 一般从哪拿最稳？",
  "excerpt": "- **Cookie + CSRF**：最常见。GET 请求只要带 cookie；POST/PUT/DELETE 还要带 `X-CSRF-Token` header（值通常来自名为 `csrf_token` 的 cookie 或 `<meta name=\"csrf-token\">`）。验证方法：用 fetch + `credentials:\"include\"` 不显式带 Authorization header 发一个 GET，如果 200 说明 cookie-only 就够。",
  "fact": "GET 仅需带 cookie；POST/PUT/DELETE 必须加 X-CSRF-Token，值通常来自 csrf_token cookie 或页面 csrf meta。",
  "rubric": {
   "must_include": [
    "GET 只带 cookie，不加 CSRF/JWT",
    "POST/PUT/DELETE 需要 X-CSRF-Token 请求头",
    "token 来源是 csrf_token cookie 或页面的 csrf meta"
   ],
   "reference_answer": "GET 不用带 CSRF/JWT，只带 cookie；写操作加 X-CSRF-Token，请从名为 csrf_token 的 cookie（或页面的 csrf meta）取值。"
  }
 },
 {
  "cid": "project_scaffold#0",
  "target": "project_scaffold",
  "question": "我的仓库准备开源，交付前需要做一次隐私排查。请给出要执行的具体命令（包含需要匹配的关键字），以及什么条件才算检查通过。",
  "excerpt": "3. Public repo 必须跑隐私扫描：\n\n   ```bash\n   rg -n \"真实邮箱|真实手机号|内部服务器|op://|private key pattern\" .\n   ```\n\n   零匹配才通过。如果匹配到了，逐个修复后再扫。",
  "fact": "公开仓库交付前必须用 rg 扫描指定敏感串，且结果为零匹配才通过。",
  "rubric": {
   "must_include": [
    "使用 rg -n \"真实邮箱|真实手机号|内部服务器|op://|private key pattern\" .",
    "零匹配才通过"
   ],
   "reference_answer": "运行 rg -n \"真实邮箱|真实手机号|内部服务器|op://|private key pattern\" .，并且扫描结果为零匹配才算通过；若有命中需逐个修复后重扫。"
  }
 },
 {
  "cid": "project_scaffold#1",
  "target": "project_scaffold",
  "question": "我想给一个 Python 项目配 GitHub Actions，用 uv 安装依赖。能直接用 --system 模式装到 runner 自带 Python 吗？如果不行，正确的替代写法是什么？",
  "excerpt": "- **不要用 `uv pip install --system`**，GitHub Actions runner 的 Python 是 externally-managed，会报错。用 `uv venv` + `uv pip install` 代替。",
  "fact": "在 GitHub Actions 上不能用 uv 的 --system 安装；应先建 venv 再用 uv pip 安装到该 venv。",
  "rubric": {
   "must_include": [
    "不要在 GitHub Actions 上用 uv pip install --system",
    "改用 uv venv + uv pip install"
   ],
   "reference_answer": "不能；runner 的 Python 是 externally-managed，会报错，正确做法是先 uv venv 再用 uv pip install 安装到该虚拟环境。"
  }
 },
 {
  "cid": "share_report#0",
  "target": "share_report",
  "question": "用户没特别说要把文章列在列表页，这个索引开关我该默认怎么设置？",
  "excerpt": "**索引控制**（重要）：\n- **默认 `indexed: false`**——文章不出现在 index.html 列表中\n- 仅当用户明确说出以下意图时设为 `true`：\n  - \"加到索引\"、\"放到 index\"、\"公开列出\"、\"在索引里包括这篇\"\n- 不确定时，默认 `false`，事后可改",
  "fact": "列表索引默认关闭，只有在用户明确要求公开列出时才把 indexed 设为 true。",
  "rubric": {
   "must_include": [
    "明确默认是 indexed: false",
    "只有用户明确要求公开列出时才改为 true"
   ],
   "reference_answer": "保持 indexed: false（默认值），只有用户明确要求时才改成 true。"
  }
 },
 {
  "cid": "share_report#1",
  "target": "share_report",
  "question": "我把页面生成好了，需要把 site 目录里的 HTML 文件也提交到 Git 吗？",
  "excerpt": "- `site/` 下的 HTML 文件被 .gitignore 忽略，只有 manifest.json 和脚本被 git 追踪",
  "fact": "生成的 HTML 不需要提交到版本库，site/ 下的页面被 .gitignore 忽略。",
  "rubric": {
   "must_include": [
    "不要提交 site/ 下的 HTML 到 git",
    "说明这些文件被 .gitignore 忽略"
   ],
   "reference_answer": "不用，site/ 下的 HTML 被 .gitignore 忽略，不需要提交。"
  }
 },
 {
  "cid": "workflow_astra_coordinator#0",
  "target": "workflow_astra_coordinator",
  "question": "这轮主模型实际是 GPT‑6.1，但界面上挂了个“Astra”标签。如果我让你担任项目统筹，你会切换到那个特殊模式接管吗，还是继续按普通方式做事？",
  "excerpt": "本角色仅在同时满足以下两项条件时激活：\n1. 可信运行时确认主线程当前实际模型为 GPT-6 Astra，不能只依据 Agent 标签或显示名称。\n2. 用户在当前任务中明确请求主线程担任 coordinator 或 PI。\n\n模型身份未知、主模型非 Astra、用户仅要求多 agent、赞赏过往编排，或参考材料中出现相关术语，均不激活。",
  "fact": "仅在运行时确认主模型为 GPT-6 Astra且用户明确请求时才激活；标签或术语提及不触发。",
  "rubric": {
   "must_include": [
    "需要同时满足：运行时确认实际模型为 GPT-6 Astra 且用户明确请求担任该角色",
    "仅有标签/显示名称不足以触发",
    "主模型非 Astra 时不激活并继续常规执行"
   ],
   "reference_answer": "不会激活；只有在运行时确认当前模型确为 GPT‑6 Astra且你明确要求我担任该角色时才会进入该模式，否则继续按常规执行。"
  }
 },
 {
  "cid": "workflow_astra_coordinator#1",
  "target": "workflow_astra_coordinator",
  "question": "我这边有个外部任务启动器返回的 job id。能把它直接当作对方会话地址回信吗，还是可以默认它就等于当前会话的 id？",
  "excerpt": "不要断言 task id 永远等于或不等于 session id。用作地址前按当前运行时验证映射。Process Launcher 的 job id 不是 session 地址。传输回执，例如 `submitted` 或 HTTP 204，只证明传输层收下 handoff。确认收到、执行完成和验收分开记录。",
  "fact": "外部启动器的 job id 不是会话地址；用前必须按当前运行时验证映射，不能假定等于会话 id。",
  "rubric": {
   "must_include": [
    "job id 不是会话地址",
    "不得默认等于会话 id，需按运行时验证映射"
   ],
   "reference_answer": "不可以；这个 job id 不是会话地址，不能默认等于会话 id，用前必须按当前运行时去验证对应的会话地址。"
  }
 },
 {
  "cid": "workflow_bilibili_whisper_transcription#0",
  "target": "workflow_bilibili_whisper_transcription",
  "question": "我用这个脚本转写 B 站视频时，默认只会给我整篇文本。现在我还想在结果里把分段的小节也一并保留，命令行需要加哪个具体开关？",
  "excerpt": "默认只保留全文；只有明确需要分段文本时再加：\n\n```bash\n--include-segments\n```",
  "fact": "要保留分段文本，需在命令行额外加入 --include-segments 开关，默认不会输出分段。",
  "rubric": {
   "must_include": [
    "--include-segments"
   ],
   "reference_answer": "在命令里加 --include-segments。"
  }
 },
 {
  "cid": "workflow_bilibili_whisper_transcription#1",
  "target": "workflow_bilibili_whisper_transcription",
  "question": "我批量下载 B 站音频时总是被风控拦下，下载之间应该间隔多少秒才比较稳妥？",
  "excerpt": "**三阶段工作流：**\n\n1. **获取列表** → 使用 yt-dlp 提取视频ID（注意B站API限制，可能返回352错误）\n2. **单线程下载** → 逐个下载音频，每次间隔2-3秒，避免触发反爬\n3. **本地转录** → 默认运行 MLX Qwen ASR 1.7B；只有在兼容性或回归原因下才回退到 Whisper",
  "fact": "下载阶段必须单线程且每次下载间隔2-3秒以避免触发 B 站反爬。",
  "rubric": {
   "must_include": [
    "2-3秒"
   ],
   "reference_answer": "每次下载之间间隔 2-3 秒。"
  }
 },
 {
  "cid": "workflow_cognitive_profile_extraction#0",
  "target": "workflow_cognitive_profile_extraction",
  "question": "我打算在这套认知画像提取里一次性并行开 8 个子代理来做扫描，并用 run_in_background 的方式发起调用，这样可以吗？如果不行，正确的并行上限、任务重叠比例和调用方式分别是什么？",
  "excerpt": "Sub-agent 调度遵循 [并行 Subagent 工作流](./workflow_parallel_subagents.md) 的规则：并行度 ≤5，调研 overlap 30-50%，用 `multi_tool_use.parallel` 在同一条消息里包多个 `functions.task` 调用；不要使用旧的 `run_in_background=true` 写法。",
  "fact": "子代理并行度≤5，重叠30-50%，用multi_tool_use.parallel而非run_in_background。",
  "rubric": {
   "must_include": [
    "并行度不超过5",
    "任务重叠为30-50%",
    "使用multi_tool_use.parallel而不是run_in_background"
   ],
   "reference_answer": "不可以：并行度最多 5 个，调研重叠 30–50%，用 multi_tool_use.parallel 在同一条消息里封装多个 functions.task，不要用 run_in_background。"
  }
 },
 {
  "cid": "workflow_cognitive_profile_extraction#1",
  "target": "workflow_cognitive_profile_extraction",
  "question": "我准备把这次的公理报告生成网页并上传，请具体说下样式资源要怎么处理、该用什么方式上传整个站点，以及上线后需要做哪些最小化的可用性校验？",
  "excerpt": "2. 每个 HTML 文件独立自包含（CSS 用 `--embed-resources` 内嵌），不依赖外部样式表——这样单独打开任何子页面都能正常显示\n3. 用 rsync 整个文件夹上传，而非逐文件传——保证目录结构和链接一致\n4. 上传后用 curl 验证索引页和至少 2 个子页面的 HTTP 200",
  "fact": "发布站点时需内嵌资源(--embed-resources)、用rsync整站上传，并用curl验证索引与至少两个子页返回200。",
  "rubric": {
   "must_include": [
    "CSS/资源用--embed-resources内嵌为自包含HTML",
    "使用rsync上传整个文件夹",
    "用curl验证索引页和至少2个子页面返回HTTP 200"
   ],
   "reference_answer": "HTML 转换时用 --embed-resources 内嵌资源生成自包含页面；用 rsync 把整个文件夹上传；上传后用 curl 检查索引页和至少两个子页面都返回 HTTP 200。"
  }
 },
 {
  "cid": "workflow_deep_research_survey#0",
  "target": "workflow_deep_research_survey",
  "question": "我用 Tavily 开始做这次深度调研，默认应该怎么设参数？特别是一次要抓多少条结果、搜索深度用哪个级别、要不要打开聚合答案？",
  "excerpt": "**Tavily 参数偏好**:\n- `max_results=6`（覆盖不足可提至 10）\n- `search_depth=\"advanced\"`\n- `include_answer=false`（直接看结果与原文摘录，不依赖聚合摘要）\n- 按需启用 `include_images` / `include_image_descriptions`",
  "fact": "Tavily 的推荐默认是 max_results=6（不足可提至10）、search_depth=advanced、include_answer=false。",
  "rubric": {
   "must_include": [
    "max_results=6（可提至10）",
    "search_depth 设为 advanced",
    "include_answer 设为 false"
   ],
   "reference_answer": "用 Tavily：max_results 设 6（不够再提到 10），search_depth 选 advanced，include_answer 设为 false。"
  }
 },
 {
  "cid": "workflow_deep_research_survey#1",
  "target": "workflow_deep_research_survey",
  "question": "这份调研写完后系统会不会自动把报告发布到外部平台？如果不会，什么时刻算真正完成交付？",
  "excerpt": "**交付终点**：写完 `contexts/survey_sessions/` 下的最终 MD 文件即为调研交付终点。不要自动发布到 blog、Twitter、Circle 或其他渠道；发布需要用户对当次动作作出显式指令。\n\n**存储位置**: `contexts/survey_sessions/<topic>_survey_YYYYMMDD.md`",
  "fact": "调研完成的判定是把最终 MD 写入 contexts/survey_sessions/，不会自动发布，发布需用户显式指令。",
  "rubric": {
   "must_include": [
    "不会自动发布到外部渠道",
    "完成标志是将最终 MD 写到 contexts/survey_sessions/ 目录（按指定命名）",
    "发布需用户显式指令"
   ],
   "reference_answer": "不会自动发布；当最终 MD 写到 contexts/survey_sessions/ 下（按 <topic>_survey_YYYYMMDD.md 命名）就算完成；对外发布需要我明确下达发布指示。"
  }
 },
 {
  "cid": "workflow_knowledge_flywheel#0",
  "target": "workflow_knowledge_flywheel",
  "question": "我在做一个语义检索的小工具，如果没有手动传入返回条数的参数，系统默认会给出多少条候选结果？",
  "excerpt": "# embedding + cosine similarity 足够处理大多数场景\ndef semantic_search(query, corpus, top_k=10):\n    query_emb = embed(query)\n    scores = [cosine(query_emb, doc_emb) for doc_emb in corpus_embs]\n    return top_k_indices(scores)",
  "fact": "语义检索函数未指定返回数量时的默认 top_k 是 10。",
  "rubric": {
   "must_include": [
    "10"
   ],
   "reference_answer": "默认是返回 10 条。"
  }
 },
 {
  "cid": "workflow_knowledge_flywheel#1",
  "target": "workflow_knowledge_flywheel",
  "question": "我想把文本里的人物关系抽成 JSON，三项字段名具体应该用什么？别给我你自己的命名，我要跟现有规范一致。",
  "excerpt": "# 强制 JSON 输出，便于后续处理\nprompt = \"\"\"\n从以下文本提取人物关系，输出 JSON 格式：\n{\"relations\": [{\"person_a\": \"...\", \"relation\": \"...\", \"person_b\": \"...\"}]}\n\"\"\"\n",
  "fact": "人物关系的 JSON 字段名固定为 person_a、relation、person_b。",
  "rubric": {
   "must_include": [
    "person_a",
    "relation",
    "person_b"
   ],
   "reference_answer": "使用 person_a、relation、person_b 这三个键。"
  }
 },
 {
  "cid": "workflow_parallel_subagents#1",
  "target": "workflow_parallel_subagents",
  "question": "我想在并行任务里把 subagent_type 直接写成 deepseek/deepseek-v4-pro 来用这个模型，可以吗？如果不行应该怎么配？",
  "excerpt": "`subagent_type` 是 OpenCode 原生 agent 名，不是模型名，也不是旧 `category`。OpenCode 会执行 `agent.get(subagent_type)`；找不到同名 agent 就报 `Unknown agent type`。\n\n内置 agent 与自定义 agent 的来源：\n\n- `general` / `explore` 是 OpenCode 源码内置 agent。\n- 其他命名 agent 来自 `~/.config/opencode/opencode.json`、项目 `opencode.json`，或 `.opencode/agent(s)/*.md`。\n- `provider/model` 只是底层模型入口。要能被 `task` 调用，必须包成 agent，例如 `writer_deepseek -> deepseek/deepseek-v4-pro`。",
  "fact": "subagent_type 必须是已注册的 agent 名而不是 provider/model；要用具体模型需先包装成 agent，否则会报 Unknown agent type。",
  "rubric": {
   "must_include": [
    "subagent_type 只能填已注册的 agent 名，不能填模型名",
    "否则会报 Unknown agent type",
    "要用指定模型需先在配置中将其包装成 agent 再调用"
   ],
   "reference_answer": "不可以，subagent_type 只能填已注册的 agent 名；模型名会报 Unknown agent type；要用该模型先把它在配置里包装成一个 agent（如 writer_deepseek→deepseek/deepseek-v4-pro）再调用。"
  }
 },
 {
  "cid": "workflow_public_consensus_net_income_audit#0",
  "target": "workflow_public_consensus_net_income_audit",
  "question": "我在给一组 A 股做 FY2026 一致预期净利润审计，某只股票在页面上找不到年度净利润，只显示净销售额和净利率。表里现在该如何标注当前状态，备注里要写哪些具体内容，才能符合规范？",
  "excerpt": "**derived 值必须降级标记。** 如果页面没有直接暴露 annual net income row，只能用 net sales × net margin 或半年度净利润加总，就把 `Current Source Status` 写成 derived / semiannual direct sum，并在 notes 写出公式。不要把 derived 伪装成 direct consensus。",
  "fact": "当没有直接年度净利润时，必须将状态标为 derived/半年度直和，并在备注中写明计算公式，且不得当作直接共识值。",
  "rubric": {
   "must_include": [
    "将当前状态标为派生值（derived）",
    "备注中明确写出净销售额 × 净利率的计算公式",
    "不得把该值当作直接的共识年度净利润"
   ],
   "reference_answer": "标成 derived，并在备注写明用净销售额 × 净利率推得，且不能当作直接共识值。"
  }
 },
 {
  "cid": "workflow_public_consensus_net_income_audit#1",
  "target": "workflow_public_consensus_net_income_audit",
  "question": "在 MarketScreener 上看 FY2026 的净利润时，年表是 2021–2028，我担心把 2027 误当 2026。要具体核对哪些信息才能避免年份列错位？",
  "excerpt": "**MarketScreener 年份列容易错位。** annual 表通常是 2021-2028，搜索摘要会把最后一列当 2026，或者把 2027 列误读成 2026。解决办法是必须同时检查 `Fiscal Period` header、announcement dates 和目标年份列。",
  "fact": "为避免 MarketScreener 年份列错位，必须同时检查 Fiscal Period 表头、公告日期和目标年份列。",
  "rubric": {
   "must_include": [
    "同时检查 Fiscal Period 表头",
    "检查公告日期（announcement dates）",
    "检查目标年份对应的列"
   ],
   "reference_answer": "需要同时核对 Fiscal Period 的表头、公告日期以及目标年份那一列，避免把 2027 误当 2026。"
  }
 },
 {
  "cid": "workflow_research_paper_survey_writing#0",
  "target": "workflow_research_paper_survey_writing",
  "question": "我在写一篇关于小模型推理的技术分析，想先铺背景和方法，到第4段再点题讲清楚结论和意义，这样安排可以吗？如果不行，最晚该在第几段把这两点说清楚？",
  "excerpt": "**第一层：发生了什么，为什么重要（前 3 段内必须交代完）**",
  "fact": "开头必须在前三段内交代论文做了什么以及为何重要。",
  "rubric": {
   "must_include": [
    "必须在前三段内完成",
    "同时交代“做了什么”和“为什么重要”"
   ],
   "reference_answer": "不可以，开头最晚必须在前三段内把论文做了什么以及为什么重要讲清楚。"
  }
 },
 {
  "cid": "workflow_research_paper_survey_writing#1",
  "target": "workflow_research_paper_survey_writing",
  "question": "我按这套流程做论文外部调研时，第二步具体要用哪种搜索服务？该搜哪些关键词，并且要重点整理哪三类外部信息？",
  "excerpt": "用 Tavily 搜索论文标题、作者名、关键方法名。关注三类信息：\n\n- **社区讨论**（Twitter/X、Reddit、HN）：有没有人复现、质疑、或者指出未被注意的细节\n- **同行评议**（OpenReview、NeurIPS/ICML reviews）：如果有公开 review，看 reviewer 的主要 concerns\n- **后续工作**：有没有人在这篇论文基础上改进，或者把它集成进了产品",
  "fact": "调研第二步要求用 Tavily 搜索论文标题、作者名和关键方法名，并关注社区讨论、同行评议、后续工作三类信息。",
  "rubric": {
   "must_include": [
    "使用 Tavily",
    "搜索论文标题、作者名、关键方法名",
    "三类信息是社区讨论、同行评议、后续工作"
   ],
   "reference_answer": "第二步用 Tavily 搜索论文标题、作者名和关键方法名，并重点整理社区讨论、同行评议与后续工作三类信息。"
  }
 },
 {
  "cid": "workflow_watchdog#0",
  "target": "workflow_watchdog",
  "question": "我在 Claude Code harness 里启动了一个要跑很久的代码生成任务，应该默认隔多久自动再醒来看一下它的进度？用哪个调度动作去设这个唤醒？",
  "excerpt": "派出任务后，设一个 reasonable 的巡检 wake-up，默认约 30 分钟（1800s）。Claude Code harness 用 `ScheduleWakeup`；其他 harness 用对应的定时机制（如 Process Launcher 的延时执行，见 `rules/skills/process_launcher.md`）。",
  "fact": "默认巡检唤醒约 30 分钟（1800s），在 Claude Code harness 用 ScheduleWakeup 设置。",
  "rubric": {
   "must_include": [
    "默认约 30 分钟（1800s）的巡检间隔",
    "使用 ScheduleWakeup 安排唤醒"
   ],
   "reference_answer": "默认约 30 分钟（1800s），用 ScheduleWakeup 安排唤醒。"
  }
 },
 {
  "cid": "workflow_watchdog#1",
  "target": "workflow_watchdog",
  "question": "我的后台批处理在 Claude Code 里似乎卡住了（老在同一步重试），需要先问我能不能停掉吗？如果要停，具体要用哪个动作？",
  "excerpt": "2. **鬼打墙卡住**：长时间无进展、同一步骤反复重试。把它 kill 掉（Claude Code 用 `TaskStop`），用已有的部分结果推进，或换方法重做。\n\n\"真忙 vs 卡住\"的判断自己做，不用问用户。这和 `rules/SOUL.md` 的自主执行契约一致：巡检和 kill 属于技术编排决策，自己推到底。",
  "fact": "遇到卡住时无需询问用户，直接终止；在 Claude Code 用 TaskStop 杀掉。",
  "rubric": {
   "must_include": [
    "无需询问用户，自主决策",
    "终止/kill 掉卡住的任务",
    "在 Claude Code 使用 TaskStop"
   ],
   "reference_answer": "不用征求用户，判断为卡住就直接终止，Claude Code 用 TaskStop 停掉。"
  }
 },
 {
  "cid": "antigravity_cli#0",
  "target": "antigravity_cli",
  "question": "我在 CI 里已经设置了 GEMINI_API_KEY，但 agy 还是提示未授权，agy models 也列不出模型。到底应该怎么登录，才能让命令行用上我的订阅？",
  "excerpt": "- **Authentication Channel**: `agy` authenticates via Antigravity subscription credentials stored in the system keyring. It does not read `GEMINI_API_KEY`. If `agy models` fails to list models, sign in via the Antigravity desktop application. Do not fall back to `GEMINI_API_KEY` (that routes to a distinct API billing path).",
  "fact": "agy 不读取 GEMINI_API_KEY；需通过桌面应用登录把订阅凭据写入系统钥匙串，且不要用 GEMINI_API_KEY 兜底。",
  "rubric": {
   "must_include": [
    "说明 agy 不会使用 GEMINI_API_KEY 环境变量",
    "指明需在 Antigravity 桌面应用中登录以写入系统钥匙串",
    "明确不要用 GEMINI_API_KEY 作为兜底/该路径是不同计费"
   ],
   "reference_answer": "agy 使用系统钥匙串中的订阅凭据，不读取 GEMINI_API_KEY；先在 Antigravity 桌面应用里登录让 agy models 能列出模型，不要用 GEMINI_API_KEY 兜底（那是不同计费通道）。"
  }
 },
 {
  "cid": "antigravity_cli#1",
  "target": "antigravity_cli",
  "question": "在我的流水线里用 agy --print 跑任务，有时会一直卡住不结束。这个命令的内部超时默认是多少？应该怎么设置，避免永远挂起又能保证日志正常落盘？",
  "excerpt": "`--print-timeout` | Internal execution timeout; 1.2.0 defaults to **0** (wait until the turn completes). Set explicitly (e.g. `10m`) so a stuck turn cannot hang forever; keep the outer wrapper timeout higher so logs can flush.",
  "fact": "1.2.0 下 --print-timeout 默认是 0，需显式设置（如 10m）且外层超时要更长以便日志刷新。",
  "rubric": {
   "must_include": [
    "指出默认值为 0（等待直到该轮完成）",
    "要求显式传入 --print-timeout（示例 10m）",
    "外层包装超时需设得更高以便日志刷新"
   ],
   "reference_answer": "默认内部超时是 0；请显式加 --print-timeout（如 10m），并把外层超时设得更长，避免挂死且保证日志能刷到磁盘。"
  }
 },
 {
  "cid": "claude_code#0",
  "target": "claude_code",
  "question": "在 Claude Code CLI 里我想强制关闭所有内置工具（包括 Bash/Read/Write），避免它改动文件，只让它给出文字结果。命令行该怎么写，具体要给哪个参数什么值？",
  "excerpt": "| `--tools` | Built-in allow list (e.g., `Bash,Edit,Read`). `default` preserves all tools; `\"\"` disables tools. |",
  "fact": "将 --tools 设为空字符串（\"\"）可以禁用所有工具。",
  "rubric": {
   "must_include": [
    "--tools \"\"",
    "说明这是禁用所有工具的做法"
   ],
   "reference_answer": "在命令里加 --tools \"\"（空字符串），这会禁用所有工具。"
  }
 },
 {
  "cid": "claude_code#1",
  "target": "claude_code",
  "question": "我想把我们编排器里的会话 ID 传给 Claude Code，用 --resume 让它延续之前的对话，这样可行吗？如果不行，应该用什么方式正确续上会话？",
  "excerpt": "- Claude Code sessions are independent of the parent orchestrator's sessions. Resume only via `claude -c` or `claude -r`. Do not supply a parent orchestrator session ID to `--resume`.",
  "fact": "Claude Code 会话独立，不能把父编排器会话ID传给 --resume，续聊只能用 -c 或 -r。",
  "rubric": {
   "must_include": [
    "不要把父编排器的会话ID传给 --resume",
    "使用 claude -c 或 claude -r 来恢复会话"
   ],
   "reference_answer": "不可以；Claude Code 会话是独立的，只能用 claude -c 或 claude -r 来恢复，别把父编排器的会话 ID 传给 --resume。"
  }
 },
 {
  "cid": "codex_cli#0",
  "target": "codex_cli",
  "question": "我想用 codex exec 运行一次任务：一部分提示从管道输到 stdin，同时命令里也写了一个位置参数提示。最终会用哪段为主？两者会如何合并？",
  "excerpt": "Stdin input: A prompt argument of `-` reads from stdin. If both a positional prompt and stdin are provided, stdin is appended inside a `<stdin>` block.",
  "fact": "同时提供位置参数提示和 stdin 时，stdin 会作为一个 <stdin> 块追加在后面而不是覆盖。",
  "rubric": {
   "must_include": [
    "stdin 不会覆盖位置参数，而是被追加",
    "追加内容被包在一个 <stdin> 块里"
   ],
   "reference_answer": "同时提供两者时，位置参数提示保留不变，stdin 内容会作为一个 <stdin> 块被追加在其后。"
  }
 },
 {
  "cid": "codex_cli#1",
  "target": "codex_cli",
  "question": "我把 Codex 指向一个第三方兼容后端后总是报 web_search 工具不支持，想在配置里彻底关掉这个能力：具体应该写哪一行、用什么值，放在配置文件的哪个层级？布尔值能不能用？",
  "excerpt": "Disable it as a bare top-level key `web_search = \"disabled\"` in the base config or in the profile file the run loads (profile files layer over the base config). The value is a string unit variant: on 0.156.1 only `\"disabled\"` parses (`false`, `on`, `off`, and `enabled` are all rejected with `expected string only in 'web_search'`).",
  "fact": "要禁用默认的 web_search，需在配置顶层写 web_search = \"disabled\"（字符串），可放在基础配置或加载的 profile 中；布尔值无效。",
  "rubric": {
   "must_include": [
    "配置为顶层裸键，并写成 web_search = \"disabled\"",
    "值必须是字符串 \"disabled\"，布尔值会被拒绝",
    "可写在基础配置或该次运行加载的 profile 文件中"
   ],
   "reference_answer": "在配置顶层添加 web_search = \"disabled\"（必须是字符串，布尔值会被拒绝），可放在基础配置或此次运行加载的 profile 中即可。"
  }
 },
 {
  "cid": "cursor_cli#0",
  "target": "cursor_cli",
  "question": "我在一台无头服务器上用 Cursor 命令行登录，浏览器页面已经提示成功了，这时把启动登录的进程关掉可以吗？如果不可以，应该用什么方式执行才能确保凭据真正落盘？",
  "excerpt": "Login Recovery\n\nThe browser challenge requires the `cursor agent login` process to stay alive to receive the callback. If the waiting process is killed, the browser succeeds but tokens are never written. Run it detached (`nohup cursor agent login ... &`) or interactively in a terminal you control, then verify with `cursor agent about`.",
  "fact": "浏览器登录时必须保持 cursor agent login 进程存活，否则令牌不会写入；可用 nohup 后台运行或在交互式终端执行，并用 about 验证。",
  "rubric": {
   "must_include": [
    "必须保持登录进程存活，不能中途杀掉",
    "推荐用 nohup 后台运行或在受控终端交互执行，随后用 cursor agent about 验证"
   ],
   "reference_answer": "不可以，登录进程必须保持存活接收回调；用 nohup cursor agent login ... & 后台跑或在你控制的终端里交互执行，完成后再用 cursor agent about 验证。"
  }
 },
 {
  "cid": "cursor_cli#1",
  "target": "cursor_cli",
  "question": "想在 Cursor 的 CLI 里控制是否走快速路由，有没有专门的 --fast 选项？如果我要把某模型设为 fast=false，该怎么写 --model 参数，需不需要把整个参数用引号包起来？",
  "excerpt": "Fast is not a `--fast` flag\n\nThere is still no `--fast` flag. Speed is selected in two ways:\n\n1. **Suffix IDs** from `--list-models`: `composer-2.5` vs `composer-2.5-fast`, `cursor-grok-4.6-high` vs `cursor-grok-4.6-high-fast`.\n2. **Bracket overrides** on `--model`: `'claude-opus-4-8[context=1m,effort=high,fast=false]'`. Quote the whole token so the shell does not split on `[` / `]`.",
  "fact": "没有 --fast 旗标；需用 --model 的括号覆盖设置 fast=false，并且整个模型字符串必须加引号避免被 shell 分割。",
  "rubric": {
   "must_include": [
    "明确没有 --fast 选项",
    "用 --model 的括号参数将 fast=false 指定",
    "必须把整个模型标识用引号包起来"
   ],
   "reference_answer": "没有 --fast 选项；用 --model 'claude-opus-4-8[context=1m,effort=high,fast=false]' 这类括号覆盖来设定，并且要给整个模型字符串加引号以防被 shell 按方括号拆分。"
  }
 },
 {
  "cid": "grok_cli#0",
  "target": "grok_cli",
  "question": "我已经用浏览器登录过 Grok 订阅账号了，但在 CI 里跑 grok 还是按环境里的密钥计费。怎么强制它走订阅而不是用那个环境变量？",
  "excerpt": "- **API Key Precedence**: If `XAI_API_KEY` is present in the environment, version 1.0.4 prioritizes the API key over stored subscription credentials in `~/.grok/auth.json`. Explicitly unset `XAI_API_KEY` to enforce subscription usage.",
  "fact": "在 1.0.4 中，只要环境里有 XAI_API_KEY 就会优先用它计费；要使用订阅必须显式 unset 该变量。",
  "rubric": {
   "must_include": [
    "需要显式取消设置/清空 XAI_API_KEY 环境变量",
    "原因是该变量存在时会优先使用 API key 而忽略已登录订阅"
   ],
   "reference_answer": "把 XAI_API_KEY 从该进程环境里 unset 掉；1.0.4 看到这个变量就会优先用它而不走订阅。"
  }
 },
 {
  "cid": "grok_cli#1",
  "target": "grok_cli",
  "question": "在一台没有图形界面的服务器上，我想让 Grok 的深度研究任务一直跑到出报告并写到我指定的文件再退出。提示词里应该怎么写才不会提前结束？",
  "excerpt": "- **Blocking Invocation Pattern**: To run deep research headlessly, instruct the model in the prompt to invoke the built-in `workflow` tool named `deep-research`, remain in the active turn until the workflow concludes, and persist the cited report to the designated result path.",
  "fact": "无界面环境下要阻塞运行深度研究，需在提示中让模型调用名为 deep-research 的 workflow 工具、保持在本回合直到完成，并将报告写入指定路径。",
  "rubric": {
   "must_include": [
    "要求模型调用内置 workflow 工具 deep-research",
    "保持活动回合直到工作流结束",
    "将报告持久化到指定的结果路径"
   ],
   "reference_answer": "在提示里让模型调用内置的 workflow 工具 deep-research，保持该回合不结束直到完成，并把报告写到你指定的结果文件。"
  }
 },
 {
  "cid": "opencode_cli#0",
  "target": "opencode_cli",
  "question": "我用 OpenCode 执行任务，想把结果直接写到 /tmp/out.json，但每次都提示写入失败或权限不够。应该怎么设置路径才能让它成功输出？",
  "excerpt": "- **Workspace Scoping**: OpenCode tools are strictly scoped to the server/project directory (`--dir`). Prompt files and result destination files must reside within that directory tree. Paths outside the project root (such as `/tmp/prompt.md`) cause file access failures.",
  "fact": "提示与结果文件都必须位于 --dir 指定的项目目录内，目录外路径（如 /tmp）会失败。",
  "rubric": {
   "must_include": [
    "结果文件路径必须位于 --dir 指定目录树内",
    "像 /tmp 这样的项目外路径会失败"
   ],
   "reference_answer": "把输出文件放到 --dir 指定的项目目录树内（不要用 /tmp 等项目外路径），再运行即可。"
  }
 },
 {
  "cid": "opencode_cli#1",
  "target": "opencode_cli",
  "question": "我给 OpenCode 的 HTTP 服务启用了基础认证，只配置了服务端的密码环境变量，没有单独设用户名。客户端连接时用户名该填什么？",
  "excerpt": "Set environment variable `OPENCODE_SERVER_PASSWORD` to enable basic authentication (username defaults to `opencode`).",
  "fact": "启用基本认证时默认用户名是 opencode。",
  "rubric": {
   "must_include": [
    "用户名是 opencode"
   ],
   "reference_answer": "用户名填 opencode。"
  }
 },
 {
  "cid": "skill_ai_agent_cli#0",
  "target": "skill_ai_agent_cli",
  "question": "我在写一个脚本用子进程调用代码助手的 CLI，任务内容会先拼成一段长字符串放进提示文件，但里面可能混入了\"\\0\"。这种情况下需要先做什么处理，避免把子进程搞挂？",
  "excerpt": "- Capture stdout, stderr, and any vendor log file separately.\n- Clean NULs out of prompt strings (`replace('\\0', '')`) before handing them to a subprocess.",
  "fact": "在把提示字符串交给子进程前，必须先清理其中的 NUL 字符（如用 replace('\\0','')）。",
  "rubric": {
   "must_include": [
    "必须在交给子进程前移除/清理 NUL (\\0) 字符",
    "提到可用 replace('\\0', '') 之类的方法"
   ],
   "reference_answer": "要先把提示字符串里的 NUL（\\0）都去掉（例如 replace('\\0', '')），再交给子进程。"
  }
 },
 {
  "cid": "skill_ai_agent_cli#1",
  "target": "skill_ai_agent_cli",
  "question": "我用 Grok Build 跑了一次任务，stdout 里打印了一段很顺畅的总结。我能直接把这段当最终产物提交吗，还是必须写入某个结果文件再校验？",
  "excerpt": "2. **Artifact Verification**: The designated result file exists, is non-empty, and satisfies all task-specific hard checks (tokens, schema, required URLs). A fluent stdout summary is not a fallback product.",
  "fact": "仅有 stdout 的流畅摘要不算完成，必须生成并验证非空且通过硬性校验的结果文件。",
  "rubric": {
   "must_include": [
    "标准输出（摘要）不能作为最终成果",
    "需要存在一个非空的结果文件并通过规定的硬性检查"
   ],
   "reference_answer": "不可以，标准输出的概述不算交付，必须生成并验证非空的结果文件且通过规定的硬性检查。"
  }
 },
 {
  "cid": "ai_session_profanity_rate#0",
  "target": "ai_session_profanity_rate",
  "question": "我在做最近聊天记录的脏话占比分析，运行 prepare 时老弹出需要我批准写入的提示。应该把输出目录设到哪里？默认的那个能用吗？缓存要不要移动？",
  "excerpt": "Always pass `--output` pointing under `tmp/` inside the workspace (e.g. `tmp/profanity_runs/<stamp>-<days>d`); the default `--home/runs/` location is outside the workspace tree and writing there triggers a user-approval prompt that blocks progress. The persistent SQLite cache stays at its default `--home` location.",
  "fact": "prepare 必须用 --output 指到工作区内的 tmp/，默认 --home/runs/ 会触发阻塞的用户批准；SQLite 缓存仍保留在默认 --home。",
  "rubric": {
   "must_include": [
    "--output 必须指向工作区内的 tmp/（可给出示例路径）",
    "不要用默认 --home/runs/，否则会触发需要用户批准并阻塞",
    "缓存保留在默认 --home，不需要移动"
   ],
   "reference_answer": "把 --output 指到工作区里的 tmp/（如 tmp/profanity_runs/<stamp>-<days>d）；不要用默认的 --home/runs/，否则会弹阻塞的批准提示；持久化 SQLite 缓存继续放在默认 --home 就行。"
  }
 },
 {
  "cid": "ai_session_profanity_rate#1",
  "target": "ai_session_profanity_rate",
  "question": "我既有用导出工具生成的 Markdown 归档，也还能直接读取本机的原始会话库。能不能在同一次统计里把这两种来源一起喂进去，这样更全？会不会有重复？",
  "excerpt": "Do not combine an archive with its corresponding native stores in one run; that counts the same messages twice.",
  "fact": "归档与对应的原生会话库不能在同一次运行中同时使用，否则同一批消息会被重复计数。",
  "rubric": {
   "must_include": [
    "不能把归档与对应的原生库在同一次运行中同时使用",
    "原因是会把相同消息重复计算（算两次）"
   ],
   "reference_answer": "不能；归档和对应的原生库不能在同一次运行里混用，否则会把相同消息算两次。"
  }
 },
 {
  "cid": "skill_ai_usage_dashboard#1",
  "target": "skill_ai_usage_dashboard",
  "question": "我想用精确时间窗口统计，如果把整天作为窗口跑一遍，金额会和日汇总完全一致吗？尤其 Cursor 的调用部分，会被计价还是只记用量？",
  "excerpt": "A full-day window equals the dashboard's day row (same tokens and cost): cost uses the canonical split and the same provider basis (Cursor tokens are counted but not priced, matching the dashboard).",
  "fact": "整天精确窗口与日表的代币与费用完全一致；Cursor 调用只计用量不计费用。",
  "rubric": {
   "must_include": [
    "整天窗口与日表结果一致（代币与费用）",
    "Cursor 调用不计价只计用量"
   ],
   "reference_answer": "把整天作为精确窗口统计时结果与日表完全一致，且 Cursor 调用只计用量不计价格。"
  }
 },
 {
  "cid": "skill_antigravity_push#0",
  "target": "skill_antigravity_push",
  "question": "我在一台通过 Tailscale 连接的笔记本上想先验证把 Antigravity 的用量同步到主机的配置是否正确，但不想真的上传数据。应该用什么命令运行？预期会看到哪些信息？",
  "excerpt": "## Dry Run\n\nTo verify the configuration without POSTing:\n\n```bash\n.venv/bin/python scripts/push-antigravity --dry-run\n```\n\nPrints the entry count and target URL without sending data.",
  "fact": "提供 --dry-run 选项：运行 .venv/bin/python scripts/push-antigravity --dry-run 会只打印条目数和目标 URL，不会发送数据。",
  "rubric": {
   "must_include": [
    "命令 .venv/bin/python scripts/push-antigravity --dry-run",
    "不发送数据/不POST，只打印本地条数与目标URL"
   ],
   "reference_answer": "运行 .venv/bin/python scripts/push-antigravity --dry-run；它只打印本地条数和目标 URL，不会真的发送数据。"
  }
 },
 {
  "cid": "skill_antigravity_push#1",
  "target": "skill_antigravity_push",
  "question": "如果我在卫星机上不小心多次执行了把 Antigravity 用量同步到主机的操作，主机的统计会被重复累加吗？",
  "excerpt": "The host deduplicates by `response_id`, so pushing the same entries multiple times is safe and idempotent.",
  "fact": "主机按 response_id 去重，因此重复推送同一批条目是安全且幂等的，不会重复计数。",
  "rubric": {
   "must_include": [
    "按 response_id 去重",
    "重复推送安全/幂等，不会重复累计"
   ],
   "reference_answer": "不会；主机会按 response_id 去重，重复推送是幂等的，不会造成重复统计。"
  }
 },
 {
  "cid": "apple_photos#0",
  "target": "apple_photos",
  "question": "我想用这个工具删除相册里的重复，但对比报告老是不过。具体要满足哪些像素和资源方面的硬性条件（比如尺寸一致、阈值），以及字节完全相同的那类能不能删？",
  "excerpt": "- **Delete Eligibility**: Support byte-different, single-resource still-image pairs only. Reject Live Photos, RAW+JPEG or edited compound assets, unavailable resources, and non-photo resources. Require equal dimensions, RGB MAE <= 1%, luma MAE <= 1%, and RGB P99 <= 5%. Policies may be stricter, never weaker. Byte-identical duplicate deletion is unsupported.",
  "fact": "仅支持字节不同的单资源静态照片对；要求同尺寸并同时满足RGB MAE≤1%、亮度MAE≤1%、RGB P99≤5%；字节完全相同的重复不支持删除。",
  "rubric": {
   "must_include": [
    "同尺寸且满足 RGB MAE <= 1%、luma MAE <= 1%、RGB P99 <= 5% 的数值门槛",
    "只支持字节不同的单资源静态照片；Live/RAW+JPEG/已编辑等复合资产会被拒绝",
    "字节完全相同的重复不支持删除"
   ],
   "reference_answer": "仅当是字节不同的单资源静态照片对，且尺寸相同并满足 RGB MAE≤1%、亮度 MAE≤1%、RGB P99≤5% 时才可授权；Live、RAW+JPEG、已编辑等复合或不可用/非照片资源会被拒；字节完全相同的重复不支持删除。"
  }
 },
 {
  "cid": "apple_photos#1",
  "target": "apple_photos",
  "question": "我这次需要清掉大约 120 对候选，能不能一次性发起删除？如果得分批的话，每批最多多少对，而且之前拿到的授权能否复用或对结果不确定的批次再试一次？",
  "excerpt": "- **Delete Batch Bound**: Limit each delete manifest to 50 pairs. Split larger evidence sets into independent plans and require fresh review and authorization for each; never reuse a token or retry an uncertain batch.",
  "fact": "每个删除批次上限为50对，必须拆分独立计划分别复核并授权；禁止复用令牌或重试不确定批次。",
  "rubric": {
   "must_include": [
    "每批最多 50 对，需拆分为独立批次",
    "每批都要重新审核与授权",
    "不得复用令牌，且不允许重试不确定批次"
   ],
   "reference_answer": "不行：每份删除批次最多 50 对，需拆成独立计划分别复核并逐一授权；不得复用之前的令牌，也不能重试结果不确定的批次。"
  }
 },
 {
  "cid": "asr#0",
  "target": "asr",
  "question": "我在一台离线的 Apple Silicon 机器上跑这个 ASR 工具的“doctor”自检时，它会不会自动去下载模型权重？如果我只想检查依赖/版本而不加载任何模型，该用什么参数？",
  "excerpt": "Run asr-skill doctor to inspect the environment. It loads both models from the local cache and does not download weights. The command asr-skill doctor --no-load checks imports and declared pins only.",
  "fact": "doctor 只从本地缓存加载模型且不下载权重；若只做导入/版本检查，使用 --no-load。",
  "rubric": {
   "must_include": [
    "不会下载权重（不联网下载）",
    "使用 --no-load 参数（asr-skill doctor --no-load）"
   ],
   "reference_answer": "自检不会下载权重，只会从本地缓存加载；仅检查导入和版本时用 asr-skill doctor --no-load。"
  }
 },
 {
  "cid": "asr#1",
  "target": "asr",
  "question": "我有一段约2小时10分钟的单个录音，能直接用这个本地转写工具处理吗？如果不行，会在什么阶段被拒绝？把音频切成多段能解决吗？",
  "excerpt": "A single file longer than 7200 seconds is rejected before a model loads. Splitting a file makes separate files; a speaker letter does not continue across slices. Several files that add up to a long day are not one file over the limit.",
  "fact": "单个音频超过7200秒会在模型加载前被拒；切分成多文件可分别处理。",
  "rubric": {
   "must_include": [
    "单文件超过7200秒会被拒绝",
    "在模型加载前拒绝",
    "可通过切分为多文件分别处理"
   ],
   "reference_answer": "不能：单个文件超过7200秒会在模型加载前被拒绝；把录音切成多段即可分别处理（合计时长不限）。"
  }
 },
 {
  "cid": "skill_agentic_patrol#0",
  "target": "skill_agentic_patrol",
  "question": "我在用 Process Launcher 给一个巡检任务排下一次检查时，如何避免重复预约？是只要看同名 label 就算重复，还是还需要比对别的字段？",
  "excerpt": "Query `GET /scheduled?status=pending&label=<label>` first to avoid a duplicate pending patrol job. The `label` is a substring filter, not a uniqueness constraint; verify the command and target time before assuming a match.",
  "fact": "排程前先用带 label 的查询检查是否已存在待执行项；label 只是子串匹配，需同时核对命令和计划时间。",
  "rubric": {
   "must_include": [
    "先查询 GET /scheduled?status=pending&label=<label>",
    "label 为子串匹配、非唯一",
    "需核对命令与目标时间才能判定重复"
   ],
   "reference_answer": "先调 GET /scheduled?status=pending&label=<label>，因 label 只是子串匹配并不唯一，只有当命令和计划时间都吻合时才视为已存在，从而避免重复预约。"
  }
 },
 {
  "cid": "skill_agentic_patrol#1",
  "target": "skill_agentic_patrol",
  "question": "我用 OpenCode 的 CLI 安排下一次巡检时，需要在命令里加上 --wait 等到那边执行完再返回吗？",
  "excerpt": "For asynchronous handoff CLIs such as the OpenCode example below, do not pass blocking flags such as `--wait`. Other harnesses have their own execution contract.",
  "fact": "对异步移交的 CLI（如 OpenCode），不要使用阻塞参数，例如不要加 --wait。",
  "rubric": {
   "must_include": [
    "不要使用 --wait 或任何阻塞参数"
   ],
   "reference_answer": "不要加 --wait；这是异步移交的调用，应省略阻塞参数。"
  }
 },
 {
  "cid": "skill_process_launcher#0",
  "target": "skill_process_launcher",
  "question": "我想用 launchd 把这个本地任务管理器常驻起来，子进程还能继承屏幕录制/麦克风这些权限吗？如果不行，正确的启动方式是什么？我平时也会用 tmux。",
  "excerpt": "**Important:** Start the launcher from an interactive terminal session. Terminal.app or iTerm2 works. tmux and zellij work only if the multiplexer server was itself started from one of those GUI terminals. If the server was started by launchd, SSH, or an automated script, TCC inheritance is broken.",
  "fact": "必须从交互式 GUI 终端启动；launchd/SSH/脚本会打断权限继承；tmux/zellij 只有其服务端由 GUI 终端启动时才有效。",
  "rubric": {
   "must_include": [
    "要求从 GUI 终端（如 Terminal.app/iTerm2）启动",
    "不能用 launchd/SSH/脚本等无 GUI 方式，否则权限继承会失效",
    "tmux/zellij 仅当其 server 由 GUI 终端启动时可行"
   ],
   "reference_answer": "不行，必须在交互式 GUI 终端里启动；用 launchd/SSH/脚本会让权限继承失效；tmux/zellij 只有其服务端由 GUI 终端启动时才可用。"
  }
 },
 {
  "cid": "skill_process_launcher#1",
  "target": "skill_process_launcher",
  "question": "我提交了两条同一时刻运行的定时任务，请求返回冲突错误。怎么做才能让它们同时保留？如果要用新的替换掉旧的，又该怎么处理？",
  "excerpt": "Nothing is created on 409. If the overlap is intentional, re-submit the same request with `\"confirm_conflict\": true`. To replace a conflicting job instead, cancel it first with `POST /scheduled/{id}/cancel`. `PATCH /scheduled/{job_id}` applies the same guard when moving `run_at` onto a conflicting time (same `confirm_conflict` escape hatch). The guard matches exact times only;",
  "fact": "相同执行时间会触发409冲突；想并存需带confirm_conflict=true，想替换则先取消原任务；冲突只匹配精确时间。",
  "rubric": {
   "must_include": [
    "并存时需设置 confirm_conflict=true",
    "替换需要先取消原任务再提交",
    "冲突只针对完全相同的时间点"
   ],
   "reference_answer": "在同一时间点会返回409；要并存需带 confirm_conflict=true；若要替换，先取消冲突的那条再提交。"
  }
 },
 {
  "cid": "bright_horizons_photo_sync#0",
  "target": "bright_horizons_photo_sync",
  "question": "上次导入中断了，这次我能给 photos-import 加上 --resume 来加速吗？这样会不会影响把已经存在的重复照片也放进目标相册？",
  "excerpt": "不要改用 `osxphotos import`：它逐个资产发送 Apple Event，大型导入可能耗时数小时。也不要添加 `--resume`；该路径可能跳过本流程要求的重复资产 album 修复。",
  "fact": "photos-import 禁止使用 --resume，否则可能跳过对重复资产归入目标相册的修复。",
  "rubric": {
   "must_include": [
    "明确禁止使用 --resume",
    "给出原因是会跳过重复资产归相册的修复流程"
   ],
   "reference_answer": "不可以，加 --resume 被禁止，因为该路径可能跳过将重复资产归入相册的修复流程。"
  }
 },
 {
  "cid": "bright_horizons_photo_sync#1",
  "target": "bright_horizons_photo_sync",
  "question": "在 Mac 上用导入命令时，单个文件也会报 ENOMEM 错误；我已经把 Photos 关了再开还是不行，这种情况应该怎么处理？",
  "excerpt": "如果单文件导入依然因为沙盒而引发 `ENOMEM` 错误，说明系统的 Extension 表已耗尽。此时仅重启 Photos 应用程序是无济于事的，必须重启 macOS 才能重置系统状态，重启后再次运行 CLI 即可。",
  "fact": "遇到单文件导入触发 ENOMEM 时，重启 Photos 无效，必须重启 macOS 才能恢复。",
  "rubric": {
   "must_include": [
    "必须重启 macOS",
    "说明仅重启 Photos 无效"
   ],
   "reference_answer": "必须重启 macOS 才能恢复，单独重启 Photos 没用。"
  }
 },
 {
  "cid": "chat_gpt_oauth#0",
  "target": "chat_gpt_oauth",
  "question": "我想把凭据文件改存到 ./secrets/local-token.json。工具会不会顺手把上一级目录权限也改严？另外，新建的这个文件默认会用什么权限？",
  "excerpt": "不要把 repo 内路径作为长期 token 默认值。`--token-path` 主要用于隔离测试；正常运行应把 credential 放在 repo 外。自定义路径始终把文件设为 `0600`，但不会擅自修改已经存在的父目录权限。",
  "fact": "自定义 token 保存路径时只把文件权限设为0600，不会更改已存在父目录权限。",
  "rubric": {
   "must_include": [
    "不会修改父目录权限",
    "文件权限为0600"
   ],
   "reference_answer": "不会；它只把该文件设为0600，不会动已存在的父目录权限。"
  }
 },
 {
  "cid": "chat_gpt_oauth#1",
  "target": "chat_gpt_oauth",
  "question": "我用它发起一次模型请求时，HTTP 头里应该带哪些身份信息？刷新用的和身份声明的那两个值能不能一起发？",
  "excerpt": "`request` 的 body 包含 `store:false`，header 包含 bearer access token 和 account ID，但不包含 refresh/ID token。",
  "fact": "模型请求头只能携带bearer access token与account ID，不能包含refresh_token或id_token。",
  "rubric": {
   "must_include": [
    "只包含 access token 和 account ID",
    "不能包含 refresh token 和 id_token"
   ],
   "reference_answer": "只在请求头携带 Bearer access token 和账户 ID，绝不能把 refresh_token 或 id_token 放进 header。"
  }
 },
 {
  "cid": "skill_circle_post#0",
  "target": "skill_circle_post",
  "question": "我没配 CIRCLE_V2_TOKEN，只想先跑一次预演看看会发什么内容。用 --dry-run 时会不会去上传图片或调用 Circle 接口、在站里生成测试贴？",
  "excerpt": "`--dry-run` validates the input and prints the outgoing Circle API payload. It does not load `.env`, upload images, or call Circle. Dry-run is a preflight; it is not a test post.",
  "fact": "--dry-run 只做预检并打印将发送的请求，不会加载 .env、不会上传图片或调用 Circle，也不会生成测试贴。",
  "rubric": {
   "must_include": [
    "说明 --dry-run 只校验并打印即将发送的负载",
    "明确不会加载 .env、不会上传图片、不会调用 Circle，且不是测试贴"
   ],
   "reference_answer": "可以，--dry-run 只验证并打印将发出的请求，不加载 .env，不上传图片、不调用 Circle，也不会生成测试贴。"
  }
 },
 {
  "cid": "skill_circle_post#1",
  "target": "skill_circle_post",
  "question": "我想用命令行真正删除一篇 Circle 帖子，除了提供帖子 ID，还需要加什么参数才能执行删除，而不是只做预演？",
  "excerpt": ".venv/bin/python circle_post.py delete --post-id YOUR_POST_ID --dry-run\n.venv/bin/python circle_post.py delete --post-id YOUR_POST_ID --confirm",
  "fact": "要真实删除帖子，delete 命令必须加 --confirm（并提供 post-id）。",
  "rubric": {
   "must_include": [
    "需要加上 --confirm 参数才能执行真实删除"
   ],
   "reference_answer": "在提供帖子 ID 的同时加上 --confirm，才会执行真实删除；否则只是预演。"
  }
 },
 {
  "cid": "ct_education#0",
  "target": "ct_education",
  "question": "我想让 ct-edu 的本地查看器播放一个我放在 /tmp 下的 MP4，serve 参数能直接填这个绝对路径吗？如果不行，我应该怎么指定视频文件？",
  "excerpt": "Either flag can be used alone; each accepts a relative path to an existing regular `.mp4` inside the completed workspace. Absolute paths, traversal, symlinks, missing files, and non-MP4 names fail startup with `E_VIDEO_FILE`.",
  "fact": "serve 的视频文件参数必须是工作区内的相对路径，使用绝对路径或符号链接会以 E_VIDEO_FILE 失败。",
  "rubric": {
   "must_include": [
    "视频文件必须是工作区内的相对路径",
    "绝对路径会启动失败并报 E_VIDEO_FILE"
   ],
   "reference_answer": "不能用 /tmp 的绝对路径；需把 MP4 放到该工作区内并用相对路径指定，否则会以 E_VIDEO_FILE 启动失败。"
  }
 },
 {
  "cid": "ct_education#1",
  "target": "ct_education",
  "question": "我用 render-cinematic 想把 --output 写成相对路径，这个相对路径是相对于当前目录还是工作区？",
  "excerpt": "| `--output` | Required | New external run directory disjoint from input workspace and repository; parent must exist. No overwrite, traversal, or symlink aliases. Relative paths resolve from the current directory, not the workspace. |",
  "fact": "render-cinematic 的 --output 若为相对路径，是相对于当前工作目录解析，而不是相对于工作区。",
  "rubric": {
   "must_include": [
    "相对路径按当前工作目录解析",
    "不是相对于工作区"
   ],
   "reference_answer": "相对路径按当前工作目录解析，不是相对于工作区。"
  }
 },
 {
  "cid": "dataforseo#0",
  "target": "dataforseo",
  "question": "我用 dataforseo 的 CLI 查余额没问题，但一跑关键词相关的命令就返回 40104，切到 sandbox 也一样。这个怎么解决？",
  "excerpt": "DataForSEO may return `40104` when the account is authenticated but not verified. In that case, account/balance can still work, but keyword data endpoints, including sandbox, may be blocked until the user completes verification in the DataForSEO panel.",
  "fact": "40104 出现在账号已认证但未完成验证时；余额可查但关键词数据（含沙箱）被阻止，需在 DataForSEO 面板完成验证。",
  "rubric": {
   "must_include": [
    "说明 40104 的根因是账号未完成验证",
    "指出余额可用但关键词端点（含沙箱）被拦截",
    "给出在 DataForSEO 面板完成验证这一处置"
   ],
   "reference_answer": "这是未完成账号验证导致的 40104；余额接口仍可用，但关键词等（含沙箱）会被拦，去 DataForSEO 面板完成验证即可。"
  }
 },
 {
  "cid": "dataforseo#1",
  "target": "dataforseo",
  "question": "用命令行拿关键词推荐时只输出了精简字段，我想保留完整的原始返回数据，应该加哪个参数？",
  "excerpt": "Keyword commands return compact JSON rows by default. Use `--raw` to keep the full DataForSEO response.",
  "fact": "关键词命令默认输出精简行；加 --raw 可保留完整原始响应。",
  "rubric": {
   "must_include": [
    "默认是精简 JSON 行输出",
    "明确写出需要使用 --raw 参数"
   ],
   "reference_answer": "在命令后加 --raw；默认只返精简行，加上后会保留完整的 DataForSEO 原始响应。"
  }
 },
 {
  "cid": "design_critique#0",
  "target": "design_critique",
  "question": "我在做我的旅游 App 首页的层级检查。评审时应该把页面缩放到多少比例来判断阅读顺序是否清晰？请给出一个明确的数值。",
  "excerpt": "Shrink the screen to 50%. Is there a clear reading order? Whitespace should guide, not decorate. Typography should create explicit layers: the heading says what this is, the body explains, the metadata sits quietly.",
  "fact": "评审视觉层级时应将界面缩小到 50% 来检查是否有清晰的阅读顺序。",
  "rubric": {
   "must_include": [
    "将界面缩小到 50%",
    "用于判断阅读顺序是否清晰"
   ],
   "reference_answer": "把界面缩小到 50% 再看是否有清晰的阅读顺序。"
  }
 },
 {
  "cid": "design_critique#1",
  "target": "design_critique",
  "question": "我的企业后台表单页底部现在有“保存”和“保存并发布”两个同等突出的按钮。按你们的评审标准，这种情况下主操作该怎么处理？",
  "excerpt": "Every screen should have exactly one primary action; competing actions should be visually demoted.",
  "fact": "每个页面只能有一个主操作，其它竞争操作需要在视觉上降级。",
  "rubric": {
   "must_include": [
    "只能有一个最重要的操作",
    "其他操作需要视觉降级/弱化"
   ],
   "reference_answer": "只能保留一个最高优先级的操作按钮，其余的都要在视觉上降级。"
  }
 },
 {
  "cid": "design_system#0",
  "target": "design_system",
  "question": "我们后台里新出现一个“公告条”样式，在两三个页面都能用。现在要不要立刻抽成共享组件？如果不该马上抽象，你依据哪些前置条件判断，并该给什么替代建议？",
  "excerpt": "- **Reuse demand**: recurrence is observed across real product surfaces, not forecast from visual similarity\n- **Governance budget**: the team can document, version, test, migrate, support, and eventually deprecate the primitive\n\nIf either condition is missing, recommend a tracked one-off or snowflake path first. Local work is often the honest choice while the pattern is still unproven.",
  "fact": "在抽成共享组件/Token前，需同时满足“真实复用需求”和“治理投入”，否则先走跟踪的一次性/本地实现。",
  "rubric": {
   "must_include": [
    "同时提出两个前置条件：真实跨产品面的复用、团队具备文档/版本/测试/迁移/支持/废弃的治理能力",
    "若任一条件不满足，建议走一次性本地实现（先不抽象成共享）"
   ],
   "reference_answer": "只有在确认真实复用且团队有完整治理投入时才抽成共享；否则先走登记的一次性/本地实现方案。"
  }
 },
 {
  "cid": "design_system#1",
  "target": "design_system",
  "question": "我要给公司的 iOS 应用做一次设计系统合规审计。颜色这块具体怎么判定有没有偷用硬编码？应该重点检查哪种写法？",
  "excerpt": "For iOS, check for hardcoded Color literals instead of asset catalog references.",
  "fact": "iOS 审计应检查是否用了硬编码的 Color 字面量而非资产目录引用。",
  "rubric": {
   "must_include": [
    "指出要查硬编码的 Color 字面量",
    "指出应改为使用资产目录中的颜色引用（而不是字面量）"
   ],
   "reference_answer": "在 iOS 上要查有没有用硬编码的 Color 字面量；应使用资产目录的颜色引用而不是直接写字面量。"
  }
 },
 {
  "cid": "frontend_design#0",
  "target": "frontend_design",
  "question": "我准备给我的 B2B 仪表盘做一次视觉重构。正式开写代码前，你具体要我先交付哪些设计基线（比如颜色数量、排版、布局表达等）？颜色需要定几个？",
  "excerpt": "Capture the direction as a small token system before writing code: 4–6 named hex colors, the typefaces and their roles, a layout concept (one sentence plus a rough ASCII wireframe), and the principles that make this page specific.",
  "fact": "开写代码前必须先交付一套小型基线：恰当的 4–6 个命名色、字体及其角色、一句话布局加粗略字符线框图，以及让页面具体化的原则。",
  "rubric": {
   "must_include": [
    "4–6 个命名的十六进制颜色",
    "字体及其角色（如正文/标题的分工）",
    "一句话的布局概念与粗略线框，以及页面具体化原则"
   ],
   "reference_answer": "开写前先交付一个小型基线：4–6 个命名的十六进制颜色、所用字体及其角色、一句布局概念加粗略线框图，以及让页面具体的原则。"
  }
 },
 {
  "cid": "frontend_design#1",
  "target": "frontend_design",
  "question": "在把我的电商管理后台的前端标注为“可上线”之前，是否必须提供页面截图或可运行的演示？如果没有这些还能算生产级吗？",
  "excerpt": "- There is at least one screenshot or running artifact behind the judgment",
  "fact": "被判定为生产级之前，必须至少提供一张截图或一个可运行的产物作为依据。",
  "rubric": {
   "must_include": [
    "至少一张截图或一个可运行的产物",
    "这是作为生产级判断/标注的必要前提"
   ],
   "reference_answer": "是，标注为生产级前必须至少有一张截图或一个可运行的产物作支撑。"
  }
 },
 {
  "cid": "dinov3_classifier_skill#0",
  "target": "dinov3_classifier_skill",
  "question": "我在对比两版模型准备做上线前的复核，需要生成完整的分歧清单。这个命令里的计数参数应该设成多少，系统会把精确样本身份和分歧统计写到哪个文件？",
  "excerpt": "Setting `--count 0` is mandatory for deployment review. It records exact cohort identity and full disagreement counts in `workbench_private/model_cases.jsonl`.",
  "fact": "生成上线复核用的分歧清单时必须把 --count 设为 0，系统会把精确样本身份和完整分歧计数写入 workbench_private/model_cases.jsonl。",
  "rubric": {
   "must_include": [
    "必须使用 --count 0",
    "结果写入 workbench_private/model_cases.jsonl，且包含精确样本身份与完整分歧计数"
   ],
   "reference_answer": "必须把计数参数设为 --count 0；这样会把精确样本身份和完整分歧计数写入 workbench_private/model_cases.jsonl。"
  }
 },
 {
  "cid": "dinov3_classifier_skill#1",
  "target": "dinov3_classifier_skill",
  "question": "我用硬件评测学生模型时，分类阈值是沿用之前的还是要重新确定？另外如果命令返回码是 1，具体表示什么，结果文件会不会照样生成？",
  "excerpt": "The evaluator selects a fresh maximum-F1 threshold from hardware logits and separately reports parity at the candidate source threshold. Exit `0` means all three inclusive gates passed. Exit `1` means a valid result was written with `status: fail`; schema or integrity errors write no result and raise.",
  "fact": "硬件评估会从硬件 logits 重新选取最大 F1 的阈值；退出码 1 表示生成了状态为 fail 的有效结果，架构/完整性错误则不写结果并直接报错。",
  "rubric": {
   "must_include": [
    "阈值从硬件 logits 重新按最大 F1 选取，而不是沿用原阈值",
    "退出码 1 表示写出了有效结果但状态为 fail；架构/完整性错误不会写结果并会抛错"
   ],
   "reference_answer": "阈值会基于硬件 logits 重新选取最大 F1，而不是沿用旧值；返回码 1 表示写出了 status: fail 的有效结果（架构/完整性错误则不写结果并直接报错）。"
  }
 },
 {
  "cid": "eink_diary#0",
  "target": "eink_diary",
  "question": "我用这套电子纸日记在出图时，如果被图像服务判定不通过，它会自动帮我重试几次？还需要我自己再做额外的视觉内容审核吗？",
  "excerpt": "- **moderation 自动重试**：出图遇 gpt-image-2.5-sunburst 的 moderation_blocked，自动重跑 synthesize\n  换措辞再试（默认最多 2 次）。不做视觉内容审查（保持简单、cron 友好）。",
  "fact": "被 gpt-image-2.5-sunburst 审核拦截时会自动改写重试，默认最多 2 次，且不做视觉内容审查。",
  "rubric": {
   "must_include": [
    "默认最多重试 2 次",
    "不做视觉内容审查"
   ],
   "reference_answer": "被出图审核拦截时会自动改写提示词再试，默认最多重试 2 次；不做任何额外的视觉内容审核。"
  }
 },
 {
  "cid": "eink_diary#1",
  "target": "eink_diary",
  "question": "我现在是凌晨 1:30 想要“全天版本”的电子纸图，需要自己改时间窗吗？具体会取哪一段时间来生成？",
  "excerpt": "- **全天语义**：用户说“今天全天/全天版本”时优先用 `--full-day`，不要手算\n  `--minutes`。本地时间 00:00–02:00 之间，`--full-day` 自动解释为昨天完整一天\n  （`yesterday 00:00..today 00:00`）；其他时间解释为今天从 00:00 到当前时刻。",
  "fact": "全天模式应使用 --full-day；00:00–02:00 取昨天整日，其他时段取今天 00:00 至当前。",
  "rubric": {
   "must_include": [
    "不手算分钟/直接用 --full-day",
    "00:00–02:00 取昨天 00:00–今天 00:00",
    "其他时间取今天 00:00 到当前时刻"
   ],
   "reference_answer": "不用手动改分钟，直接用 --full-day：00:00–02:00 间会取昨天 00:00 到今天 00:00，其它时段取今天 00:00 到当前时刻。"
  }
 },
 {
  "cid": "skill_firecrawl#1",
  "target": "skill_firecrawl",
  "question": "我打算用内容提取子命令一次性传入 30 个链接，还想并行抓取以提速，这样可以吗？有没有数量上限？",
  "excerpt": "| `urls...` | One or more URLs, up to 20 (scraped sequentially) | required |",
  "fact": "内容提取一次最多接受 20 个 URL，且是顺序抓取而非并行。",
  "rubric": {
   "must_include": [
    "最多只能传 20 个 URL",
    "抓取是顺序进行（不并行）"
   ],
   "reference_answer": "不可以：最多 20 个 URL，而且是顺序抓取，不支持并行。"
  }
 },
 {
  "cid": "firewalla#1",
  "target": "firewalla",
  "question": "看告警详情时有接口相关的字段，能不能据此判断是哪台客户端触发了告警？应该根据哪些字段来做设备归属？",
  "excerpt": "For alarm-to-device attribution, trust source/client fields only:\n\n- `device`\n- `p.device.id`\n- `p.device.ip`\n- `p.device.mac`\n- `p.device.name`\n- `p.flows[].device`\n\nIgnore infrastructure/interface fields such as `p.intf.*`; they describe where Firewalla observed traffic, not which client caused the alarm.",
  "fact": "告警归属只能信任源/客户端字段（device、p.device.*、p.flows[].device），应忽略 p.intf.* 等接口字段。",
  "rubric": {
   "must_include": [
    "明确不能用接口字段（如 p.intf.*）做归属",
    "指出需依据源/客户端字段（如 device 或 p.device.ip）"
   ],
   "reference_answer": "不能，用接口字段不能判断触发设备；只信任源/客户端字段（如 device、p.device.ip、p.device.mac、p.flows[].device）来归属。"
  }
 },
 {
  "cid": "skill_genai_portrait#0",
  "target": "skill_genai_portrait",
  "question": "我想用两张图编辑：第一张是我的人像，第二张只是灯光参考。提示词里应该怎么指定谁决定五官和脸型？另外，参考图能否对我没明确要求的属性也产生影响？",
  "excerpt": "The first image must be declared in the prompt as the sole identity and geometry authority. Reference images may influence only the explicitly requested property.",
  "fact": "多图编辑时，必须在提示里把第一张图指定为唯一的身份与几何权威；参考图只能影响你明确请求的属性。",
  "rubric": {
   "must_include": [
    "在提示中声明第一张图是身份与几何的唯一依据",
    "参考图只能影响明确请求的属性，不能超出"
   ],
   "reference_answer": "在提示里明确指定第一张输入作为唯一的人脸/几何依据；参考图只能作用于你明确要求的那一项，不能扩展到其他方面。"
  }
 },
 {
  "cid": "skill_genai_portrait#1",
  "target": "skill_genai_portrait",
  "question": "做一次从白底职业照到暗调棚拍的转换时，如果前几次都不理想，这个工具默认建议我最多尝试几种明显不同的思路？在什么情况下可以超过这个次数？",
  "excerpt": "As a default budget, try two to four materially different attempts. More attempts are justified only when testing a new hypothesis. Stop when the best candidate passes and further edits are more likely to trade identity for style.",
  "fact": "默认尝试预算为2到4个明显不同的方案；只有在验证新假设时才可以增加尝试次数。",
  "rubric": {
   "must_include": [
    "默认尝试次数为2到4次",
    "只有在测试新假设时才可增加次数"
   ],
   "reference_answer": "默认做2到4次彼此差异明显的尝试；只有在验证一个新的假设时才应增加尝试次数。"
  }
 },
 {
  "cid": "skill_google_maps_routing#0",
  "target": "skill_google_maps_routing",
  "question": "我想用这个路由工具计算“现在出发”的驾驶时间。参数应该怎么填：是只能提供出发时间或到达时间其中一个吗？如果我传一个接近当前时刻的 ISO 时间戳，会不会被 API 拒绝？",
  "excerpt": "Exactly one of `--departure-time` or `--arrival-time` is required.\n\nUse `--departure-time now` for current traffic. The CLI avoids sending a fragile explicit near-current timestamp because Routes API may reject it as not sufficiently in the future.",
  "fact": "route 命令必须二选一提供出发或到达时间；要用当前路况应传 --departure-time now，避免用接近当前的显式时间戳以免被拒。",
  "rubric": {
   "must_include": [
    "只能二选一提供 --departure-time 或 --arrival-time",
    "“现在出发”要用 --departure-time now",
    "不要用接近当前的显式时间戳，可能被 Routes API 拒绝"
   ],
   "reference_answer": "只能提供出发或到达时间其中一个；要“现在出发”用 --departure-time now，别传临近当前的显式时间戳，否则可能被 Routes API 拒绝。"
  }
 },
 {
  "cid": "skill_google_maps_routing#1",
  "target": "skill_google_maps_routing",
  "question": "我在 CI 里跑 doctor 想核对配置。它的 JSON 会包含哪些关键字段？另外会不会把完整的 API key 或 1Password 引用打印出来？",
  "excerpt": "Checks credential resolution and endpoint configuration. It must output only a masked key and whether the 1Password backend is configured. It must not output the full API key or the full 1Password reference.\n\nExpected JSON fields include `key_source`, `key_masked`, `op_reference_configured`, `geocoding_base_url`, and `routes_base_url`.",
  "fact": "doctor 只应输出脱敏密钥与 1Password 后端是否配置，且不得打印完整密钥或完整 1Password 引用，并包含特定字段列表。",
  "rubric": {
   "must_include": [
    "不会输出完整 API key 或完整 1Password 引用，只给脱敏密钥与是否配置 1Password",
    "字段应包含 key_source、key_masked、op_reference_configured、geocoding_base_url、routes_base_url"
   ],
   "reference_answer": "doctor 只会给出脱敏密钥和是否配置了 1Password，不会打印完整 API key 或 1Password 引用；JSON 至少包含 key_source、key_masked、op_reference_configured、geocoding_base_url、routes_base_url。"
  }
 },
 {
  "cid": "blender_animation#0",
  "target": "blender_animation",
  "question": "我已经把建筑动画导成了 MP4，想用 FFmpeg 快速检查这个文件有没有解码问题。给我一条只输出错误信息的完整命令行可以直接粘贴运行吗？",
  "excerpt": "- **Stream Decode Verification**: Video encoded with FFmpeg decodes cleanly without bitstream errors:\n  ```bash\n  ffmpeg -v error -i output.mp4 -f null -\n  ```",
  "fact": "用 FFmpeg 通过“ffmpeg -v error -i output.mp4 -f null -”进行仅输出错误的解码校验。",
  "rubric": {
   "must_include": [
    "ffmpeg -v error -i output.mp4 -f null -"
   ],
   "reference_answer": "使用命令：ffmpeg -v error -i output.mp4 -f null -，即可仅输出解码错误进行校验。"
  }
 },
 {
  "cid": "blender_animation#1",
  "target": "blender_animation",
  "question": "昨晚渲染中途被打断了，今天该从哪一帧继续最稳妥？另外我改了灯光，不想让新旧版本的帧混在一起，输出目录应该怎么处理？",
  "excerpt": "- Whenever scene geometry, lighting, or animation curves change, increment the output directory prefix (e.g., `frames_v2/`).\n- Never mix newly rendered frames with older iterations in the same folder.\n- When resuming an interrupted render, check the highest consecutive frame index rendered and resume from `index + 1`.",
  "fact": "场景有改动时使用新的输出目录前缀且不要混放新旧帧；恢复渲染时从已连续帧的最高索引加一继续。",
  "rubric": {
   "must_include": [
    "从最高连续帧索引 + 1 继续渲染",
    "场景改动后使用新的输出目录前缀并且不要把新帧与旧版本混在同一文件夹"
   ],
   "reference_answer": "先找出现有序列中连续的最高帧号，从该帧号+1继续；场景改动后改用新的输出目录前缀（如 frames_v2/），不要把新旧版本帧混在同一文件夹。"
  }
 },
 {
  "cid": "blender_compositing_plate#0",
  "target": "blender_compositing_plate",
  "question": "我在做竖屏的正交相机匹配，合成那层给了每帧的 width、W、H（像素宽高）。为了让像素坐标准确对齐它的公式，我的相机应该怎么设置？尤其 ortho 的缩放该取什么值？",
  "excerpt": "For a portrait frame, set `sensor_fit` to `VERTICAL` and `ortho_scale = width * H / W`, where `width` is the horizontal world extent. Place the camera above the centre. Assert agreement on every frame:",
  "fact": "竖屏正交相机需设 sensor_fit=VERTICAL，且 ortho_scale=width*H/W 才能与像素公式一致。",
  "rubric": {
   "must_include": [
    "sensor_fit 设为 VERTICAL",
    "ortho_scale = width * H / W"
   ],
   "reference_answer": "把相机设为正交，sensor_fit 设 VERTICAL，ortho_scale 取 width * H / W，以保证与像素公式精确对齐。"
  }
 },
 {
  "cid": "blender_compositing_plate#1",
  "target": "blender_compositing_plate",
  "question": "我的镜头是顶视的正交相机，旗面起伏在画面里几乎看不出位移，只是明暗变化。想在不换成透视相机的前提下，让高度真正推动像素并与合成层严格同步，我具体该怎么做？",
  "excerpt": "A straight-down orthographic camera cannot show height: waves only change shading. If the motion must read as displacement, add a height-dependent screen offset (a parallel-oblique mapping such as `world_of(u, v, t) = (u + dx, v + dy + k * height)`) inside the shared module, so both layers apply the same shift.",
  "fact": "顶视正交下要看出位移，需在共享模块里加按高度的平行-斜投影屏幕偏移，并让两层使用同一映射。",
  "rubric": {
   "must_include": [
    "添加按高度驱动的屏幕偏移/平行-斜投影",
    "在共享模块中实现并由两层共同使用"
   ],
   "reference_answer": "在共享的变形模块里添加按高度的屏幕偏移（平行-斜投影，如 v 分量加 k*height），并让两层都用同一映射，这样顶视正交下也能看到位移且两层同步。"
  }
 },
 {
  "cid": "blender_modeling#0",
  "target": "blender_modeling",
  "question": "我在 Blender 的 Python 脚本里想把所有外部贴图一起打包进最终的 .blend，但调用 wm 下的 pack_all 总是报不存在这个操作。应该改成用哪个指令来完成打包？",
  "excerpt": "- **Pack Operator Namespace Error**:\n  - *Symptom*: Calling `bpy.ops.wm.pack_all()` throws an `AttributeError` stating the operator does not exist.\n  - *Fix*: Use `bpy.ops.file.pack_all()` to pack external textures and dependencies into the `.blend` file.",
  "fact": "应使用 bpy.ops.file.pack_all() 打包外部纹理与依赖，wm 下没有 pack_all。",
  "rubric": {
   "must_include": [
    "bpy.ops.file.pack_all()",
    "说明用于把外部纹理/依赖打包进 .blend"
   ],
   "reference_answer": "用 bpy.ops.file.pack_all() 把外部纹理和依赖打包进 .blend。"
  }
 },
 {
  "cid": "blender_modeling#1",
  "target": "blender_modeling",
  "question": "在我的 Blender 自动生成脚本里，修改了几何后立刻去读评估过的顶点位置，有时拿到的还是旧数据。要加哪一步才能确保读到最新的评估结果？",
  "excerpt": "- **Dependency Graph Stale Caches**: Always call `depsgraph.update()` when dynamically inspecting evaluated mesh vertices or derived dimensions in Python scripts.",
  "fact": "在读取评估网格或派生尺寸前必须先调用 depsgraph.update() 刷新依赖图缓存。",
  "rubric": {
   "must_include": [
    "depsgraph.update()",
    "强调是在读取评估数据前调用"
   ],
   "reference_answer": "在读取评估数据前先调用 depsgraph.update() 刷新依赖图。"
  }
 },
 {
  "cid": "character_rigging_mocap#0",
  "target": "character_rigging_mocap",
  "question": "我的 Web 端肢体跟踪延迟有点高，能不能把摄像头帧排队起来一个个处理，至少别丢帧？另外这些被转移的帧对象在成功、出错或取消时要不要显式释放？",
  "excerpt": "Keep at most one frame in flight across acquisition, transfer, inference and consumption. Prefer fresh work over a queue of old frames, and release transferables on success, error and cancellation.",
  "fact": "管线中任何时刻至多保留一帧在途，优先处理最新帧，并在成功/错误/取消后释放转移对象。",
  "rubric": {
   "must_include": [
    "禁止排队旧帧，任何时刻最多一帧在处理链上",
    "优先处理最新帧而非积压",
    "在成功、错误或取消时释放已转移的帧对象"
   ],
   "reference_answer": "不要排队处理旧帧；始终只保留最多一帧在途、优先处理最新帧，并在成功、错误或取消时释放已转移的帧对象。"
  }
 },
 {
  "cid": "character_rigging_mocap#1",
  "target": "character_rigging_mocap",
  "question": "我在静态部署时发现模型文件的校验哈希和清单对不上，构建脚本能不能自动把清单里的校验值改成新的让构建继续，还是必须让这次构建直接失败？",
  "excerpt": "A standard clean build must acquire and verify fixed dependencies or fail, rather than succeeding because ignored assets happen to exist locally. Treat checksums as read-only trust input; do not rewrite a manifest to bless new download bytes.",
  "fact": "校验值是只读信任输入，不能改写清单；干净构建拿不到并验证固定依赖时应直接失败。",
  "rubric": {
   "must_include": [
    "校验值不可自动更新/改写清单",
    "拿不到已固定依赖应让构建失败而非继续"
   ],
   "reference_answer": "不能自动改校验；校验值作为只读信任输入，清单不可被重写，标准干净构建拿不到已固定依赖就应直接失败。"
  }
 },
 {
  "cid": "hybrid_ai_video#0",
  "target": "hybrid_ai_video",
  "question": "生成后平台给了我一个视频的CDN下载链接。为了避免被拒绝，我是否应该在下载请求里加上授权头？这个带签名的地址能不能写进日志或清单文件里方便排查？",
  "excerpt": "Download media only from approved HTTPS hosts, validating redirects too. Send no Bearer credentials on any CDN download, including the first request. Use signed URLs in memory; never retain them in logs, manifests, or repository files.",
  "fact": "CDN下载时禁止携带Bearer凭证，签名URL只可在内存中使用且不得写入日志或文件。",
  "rubric": {
   "must_include": [
    "CDN下载请求不要附带授权/Bearer头",
    "签名URL只在内存使用，不能写入日志、清单或仓库文件"
   ],
   "reference_answer": "不要在CDN下载时附带授权头；只在内存里使用签名URL，且不要把它写入日志、清单或仓库文件。"
  }
 },
 {
  "cid": "hybrid_ai_video#1",
  "target": "hybrid_ai_video",
  "question": "我调用视频生成的创建接口时网络超时了，任务是否已建成不确定。现在能不能直接再发一次同样的创建请求？",
  "excerpt": "State Serialization and Idempotency: Persist exclusive local attempt state and budget reservations before non-idempotent POST calls. Use a single ledger writer or serialized reservations. Ambiguous submissions must block automatic resubmission. Never issue a new POST to resume a known task.",
  "fact": "创建请求超时时不允许自动重发；应保存本次尝试与预算预留，且绝对不要用新的创建请求去续接已知任务。",
  "rubric": {
   "must_include": [
    "不要自动重发/不要再次提交创建请求",
    "保留当前尝试状态与预算预留，阻止自动重提"
   ],
   "reference_answer": "不能；要保留这次尝试与预算预留并阻止自动重提，绝对不要用新的创建请求去“续上”该任务。"
  }
 },
 {
  "cid": "skill_gpt_3d#1",
  "target": "skill_gpt_3d",
  "question": "我要把一个会变形的角色导出到网页里实时展示，为了提速能不能直接在原工程里把网格合并/减面，并把角色的自阴影烘焙进贴图？这样做是否被允许？",
  "excerpt": "Preserve skins and editable rig sources; do not blindly apply the static merge/bake path below to the character. Surface-color bakes can remain useful, but pose-dependent self-shadow bakes are not valid under arbitrary deformation.",
  "fact": "对可变形角色不要走静态合并/烘焙流程；姿态相关的自阴影烘焙在任意变形下无效。",
  "rubric": {
   "must_include": [
    "不要在角色上直接做静态合并/减面/烘焙",
    "基于姿态的自阴影烘焙不适用或无效",
    "保留可编辑的蒙皮/骨骼源"
   ],
   "reference_answer": "不可以：角色要保留可编辑蒙皮/骨架，不能走静态合并/烘焙，而且自阴影烘焙对任意变形的角色并不成立。"
  }
 },
 {
  "cid": "web_walkthrough#0",
  "target": "web_walkthrough",
  "question": "我把 Blender 的场景导出到网页漫游后，三维坐标该怎么换成引擎用的坐标？请告诉我 x、y、z 分量各映射到哪一轴，哪个需要取负号。",
  "excerpt": "- **Coordinate Conversion Integrity**: Blender Z-up coordinates convert cleanly to WebGL Y-up coordinates: `(x, y, z) -> (x, z, -y)`.",
  "fact": "Blender 的 Z-up 坐标必须按 (x, y, z) -> (x, z, -y) 映射到 WebGL 的 Y-up。",
  "rubric": {
   "must_include": [
    "将 (x, y, z) 转为 (x, z, -y)"
   ],
   "reference_answer": "把 (x, y, z) 映射为 (x, z, -y)。"
  }
 },
 {
  "cid": "web_walkthrough#1",
  "target": "web_walkthrough",
  "question": "我想在本地起一个预览服务，默认会监听哪个地址？如果要让同一 Wi‑Fi 的手机访问需要做什么确认？端口被占用时你会不会自动帮我结束占用的进程？",
  "excerpt": "- **Network Serving Authority**: Serve static build directories only. Bind to localhost/127.0.0.1 by default. Binding to LAN interfaces or generating external URLs requires explicit user authorization. Check chosen port availability before binding; never kill unrelated processes.",
  "fact": "本地服务默认只绑定到 localhost/127.0.0.1；对局域网/外链暴露需用户明确授权；端口占用只能检查，不得杀死无关进程。",
  "rubric": {
   "must_include": [
    "默认绑定到 localhost/127.0.0.1",
    "对局域网或外链暴露需用户明确授权",
    "检查端口且不杀无关进程"
   ],
   "reference_answer": "默认仅绑定 localhost/127.0.0.1；要让局域网访问必须先获得用户明确授权；端口占用只检查不动手，绝不会杀无关进程。"
  }
 },
 {
  "cid": "ecg_plot#0",
  "target": "ecg_plot",
  "question": "我用这个心电图绘图命令处理一份导出的 JSON，控制台提示检查没通过。请问这种情况下会不会仍然产出那张 PNG 图？能不能至少把图先画出来？",
  "excerpt": "通过核对后才画 PNG。核对失败时仍写完整性 JSON，但不写 PNG，避免把缺样、截断或坏点画成一条看起来完整的曲线。",
  "fact": "只有核对通过才会生成 PNG；核对失败时仍写完整性 JSON，但不会写 PNG。",
  "rubric": {
   "must_include": [
    "核对未通过不生成PNG",
    "仍然会写完整性JSON"
   ],
   "reference_answer": "不会；只有通过检查才会画，未通过时只写完整性 JSON，不写 PNG。"
  }
 },
 {
  "cid": "ecg_plot#1",
  "target": "ecg_plot",
  "question": "我的这条心电数据有点长，后面一些采样点落在30秒以后。这个工具会自动把多出来的部分剪掉继续画，还是直接拒绝出图？",
  "excerpt": "- 全部样本落在 0 到 30 秒内。超出 6 条 5 秒窗口的点不会被裁掉，而是拒绝作图",
  "fact": "样本必须全部在0–30秒内，超出6×5秒窗口的点不会被裁剪而是直接拒绝作图。",
  "rubric": {
   "must_include": [
    "样本需要在0到30秒内",
    "不会裁掉超出部分",
    "会拒绝作图"
   ],
   "reference_answer": "不会裁剪；样本必须在0到30秒内，超出就直接拒绝作图。"
  }
 },
 {
  "cid": "health_quantification#1",
  "target": "health_quantification",
  "question": "我想把心电图波形直接导出到仓库里的 data/ecg.json，可以吗？有符号链接的话能绕过限制吗？如果要写在仓库里该放到哪里？",
  "excerpt": "仓库内路径必须落在 `data/exports/`；`data/` 根目录没有被 gitignore，`data/ecg.json` 这类路径会被拒绝。路径、已存在的 symlink 和父目录都会先 resolve，再确认结果仍在 `data/exports/` 下。仓库外路径仍可写。",
  "fact": "ECG 导出在仓库内必须写到 data/exports/ 下，data/ecg.json 会被拒绝，且会解析符号链接与父目录以确保仍在该目录；仓库外路径可写。",
  "rubric": {
   "must_include": [
    "仓库内必须在 data/exports/ 下",
    "data/ecg.json 会被拒绝",
    "会解析符号链接/父目录，无法绕过限制"
   ],
   "reference_answer": "不可以；仓库内导出路径必须在 data/exports/ 下，data/ecg.json 会被拒绝；会解析符号链接和父目录以确保仍在 data/exports/，无法绕过（仓库外路径可写）。"
  }
 },
 {
  "cid": "skill_image_generation#0",
  "target": "skill_image_generation",
  "question": "我用 Gemini 出图时加了 --quality high，怎么看起来没区别？这个参数在 Gemini 下到底会不会生效？",
  "excerpt": "`--quality low|medium|high|xhigh|max|auto` applies to GPT Image models. GPT Image 2.5 adds `xhigh`, `max`, and `auto`, and its quality scale is finer than GPT Image 2's: 2.5 `high` costs about a quarter of GPT Image 2 `high`, and 2.5 `max` matches the old `high`. Gemini accepts the flag but ignores it because quality tiers are provider-specific.",
  "fact": "Gemini 会接受 --quality 参数但忽略它；该参数只对 GPT Image 模型生效。",
  "rubric": {
   "must_include": [
    "明确说明 --quality 在 Gemini 下被忽略/不起作用",
    "指出该参数仅对 GPT Image 模型生效"
   ],
   "reference_answer": "在 Gemini 下 --quality 会被忽略，只有 GPT Image 系列才会应用质量设置。"
  }
 },
 {
  "cid": "skill_image_generation#1",
  "target": "skill_image_generation",
  "question": "我想把用 draw.io 画的示意图导出成 PNG，直接放到对外发布的 Markdown 教程里可以吗？如果不行，正确做法是什么？",
  "excerpt": "Final delivery format rule for external Markdown deliverables: every embedded image in a survey report, blog draft, course material, or share-ready document must be a PNG, JPG, or WebP file produced by a GPT Image model (`gpt-image-2.5-sunburst` / `gpt-image-2.5-flare` / `gpt-image-2`) generation/redraw, or a compressed derivative of that output.",
  "fact": "对外 Markdown 文档的最终嵌入图必须由 GPT Image 模型产出（或其压缩派生），不能直接用本地工具导出的图。",
  "rubric": {
   "must_include": [
    "不能直接嵌入本地导出的图像",
    "必须通过 GPT Image 模型生成/重绘后作为最终嵌入图（或其压缩派生物）"
   ],
   "reference_answer": "不可以，最终嵌入图必须是由 GPT Image 模型生成/重绘得到的 PNG/JPG/WebP（或其压缩派生），不能直接用 draw.io 导出的 PNG。"
  }
 },
 {
  "cid": "innovation_assistant#0",
  "target": "innovation_assistant",
  "question": "我既要改进我们现有的在线教育平台，也想探索它未来两年的全新形态。该走哪套路线，能否把两种方法结合起来用？如果能，具体怎么分工？",
  "excerpt": "3. **Both apply** (an existing product AND an open question about its future) → run Think Bigger as the outer loop; use SIT templates as an additional tactic generator inside the search step.",
  "fact": "当既有产品改进与开放式探索同时成立时，应以 Think Bigger 为主流程，并在搜索步骤中把 SIT 仅作为补充招法生成器。",
  "rubric": {
   "must_include": [
    "以 Think Bigger 为主流程（外层）",
    "SIT 只在搜索步骤里作为补充战术生成器"
   ],
   "reference_answer": "两者都适用时，用 Think Bigger 作为主流程，并在搜索阶段把 SIT 模板当作附加的战术生成器嵌入。"
  }
 },
 {
  "cid": "innovation_assistant#1",
  "target": "innovation_assistant",
  "question": "我在做一款团队协作工具，想把已有的评论、权限、自动化三块拼成一个“按异常自动派任务”的能力：控件都常见，但这种整合我没见过。按你的方法，这种情况要怎么分类并在报告里标注？",
  "excerpt": "An idea whose parts all exist but whose integration layer has no precedent anywhere is a partial violation — label it `mental_invention` and attach the risk note.",
  "fact": "部件都已有但整合方式无前例时，视为部分类违规，需标注为 mental_invention 并附上风险说明。",
  "rubric": {
   "must_include": [
    "标注为 mental_invention",
    "附上风险说明/风险备注"
   ],
   "reference_answer": "把它当作部分类违规：标注为 mental_invention，并附上风险说明。"
  }
 },
 {
  "cid": "skill_intake#0",
  "target": "skill_intake",
  "question": "我按说明生成了示例音频，但只得到一个 .wav 文件。我要怎么处理才能让后面的同步步骤识别这段音频？需要先装哪些依赖？",
  "excerpt": "If `make-sample-audio` reports a `.wav` output instead of `.m4a`, install or fix `ffmpeg` and rerun the sample generation. Sync only processes `.m4a` and `.qta` files.",
  "fact": "示例音频若生成 wav，必须先安装或修复 ffmpeg 并重新生成为 m4a；同步只处理 m4a/qta。",
  "rubric": {
   "must_include": [
    "需要安装或修复 ffmpeg 并重生成音频",
    "同步只处理 m4a 和 qta（wav 不会被处理）"
   ],
   "reference_answer": "先装好或修复 ffmpeg，再重新生成 m4a；同步只吃 m4a/qta，wav 会被忽略。"
  }
 },
 {
  "cid": "skill_intake#1",
  "target": "skill_intake",
  "question": "我想在这台 Mac 上开启每天夜里自动跑，但我已经有一堆 crontab 任务了。安装的时候会不会把我原有的排程覆盖？会自动做备份吗？",
  "excerpt": "The CLI also writes a timestamped backup under `logs/crontab_backup_*.txt` and appends one marked line if absent. Append only; never replace the user's existing schedule.",
  "fact": "安装夜间自动运行时会追加而不覆盖，并在 logs/crontab_backup_*.txt 下写入时间戳备份。",
  "rubric": {
   "must_include": [
    "不会替换现有计划，只追加一行",
    "会在 logs/crontab_backup_*.txt 写时间戳备份"
   ],
   "reference_answer": "不会覆盖，安装只追加一行并在 logs/crontab_backup_*.txt 下写时间戳备份。"
  }
 },
 {
  "cid": "app_store_release#1",
  "target": "app_store_release",
  "question": "我用 Apple ID 的专用密码在命令行登录后，能否查询某个构建的处理进度？如果不行，需要改用哪种方式查询？",
  "excerpt": "- **Note**: An app-specific password cannot query the processing status of individual builds; that status requires an App Store Connect API key or the App Store Connect web interface.",
  "fact": "用应用专用密码无法查询单个构建的处理状态；需要改用 App Store Connect API Key 或登录网页查看。",
  "rubric": {
   "must_include": [
    "不能用应用专用密码查询处理状态",
    "需要使用 App Store Connect 的 API Key 或网页版界面"
   ],
   "reference_answer": "不行；需要用 App Store Connect 的 API Key 或直接在网页端查看。"
  }
 },
 {
  "cid": "ios_development#0",
  "target": "ios_development",
  "question": "我在 CI 上想把同一个 iOS 工程同时跑两条 xcodebuild 流水线，并都指向同一个 DerivedData 目录，这样能快点吗？需要怎么配置才能避免互相锁表之类的问题？",
  "excerpt": "Run `xcodebuild` sequentially against a single `-derivedDataPath` per project. Parallel builds against the same project or DerivedData fail with `build.db: database is locked`.",
  "fact": "对同一项目/同一路径必须串行使用单一 -derivedDataPath；并发共享会因 build.db 被锁而失败。",
  "rubric": {
   "must_include": [
    "必须串行运行 xcodebuild 针对单一 -derivedDataPath/同一项目",
    "并行共享同一 DerivedData/项目会失败",
    "报错为 build.db: database is locked"
   ],
   "reference_answer": "不能这样做；对同一项目必须串行运行并使用单一 -derivedDataPath，并行共享会因 build.db: database is locked 而失败。"
  }
 },
 {
  "cid": "ios_development#1",
  "target": "ios_development",
  "question": "我的 Mac 没有登录任何苹果账号，但我想把调试构建装到我的 iPhone 上。命令里要不要打开那个“允许自动下载描述文件”的参数，还是有别的推荐做法？",
  "excerpt": "Device install uses automatic signing with a cached wildcard profile without `-allowProvisioningUpdates` when no Xcode account session is active.",
  "fact": "未登录 Xcode 账号时，真机安装应使用已缓存的通配符开发签名自动签名，且不需要加 -allowProvisioningUpdates。",
  "rubric": {
   "must_include": [
    "不需要使用 -allowProvisioningUpdates",
    "未登录 Xcode 账号也可安装到真机",
    "使用已缓存的通配符（wildcard）自动开发签名"
   ],
   "reference_answer": "不需要；用已缓存的通配符开发签名自动签名即可在未登录的情况下安装到真机，且不要加 -allowProvisioningUpdates。"
  }
 },
 {
  "cid": "simulator_testing#0",
  "target": "simulator_testing",
  "question": "在 iPhone 模拟器的 UI 自动化里，我需要做一次可控的拖动（不要有甩动/动量），但找不到能用的拖拽 API，还遇到过指针事件不支持的报错。应该用哪个调用来实现拖动？手势时长要设为多少才能避免被当成长按？",
  "excerpt": "For controlled scrolling without fling momentum, use:\n  ```swift\n  coordinate.press(forDuration: 0.1, thenDragTo: otherCoordinate)\n  ```\n  A duration of 0.1 s stays below the system long-press threshold, functioning as a controlled drag.",
  "fact": "在 iPhone 模拟器的 XCUITest 中没有现成的拖拽 API，需要用 coordinate.press(forDuration: 0.1, thenDragTo:) 实现拖动，且 0.1 秒避免触发长按。",
  "rubric": {
   "must_include": [
    "给出 coordinate.press(forDuration: 0.1, thenDragTo:) 的用法",
    "明确持续时间为 0.1 秒以避开长按阈值"
   ],
   "reference_answer": "使用 coordinate.press(forDuration: 0.1, thenDragTo:)，时长设为 0.1 秒以避免触发系统长按。"
  }
 },
 {
  "cid": "simulator_testing#1",
  "target": "simulator_testing",
  "question": "用 Xcode 26 在指定的模拟器 UUID 上截图时，直接跑 simctl screenshot 不是报错就是只打印 usage。请告诉我应该用哪条完整命令（含必要的子命令）把截图保存到我提供的路径？",
  "excerpt": "- `simctl screenshot` fails or prints usage: Route screenshot commands through `xcrun simctl io <simulator-uuid> screenshot <path>`. Recent Xcode releases route capture operations through `io`.",
  "fact": "在近期 Xcode 中应使用 xcrun simctl io <simulator-uuid> screenshot <path> 截图，不能直接调用 simctl screenshot。",
  "rubric": {
   "must_include": [
    "使用 io 子命令：xcrun simctl io <simulator-uuid> screenshot <path>",
    "包含模拟器 UUID 和输出路径"
   ],
   "reference_answer": "使用 xcrun simctl io <simulator-uuid> screenshot <path> 进行截图。"
  }
 },
 {
  "cid": "watch_development#0",
  "target": "watch_development",
  "question": "首次把我的 Apple Watch 作为真机目标编译时，命令行经常在“准备手表”阶段就因等待可用目标超时而失败。请问 xcodebuild 要加什么参数、怎么设置时间，才能在设备准备/拷符号期间不提前退出？",
  "excerpt": "To prevent premature build failures while the Mac copies OS symbols, pass `-destination-timeout <seconds>` (allocating sufficient time for preparation to finish).",
  "fact": "在 DDI/符号拷贝期间需要给 xcodebuild 加上 -destination-timeout 并设置足够长的秒数，否则会因默认超时过短而提前失败。",
  "rubric": {
   "must_include": [
    "明确写出使用 xcodebuild 的 -destination-timeout 参数",
    "说明需要给出足够长的秒数以覆盖设备准备/符号拷贝过程"
   ],
   "reference_answer": "在构建命令里加上 -destination-timeout <秒数>，把超时时间拉长到足以等完设备准备/符号拷贝。"
  }
 },
 {
  "cid": "watch_development#1",
  "target": "watch_development",
  "question": "我在 watchOS 上做跑步记录，是否应该把 CLLocationManager 的 allowsBackgroundLocationUpdates 设为 true 才能持续拿到位置？Info.plist 里已开启锻炼相关的后台模式，这个属性还能开吗，会不会引发崩溃？",
  "excerpt": "A recording app gets background runtime from the active `HKWorkoutSession`; while the session\nruns, CoreLocation keeps delivering updates, so the app does not need — and must not set —\n`allowsBackgroundLocationUpdates` on watchOS (see Traps). It may still declare\n`WKBackgroundModes = [workout-processing]` in its Info.plist, but that declaration does not by\nitself permit the flag.",
  "fact": "在 watchOS 上不要设置 CLLocationManager.allowsBackgroundLocationUpdates；后台定位由活动的 HKWorkoutSession 提供，Info.plist 的声明不赋予开启该标志的权限。",
  "rubric": {
   "must_include": [
    "不要在 watchOS 上设置 allowsBackgroundLocationUpdates",
    "后台由活动的 HKWorkoutSession 提供（Info.plist 的声明不等于可以开启该属性）"
   ],
   "reference_answer": "不需要也不能开启；watchOS 上由 HKWorkoutSession 提供后台定位，即使声明了锻炼后台模式也不要设置 allowsBackgroundLocationUpdates。"
  }
 },
 {
  "cid": "skill_kit#0",
  "target": "skill_kit",
  "question": "我用订阅者计数的命令跑出一个数字，这个可以直接当成某个标签/分组或某份简报受众的数量吗？如果我要只统计某个标签，命令应该怎么加参数？另外如果标签名字写错了会返回什么？",
  "excerpt": "`analytics subscriber-count` returns account-wide active subscribers. Do not interpret it as a tag, segment, or newsletter audience count unless the account has only one audience. For a per-audience count, pass `--tag` with a tag name or numeric id; use `analytics tags` to discover tag names. An unknown tag name exits 1 with `Tag not found`.",
  "fact": "subscriber-count 默认是账号级活跃订阅者；按标签统计需传 --tag，未知标签会以退出码 1 并提示 Tag not found。",
  "rubric": {
   "must_include": [
    "默认是账号范围的活跃订阅者总数",
    "按标签统计需传 --tag（可用名称或数字ID）",
    "未知标签时报错并以退出码 1 结束，信息为 'Tag not found'"
   ],
   "reference_answer": "不是；那个计数是账号级别的活跃订阅者总数；要按某标签统计请给命令加 --tag（标签名或ID）；如果标签名不存在将以退出码 1 结束并显示 'Tag not found'。"
  }
 },
 {
  "cid": "skill_kit#1",
  "target": "skill_kit",
  "question": "我要导出订阅者清单来看具体邮箱，但现在结果都被打码了，怎么才能显示出邮箱？需要满足什么安全条件？",
  "excerpt": "Subscriber list commands redact emails by default. Use `--show-emails` only when the terminal, log, and output file are private.",
  "fact": "订阅者清单默认隐藏邮箱；仅在终端/日志/输出文件均为私有时才可用 --show-emails 显示。",
  "rubric": {
   "must_include": [
    "默认会隐藏邮箱",
    "使用 --show-emails 才能显示邮箱",
    "仅在终端、日志和输出文件都是私有时才可这么做"
   ],
   "reference_answer": "订阅者清单默认会遮蔽邮箱；只有在终端、日志和输出文件都确保私有的前提下，才能加 --show-emails 来显示真实邮箱。"
  }
 },
 {
  "cid": "koyeb#0",
  "target": "koyeb",
  "question": "我想用 Koyeb CLI 看某个服务的运行日志，只拉取并跟随最后 100 行。--tail 100 这种写法可以吗？如果不行，应该怎么实时跟随当前日志？",
  "excerpt": "# Tail current logs (--tail is a boolean, not a line count)\npython3 scripts/koyeb_env.py -- services logs example-service --app example-app --tail",
  "fact": "日志跟随参数 --tail 是布尔开关，不接受行数；实时查看需直接加 --tail。",
  "rubric": {
   "must_include": [
    "不能用 --tail 100（--tail 不接受数字）",
    "直接使用 --tail 作为布尔开关实时跟随日志"
   ],
   "reference_answer": "不可以；--tail 不是行数而是布尔开关，直接加 --tail 即可实时跟随当前日志。"
  }
 },
 {
  "cid": "koyeb#1",
  "target": "koyeb",
  "question": "我们这边用你们的封装脚本来跑 Koyeb 命令，能不能在命令里直接加 --token 切换账号？如果脚本拒绝这个参数，会返回什么退出码？",
  "excerpt": "- **Prohibited Flags**: The launcher explicitly rejects `--token`, `--debug-full`, and `--url` (exits with code `2`). Never pass tokens in `argv`.",
  "fact": "启动器禁止传 --token/--debug-full/--url；若传入会被拒绝并以退出码 2 退出。",
  "rubric": {
   "must_include": [
    "不能传 --token 给封装脚本",
    "被拒绝时退出码为 2"
   ],
   "reference_answer": "不可以；封装脚本会拒绝 --token 并以退出码 2 退出。"
  }
 },
 {
  "cid": "logto_management_skill#0",
  "target": "logto_management_skill",
  "question": "我想直接用 CLI 的 API 子命令去 PATCH Logto 的登录体验或账号中心设置，加上 --execute 就能生效吗？如果不行，该怎么操作？",
  "excerpt": "Every non-GET direct call is a dry-run without `--execute`. Direct writes to sign-in experience, account center, and connectors remain blocked even with `--execute`; use their guarded command groups.",
  "fact": "对登录体验、账号中心和连接器的直接写操作即使加 --execute 也会被阻止，必须用对应的命令组执行。",
  "rubric": {
   "must_include": [
    "说明即使带 --execute 也不会直接生效",
    "必须使用对应的命令组而不是直接 API 调用"
   ],
   "reference_answer": "不行；这类配置的直接调用即使带 --execute 也被阻止，必须用对应的命令组来修改。"
  }
 },
 {
  "cid": "logto_management_skill#1",
  "target": "logto_management_skill",
  "question": "我准备调整 Logto 的邮件模板：能直接去改对应连接器里的模板数组吗？备份出来的文件可以提交到代码仓库吗？",
  "excerpt": "Email templates are embedded in one connector's `config.templates` array. Never patch that connector manually. Backups contain complete connector configuration, may contain secrets, and belong only in the gitignored owner-readable backup directory.",
  "fact": "邮件模板位于某个连接器配置中，禁止手动改该连接器；模板备份可能含密信息，只能放在被 git 忽略且仅拥有者可读的目录。",
  "rubric": {
   "must_include": [
    "不要手动修改连接器中的模板数组",
    "备份可能含敏感信息，必须保存在被 git 忽略且仅拥有者可读的目录，不能入库"
   ],
   "reference_answer": "不要直接改连接器里的模板数组；备份可能含密钥，只能放在忽略提交且仅拥有者可读的备份目录。"
  }
 },
 {
  "cid": "m5stack_sticks3#0",
  "target": "m5stack_sticks3",
  "question": "在我的 M5StickS3（Arduino core 3.3.8 / IDF 5.x）上做 ESP-NOW，接收回调函数的参数签名到底用哪种？照网上老例子写成 (const uint8_t* mac, const uint8_t* data, int len) 一直编译不过，该怎么改？",
  "excerpt": "- 收包回调签名以 IDF 5.x 为准：`void recv_cb(const esp_now_recv_info_t *info, const uint8_t *data, int len)`；IDF 4.x 是 `(const uint8_t *mac, const uint8_t *data, int len)`，旧签名直接编不过。",
  "fact": "在 IDF 5.x 上 ESP-NOW 接收回调必须使用含 esp_now_recv_info_t* 参数的签名，否则用旧 (mac, data, len) 写法会编译失败。",
  "rubric": {
   "must_include": [
    "给出完整且正确的 5.x 回调签名",
    "明确包含 esp_now_recv_info_t* info 参数"
   ],
   "reference_answer": "使用 IDF 5.x 签名：void recv_cb(const esp_now_recv_info_t *info, const uint8_t *data, int len)。"
  }
 },
 {
  "cid": "m5stack_sticks3#1",
  "target": "m5stack_sticks3",
  "question": "我在 StickS3 上用 RMT 接收红外码，老是收不到或很杂，除了确认引脚外，电源相关需要先做哪些设置才能稳定接收？",
  "excerpt": "关键约束：\n- IR_TX=GPIO46, IR_RX=GPIO42，收发器在设备顶部\n- 接收前必须关功放 + 开 EXT_5V\n- 用 RMT 外设（不是 GPIO 轮询）\n- 38kHz 载波",
  "fact": "进行红外接收前必须先关闭喇叭功放并开启 EXT_5V 供电（并用 RMT 接收）。",
  "rubric": {
   "must_include": [
    "明确提到接收前要关闭功放",
    "明确提到接收前要开启 EXT_5V"
   ],
   "reference_answer": "接收前先把喇叭功放关掉并打开 EXT_5V，再用 RMT 接收即可。"
  }
 },
 {
  "cid": "m5stack_sticks3_esp_idf#0",
  "target": "m5stack_sticks3_esp_idf",
  "question": "我做了个基于 ESP-IDF 的 BLE 键盘，设了固定的广播时长后，过一段时间设备就再也搜不到了。广播持续时间应该具体怎么设置，才能避免后续不可被发现？",
  "excerpt": "- advertising duration 使用 `BLE_HS_FOREVER`；180 秒会让设备之后不可发现",
  "fact": "BLE 广播持续时间必须设为 BLE_HS_FOREVER，设为 180 秒会导致设备之后不可被发现。",
  "rubric": {
   "must_include": [
    "明确写出使用 BLE_HS_FOREVER",
    "指出不要使用 180 秒（会导致之后不可发现）"
   ],
   "reference_answer": "将广播持续时间设为 BLE_HS_FOREVER（不要设 180 秒，否则之后会不可发现）。"
  }
 },
 {
  "cid": "m5stack_sticks3_esp_idf#1",
  "target": "m5stack_sticks3_esp_idf",
  "question": "在 StickS3 同时跑 BLE HID 和 HTTPS 大上传时，写到十几 KB 就卡住超时且 errno 还是 0，该怎么改 BLE 的内存分配配置才能避免这种卡死？",
  "excerpt": "典型表象不是明确的 `ESP_ERR_NO_MEM`，而是 TLS connect 失败，或大 body 写到约 10-20KB 后 `esp_http_client_write()` 等满 timeout、返回 0，`esp_http_client_get_errno()` 仍为 0。这很容易误判成 MTU black hole、TCP ACK 丢失或 Wi-Fi/BLE airtime coexistence。\n\n有 8MB Octal PSRAM 的 StickS3 优先配置：\n\n```text\nCONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL=y\n# CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL is not set\n```",
  "fact": "应将 NimBLE host 的内存分配改为使用外部 RAM：开启 CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL，并禁用 INTERNAL 模式。",
  "rubric": {
   "must_include": [
    "写明启用 CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL=y",
    "说明不要启用/需关闭 INTERNAL 分配模式（CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL 不设）"
   ],
   "reference_answer": "把 NimBLE 的内存分配切到外部内存：启用 CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL=y，并且不启用内部模式（CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL 不设）。"
  }
 },
 {
  "cid": "m5stack_sticks3_m5unified#0",
  "target": "m5stack_sticks3_m5unified",
  "question": "我用 M5Unified 在 StickS3 上用 playRaw 连续播放 8kHz、20ms 一帧的短音频，开始几帧正常但很快就没声了，而且 playRaw 返回 false。应该改哪个参数才能让它稳定连播？",
  "excerpt": "- **连续流式必须显式固定 `channel`（如 0）**：`channel=-1` 每次自动选空闲声道，虚拟声道共 8 个，短 chunk 各占一个，播 8 帧左右后全部占满、`playRaw` 返回 false，声音无声消失。复位用 `M5.Speaker.stop(0)`。",
  "fact": "连续流式播放必须固定指定 playRaw 的 channel（如 0），否则用 -1 会占满 8 个虚拟声道导致静音。",
  "rubric": {
   "must_include": [
    "明确指出要把 playRaw 的 channel 固定为同一个值（例如 0）",
    "说明不要用 -1 自动分配或会占满 8 个虚拟声道导致静音"
   ],
   "reference_answer": "把 playRaw 的 channel 固定成同一个值（例如 0），不要用 -1 自动分配，否则 8 个虚拟声道占满后就会静音。"
  }
 },
 {
  "cid": "m5stack_sticks3_m5unified#1",
  "target": "m5stack_sticks3_m5unified",
  "question": "在 StickS3 上用 ESP-IDF 的 RMT 驱动做红外接收时，我把 signal_range_min_ns 设成 4000ns 就直接报错，这个参数最大能设到多少？",
  "excerpt": "- TX 和 RX 必须用同一个时钟源（都用 `RMT_CLK_SRC_DEFAULT`），否则报 `group clock conflict`\n- `signal_range_min_ns` 最大 3187ns（RMT 硬件限制），设太大直接报错\n- RMT RX 是 one-shot，每次接收完需重新调 `rmt_receive()`",
  "fact": "RMT 的 signal_range_min_ns 最大只能设到 3187ns，超过会直接报错。",
  "rubric": {
   "must_include": [
    "给出 signal_range_min_ns 的最大值 3187ns"
   ],
   "reference_answer": "signal_range_min_ns 的上限是 3187ns。"
  }
 },
 {
  "cid": "m5stack_sticks3_test_loop#0",
  "target": "m5stack_sticks3_test_loop",
  "question": "我用 ESP-IDF 在 Mac 上给我的 M5StickS3 从运行态直接刷机，想把串口速率调到 921600 提高速度，这样稳吗？如果不稳，请给出推荐的上传速率。",
  "excerpt": "在 M5StickS3 SKU K150 + ESP-IDF 5.5.5 上，运行态到运行态的全自动循环已经实机验证。115200 baud 是已验证的可靠刷写速率；更高 baud 即使写入看似完成，也可能在 MD5/hash 校验阶段失败。不要用 `esptool run` 默认行为替代标准 flash-to-run 验收：该命令执行用户代码后仍可能按默认 `--after=hard_reset` 再次复位，观察到的最终状态容易误导。",
  "fact": "StickS3 刷写应固定使用 115200 波特率，更高波特率可能在 MD5/hash 校验阶段失败。",
  "rubric": {
   "must_include": [
    "建议使用 115200 波特率刷写",
    "更高波特率可能在 MD5/hash 校验阶段失败"
   ],
   "reference_answer": "不要提速，按 115200 波特率刷写；更高波特率即使看似写完，也可能在 MD5/hash 校验时失败。"
  }
 },
 {
  "cid": "m5stack_sticks3_test_loop#1",
  "target": "m5stack_sticks3_test_loop",
  "question": "我的 M5StickS3 是电池供电，刷机或软件重启后常立刻又睡下，导致 macOS 来不及识别端口。应该预留多长的清醒时间给主机枚举和验证？只做界面上的延时是否足够？",
  "excerpt": "电池产品即使最终必须进入 deep sleep，也应在刷写或其他非 deep-sleep reset 后保留约 60 秒的不可缩短 awake 窗口，让 macOS 完成 USB Serial/JTAG 枚举并给 agent 留出验证、重刷时间。用 reset reason 区分这类启动和 GPIO deep-sleep wake：前者设置全局 `sleep_not_before`，所有较短 idle timer 都不能越过它；后者走正常产品时序。只在 UI 上延迟 60 秒不够，因为期间的按钮往返或任务完成可能重新设置更早的休眠 deadline。",
  "fact": "刷写或非深睡复位后必须保留约 60 秒不可缩短的清醒窗口，不能只做 UI 延时；应基于 reset reason 设全局 sleep_not_before。",
  "rubric": {
   "must_include": [
    "约 60 秒的清醒窗口",
    "只做 UI 延时不够",
    "基于 reset reason 设置全局不早于时间（sleep_not_before）以防更早入睡"
   ],
   "reference_answer": "需要在刷机或非深睡复位后保留约 60 秒不可缩短的清醒窗口，不能只靠界面延时；要按 reset reason 设置全局 sleep_not_before，确保短 idle 定时器不会让设备更早入睡。"
  }
 },
 {
  "cid": "maven#0",
  "target": "maven",
  "question": "我刚跑了 maven-skill 的会话检查，显示连接正常，但接着执行读数据的命令却被重定向到登录页。现在应该怎么处理，继续重试还是先做别的？",
  "excerpt": "- 返回包含 `browser_connected: true` 时方可继续；连接失败或超时则**停下来提示用户**：“未检测到活跃的 Maven 浏览器会话，请先执行 `maven-skill session open` 并在弹出的浏览器中完成登录。”\n- **重要提示**：`status` 仅代表本地 CDP 调试端口可达，**不代表 Maven 已登录**。业务命令若报告未认证（跳转登录页、找不到账号菜单），停止并提示用户登录。",
  "fact": "session status 只代表本地 CDP 端口可达，不保证已登录；若出现未认证迹象必须停止并提示用户先登录。",
  "rubric": {
   "must_include": [
    "说明 status 仅表示连通性，不等于已登录",
    "要求停止继续执行并提示用户先登录",
    "可指出需通过打开会话窗口完成登录"
   ],
   "reference_answer": "停止执行并提示用户先在浏览器完成登录；status 只说明 CDP 端口可达，不代表已登录。"
  }
 },
 {
  "cid": "maven#1",
  "target": "maven",
  "question": "我想给课程加个折扣码 ABC_DEF，但在页面点保存时完全没反应，这是为什么？折扣码应该用什么字符才有效？",
  "excerpt": "**Code 字符集**：Maven 折扣码只接受字母、数字和连字符 `-`，**不接受下划线**。构造代码时先做 `^[A-Za-z0-9-]+$` 自检。含 `_` 的代码会被客户端校验拒绝；已观察到的一种形态是既不发请求也无弹窗，表现为「点了没反应」，因此不能靠界面反馈猜测成败。",
  "fact": "折扣码仅允许字母、数字和连字符-，不允许下划线；含下划线会被前端校验拦截，表现为“点了没反应”。",
  "rubric": {
   "must_include": [
    "明确下划线不被允许",
    "给出允许的字符集合（或等价正则）",
    "解释“没反应”是前端校验拦截未发请求"
   ],
   "reference_answer": "不允许下划线，折扣码必须只含字母、数字和连字符-（匹配 ^[A-Za-z0-9-]+$）；含 _ 会被前端拦截所以看起来点了没反应。"
  }
 },
 {
  "cid": "narwal#1",
  "target": "narwal",
  "question": "我在客厅直接让我的 Narwal 开始全屋清扫，结果提示 NOT_READY，这是什么原因？怎么做它才会接受开始清扫？",
  "excerpt": "Whole house `narwal-local start`; selected rooms `narwal-local clean --rooms 3,5`. Both use `clean/start_clean`, which **only applies while the robot is docked**; otherwise the robot answers `NOT_READY` (exit 20).",
  "fact": "开始全屋或按房间清扫只在机器人停靠底座时才适用，否则设备返回 NOT_READY（退出码 20）。",
  "rubric": {
   "must_include": [
    "必须在底座/停靠状态下发送开始清扫",
    "否则会返回 NOT_READY（退出码 20）"
   ],
   "reference_answer": "需要让机器人先停靠在底座，再下达 start/clean；未停靠会被设备以 NOT_READY 拒绝（退出码 20）。"
  }
 },
 {
  "cid": "bilingual_subtitles#0",
  "target": "bilingual_subtitles",
  "question": "我想把一次会议的视频做双语字幕。准备阶段能直接用 SRT 或只有句级时间的语音识别结果当作输入吗？如果有更精确的时间轴，还能用这份 ASR 覆盖掉吗？",
  "excerpt": "Use `bilingual-subtitles prepare` to parse a timestamped VTT into source records and write a language-order manifest. Other SRT, diarization, and ASR sidecars are agent evidence; the current deterministic preparation input is VTT. ASR output without fine timing must not replace a better cue timeline.",
  "fact": "准备阶段只接受带时间戳的 VTT 作为确定性输入；SRT/说话人/ASR 只是证据，且无细粒度时间的 ASR 不能替换更好的时间轴。",
  "rubric": {
   "must_include": [
    "准备阶段的确定性输入是带时间戳的 VTT",
    "SRT/ASR 等仅作证据，不能直接作为准备输入",
    "无细粒度时间的 ASR 不得覆盖更优时间轴"
   ],
   "reference_answer": "不能；准备阶段必须用带时间戳的 VTT，SRT/ASR 只能当作证据，而且没有细粒度时间的 ASR 不能替换现有更精确的时间轴。"
  }
 },
 {
  "cid": "bilingual_subtitles#1",
  "target": "bilingual_subtitles",
  "question": "我把长讲座按时间切成几段并行做字幕时，跨越分段边界的条目该怎么分配？应该选取所有与时间区间相交的条目，还是只按开始时间落在哪个分段来归属，才能避免重复？",
  "excerpt": "Selecting every cue that intersects adjacent time packets duplicates boundary-spanning cues. Packet assignment must use cue start time.",
  "fact": "并行时间分段时，字幕条目必须按起始时间归属分段，不能按与分段相交来选以免重复。",
  "rubric": {
   "must_include": [
    "按条目起始时间归属分段",
    "说明按相交选择会导致重复"
   ],
   "reference_answer": "按条目的起始时间归属分段；不要按与区间相交来选，否则会把跨界条目重复计算。"
  }
 },
 {
  "cid": "download_and_transcribe#0",
  "target": "download_and_transcribe",
  "question": "我用 yt-dlp 下载某个 B 站的视频，即便导入了浏览器的 Cookie 还是一直返回 412。为了先拿到可用的直链做转写，应该改用哪个接口，参数要怎么填？",
  "excerpt": "'https://api.bilibili.com/x/player/playurl?bvid=BVxxxxxxxxxx&cid=<CID>&platform=html5&high_quality=1&fnval=0&qn=80'",
  "fact": "在 yt-dlp+Cookie 仍 412 时，改用 HTML5 渠道的 playurl 接口，并带上 platform=html5&high_quality=1&fnval=0（连同 bvid 与 cid）即可获取直链。",
  "rubric": {
   "must_include": [
    "调用 /x/player/playurl 并提供 bvid 与 cid",
    "必须包含参数 platform=html5&high_quality=1&fnval=0"
   ],
   "reference_answer": "改用 https://api.bilibili.com/x/player/playurl，带上 bvid 和 cid，并设置 platform=html5&high_quality=1&fnval=0（可加 qn=80），即可返回直链 durl[0].url。"
  }
 },
 {
  "cid": "download_and_transcribe#1",
  "target": "download_and_transcribe",
  "question": "我还没配置 ASR 的环境变量，直接运行的话会用哪个 Python 解释器和哪份转写脚本？需要我手动指定吗？",
  "excerpt": "If `ONLINE_MEDIA_ASR_PYTHON` is unset, the CLI uses the current Python. If `ONLINE_MEDIA_TRANSCRIBE_SCRIPT` is unset, the CLI expects a project-local `scripts/transcribe.py` or a caller-provided `--transcribe-script` once that option is added.",
  "fact": "未设置 ONLINE_MEDIA_ASR_PYTHON/ONLINE_MEDIA_TRANSCRIBE_SCRIPT 时，分别使用当前 Python，并默认找项目内 scripts/transcribe.py（或由未来的 --transcribe-script 指定）。",
  "rubric": {
   "must_include": [
    "未设 ONLINE_MEDIA_ASR_PYTHON 时使用当前 Python",
    "未设 ONLINE_MEDIA_TRANSCRIBE_SCRIPT 时默认找项目内 scripts/transcribe.py"
   ],
   "reference_answer": "不会强制你手动指定：未设 ONLINE_MEDIA_ASR_PYTHON 就用当前 Python；未设 ONLINE_MEDIA_TRANSCRIBE_SCRIPT 则默认找项目内的 scripts/transcribe.py（或用后续提供的 --transcribe-script 覆盖）。"
  }
 },
 {
  "cid": "media_metadata#0",
  "target": "media_metadata",
  "question": "我想把从 Tidal 下的无损音频导入 Apple Music/iOS 库同步到手机，源文件都是 FLAC。具体应该怎么处理格式和写标签/封面？原始 FLAC 需要删除吗？",
  "excerpt": "Apple Music and iOS library sync should use Apple-compatible containers. Do not treat FLAC as an import-ready final format for that path. Convert accepted FLAC sources to ALAC `.m4a`, then explicitly write MP4 tags and artwork after conversion. Keep the source FLAC files in the private runtime library unless the user asks to delete archive copies.",
  "fact": "Apple Music/iOS 导入必须先把 FLAC 转成 ALAC .m4a，再显式写入 MP4 标签和封面，且默认保留源 FLAC，除非用户要求删除。",
  "rubric": {
   "must_include": [
    "不能直接用 FLAC 导入，需要转 ALAC .m4a",
    "转换后要显式写 MP4 标签与封面",
    "源 FLAC 默认保留，除非用户要求删除"
   ],
   "reference_answer": "先把 FLAC 转成 ALAC .m4a，并在转换后显式写入 MP4 的标题/艺人等标签与封面；不要直接用 FLAC 导入；源 FLAC 默认保留，除非你要求删除。"
  }
 },
 {
  "cid": "media_metadata#1",
  "target": "media_metadata",
  "question": "我批量抓了 YouTube/Tidal 的音频，想马上导入本地音乐库。哪些元数据是必须的？如果没有封面该怎么处理？能否跳过校验直接导入？",
  "excerpt": "For Tidal and YouTube batch acquisition, post-download metadata verification is required before import. Accepted audio must have title, artist, and embedded cover artwork. If any of those fields are missing, fetch artwork from the selected platform metadata or quarantine the file until it can be corrected.",
  "fact": "Tidal/YouTube 批量导入前必须做下载后的元数据校验；每首需有标题、艺人和内嵌封面；缺失时应用平台元数据补齐封面或隔离等待修正。",
  "rubric": {
   "must_include": [
    "导入前必须校验，不能跳过",
    "必需字段：标题、艺人、内嵌封面",
    "缺失则用平台元数据补封面或先隔离"
   ],
   "reference_answer": "不能跳过；导入前要先校验，且每首必须有标题、艺人和内嵌封面；若缺则用平台信息补封面，否则先隔离等待修正。"
  }
 },
 {
  "cid": "medley_source_identification#0",
  "target": "medley_source_identification",
  "question": "我准备对识别出来的歌曲列表做去重，去重键应该怎么设？如果有行的歌名还是空着要不要参与？另外像“歌名A / 歌名B”这种边界标题且歌手也用斜杠对应时，需要怎么处理？",
  "excerpt": "The dedupe key is exact normalized `(song_title, artist)`. Rows with empty `song_title` are unresolved and excluded. Boundary rows such as `title A / title B` are expanded into separate entries when the artist field has matching slash-separated parts.",
  "fact": "去重时以标准化后的(歌名, 歌手)作为键，歌名为空的行不参与；若标题为A/B且歌手也对应A/B，则需要拆成两条记录。",
  "rubric": {
   "must_include": [
    "去重键是标准化后的(歌名, 歌手)",
    "歌名为空的行不参与去重",
    "标题A/B且歌手A/B对应时要拆成两条记录"
   ],
   "reference_answer": "用标准化后的(歌名, 歌手)去重，歌名为空的行排除；遇到“歌名A / 歌名B”且歌手也A/B对应时拆成两条独立记录。"
  }
 },
 {
  "cid": "medley_source_identification#1",
  "target": "medley_source_identification",
  "question": "我现在就想把分段级的结果表直接拿去批量下载音源，可以吗？到底应该用哪份CSV，下载前有没有必须先做的步骤？",
  "excerpt": "For bulk acquisition, use the manually reviewed deduped CSV rather than the original segment-level CSV. Do not download before dedupe.",
  "fact": "批量获取时必须用人工复核后的去重CSV，不能用原始分段级CSV；在去重前禁止下载。",
  "rubric": {
   "must_include": [
    "必须用人工复核后的去重CSV进行批量获取",
    "不要在去重前下载",
    "不能直接使用原始分段级CSV"
   ],
   "reference_answer": "不可以，需用人工审核后的去重CSV来批量获取，去重前不要下载，不能直接用分段级CSV。"
  }
 },
 {
  "cid": "music_library_dedup#1",
  "target": "music_library_dedup",
  "question": "我发现有些歌名相同但歌手不同的曲目，它们会被写进哪个清单文件？这些会不会出现在主清单里让我直接标记删除？",
  "excerpt": "Near-duplicate groups with the same normalized title but different artists are written separately to:\n\n```text\nsource_identification/music_library_near_duplicates.csv\n```\n\nThose rows are for manual inspection only. Do not trash them from the duplicate review CSV.",
  "fact": "同名不同歌手的分组只写入 near_duplicates.csv，用于人工查看，且不应在去重审阅CSV中被删除。",
  "rubric": {
   "must_include": [
    "写入 source_identification/music_library_near_duplicates.csv",
    "不出现在主去重审阅清单里，且不应在那份清单中标记删除"
   ],
   "reference_answer": "会被写到 source_identification/music_library_near_duplicates.csv；它们不会出现在去重审阅清单里，且不应在那份清单中标记删除。"
  }
 },
 {
  "cid": "online_media#0",
  "target": "online_media",
  "question": "我在做一个命令行小工具，想在下载和解析后直接给出歌曲标题、根据搜索结果打个置信度分，并顺便概括下转写内容，这样能不能一并在 CLI 里完成，还是要交给上层智能体处理？",
  "excerpt": "If a task asks the CLI to decide a song title, assign confidence from search results, or summarize a transcript, stop and move that work into the agent layer.",
  "fact": "CLI 遇到判定歌名、基于搜索打置信度或总结转写时必须停止并把工作交给 agent 层。",
  "rubric": {
   "must_include": [
    "明确不能在 CLI 内完成这些决策或摘要",
    "需要把这类工作移交给 agent 层",
    "至少提到一个被禁止的动作（如判歌名、打置信度或总结转写）"
   ],
   "reference_answer": "不可以，遇到判歌名、基于搜索打置信度或概括转写这类事，CLI 要停下并交给 agent 层处理。"
  }
 },
 {
  "cid": "online_media#1",
  "target": "online_media",
  "question": "downloader 生成的 .info.json 我要不要也推到 GitHub？里面有一些直链和浏览器指纹，看起来调试很方便，但会不会有风险？",
  "excerpt": "- Real `.info.json` files can contain signed URLs and browser identifiers. Keep them out of public repos.",
  "fact": "真实的 .info.json 可能包含签名链接和浏览器标识，必须不要放入公共仓库。",
  "rubric": {
   "must_include": [
    "不要把真实 .info.json 放到公开仓库",
    "说明原因：其中可能含签名 URL 和浏览器标识信息"
   ],
   "reference_answer": "不要提交，真实的 .info.json 可能含签名 URL 和浏览器标识，必须排除在公开仓库之外。"
  }
 },
 {
  "cid": "source_search#0",
  "target": "source_search",
  "question": "我用 yt-dlp 抓 YouTube 音源，有时看着成功但常见的音质/格式都没列全。是不是命令里缺了必须启用的运行时或远程组件？能给我一条正确的示例命令行吗？",
  "excerpt": "```bash\nyt-dlp --js-runtimes deno --remote-components ejs:github \\\n  -f \"bestaudio\" \\\n  --extract-audio --audio-format mp3 --audio-quality 0 \\\n  -o \"source_candidates/%(title)s.%(ext)s\" \\\n  \"https://www.youtube.com/watch?v=...\"\n```",
  "fact": "在 YouTube 上使用 yt-dlp 时必须启用 JS 运行时并加载 EJS 远程组件（--js-runtimes deno 与 --remote-components ejs:github），否则会漏抓可用格式。",
  "rubric": {
   "must_include": [
    "命令包含 --js-runtimes deno",
    "命令包含 --remote-components ejs:github"
   ],
   "reference_answer": "在 YouTube 上用 yt-dlp 要启用 JS 运行时并加载 EJS 远程组件，例如：yt-dlp --js-runtimes deno --remote-components ejs:github …"
  }
 },
 {
  "cid": "source_search#1",
  "target": "source_search",
  "question": "用 streamrip 下载 Tidal 时，曲目能搜到也能拉音频，但歌词接口返回 401。这个情况要不要让流程失败？应该怎么处理？",
  "excerpt": "If streamrip fails on the Tidal lyrics endpoint with `401 Unauthorized` while track search and audio access work, skip lyrics sidecars and continue with audio verification. The helper patches streamrip's lyrics failure handling so a lyrics endpoint error is logged instead of aborting the audio download.",
  "fact": "Tidal 歌词接口报 401 时应跳过歌词侧文件并继续音频验证，不要中断或放弃音频下载。",
  "rubric": {
   "must_include": [
    "不要因为歌词 401 终止或中断音频下载",
    "明确跳过/忽略歌词侧文件，继续做音频验证"
   ],
   "reference_answer": "不要中断；跳过歌词侧文件，继续进行音频验证/下载。"
  }
 },
 {
  "cid": "skill_open_router_data_scraper#0",
  "target": "skill_open_router_data_scraper",
  "question": "我调用 openrouter 的 model-activity 接口时，用模型的短标识总是拿到空数组。应该传哪种 ID 才能成功获取数据？",
  "excerpt": "| 短 slug 不被 model-activity 接受 | 返回空数组 | CLI 自动解析 canonical_slug（末尾 8 位日期）；手动传时需用 canonical_slug |",
  "fact": "model-activity 不接受短 slug，必须使用带末尾 8 位日期的 canonical_slug。",
  "rubric": {
   "must_include": [
    "需要使用 canonical_slug",
    "短 slug 会导致返回空数组"
   ],
   "reference_answer": "要用 canonical_slug（带末尾 8 位日期）；短 slug 会被 model-activity 拒绝并返回空数组。"
  }
 },
 {
  "cid": "skill_opencode_agent_to_agent#0",
  "target": "skill_opencode_agent_to_agent",
  "question": "用 append 发给另一个会话时，我能把 reply_to 和 request_id 这两个字段放进 JSON 里一起提交吗？如果不行，应该放在哪里？",
  "excerpt": "3. The prompt file is a text envelope with `actor: agent` and `not_a_user_instruction: true`. `reply_to` and `request_id` are in that text, not in the JSON body. A reply's `reply_to` is the responder or that responder's coordinator, not a copy of the requester address.",
  "fact": "reply_to 与 request_id 必须写在文本信封里，而不能放在 append 的 JSON 请求体中。",
  "rubric": {
   "must_include": [
    "不能把 reply_to 和 request_id 放在 JSON 里",
    "它们必须写在提示文件的文本信封中"
   ],
   "reference_answer": "不行；这两个键必须写在发送的文本信封里，不能放进 JSON 请求体。"
  }
 },
 {
  "cid": "skill_opencode_data#0",
  "target": "skill_opencode_data",
  "question": "我想按标题前缀选择一批会话去归档。默认会不会把这些会话下面的子会话也一起算进去？如果只想动被我选中的那些会话本身，要加什么参数？",
  "excerpt": "By default, CLI selectors expand descendants through the session `parent_id` chain. This keeps root sessions and subagent child sessions together. Use `--no-expand` only when the user explicitly wants the raw selector result.",
  "fact": "选择器默认会级联包含子会话；要禁止扩展需加 --no-expand。",
  "rubric": {
   "must_include": [
    "默认会包含子/后代会话",
    "使用 --no-expand 禁止扩展"
   ],
   "reference_answer": "默认会把子会话一起选中；要只保留原始匹配结果，请加 --no-expand。"
  }
 },
 {
  "cid": "skill_opencode_data#1",
  "target": "skill_opencode_data",
  "question": "我用导出功能把最近的对话转成 Markdown，但发现多代理分支的会话没有出现在导出的文件里。要怎么把这些分支也一并导出？需要加哪一个参数？",
  "excerpt": "Subagent fan-out sessions are skipped unless `--include-subagent` is set; `--since` accepts a relative window (e.g. `30d`) or an ISO date.",
  "fact": "导出时默认跳过子代理分支；用 --include-subagent 才会导出。",
  "rubric": {
   "must_include": [
    "默认跳过子代理分支",
    "使用 --include-subagent 才会导出"
   ],
   "reference_answer": "导出默认跳过子代理分支；加上 --include-subagent 才会把它们导出。"
  }
 },
 {
  "cid": "skill_opencode_periodic_job#0",
  "target": "skill_opencode_periodic_job",
  "question": "我想给 OpenCode 的定时任务做一次临时校验，现在加一条只提前 1 分钟触发的 cron 可以吗？如果不行，应该预留多少时间才稳妥？",
  "excerpt": "Then schedule at least two minutes in the future. One-minute cron tests are flaky because the edit may land too close to the next minute boundary.",
  "fact": "临时校验的 cron 需至少提前两分钟安排，1 分钟测试不可靠。",
  "rubric": {
   "must_include": [
    "至少两分钟提前量",
    "不要用 1 分钟的临时测试"
   ],
   "reference_answer": "不要用 1 分钟测试，至少预留两整分钟的提前量再装临时 cron。"
  }
 },
 {
  "cid": "skill_opencode_submission#0",
  "target": "skill_opencode_submission",
  "question": "我在用 OpenCode 提交时，环境里已经配了 OPENCODE_PROVIDER=example，只加 --model default-model 为什么还是不行？正确的两种传参方式分别是什么？",
  "excerpt": "`--model` and `--provider` must be a complete pair from one source. Pass `--model example/default-model`, or `--model default-model --provider example`. Omitting both flags uses `.env`. A bare `--model` does not take `OPENCODE_PROVIDER` from `.env`.",
  "fact": "--model 与 --provider 必须成对提供或在 --model 中包含提供方；单独给 --model 不会从环境变量读取提供方。",
  "rubric": {
   "must_include": [
    "说明 --model 与 --provider 必须成对，否则不从环境取提供方",
    "指出单独 --model 不会使用 OPENCODE_PROVIDER",
    "给出两种正确写法：--model provider/model；或 --model model --provider provider"
   ],
   "reference_answer": "要么写成 --model example/default-model，要么写成 --model default-model --provider example；单独给 --model 不会从环境里拿提供商。"
  }
 },
 {
  "cid": "skill_opencode_submission#1",
  "target": "skill_opencode_submission",
  "question": "我把定时提交交给调度器跑，命令指向仓库里的虚拟环境 Python，可是因为调度器启动目录不同，.env 没被读取。应该怎么配置这个计划任务，才能让它正确加载 .env？",
  "excerpt": "The client loads `.env` relative to the process working directory; pointing a scheduler at this repository's absolute `.venv/bin/python` does not load this repository's `.env` if the scheduler starts in another directory. Set the scheduled job's `cwd` explicitly to this repository root, or use an approved secret-injection wrapper.",
  "fact": "客户端按进程工作目录加载 .env；计划任务需把 cwd 设为仓库根目录（或用合规密钥注入器），仅指向绝对路径的解释器不会加载仓库的 .env。",
  "rubric": {
   "must_include": [
    "指出 .env 是按进程工作目录加载的",
    "要求把计划任务的 cwd 设为仓库根目录，或说明可用密钥注入封装"
   ],
   "reference_answer": "把计划任务的工作目录显式设为该仓库根目录（或用合规的密钥注入封装）；因为 .env 按进程工作目录加载，单独指向绝对路径的解释器不会加载仓库的 .env。"
  }
 },
 {
  "cid": "skill_opencode_throughput#0",
  "target": "skill_opencode_throughput",
  "question": "我只想在终端拿到机器可读的统计结果做自动化处理，不希望在仓库里生成任何报告文件或图片。应该怎么运行？",
  "excerpt": "# Machine-readable output (prints JSON, does not write a report file)\n.venv/bin/python -m opencode_skill throughput --since 30d --json",
  "fact": "使用 --json 时只打印 JSON 到标准输出且不会写任何报告文件。",
  "rubric": {
   "must_include": [
    "指出使用 --json 参数",
    "说明只打印 JSON 到 stdout",
    "明确不会写入报告文件"
   ],
   "reference_answer": "加上 --json 参数运行，它只会在标准输出打印 JSON，不会写任何报告文件。"
  }
 },
 {
  "cid": "procedural-video-frames#0",
  "target": "procedural-video-frames",
  "question": "我想用 ffmpeg 把一组 PNG 帧和 MP3 合成 H.264 mp4，同时把一个 SRT 软字幕也一起加进去。为了避免尾部黑屏，我打算在这条命令里加 -shortest，这样安全吗？正确做法是什么，才能不被字幕意外截短？",
  "excerpt": "Never add a soft subtitle track in the same command as `-shortest`: a track whose last cue ends early cuts the film there (`assemble` muxes subtitles in a second, stream-copy pass).",
  "fact": "软字幕不能与 -shortest 在同一条 ffmpeg 命令中一起加入；应在第二次无损合流时再 mux 字幕，否则影片会被字幕的最后一条过早截断。",
  "rubric": {
   "must_include": [
    "不要在含有 -shortest 的同一条命令里加软字幕",
    "用第二次（stream copy）合流字幕",
    "说明否则会被最后一条字幕提前截断"
   ],
   "reference_answer": "不要把软字幕和 -shortest 放在同一条 ffmpeg 命令里；先合成视频音频，再用第二次无损合流把 SRT 加入，否则字幕会把影片在最后一条字幕处截短。"
  }
 },
 {
  "cid": "video-scoring-audio#0",
  "target": "video-scoring-audio",
  "question": "我用 fluidsynth 把 10 秒的 MIDI 渲成 WAV，结果导出来有 12、13 秒长，接到我短视频里会拖出画面。ffmpeg 这步我需要加什么明确的参数才能保证正好截到 10 秒？",
  "excerpt": "**`-t 10` is mandatory, not tidying.** fluidsynth keeps writing samples until reverb and note releases decay, so a MIDI file of nominal length 10.00s rendered to 12.83s in testing (and 13.25s with the larger bank). Hand that to a video edit and the audio overruns the cut. Trim explicitly to the cue length.",
  "fact": "fluidsynth 会把混响与释音写到尾巴里，必须在 ffmpeg 命令里用 -t 明确裁剪到目标时长。",
  "rubric": {
   "must_include": [
    "明确写出在 ffmpeg 中加入 -t 10",
    "解释原因是合成尾音/混响导致渲染超长，需要显式裁剪"
   ],
   "reference_answer": "在 ffmpeg 命令中加上 -t 10 明确裁剪到 10 秒，因为 fluidsynth 会把混响和释音写进尾巴导致超长。"
  }
 },
 {
  "cid": "video-scoring-audio#1",
  "target": "video-scoring-audio",
  "question": "我在测配乐峰值前先用 ffmpeg 把双声道转成单声道（-ac 1），结果报告说有削波，但原始混音并没有。是不是测法有问题？应该怎么测和做交叉验证？",
  "excerpt": "Do not let ffmpeg downmix with `-ac 1` before measuring peak. For correlated stereo (a mono mix written to both channels, the usual case for a voice-over) it sums the channels at about +3 dB: a mix with a true peak of -1.5 dBFS measured 1.19 and was reported as clipping. `ffmpeg -af ebur128=peak=true -f null -` is an independent cross-check of integrated loudness and true peak.",
  "fact": "测峰值前不要用 -ac 1 下混；相关立体声会被相加抬高约 +3 dB 误报削波，应在原声道上测并用 ebur128 交叉验证。",
  "rubric": {
   "must_include": [
    "说明不要在测峰值前用 -ac 1 下混",
    "提到相关立体声约 +3 dB 的误差来源会导致误报削波",
    "给出 ebur128 交叉验证命令或等效做法"
   ],
   "reference_answer": "不要先用 -ac 1 下混再测；相关立体声会被相加抬高约 +3 dB 导致误报削波；在原双声道上测峰值，并用 ffmpeg -af ebur128=peak=true -f null - 交叉验证。"
  }
 },
 {
  "cid": "skill_outlook#0",
  "target": "skill_outlook",
  "question": "我在 Outlook 里想对某封邮件“回复所有人”并且立刻发出，不只是保存成草稿。用这个命令行应该加哪个参数？如果不加这个参数会发生什么？",
  "excerpt": "Replies in-thread via Graph draft flow. **Default behavior: creates a draft only — nothing is sent.** Pass `--execute` to actually send. `mail reply` uses `createReply`; `mail reply-all` uses `createReplyAll`. Both require `Mail.ReadWrite` + `Mail.Send`.",
  "fact": "邮件线程回复默认只生成草稿不发送；要真正发送必须加 --execute。",
  "rubric": {
   "must_include": [
    "必须指出需要加 --execute 才会发送",
    "说明未加时只会生成草稿/不会发送"
   ],
   "reference_answer": "默认只生成草稿，不会发；要真正发出需在 reply 或 reply-all 命令上添加 --execute。"
  }
 },
 {
  "cid": "skill_outlook#1",
  "target": "skill_outlook",
  "question": "我用命令创建 Outlook 日历会议，开始/结束时间能不能写成带 -07:00 之类偏移的时间戳？如果要按洛杉矶时间建会，应该怎么填时间和时区参数才不会被拒？",
  "excerpt": "`--start`/`--end` are wall-clock times (no UTC offset allowed; offset-bearing values are rejected) interpreted in the `--timezone` zone. The zone accepts IANA names (`America/Los_Angeles`)",
  "fact": "创建会议时开始/结束时间不允许带UTC偏移；用不带偏移的本地时间并通过 --timezone 指定时区（可用 IANA 名如 America/Los_Angeles）。",
  "rubric": {
   "must_include": [
    "明确不能带 UTC 偏移，会被拒绝",
    "用不带偏移的时间并通过 --timezone 指定时区",
    "可用 IANA 名称（如 America/Los_Angeles）或等效别名"
   ],
   "reference_answer": "不能带偏移；用不带偏移的时间，并加 --timezone America/Los_Angeles（或等效别名）来表示洛杉矶时间。"
  }
 },
 {
  "cid": "skill_playwright_test#0",
  "target": "skill_playwright_test",
  "question": "在用 pw-test 等一个元素出现时，如果我只写选择器不带状态参数，它默认会等待到什么状态？我现在想等登录按钮能看得见再继续。",
  "excerpt": "| `wait-for-selector` | `<selector> [state] [timeout_ms]` | Wait for selector state (`visible` by default) |",
  "fact": "wait-for-selector 在未指定状态时默认等待元素变为可见（visible）。",
  "rubric": {
   "must_include": [
    "明确写出默认状态是 visible",
    "指出这是 wait-for-selector 的默认行为"
   ],
   "reference_answer": "默认等到可见（visible）状态。"
  }
 },
 {
  "cid": "skill_playwright_test#1",
  "target": "skill_playwright_test",
  "question": "我的前端是单页应用，会一直有 WebSocket 连接。用 pw-test 打开页面时，它默认会等到哪个加载阶段再继续？",
  "excerpt": "| `goto` | `<url>` | Navigate to URL (waits for DOM content loaded) |",
  "fact": "pw-test 的 goto 默认等到 DOMContentLoaded，而不是等待网络空闲。",
  "rubric": {
   "must_include": [
    "写出等待条件是 DOMContentLoaded",
    "说明这是 goto 的默认行为"
   ],
   "reference_answer": "它等的是 DOMContentLoaded（默认行为）。"
  }
 },
 {
  "cid": "copy_workflow#0",
  "target": "copy_workflow",
  "question": "我打算用 Antigravity 在一个临时目录里跑一次文案生成。命令行应该加哪些关键选项，工作目录要怎么设置，才能保证是全新会话且稳定输出？",
  "excerpt": "If you are using Antigravity, pass `--new-project`, provide an explicit `--print-timeout`, and set the process's working directory right in the scratch dir.",
  "fact": "用 Antigravity 跑写作模型时必须加 --new-project、显式设置 --print-timeout，并把进程工作目录设在该临时目录。",
  "rubric": {
   "must_include": [
    "需要 --new-project",
    "需要显式 --print-timeout",
    "将进程工作目录设为该临时目录"
   ],
   "reference_answer": "用 Antigravity 运行写手时要加 --new-project，显式设置 --print-timeout，并把进程的工作目录直接设到那个临时工作目录里。"
  }
 },
 {
  "cid": "copy_workflow#1",
  "target": "copy_workflow",
  "question": "我作为搭建者改了几处屏幕上的文字（比如结构性标题），评审后还新增了一条说法；这些变更需要记录吗，应该记录到哪里？",
  "excerpt": "Every fix must be recorded in `validation.md`, and that includes every builder-authored on-screen string, such as structural labels or any new claim added after a critic round.",
  "fact": "所有修改都必须记录在 validation.md，包括构建者写的屏幕文字（如结构标签）以及评审后新增的任何说法。",
  "rubric": {
   "must_include": [
    "需要记录在 validation.md",
    "包括构建者自己写的屏幕文字/结构标签",
    "包括评审后新增的任何说法"
   ],
   "reference_answer": "要，所有修改都要记到 validation.md，包括构建者写的屏幕文字（如结构标签）和评审后新增的任何说法。"
  }
 },
 {
  "cid": "critic_review#0",
  "target": "critic_review",
  "question": "我准备开始新一轮的画面评审，需要把每一步的截图固定下来。输出目录应该怎么指定？能不能直接在上轮评审正在看的那个目录里继续补拍？请给我具体命令。",
  "excerpt": "1. Freeze a shots directory for the round using `python3 tools/shoot.py --out verification/roundN`. Never re-shoot into a directory a critic is reading.",
  "fact": "新一轮需用命令 python3 tools/shoot.py --out verification/roundN 冻结截图目录，且禁止向正在被评审读取的目录重新拍摄。",
  "rubric": {
   "must_include": [
    "使用命令 python3 tools/shoot.py --out verification/roundN",
    "不要在被评审读取的目录里重新拍摄/覆盖"
   ],
   "reference_answer": "用 python3 tools/shoot.py --out verification/roundN 冻结当轮截图目录；绝对不要在正在被评审读取的目录里重新拍摄或追加。"
  }
 },
 {
  "cid": "critic_review#1",
  "target": "critic_review",
  "question": "我想给这一套演示做一份供评审参考的标准说明，这个文件应该放在哪个路径、每套演示需要写几次，以及需要包含哪些要点？",
  "excerpt": "2. Write `verification/critic/rubric.md` once per deck: lay out the target feel in the owner's words, the visual register, 6–8 criteria, and the genre's kitsch traps.",
  "fact": "评审标准文件应写在 verification/critic/rubric.md，每套演示只写一次，并包含目标氛围（业主原话）、视觉基调、6–8 条标准和题材的俗套陷阱。",
  "rubric": {
   "must_include": [
    "路径 verification/critic/rubric.md",
    "频次每套只写一次（once per deck）",
    "包含：目标氛围（业主原话）、视觉基调、6–8 条标准、类型/题材的俗套陷阱"
   ],
   "reference_answer": "把文件写到 verification/critic/rubric.md，每套演示只写一次，内容包括用业主的表述写目标氛围、视觉风格、6–8 条评判标准，以及该题材常见的俗套陷阱。"
  }
 },
 {
  "cid": "generated_assets#0",
  "target": "generated_assets",
  "question": "我准备一次跑一批画板插图，提示词很长，想用 xargs -I 并行喂给命令行。这样会不会踩坑？有什么更稳的并发做法？",
  "excerpt": "Once it is right, you can render the rest in parallel with that same paragraph (typically 4–6 at a time, keeping in mind each call can take minutes). Since long prompts tend to break `xargs -I`, use a small script with a thread pool instead.",
  "fact": "长提示词会导致 xargs -I 不可靠，应改用带线程池的小脚本并发渲染。",
  "rubric": {
   "must_include": [
    "指出长提示会导致 xargs -I 出问题/不可靠",
    "建议使用带线程池的小脚本并发处理"
   ],
   "reference_answer": "长提示容易把 xargs -I 搞崩，别用它；改用一个带线程池的小脚本来并行跑那批渲染。"
  }
 },
 {
  "cid": "generated_assets#1",
  "target": "generated_assets",
  "question": "我能不能直接让这个组件帮我去调图像生成服务？还是需要在我的工作区里自己处理生成步骤？",
  "excerpt": "Keep in mind that image generation belongs to the installing workspace. This repo supplies the presentation contract and deterministic post-processing only; it does not call a provider API.",
  "fact": "图像生成不由该仓库直接完成；它不调用提供商 API，生成应在安装方工作区进行。",
  "rubric": {
   "must_include": [
    "图像生成由安装的工作区负责",
    "本仓库不调用任何提供商/生成服务 API"
   ],
   "reference_answer": "不行；生成步骤在你的工作区里做，这套工具只负责约定和后处理，本身不调用任何生成服务 API。"
  }
 },
 {
  "cid": "reference#0",
  "target": "reference",
  "question": "我想在同一张闭幕页里同时引用导航条样式图、品牌 logo 和二维码。清单里能列出多个素材吗？这些参考图会在生成时被自动叠加合成，还是只是按列表顺序一并作为参考传给模型？",
  "excerpt": "When an outline slide lists multiple paths under `Asset`, `tools/generate_slides.py` passes them all to `client.images.edit` in list order. No stacking or compositing is performed.",
  "fact": "多个参考素材会按列表顺序一次性传给图像编辑接口，不会进行叠加或合成。",
  "rubric": {
   "must_include": [
    "可列多个素材并一次调用传入",
    "按列表顺序传递",
    "不会叠加/合成"
   ],
   "reference_answer": "可以。会在一次调用里按列表顺序传给模型，不会自动叠加或合成。"
  }
 },
 {
  "cid": "reference#1",
  "target": "reference",
  "question": "我准备分别出一批 1K 草稿图和一批 4K 成品图，默认会各用哪个图像模型变体？如果我要强制用精度优先的那个，并把质量固定成 high，命令行要怎么写？",
  "excerpt": "- `gpt-image-2.5-flare` — speed-first; default at 1K.\n- `gpt-image-2.5-sunburst` — precision-first; default at 2K/4K.\n- Override the variant with `--variant flare|sunburst` (`auto` follows size). Quality defaults to `auto`; pin it with `--quality low|medium|high|xhigh|max|auto`.",
  "fact": "1K 默认用 flare、2K/4K 默认用 sunburst；可用 --variant 和 --quality 覆盖，质量默认 auto。",
  "rubric": {
   "must_include": [
    "1K 默认 flare，2K/4K 默认 sunburst",
    "用 --variant sunburst 强制指定",
    "用 --quality high 固定质量为 high"
   ],
   "reference_answer": "默认 1K 用 flare、2K/4K 用 sunburst；要强制精度优先并固定质量，加 --variant sunburst --quality high。"
  }
 },
 {
  "cid": "skill_presentation#0",
  "target": "skill_presentation",
  "question": "我在做一套图片式的演示稿，生成图片时接口报错了。要不要自动切换成网页动画那种形式继续？",
  "excerpt": "Crucially, you must never silently downgrade image → html simply because image generation encounters an error.",
  "fact": "遇到图片生成出错时，严禁自动从图片模式降级到 HTML 模式。",
  "rubric": {
   "must_include": [
    "不能自动从图片模式切换到HTML/网页模式",
    "报错不构成自动降级的理由"
   ],
   "reference_answer": "不能；即使图片生成出错也不允许自动改用 HTML 模式。"
  }
 },
 {
  "cid": "skill_presentation#1",
  "target": "skill_presentation",
  "question": "我想先出一批 1K 分辨率的草稿图，默认会选哪个图像变体？如果我想强制用另一个变体，命令行要怎么指定？",
  "excerpt": "The generator selects variants based on your target resolution: **1K → flare**, while **2K/4K → sunburst**. You can always override this by passing `--variant flare|sunburst` (leaving it as `auto` will follow the resolution rule).",
  "fact": "分辨率决定默认变体：1K→flare、2K/4K→sunburst；可用 --variant 覆盖。",
  "rubric": {
   "must_include": [
    "1K 默认使用 flare",
    "可用 --variant flare|sunburst 显式指定"
   ],
   "reference_answer": "默认 1K 用 flare；如需强制改用另一种，在命令行加 --variant flare|sunburst。"
  }
 },
 {
  "cid": "speaker_notes#0",
  "target": "speaker_notes",
  "question": "我在整理一份可以直接口播的演讲稿。句子长度有没有硬性上限？普通句子大概应该控制在多少词比较合适？",
  "excerpt": "- **Easy to Say**: Each sentence must be easy to say in one breath. Keep ordinary sentences between 12-20 words. **Hard gate**: no ordinary spoken sentence may exceed 22 words.",
  "fact": "普通口播句子建议12–20词，且有硬性上限：不得超过22词。",
  "rubric": {
   "must_include": [
    "给出普通句子的建议范围为12–20词",
    "明确硬性上限为22词"
   ],
   "reference_answer": "普通句子建议控制在12–20词，并且有硬性上限：任何口播普通句子都不能超过22词。"
  }
 },
 {
  "cid": "speaker_notes#1",
  "target": "speaker_notes",
  "question": "我的课程演讲结尾会给优惠，现场用链接或二维码怎么做，才能让观众一打开就直接看到折扣价？需要我在话术里特别说明吗？",
  "excerpt": "- **Make the Link Carry the Offer**: If there is a discount, use a link or QR code with it pre-applied, verify that it shows the discounted price, and tell the audience they will see it.",
  "fact": "带折扣的链接/二维码必须预先应用优惠并验证显示折后价，且要口头告知观众他们会看到该折扣。",
  "rubric": {
   "must_include": [
    "链接或二维码需预先内嵌优惠",
    "打开后需验证确实显示折扣价",
    "口播中要告诉观众他们会看到折扣"
   ],
   "reference_answer": "把折扣预先写进链接或二维码，先确认打开后显示折后价，并在台上告诉观众他们会看到已应用的折扣。"
  }
 },
 {
  "cid": "skill_resend_email#0",
  "target": "skill_resend_email",
  "question": "我想用命令行发送邮件并把自动重试次数设为 3，但先只做 dry-run。除了 --max-attempts 3，还必须带哪个参数？另外在什么情况下这个 key 需要更换？",
  "excerpt": "`--max-attempts` sets the total attempt count from 1 to 5 (default 1), counting the initial request. Setting `--max-attempts` above 1 requires `--idempotency-key`, including during dry runs. Reuse the same key only when retrying the same logical email; use a new key whenever the recipient, subject, or body changes.",
  "fact": "将 --max-attempts 设为大于 1 时，必须提供 --idempotency-key（即使 dry-run），且只在重试同一逻辑邮件时复用；收件人、主题或正文变更就要换新 key。",
  "rubric": {
   "must_include": [
    "需要 --idempotency-key 才能把 --max-attempts 设为 >1（包括 dry-run）",
    "仅在重试同一逻辑邮件时复用 key",
    "收件人、主题或正文任一变化要用新的 key"
   ],
   "reference_answer": "需要加 --idempotency-key；该 key 只在重试同一封逻辑邮件时复用，收件人、主题或正文有变化就必须换新 key。"
  }
 },
 {
  "cid": "skill_resend_email#1",
  "target": "skill_resend_email",
  "question": "我想按“最近两天”导出收到的邮件为 Markdown，可以把 --after/--before 直接设成 ISO 时间吗？如果不行，正确的按日期筛选流程是什么？",
  "excerpt": "`received list/export-all-md --after` and `--before` are Resend pagination cursors, not timestamp filters. Do not pass ISO timestamps to them; the API expects UUID cursor values and will return a validation error. For date-window analysis, export recent messages first and filter Markdown files by `created_at` locally.",
  "fact": "--after/--before 是分页游标（UUID），不能用时间戳；应先导出一页最近邮件，再按 Markdown 的 created_at 本地筛选日期。",
  "rubric": {
   "must_include": [
    "--after/--before 不是时间过滤器，不能传 ISO 时间",
    "它们需要 UUID 游标",
    "先导出最近邮件，再本地按 created_at 过滤"
   ],
   "reference_answer": "不可以；--after/--before 是分页游标（UUID），不能传 ISO 时间。先导出一页最近邮件，再在本地根据 Markdown 的 created_at 进行日期过滤。"
  }
 },
 {
  "cid": "skill_suppression_analysis#0",
  "target": "skill_suppression_analysis",
  "question": "请帮我跑一遍抑制名单分析。输出的报告应该用什么精确的文件名格式、放在哪个目录？另外这份文件能不能提交到 Git 版本库？",
  "excerpt": "When instructed to inspect or analyze suppressions, produce a single Markdown report named `suppression_report_<YYYY-MM-DD>.md` in the current working directory. The primary audience is the operator. Because suppression lists contain private recipient addresses, treat this file as confidential data and never commit it to git.",
  "fact": "分析报告必须命名为 suppression_report_<YYYY-MM-DD>.md，保存在当前工作目录，且严禁提交到 git。",
  "rubric": {
   "must_include": [
    "文件名模式：suppression_report_<YYYY-MM-DD>.md",
    "保存位置：当前工作目录",
    "不得提交到 git/版本库"
   ],
   "reference_answer": "报告命名为 suppression_report_<YYYY-MM-DD>.md，保存在当前工作目录，且因含私密地址绝不能提交到 git。"
  }
 },
 {
  "cid": "skill_suppression_analysis#1",
  "target": "skill_suppression_analysis",
  "question": "我只有最近的发送日志（更早的日志拿不到），但抑制记录跨越更久。你在报告里应该如何处理退信率：能不能根据历史外推？如果日志窗口对不齐，具体要怎么说？",
  "excerpt": "- If the send-log window does not cover the suppression window (historical entries older than ~30 days), explicitly state that denominator data is unavailable. Report absolute counts only. Never fabricate or extrapolate a rate without send logs.",
  "fact": "发送日志不覆盖抑制窗口时不得计算退信率，需声明分母不可用，只报告绝对数且禁止外推。",
  "rubric": {
   "must_include": [
    "明确说明无法提供分母/退信率",
    "只报告绝对数量",
    "严禁臆造或外推"
   ],
   "reference_answer": "当发送日志不覆盖抑制窗口时，明确写明分母不可用，不计算退信率；只报绝对数，且绝不臆造或外推。"
  }
 },
 {
  "cid": "skill_semantic_search#0",
  "target": "skill_semantic_search",
  "question": "我在公司笔记库用 semantic-search 查不到结果，命令没报错就是空。文件列表是我在工作区根目录用 find 生成的相对路径，但查询是在另一个目录跑的。这个该怎么修复，参数或文件列表需要怎么改？",
  "excerpt": "Generate the list with absolute paths, or pass `--source-root` pointing at the directory the relative entries were generated from.",
  "fact": "相对路径在不同目录下运行会导致查询命中不到缓存；应改用绝对路径生成文件列表，或传 --source-root 指向相对路径的生成目录。",
  "rubric": {
   "must_include": [
    "建议改为使用绝对路径生成文件列表",
    "说明可通过传入 --source-root 指向相对路径生成的目录来修复"
   ],
   "reference_answer": "把文件列表改成绝对路径，或在查询/重建时传入 --source-root 指向当初生成相对路径的目录即可。"
  }
 },
 {
  "cid": "skill_semantic_search#1",
  "target": "skill_semantic_search",
  "question": "我在给 OpenCode 的检索结果生成“一键打开”链接时，发现有的记录没有合法的会话 ID（比如不是以 ses_ 开头）。这种情况下还能根据标题或文件名自己拼个 ID 吗？应该怎么处理？",
  "excerpt": "The `session_id` must come directly from the search result metadata/frontmatter. Never infer it from the filename, title, or body. If the ID is missing, does not start with `ses_`, or contains characters outside ASCII letters, digits, underscore, or hyphen, do not generate an action link.",
  "fact": "会话链接只能使用结果元数据里的合法 session_id；缺失或不合法时不得生成链接，且禁止根据文件名/标题等推断。",
  "rubric": {
   "must_include": [
    "不能从标题或文件名等推断/拼接 session_id",
    "当 ID 缺失或不合法时不要生成动作链接"
   ],
   "reference_answer": "不能；只能用检索结果元数据里的合法 session_id（以 ses_ 开头且字符合法），若缺失或不合法就不要生成链接。"
  }
 },
 {
  "cid": "smart_home_skill#0",
  "target": "smart_home_skill",
  "question": "我想在家庭自动化里远程切换 2 号车库门，直接发一个 GET 请求到切换接口可以吗？具体应该用什么方法调用？",
  "excerpt": "1. Use only `POST /api/garage/{door_index}/toggle` when it exists in OpenAPI.\n2. Do not use or invent GET garage toggle endpoints.",
  "fact": "车库门只能用 POST /api/garage/{door_index}/toggle 触发，禁止使用或自造 GET 切换接口。",
  "rubric": {
   "must_include": [
    "必须使用 POST 方法调用 /api/garage/{door_index}/toggle",
    "不能使用 GET 方法切换车库门"
   ],
   "reference_answer": "不可以用 GET，必须用 POST 调用 /api/garage/{door_index}/toggle。"
  }
 },
 {
  "cid": "smart_home_skill#1",
  "target": "smart_home_skill",
  "question": "我打算通过本地服务查询我家三星电视的音量和是否静音，这些能从状态查询里拿到吗？如果不能，它通常只返回什么状态？",
  "excerpt": "Volume and mute state are not readable (protocol limitation); `get_status` returns `PowerState` only.",
  "fact": "三星电视的音量和静音状态不可读，状态查询只返回电源状态。",
  "rubric": {
   "must_include": [
    "音量/静音不可读",
    "状态查询只返回电源状态"
   ],
   "reference_answer": "拿不到音量和静音，状态查询只会返回电源状态。"
  }
 },
 {
  "cid": "stripe_skill#0",
  "target": "stripe_skill",
  "question": "我把 .env 里 Stripe 的密钥写成了我们公司的密钥管家引用（比如 vault://...）。这个工具会自动解析后再连 Stripe 吗？如果不会，我需要怎么处理才能正常运行命令？",
  "excerpt": "If `.env` contains secret-manager references instead of resolved keys, inject the real values outside the library before running the command. The core library treats unresolved secret references as configuration errors.",
  "fact": "库不会解析 .env 里的密钥管理器引用，必须在库外注入真实值，否则会报配置错误。",
  "rubric": {
   "must_include": [
    "库/工具不会自动解析密钥引用",
    "需要在运行前把真实密钥注入（环境或 .env）",
    "未解析的引用会被当作配置错误"
   ],
   "reference_answer": "不会；库不会自动解析，需要在运行前把真实值注入环境或 .env，否则会被视为配置错误。"
  }
 },
 {
  "cid": "stripe_skill#1",
  "target": "stripe_skill",
  "question": "我想在 CI 里跑连接到 Stripe 的真实集成测试，不加任何额外配置可以直接跑吗？如果需要开关，具体要设哪个环境变量和值？",
  "excerpt": "Live integration tests default to skip and require `STRIPE_ENABLE_LIVE_TESTS=1`.",
  "fact": "真实联机测试默认跳过，必须将环境变量 STRIPE_ENABLE_LIVE_TESTS 设为 1 才会运行。",
  "rubric": {
   "must_include": [
    "默认会跳过联机测试",
    "需要将 STRIPE_ENABLE_LIVE_TESTS 设置为 1"
   ],
   "reference_answer": "不可以，默认会跳过；必须把环境变量 STRIPE_ENABLE_LIVE_TESTS 设为 1 才会运行。"
  }
 },
 {
  "cid": "skill_tavily#0",
  "target": "skill_tavily",
  "question": "我在命令行里搜“最新苹果发布会 舞台照片”，还想要自动生成每张图的文字说明。一定要同时开启图片开关吗？如果只加生成说明的参数，图片结果会不会被自动打开？",
  "excerpt": "| `--images` | Enable image results | `False` |\n| `--image-descriptions` | Include LLM-generated image descriptions; if `--images` is not explicitly passed, the CLI auto-enables image results | `False` |",
  "fact": "启用图片说明参数会自动启用图片结果，无需显式传 --images。",
  "rubric": {
   "must_include": [
    "无需同时传 --images",
    "仅传 --image-descriptions 会自动启用图片结果"
   ],
   "reference_answer": "不需要；只加 --image-descriptions 时会自动开启图片结果，无须再传 --images。"
  }
 },
 {
  "cid": "skill_tavily#1",
  "target": "skill_tavily",
  "question": "我想把 search 的完整结果直接打印在控制台，加个 --stdout 可以吗？如果加了会不会真正发起请求，退出码是多少？",
  "excerpt": "- Always read the output file selectively in code; do not expect full search or extract JSON on stdout. Passing `--stdout` to `search` or `extract` is an unrecognized-argument usage error (exit 2) and makes no network request.",
  "fact": "对 search/extract 使用 --stdout 会报用法错误并返回退出码 2，且不会发起网络请求。",
  "rubric": {
   "must_include": [
    "不能用 --stdout 打印完整结果",
    "退出码为 2",
    "不会发起网络请求"
   ],
   "reference_answer": "不可以；对 search/extract，加 --stdout 会报未识别参数并直接退出码 2，且不会发送任何网络请求。"
  }
 },
 {
  "cid": "skill_typefully_twitter#0",
  "target": "skill_typefully_twitter",
  "question": "我要在 CI 里自动校验我用 Typefully 提交的线程文本，只允许我们公司的域名链接。这个检查默认会用哪个域名？怎么改成自己域名？失败时退出码是多少、应该在什么步骤前跑这个检查？",
  "excerpt": "The default allowed domain is `example.com`; override with `--allowed-domain`. Returns exit code 1 on failure, so it can be used as a pre-publish gate in CI or agent workflows. Run `post check-urls` on every `--thread-file` before `post draft` or `post create`.",
  "fact": "post check-urls 默认校验 example.com，失败返回码为 1，应在基于 --thread-file 的草稿/创建前运行，可用 --allowed-domain 覆盖域名。",
  "rubric": {
   "must_include": [
    "默认域名是 example.com，使用 --allowed-domain 覆盖",
    "失败时退出码为 1",
    "在 post draft/create 前对每个 --thread-file 运行检查"
   ],
   "reference_answer": "默认检查 example.com，需用 --allowed-domain 指定你的域名；校验失败退出码为 1，且应在每次根据 --thread-file 创建草稿或发帖前先运行 post check-urls。"
  }
 },
 {
  "cid": "skill_typefully_twitter#1",
  "target": "skill_typefully_twitter",
  "question": "我想把一篇文章分发到 X，只发一条帖子但不限制在 280 字内。默认应该用哪种长度模式？如果用户明确要短推时，需要加什么参数来切到普通长度？",
  "excerpt": "For article distribution posts (e.g. from a content platform), default to Typefully long post. A \"single Twitter post\" means one Typefully post, not a 280-character normal X post. Do not impose the 280-character limit unless the user explicitly says \"普通推文\", \"280 字内\", \"short tweet\", or uses `--no-long-post`.",
  "fact": "文章分发默认用长文模式；“单条推文”指一条 Typefully 帖子而非 280 字短推，只有用户明确要短推时才用 --no-long-post。",
  "rubric": {
   "must_include": [
    "默认走长文模式/不要强加 280 字限制",
    "“单条推文”不是 280 字限制而是一条 Typefully 帖子",
    "要短推需加 --no-long-post"
   ],
   "reference_answer": "默认按长文模式处理；“单条推文”指一条 Typefully 帖子而非 280 字短推；只有用户明确要短推时才加 --no-long-post。"
  }
 },
 {
  "cid": "voice-lora-detect#0",
  "target": "voice-lora-detect",
  "question": "如果一篇文章的总分落在 0.3 到 0.5 之间，你要怎么向我说明结论？能不能直接说它是 AI 写的？",
  "excerpt": "- **`human_blog.md`（得分 0.399，判断为“灰区”）**：这是 2019 年阮一峰写的真人博客，分数落在 0.3–0.5 的灰区。它分数最低的两段，一段 0.01（命中“难以”），一段 0.03（一句民调数据）。这说明单段分数低不代表是 AI 写的。\n- **灰区处理原则**：**真人博客也完全可能落在灰区**。一旦文章落在灰区，Agent 必须明确告知用户该区间兼具真人与 AI 可能性，严禁直接判定为 AI，需人工结合语义通读。",
  "fact": "落在0.3–0.5灰区时，必须提示“人/AI皆有可能”，严禁直接判定为AI，并建议人工通读。",
  "rubric": {
   "must_include": [
    "不能直接判定为 AI",
    "需告知该区间兼具真人与 AI 的可能性并建议人工通读"
   ],
   "reference_answer": "不能直接判定为 AI，必须说明该区间真人与 AI 都有可能，并建议人工通读。"
  }
 },
 {
  "cid": "voice-lora-detect#1",
  "target": "voice-lora-detect",
  "question": "我把一堆短标题、图注和引用也放进 Markdown 里评估，发现它们似乎没参与计分。工具会排除哪些块？另外多短的段落会被直接忽略？",
  "excerpt": "文章得分是各个正文段落分数以段落长度为权重的加权平均。标题、引用块、表格、代码块和少于 20 字的块不计入。",
  "fact": "计分时会排除标题、引用、表格、代码块，且少于20字的段落不计入。",
  "rubric": {
   "must_include": [
    "标题、引用块、表格、代码块不计入",
    "少于 20 字的块不计入"
   ],
   "reference_answer": "标题、引用、表格、代码块会被排除，且少于 20 字的段落不参与计分。"
  }
 },
 {
  "cid": "voice-lora-rewrite#1",
  "target": "voice-lora-rewrite",
  "question": "为啥我这篇文章里有几段完全没被改，直接原样保留了？这个工具在什么情况下会放弃改写、把原文退回来？",
  "excerpt": "还有一层保险：如果某段改写后数字对不上，或者长度比超出了 0.6–1.6，就重试一次，还不行就保留原文。",
  "fact": "若某段改写后数字不符或长度比超出 0.6–1.6，会重试一次；仍不行就保留原文。",
  "rubric": {
   "must_include": [
    "数字不一致会触发保留",
    "长度比超出 0.6–1.6",
    "会先重试一次，不行才保留原文"
   ],
   "reference_answer": "当段落改写后的数字不匹配，或长度比超出 0.6–1.6，系统会重试一次，仍不通过就保留原文。"
  }
 },
 {
  "cid": "voice-lora#0",
  "target": "voice-lora",
  "question": "我把训练好的 GGUF 用 llama.cpp 跑，模型老是紧贴输入复述。请求参数需要怎么设置才能让重复惩罚覆盖整段提示？另外直接用 LM Studio 部署能解决吗？",
  "excerpt": "vLLM 的惩罚默认覆盖全部 prompt；llama.cpp 默认只看最近 64 个 token，要在请求里带 `repeat_last_n`（同样的段落，和原文的相似度 0.849 对比覆盖全文时的 0.784）。LM Studio 既不认 `repetition_penalty`，也不传 `repeat_last_n`，所以 GGUF 要用 `llama-server` 部署。",
  "fact": "llama.cpp 需在请求里显式传 repeat_last_n 才能让重复惩罚覆盖全提示，而 LM Studio 不支持相关参数，GGUF 要用 llama-server 部署。",
  "rubric": {
   "must_include": [
    "需要在 llama.cpp 请求中传 repeat_last_n，覆盖整个 prompt",
    "LM Studio 不支持 repetition_penalty 且不传 repeat_last_n",
    "GGUF 需要用 llama-server 部署"
   ],
   "reference_answer": "在 llama.cpp 里要显式传 repeat_last_n 让惩罚覆盖整段提示；LM Studio不支持这些参数，GGUF需用 llama-server 部署。"
  }
 },
 {
  "cid": "voice-lora#1",
  "target": "voice-lora",
  "question": "整篇文章改写时，担心个别长段落会改坏。有没有自动兜底机制？具体哪些条件会触发、触发后怎么处理，默认是否开启？",
  "excerpt": "`08_rewrite.py` 默认对整篇文章开启保险：数字变了或长度比超出 0.6–1.6 就重新采样一次，仍不合格则保留原文并打印出来。别关掉它。",
  "fact": "改写脚本默认开启整篇保险：数字变动或长度比不在0.6–1.6时重采一次，仍不合格则保留原文并打印。",
  "rubric": {
   "must_include": [
    "触发条件是数字变化或长度比超出 0.6–1.6",
    "先重采一次，不合格则保留原文并打印",
    "该机制默认开启"
   ],
   "reference_answer": "默认开启的整篇保险：若数字变了或长度比不在0.6–1.6，就重采一次；仍不合格则保留原文并打印。"
  }
 },
 {
  "cid": "external_prose_lint#0",
  "target": "external_prose_lint",
  "question": "我要把这套中文 Markdown 文风检查接到 CI 里。不加额外参数时它默认在哪种问题级别会让流程失败？另外返回码 0、1、2 各代表什么状态？",
  "excerpt": "python -m writing_skill.external_prose_lint_cli path/to/article.md --fail-on hard   # 默认\npython -m writing_skill.external_prose_lint_cli path/to/article.md --fail-on any\npython -m writing_skill.external_prose_lint_cli path/to/article.md --fail-on never\n```\n\n安装后就可以直接运行（`uv pip install -e .`）。\n\n退出码：`0` 无 hard finding（默认）；`1` 有 hard finding；`2` 文件错误。",
  "fact": "默认只在 hard 级别作为失败条件；退出码 0=无 hard finding，1=有 hard finding，2=文件错误。",
  "rubric": {
   "must_include": [
    "默认失败条件是 hard（不带参数）",
    "退出码映射：0=无 hard finding，1=有 hard finding，2=文件错误"
   ],
   "reference_answer": "默认只在 hard 级别才失败；退出码 0 表示无 hard finding，1 表示有 hard finding，2 表示文件错误。"
  }
 },
 {
  "cid": "external_prose_lint#1",
  "target": "external_prose_lint",
  "question": "交付自查我能不能只写一句“我已经跑过检查，没问题”，不附工具输出？如果不行，应该按什么方式提交才合规？",
  "excerpt": "1. **真跑命令**，把 stdout 全文贴进自查/acceptance 记录。\n2. 对每个 FINDING 用一句话回答 Question（改 / 不改+理由）。\n3. 改稿后再跑，直到 `hard_findings=0`；REVIEW 项若保留须写明理由（如确属直接引语）。\n4. 自然语言「扫过了没问题」且无本命令输出 → **定义为 gate 失败**。",
  "fact": "必须实际运行并贴出 stdout 全文；仅口头声称“已检查无问题”且未贴输出会被判定为 gate 失败。",
  "rubric": {
   "must_include": [
    "必须贴出命令的标准输出全文",
    "仅口头报告无问题且未贴输出会被定义为 gate 失败"
   ],
   "reference_answer": "不可以，必须真跑并把标准输出全文贴入记录；只口头报告无问题且未贴输出会被判为 gate 失败。"
  }
 },
 {
  "cid": "reference_writing_thesis_catalog#0",
  "target": "reference_writing_thesis_catalog",
  "question": "我准备用这套分析框架写一篇面向读者的长文，能不能在正文里标注我用了第几个视角，让读者一眼看懂？有没有需要避免的标注方式？",
  "excerpt": "以下视角为作者已发表文章中归纳出的分析习惯。将其当作灵感库，在读者可见的最终成品中不要出现任何 L 编号或视角代号。",
  "fact": "读者可见的最终成品中禁止出现任何 L 编号或视角代号，这些视角只作灵感库使用。",
  "rubric": {
   "must_include": [
    "不得在读者可见的成品中出现任何 L 编号或视角代号"
   ],
   "reference_answer": "不可以在读者可见的最终成品中标注任何编号或代号，尤其不能出现 L 系列代号；这些视角仅作为内部灵感库使用。"
  }
 },
 {
  "cid": "reference_writing_thesis_catalog#1",
  "target": "reference_writing_thesis_catalog",
  "question": "我在审查一个大模型应用的方案时，先该检查什么，再看什么？有没有固定的先后顺序可以遵循？",
  "excerpt": "设计或诊断一个系统时，要先理解它的信息基础（L8），再评估它的感知反馈机制（L1），实现激进的反馈透明。",
  "fact": "在设计或诊断时必须先检查信息基础/上下文信息架构（L8），再评估感知反馈机制（L1）。",
  "rubric": {
   "must_include": [
    "先检查信息基础/上下文信息架构，再评估反馈机制（先L8后L1）"
   ],
   "reference_answer": "先审视系统的信息基础与上下文信息架构，然后再评估其感知反馈机制（先 L8，后 L1）。"
  }
 },
 {
  "cid": "twitter_post_writing#0",
  "target": "twitter_post_writing",
  "question": "这条推文我想在正文里放一个产品页链接，最后一行再放文章链接。能否通过校验？规范要求我怎么放链接？",
  "excerpt": "| `bare_url` | 特殊：全篇恰好 1 个且在最后一行，必须是本文的 tracked 分发 URL（自有站点域名 + UTM，域名由发布层 overlay 提供） |",
  "fact": "整篇推文只能有一个链接，且必须位于最后一行，并且是本文的自有站点带 UTM 的分发链接。",
  "rubric": {
   "must_include": [
    "全篇仅 1 个 URL",
    "URL 必须在最后一行",
    "必须是本文的自有站点带 UTM 的分发链接"
   ],
   "reference_answer": "不行，整篇只能有一个链接且必须放在最后一行，并且这个链接必须是本文的带 UTM 的自有站点分发地址。"
  }
 },
 {
  "cid": "twitter_post_writing#1",
  "target": "twitter_post_writing",
  "question": "我在 CI 里调用 Antigravity 生成推文，判断是否成功能否只看进程退出码为 0？还需要检查哪些信号？",
  "excerpt": "- 成功必须同时满足 exit 0、stdout JSON `status: \"SUCCESS\"`，以及 `tweet_final.md` 非空、实际落在本次 scratch 且读回核验，再进入 Gate A/B。",
  "fact": "生成成功需同时满足三项：退出码 0、stdout JSON status 为 SUCCESS、且 tweet_final.md 非空并确在本次 scratch 目录且读回核验。",
  "rubric": {
   "must_include": [
    "exit 0",
    "stdout JSON 的 status 为 SUCCESS",
    "tweet_final.md 非空且位于本次 scratch 并读回核验"
   ],
   "reference_answer": "不可以，必须同时满足退出码为 0、stdout JSON 的 status 为 SUCCESS，且 tweet_final.md 非空并确实写在本次独立目录并读回核验后才算成功。"
  }
 },
 {
  "cid": "workflow_external_writing#0",
  "target": "workflow_external_writing",
  "question": "我在用 Antigravity 跑一轮 naturalize 重写，想直接续用上次的会话省时间。需要怎么设定参数？能不能用 --continue 或 --conversation？",
  "excerpt": "- 控制 10 分钟任务超时；quota 错误立即停止，不盲目重试。每轮调用均为全新会话：必带 `--new-project`，不用 `--continue` / `--conversation`。",
  "fact": "每次调用都必须新开会话：加 --new-project，且禁止使用 --continue 或 --conversation。",
  "rubric": {
   "must_include": [
    "必须使用 --new-project 开新会话",
    "禁止使用 --continue 或 --conversation"
   ],
   "reference_answer": "每次都要新开会话：加 --new-project，不能用 --continue 或 --conversation。"
  }
 },
 {
  "cid": "workflow_external_writing#1",
  "target": "workflow_external_writing",
  "question": "文章已经通过终端冷读后，我又做了作者文风改写。接下来跑终端里的那个行文检查工具，还需要把所有硬问题清零吗？如果只是把结果贴出来不改，会被拦吗？",
  "excerpt": "**voice 之后 Gate 1 降级为只读报告（2026-10-04）。** 因 Gate 1 检测项多为文风信号且以 voice 为准，此时不再阻断。跑一遍 `external_prose_lint_cli` 将结果如实呈报；事实与结构类问题必改，句式与标点类仅报告，不再要求 `hard_findings=0`，由人类决定交付、重跑或微调。在 voice rewrite（§5.3）之前，Gate 1（§5.1）仍是阻断式硬 gate，保持不变。",
  "fact": "完成作者文风改写后，行文检查降为只读：不再阻断，也不再要求 hard_findings=0，但需如实呈报并改完事实/结构问题。",
  "rubric": {
   "must_include": [
    "voice 改写后该检查不再阻断，只读报告",
    "不再要求 hard_findings=0，需如实呈报",
    "事实与结构类问题必须修正，句式/标点类仅报告"
   ],
   "reference_answer": "文风改写之后，行文检查降为只读：跑一遍并如实贴结果即可，不再要求 hard_findings=0；但事实/结构问题要改，句式标点只报告。"
  }
 },
 {
  "cid": "workflow_internal_writing#0",
  "target": "workflow_internal_writing",
  "question": "我在内部项目的说明文里要插入几张图，主要给移动端扫读。能直接把 SVG 以内联方式嵌在 Markdown 里吗？如果不行，建议我用哪些图片格式？",
  "excerpt": "- **图表生成**：优先使用 PNG/JPG/WebP 图片。**不使用内联 SVG**（以防移动端渲染不兼容）。",
  "fact": "图表应优先用 PNG/JPG/WebP，禁止使用内联 SVG 以避免移动端渲染不兼容。",
  "rubric": {
   "must_include": [
    "明确禁止内联 SVG",
    "推荐使用 PNG/JPG/WebP 三类格式"
   ],
   "reference_answer": "不可以内联 SVG；图表请优先用 PNG/JPG/WebP。"
  }
 },
 {
  "cid": "workflow_internal_writing#1",
  "target": "workflow_internal_writing",
  "question": "我要写一份很长的内部评审文，既要能扫读也要能深挖。像详细论证、否决方案和长数据这类内容，默认应该怎么放置和折叠？",
  "excerpt": "2. **深读层**：详细论证、否决方案、长数据、实现细节。**默认使用 `<details>` 标签收起或锚定在文末。**",
  "fact": "长文档的深读层内容默认用 <details> 收起，或锚定在文末。",
  "rubric": {
   "must_include": [
    "默认使用 <details> 标签收起深读内容",
    "或将其锚定在文末"
   ],
   "reference_answer": "深读内容默认用 <details> 折叠，或放锚点到文末。"
  }
 },
 {
  "cid": "workflow_news_aggregation#0",
  "target": "workflow_news_aggregation",
  "question": "我这期要做一篇新闻简报，有六个小节，lint 工具老是提示 H2 太多。需要把小节合并或把那个提示关掉吗？另外整篇大概应该控制在多少字数比较合适？",
  "excerpt": "- **Line budget**: the external workflow's spine cap applies to the shared workflow file, not to a generated article. A 4000-5000 character briefing with five to seven H2 sections is normal; the lint CLI's H2-count finding is answered, not silenced: sections are stacked items, so >4 H2s is expected and recorded with that reason.",
  "fact": "简报通常为4000–5000字符、5–7个H2；对H2过多的lint告警要解释原因而不是关闭，>4个H2是预期的。",
  "rubric": {
   "must_include": [
    "不要关闭/消音lint的H2告警，而是说明因堆叠条目导致>4个H2属预期",
    "给出4000–5000字符的推荐长度（并认可5–7个H2正常）"
   ],
   "reference_answer": "不要合并或关掉提示；>4 个 H2 属于条目堆叠的预期，向 lint 说明原因即可；整篇以 4000–5000 字符、5–7 个 H2 为宜。"
  }
 },
 {
  "cid": "workflow_news_aggregation#1",
  "target": "workflow_news_aggregation",
  "question": "我今天想加一条新闻简报的资料包，但现在还没有当天的那个目录。要不要先替我新建一个再写？",
  "excerpt": "2. Never create a folder. If no folder exists for the target date, stop and ask the user which folder to use. Creating one requires an explicit instruction.",
  "fact": "没有目标日期的目录时不得自行新建，需暂停并询问用户；只有在明确指示下才可创建。",
  "rubric": {
   "must_include": [
    "不得自行创建目录",
    "应先询问用户使用哪个文件夹，只有明确指示时才创建"
   ],
   "reference_answer": "不能直接新建；如果当天没有现成目录，应先询问要用哪个文件夹，只有在你明确指示创建时才会去建。"
  }
 },
 {
  "cid": "writing_workflows#0",
  "target": "writing_workflows",
  "question": "我要把中文外稿的机械检查脚本接到 CI，不加任何参数直跑。默认在什么情况下会让 CI 判失败？另外 0、1、2 这三个退出码各自代表什么，我要据此写规则。",
  "excerpt": "Exit codes: `0` no hard finding (default), `1` hard finding present, `2` file error.",
  "fact": "外稿检查 CLI 默认仅在出现 hard 级别发现时失败；退出码 0/1/2 分别表示无 hard（默认通过）/有 hard/文件错误。",
  "rubric": {
   "must_include": [
    "默认只在出现 hard 级问题时失败",
    "0=无 hard、1=有 hard、2=文件错误的对应关系"
   ],
   "reference_answer": "默认只在出现 hard 级别发现时才判失败；退出码 0 表示无 hard（默认通过）、1 表示存在 hard 发现、2 表示文件错误。"
  }
 },
 {
  "cid": "writing_workflows#1",
  "target": "writing_workflows",
  "question": "我在做每日多条资讯简报：打包每条材料时，那种按日期命名的工作目录需要我去新建吗？目录里要不要再分层建子文件夹，还是全部平铺放？",
  "excerpt": "inside the dated `tmp/news_aggregation_<YYYYMMDD>/` folder (folder located by date, never created; flat layout)",
  "fact": "新闻聚合的日期目录是按日期定位、从不创建；目录结构要求平铺（无子文件夹）。",
  "rubric": {
   "must_include": [
    "不要创建该日期目录（按日期定位）",
    "目录平铺，不建子文件夹"
   ],
   "reference_answer": "不要新建；按日期定位已有目录，内容平铺不分子文件夹。"
  }
 },
 {
  "cid": "zun_music#0",
  "target": "zun_music",
  "question": "我想把《Greensleeves》做成东方风的短段落，原曲是三拍子，可以不改拍子直接跑渲染和测试吗？",
  "excerpt": "- 4/4 only. `check()` rejects other meters, so convert triple-meter sources such as Greensleeves to 4/4 as part of the arrangement.",
  "fact": "只支持4/4拍；检查会拒绝其他拍号，三拍子要先改成4/4。",
  "rubric": {
   "must_include": [
    "只能用4/4拍，其他拍号会被检查拒绝",
    "三拍子素材需要先改成4/4（如Greensleeves）"
   ],
   "reference_answer": "不可以；这个流程只支持4/4，检查会拒绝其他拍号，像Greensleeves这样的三拍子要先改成4/4再渲染。"
  }
 },
 {
  "cid": "zun_music#1",
  "target": "zun_music",
  "question": "在4/4的八小节里，我能在强拍上改动原旋律好几处吗？测试对这种改动的上限具体是多少，怎么才算合规？",
  "excerpt": "2. The skeleton check passes. At each strong beat (beats 1 and 3 in 4/4), the arrangement's pitch class equals the untouched source transcription's. Every deliberate departure is listed in `skeleton_allow`, capped at one per four bars; normally it is only the final cadence.",
  "fact": "强拍需与原曲骨架一致；每四小节最多一次偏离，且必须列在 skeleton_allow（通常只在终止）。",
  "rubric": {
   "must_include": [
    "每四小节最多一次在强拍偏离原曲",
    "这些偏离必须记录在 skeleton_allow",
    "通常只允许终止式那一处"
   ],
   "reference_answer": "不行；强拍的改动每四小节最多一次，而且要记录在 skeleton_allow，通常只放在最后的终止位置。"
  }
 }
]