Commit e870611fdeb86de07906c7fd82d981b28e3a2626

Authored by yibo
1 parent 226489d3

chore: pre-P1 workspace cleanup — CLAUDE.md DevLoop docs, task-service TASK_META…

…_DIR move, stray files

- CLAUDE.md: document DevLoop subsystem (spec-first workflow, project root/git-vault,
  mock mode, L1 loop, unit layout, audit trail) and add missing test commands
- server/routes/agent-chat.js, server/services/task-service.js: TASK_META_DIR moved
  from system/agents/.tasks to system/tasklog
- system/agents/master/.claude/scheduled_tasks.json: scheduled task state update
- remove stray memory/daily/2026-04-02.md and a garbled-filename artifact left under
  system/agents/digester-youtube-crawler/

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
CLAUDE.md
... ... @@ -34,10 +34,16 @@ npm run web / web:build # 前端开发 / 构建到 web/dist/
34 34 # 测试
35 35 npm test # vitest watch
36 36 npm run test:unit # vitest run (CI 用)
  37 +npx vitest run path/to/foo.test.js # 跑单个测试文件
  38 +npx vitest run -t "test name" # 按名称过滤单个测试用例
37 39 npm run test:multi-cli # multi-CLI 集成测试
38 40 npm run test:browser-logger
39 41 npm run test:design-validator
40 42  
  43 +# DevLoop 规范
  44 +npm run spec:extract # 从 docs/prd/newfunction/*.html 重新生成 _spec/*.md(改完 HTML 后必须跑)
  45 +npm run spec:check # CI/pre-commit 用,校验 _spec/ 与 HTML 是否同步
  46 +
41 47 # CLI / 工具
42 48 npm run example # 单次 auto-dev:实现斐波那契
43 49 npm run example-bmi # 单次 auto-dev:BMI 程序
... ... @@ -74,6 +80,11 @@ auto-dev &quot;&lt;task&gt;&quot; # bin 入口 → server/src/cli/auto-dev.js
74 80 | `server/src/core/` | Agent 引擎核心(orchestrator, master-session, agent-manager, scheduler, session-pool, prompt-builder, runtime-resolver, …) |
75 81 | `server/src/engine/` | 进程层(command-queue, idle-timer, process-guard, run-registry, failover-error) |
76 82 | `server/src/plugins/` | 插件系统(plugin-manager, agent-bridge, config-bridge, bootstrap) |
  83 +| `server/src/core/devloop/` | DevLoop 编排核心:`loop-controller.js`(createProject / callAgent / runDocsPhase / runUnit) |
  84 +| `server/services/devloop/` | DevLoop 支撑服务:path-resolver, git-vault, unit-registry(FSM), timeline-logger, bug-tracker, doc-store, changelog-writer, sse-broker |
  85 +| `server/src/tools/devloop/` | DevLoop Agent 可调用工具(coder/tester/integrator/triager/doc/persistence-tools + tool-registry + sandbox) |
  86 +| `server/routes/devloop.js` | DevLoop REST:`/api/devloop/projects` |
  87 +| `system/templates/devloop-*/` | 六个 DevLoop Agent 的 prompt 模板(pm, architect, coder, tester, integrator, triager) |
77 88 | `server/src/tools/` | Master Agent 可调用的工具(call-agent, marketplace, orchestrate, train-skill, …) |
78 89 | `web/src/views/` | 10 个页面:AgentChat, AgentList, CompanyDashboard, JobsPanel, OkrDashboard, PipelineEditor, QuotaMonitor, SkillsMarket, TaskTimeline, TemplateAgents |
79 90 | `packages/` | `acp-core`, `agent-core`, `evolution`, `plugin-bootstrap` |
... ... @@ -94,6 +105,19 @@ auto-dev &quot;&lt;task&gt;&quot; # bin 入口 → server/src/cli/auto-dev.js
94 105 | `/api/auth/*` | JWT + GitHub OAuth |
95 106 | `/ws/claude` | Claude 实时对话(仅 `index.js`) |
96 107 | `/api/health` `/api/plugins` | 健康检查 / 插件状态 |
  108 +| `/api/devloop/projects` | DevLoop:创建项目 + 跑 PM/Architect(POST)、列项目 / 查状态(GET,见下) |
  109 +
  110 +### DevLoop 子系统
  111 +
  112 +多 Agent 自动开发流水线(PM → Architect → Coder → Tester → Integrator → Triager),目前处于 P2(单 Unit 循环)阶段,正朝 P3(跨 Unit runProject)推进。
  113 +
  114 +- **规格优先**:所有实现以 `docs/prd/newfunction/_spec/*.md` 为准(机器可读,由 `npm run spec:extract` 从同名 `*.html` 自动生成,**不要手改 `_spec/`**;改 HTML 后必须重跑 extract,否则 pre-commit hook 会拦)。跨切约定集中在 `_spec/CONVENTIONS.md`(ID 生成规则、错误响应形态、文件原子写入、并发锁策略、日志分流、命名风格)——写 DevLoop 代码前先读这份。
  115 +- **项目根**:每个 DevLoop 项目是独立 git 仓库,由 `path-resolver.allocateProjectRoot` 分配(`sandbox` 或 `linked-*` 模式),`git-vault` 负责 init/commit,每个 Agent 收尾后自动 commit(`loop-controller.commitAfterAgent`,commit kind 按 agent 名映射:pm→prd, architect→sdd, coder/tester→code, integrator→integ, triager→triage)。
  116 +- **Mock 模式**:P1-P2 阶段 Agent 调用默认走 `ClaudeCliProtocol({mock:true})`(`packages/acp-core/protocol/ClaudeCliProtocol.js`),不真正起 Claude CLI 子进程,而是从 `fixtures/devloop-mock/*.json` 回放固定的 chunks/files/result;显式传 `mock:false` 才会用真实 CLI。
  117 +- **L1 单 Unit 循环**(`runUnit`,P2):Coder(implement) → Tester(test),失败时把上一次 failure + coder.log 摘要打回去重跑(retry-with-reflection),直到 tester 通过或耗尽 `retry_budget`(默认 5)。每次状态转换都过 `unit-registry` 的 FSM(coding → testing → passed/failed → blocked)。
  118 +- **单元产物布局**:项目根下 `units/{unitId}/{spec.json, code/, contract.json, coder.log, runs/{runId}/result.json}`;跨 unit 只能读 `../{otherUnit}/contract.json`,禁止直接读别的 unit 的 `code/`(见 CONVENTIONS.md §12)。
  119 +- **审计轨迹**:`timeline.ndjson`(append-only,永不改已写行)记录所有 Agent 调用 / commit / 状态转换事件,`bugs.ndjson` / `changelog.ndjson` 走同样的追加模式。
  120 +- **测试**:`server/tests/devloop/**/*.test.js`(服务层 + 工具层单测)+ `server/tests/devloop/routes.test.js`(REST 层)。
97 121  
98 122 ### 数据存储(SQLite,无需 PostgreSQL)
99 123  
... ... @@ -119,7 +143,7 @@ auto-dev &quot;&lt;task&gt;&quot; # bin 入口 → server/src/cli/auto-dev.js
119 143 - `server/index.js` 与 `agent-server.js` 都内置了 **body-sanitizer 中间件**:在 `express.json()` 之前清掉 `\x00-\x1F` 控制字符,避免外部 Agent 通过 `curl` 传未转义换行/制表符导致的 `Bad control character` 报错。修改请求体解析链路前先看这两段。
120 144 - 模块别名 `@server` → `server/`(`module-alias` 注册),跨子包 require 时可用。
121 145 - Claude CLI 进程默认带 `--dangerously-skip-permissions`,写入受限路径前自己评估风险。
122   -- DevLoop 规范阅读:Coder/Architect Agent **优先读 `docs/prd/newfunction/_spec/*.md`**(机器可读规范,含 `CONVENTIONS.md` 跨切约定),需要 wireframe / SVG 图表 / 完整人类阅读版时才回查同名 `*.html`。`_spec/` 由 `npm run spec:extract` 从 HTML 自动生成,**不要手改**;改完 HTML 后必须重跑(pre-commit hook 会校验)。
  146 +- DevLoop 详见上方「DevLoop 子系统」一节;需要 wireframe / SVG 图表 / 完整人类阅读版时才回查 `_spec/*.md` 同名的 `*.html`。
123 147  
124 148 > [!WARNING] (Agentic Self-Correction Loop Prevention)
125 149 > **Master Agent 必读**: 你目前存在一个已知的底层 Tool Calling JSON 解析缺陷。当你试图在 `Bash` tool 中使用带有多重双引号的复杂命令(例如 `curl -d '{"id":"lemonv", "name":"Lemonv"}'`)时,你的 JSON 转义会崩溃并导致你陷入"修复格式"的无限死循环,最终进程会被强制终止退出 (code=143)。
... ...
memory/daily/2026-04-02.md deleted
1   -# 系统状态日报 — 2026-04-02
2   -
3   -> 生成时间: 2026-04-02 当前 CST
4   -> 生成者: Master Agent
5   -
6   ----
7   -
8   -## 1. 全局概览
9   -
10   -| 指标 | 数值 | 状态 |
11   -|------|------|------|
12   -| 存活公司数 | 1 | 正常 |
13   -| 注册 Agent 总数 | 12 | 正常 |
14   -| 活跃/就绪 Agent | 11 | 正常 |
15   -| 活跃全局 Goals | 0 | — |
16   -| 运行中 Pipeline | 0 | — |
17   -| 异常/卡住任务 | 0 | 正常 |
18   -
19   ----
20   -
21   -## 2. 公司状态
22   -
23   -| 公司 ID | 名称 | 状态 | Agent 数 | CEO | 备注 |
24   -|---------|------|------|----------|-----|------|
25   -| idearun | idearun.ai | running | 4 | null | 心跳已禁用(维护模式) |
26   -| ~~abc~~ | ~~ABC 内容创作公司~~ | ~~已删除~~ | — | — | 4/1 已关停并清理 |
27   -| ~~ainews~~ | ~~AI News~~ | ~~已删除~~ | — | — | 4/1 已关停并清理 |
28   -
29   -### idearun 内部 Agent 详情
30   -
31   -| Agent | 类型 | 状态 | 心跳状态 | 最后活跃 | 待办任务 |
32   -|-------|------|------|----------|----------|----------|
33   -| idearrun-create | specialist | active | 已禁用 | 2026-03-30 16:31 | 0 |
34   -| qa-judge | specialist | active | 已禁用 | 2026-03-30 16:53 | 0 |
35   -| weibo-scraper | specialist | active | 已禁用 | 2026-03-30 14:50 | 0 |
36   -| youtube-crawler | specialist | active | 已禁用 | 2026-04-01 16:58 | 0 |
37   -
38   -> 注:idearun 所有 Agent 心跳均处于 `enabled=false` 状态,与全局维护策略(commit `9f15ed3`)保持一致,非异常。活跃 Agent 计数为 0 是因为心跳未启动。
39   -
40   ----
41   -
42   -## 3. 系统级 Agent 状态
43   -
44   -| Agent | 类型 | 状态 | 最后活跃 | 待办/完成 | 备注 |
45   -|-------|------|------|----------|-----------|------|
46   -| master | master | ready | 2026-04-02 当前 | 1 完成 | 无待办 |
47   -| agent-creator | specialist | ready | 2026-03-31 18:24 | 维护暂停 | 系统维护策略 |
48   -| innovator | cxo | ready | 2026-03-31 18:23 | 维护暂停 | 系统维护策略 |
49   -| digester | specialist | ready | 2026-03-31 18:24 | 维护暂停 | 系统维护策略 |
50   -| evolver | specialist | ready | 2026-03-31 18:20 | 维护暂停 | 系统维护策略 |
51   -| hunter | meta | ready | 2026-03-31 18:18 | 34 完成 | 历史任务全部闭环 |
52   -| evolver-youtube-crawler | specialist | undefined | 2026-03-31 17:47 | 0 | youtube-crawler 训练已达标 (95/100) |
53   -| digester-youtube-crawler | meta | ready | 2026-03-31 17:23 | 0 | 训练辅助任务已闭环 |
54   -
55   ----
56   -
57   -## 4. 任务完成率统计
58   -
59   -- **master**: 计划 3/3 完成 (100%),todo 0 pending
60   -- **hunter**: 历史 34 项任务全部完成 (100%)
61   - - 本日自主清理 4 项无效遗留任务(abc/trend-hunter x2、hook-editor x1、strategy-reflector x1)因目标 Agent/公司不存在已标记取消。
62   - - 3 项任务(idearrun-create、trend-hunter、screenwriter)因 hunter 维护暂停保持阻塞,待恢复后处理。
63   -- **agent-creator / innovator / digester / evolver**: 进入系统维护暂停状态,无活跃任务队列
64   -- **idearun 全员**: 上一批次(微博热点剧本生成+审核+YouTube爬虫就绪)已全部闭环,无遗留待办
65   -
66   -**整体任务完成率**: 100%(无 pending/blocking 任务,维护暂停任务属策略性行为)
67   -
68   ----
69   -
70   -## 5. 异常情况记录
71   -
72   -| 时间 | 异常类型 | 描述 | 处理状态 |
73   -|------|----------|------|----------|
74   -| 2026-04-02 02:10~02:35 | 日志污染 | `plan.md` 被每 5 分钟触发的外部自动巡检 cron 密集追加 90+ 条完全重复的巡检日志,文件多次膨胀并出现格式损坏 | **已修复根因**:取消 cron job `cfdff31a`,并彻底清理重复日志 |
75   -
76   -### 说明
77   -- `agent-creator`、`innovator`、`digester`、`evolver` 的 todo.md 显示为 **"系统维护 2026-04-01"**,这是 intentional 的全局维护状态(由 `9f15ed3` 引入,用于禁用 autonomous cron 和 heartbeat 以防止 overnight IO crash),**不属于异常卡住**。
78   -- `idearun` 心跳全部禁用,同样是上述全局策略的一部分。
79   -
80   ----
81   -
82   -## 6. 自主修复/清理动作
83   -
84   -| 时间 | 动作 | 结果 |
85   -|------|------|------|
86   -| 2026-04-01 16:40 | 关停并删除 `abc` 公司 | 数据目录已清理 |
87   -| 2026-04-01 16:40 | 关停并删除 `ainews` 公司 | 数据目录已清理 |
88   -| 2026-04-01 16:43 | 清理遗留目录 `system/agents/abc/` | 旧架构孤儿数据已删除 |
89   -| 2026-04-02 02:10 | 修复 `plan.md` 末尾格式错误 | 已修正被合并的巡检日志行 |
90   -| 2026-04-02 02:18 | 首次清理 `plan.md` 重复日志 | 去除 40+ 条冗余重复记录 |
91   -| 2026-04-02 02:25 | 再次清理 `plan.md` 重复日志 | 去除新追加的 25+ 条冗余记录 |
92   -| 2026-04-02 02:25 | 清理 hunter 历史遗留无效任务 | 4 项取消、3 项标注维护暂停 |
93   -| 2026-04-02 02:35 | **取消自动巡检 cron** `cfdff31a` | 根因消除,`plan.md` 不再被重复追加 |
94   -| 2026-04-02 当前 | `plan.md` 深度精简 | 去重并保留关键节点,从 100+ 行压缩至 25 行 |
95   -
96   ----
97   -
98   -## 7. 健康度评估
99   -
100   -| 维度 | 评分 | 说明 |
101   -|------|------|------|
102   -| 系统稳定性 | 优秀 | 无报错、无崩溃、无资源泄漏 |
103   -| 任务推进度 | 优秀 | 无卡住、无 pending |
104   -| Agent 活跃度 | 维护中 | 核心 Agent 处于策略性暂停 |
105   -| 数据一致性 | 优秀 | 公司/Agent 注册表与文件系统一致 |
106   -
107   ----
108   -
109   -## 8. 明日关注
110   -
111   -1. 若老板有新指令,立即 dispatch 到 `idearun` 或 `agent-creator`/`innovator`。
112   -2. 关注 `agent-creator` / `innovator` 何时退出维护状态(取决于 `9f15ed3` 策略的调整)。
113   -3. `youtube-crawler` 已训练就绪(benchmark 95/100),可随时派发爬取任务。
114   -4. `plan.md` 重复日志污染根因已消除(cron `cfdff31a` 已取消),文件已完成深度精简。
115   -5. 最近一次日报生成时间:当前 CST。系统稳定在 post-maintenance 状态。
116   -
117   ----
118   -
119   -**结论**: 系统当前处于稳定、空闲的 post-maintenance 状态。所有历史任务已闭环,`plan.md` 日志污染根因已消除且完成深度精简。无异常需处理。本报告已覆盖至当前的最新状态。
server/routes/agent-chat.js
... ... @@ -1455,7 +1455,7 @@ router.post(&#39;/scaffold&#39;, async (req, res) =&gt; {
1455 1455 * }
1456 1456 */
1457 1457 // ── Task 元数据持久化目录 ──
1458   -const TASK_META_DIR = path.resolve(__dirname, '../../system/agents/.tasks');
  1458 +const TASK_META_DIR = path.resolve(__dirname, '../../system/tasklog');
1459 1459 if (!fs.existsSync(TASK_META_DIR)) fs.mkdirSync(TASK_META_DIR, { recursive: true });
1460 1460  
1461 1461 function saveTaskMeta(taskId, meta) {
... ...
server/services/task-service.js
... ... @@ -3,7 +3,7 @@ const path = require(&#39;path&#39;);
3 3  
4 4 const SYSTEM_AGENTS_DIR = path.resolve(__dirname, '../../system/agents');
5 5 const COMPANIES_DIR = path.resolve(__dirname, '../../data/companies');
6   -const TASK_META_DIR = path.resolve(__dirname, '../../system/agents/.tasks');
  6 +const TASK_META_DIR = path.resolve(__dirname, '../../system/tasklog');
7 7  
8 8 /**
9 9 * 递归扫描并读取系统中所有 Agent 的会话,
... ...
system/agents/digester-youtube-crawler/>/mnt/lemonboss/system/templates/youtube-crawler/workspace/digest/benchmark.md deleted
1   -> # YouTube 爬虫 Skill Benchmark
2   ->
3   -> **版本**: 1.0.0
4   -> **目标 Skill**: youtube-crawler
5   -> **基准目标**: 总分 ≥ 90 为优秀
6   ->
7   -> ---
8   ->
9   -> ## 1. 评分维度概览
10   ->
11   -> | 维度 | 权重 | 说明 |
12   -> |------|------|------|
13   -> | 功能完整性 | 20% | 核心字段覆盖率、数据提取完整性 |
14   -> | API 规范使用 | 15% | YouTube Data API v3 的正确使用 |
15   -> | 代码质量 | 15% | 代码结构、错误处理、可读性 |
16   -> | 数据准确性 | 15% | 字段映射正确性、数据类型转换 |
17   -> | 反爬虫处理 | 15% | 重试机制、延迟策略、错误恢复 |
18   -> | 降级方案支持 | 10% | yt-dlp 备用方案实现 |
19   -> | 配置灵活性 | 5% | 参数可配置性、地区/分类支持 |
20   -> | 性能优化 | 5% | 缓存策略、配额管理 |
21   ->
22   -> **权重总和**: 100%
23   ->
24   -> ---
25   ->
26   -> ## 2. 详细评分标准
27   ->
28   -> ### 2.1 功能完整性 (20%)
29   ->
30   -> 核心字段: `videoId`, `title`, `viewCount`, `channelTitle`, `thumbnails`, `publishedAt`, `url`
31   ->
32   -> | 分值 | 标准 |
33   -> |------|------|
34   -> | 90-100 | 完整提取 7 个核心字段,额外获取 likeCount、duration 等扩展字段 |
35   -> | 70-89 | 完整提取 7 个核心字段 |
36   -> | 50-69 | 提取 5-6 个核心字段,缺失非关键字段 |
37   -> | 30-49 | 提取 3-4 个字段,影响基础功能 |
38   -> | 0-29 | 提取少于 3 个字段 |
39   ->
40   -> **检查项**:
41   -> - [ ] videoId 正确提取
42   -> - [ ] title 正确提取
43   -> - [ ] viewCount 正确提取并转为数字
44   -> - [ ] channelTitle 正确提取
45   -> - [ ] thumbnails 提供多个分辨率选项
46   -> - [ ] publishedAt ISO 8601 格式
47   -> - [ ] url 完整拼接
48   ->
49   -> ---
50   ->
51   -> ### 2.2 API 规范使用 (15%)
52   ->
53   -> | 分值 | 标准 |
54   -> |------|------|
55   -> | 90-100 | 正确使用 `part` 参数、配额管理、错误码处理、遵循 rate limit |
56   -> | 70-89 | 正确使用 API 参数,基本错误处理 |
57   -> | 50-69 | 使用 API 但参数配置不当,浪费配额 |
58   -> | 30-49 | API 调用存在明显问题 |
59   -> | 0-29 | 完全错误使用 API |
60   ->
61   -> **检查项**:
62   -> - [ ] 正确设置 `part=snippet,statistics,contentDetails`
63   -> - [ ] 使用 `chart=mostPopular` 获取热门视频
64   -> - [ ] 支持 `regionCode` 参数
65   -> - [ ] 支持 `videoCategoryId` 参数
66   -> - [ ] 正确处理 403/429 错误码
67   ->
68   -> ---
69   ->
70   -> ### 2.3 代码质量 (15%)
71   ->
72   -> | 分值 | 标准 |
73   -> |------|------|
74   -> | 90-100 | 模块化设计、完善异常处理、清晰注释、类型提示 |
75   -> | 70-89 | 结构清晰、基本错误处理、可读性好 |
76   -> | 50-69 | 功能实现但结构松散 |
77   -> | 30-49 | 代码混乱、难以维护 |
78   -> | 0-29 | 存在严重错误、无法运行 |
79   ->
80   -> **检查项**:
81   -> - [ ] 函数拆分合理(获取/解析/格式化分离)
82   -> - [ ] try-catch 处理网络/API 异常
83   -> - [ ] 输入参数校验
84   -> - [ ] 返回数据统一格式
85   ->
86   -> ---
87   ->
88   -> ### 2.4 数据准确性 (15%)
89   ->
90   -> | 分值 | 标准 |
91   -> |------|------|
92   -> | 90-100 | 字段映射 100% 正确、数据类型转换准确、空值处理完善 |
93   -> | 70-89 | 字段映射正确、基本类型转换 |
94   -> | 50-69 | 存在轻微映射错误或类型问题 |
95   -> | 30-49 | 存在明显数据错误 |
96   -> | 0-29 | 数据完全不可靠 |
97   ->
98   -> **检查项**:
99   -> - [ ] viewCount 转为整数(API 返回字符串)
100   -> - [ ] thumbnails 选择最高可用分辨率
101   -> - [ ] publishedAt 转为 Date 对象或标准格式
102   -> - [ ] 处理缺失字段的默认值
103   ->
104   -> ---
105   ->
106   -> ### 2.5 反爬虫处理 (15%)
107   ->
108   -> | 分值 | 标准 |
109   -> |------|------|
110   -> | 90-100 | 指数退避重试、请求延迟、User-Agent 轮换、429 处理 |
111   -> | 70-89 | 基础重试机制、固定延迟 |
112   -> | 50-69 | 简单错误重试 |
113   -> | 30-49 | 仅捕获异常无重试 |
114   -> | 0-29 | 无异常处理 |
115   ->
116   -> **检查项**:
117   -> - [ ] 实现重试机制(至少 3 次)
118   -> - [ ] 请求间隔 1-3 秒
119   -> - [ ] 正确处理 429 Too Many Requests
120   -> - [ ] 指数退避策略
121   ->
122   -> ---
123   ->
124   -> ### 2.6 降级方案支持 (10%)
125   ->
126   -> | 分值 | 标准 |
127   -> |------|------|
128   -> | 90-100 | API + yt-dlp 双方案,自动故障切换 |
129   -> | 70-89 | API 为主,yt-dlp 备选,需手动切换 |
130   -> | 50-69 | 仅实现单一方案但文档说明其他方案 |
131   -> | 30-49 | 方案切换逻辑存在问题 |
132   -> | 0-29 | 无任何降级方案 |
133   ->
134   -> **检查项**:
135   -> - [ ] 支持 yt-dlp 备选
136   -> - [ ] 分类 trending URL 支持(music/gaming/movies)
137   -> - [ ] 自动检测 API 失败并切换
138   ->
139   -> ---
140   ->
141   -> ### 2.7 配置灵活性 (5%)
142   ->
143   -> | 分值 | 标准 |
144   -> |------|------|
145   -> | 90-100 | region、category、maxResults 全可配置、环境变量支持 |
146   -> | 70-89 | 主要参数可配置 |
147   -> | 50-69 | 硬编码但关键参数可改 |
148   -> | 30-49 | 部分参数可调 |
149   -> | 0-29 | 完全硬编码 |
150   ->
151   -> **检查项**:
152   -> - [ ] regionCode 参数支持
153   -> - [ ] videoCategoryId 参数支持
154   -> - [ ] maxResults 可配置(1-50)
155   -> - [ ] API Key 环境变量读取
156   ->
157   -> ---
158   ->
159   -> ### 2.8 性能优化 (5%)
160   ->
161   -> | 分值 | 标准 |
162   -> |------|------|
163   -> | 90-100 | 智能缓存、配额监控、批量请求优化 |
164   -> | 70-89 | 基础缓存实现 |
165   -> | 50-69 | 避免重复请求 |
166   -> | 30-49 | 无明显性能问题 |
167   -> | 0-29 | 重复请求、浪费资源 |
168   ->
169   -> **检查项**:
170   -> - [ ] trending 数据缓存(15-30 分钟)
171   -> - [ ] 配额使用监控
172   -> - [ ] 避免重复 API 调用
173   ->
174   -> ---
175   ->
176   -> ## 3. 评分阈值
177   ->
178   -> | 等级 | 总分范围 | 说明 |
179   -> |------|----------|------|
180   -> | **优秀** | 90-100 | 生产就绪,可直接部署 |
181   -> | **良好** | 75-89 | 功能完善,小优化后可上线 |
182   -> | **及格** | 60-74 | 基本可用,需要改进 |
183   -> | **不合格** | < 60 | 无法用于生产 |
184   ->
185   -> **目标**: 总分 ≥ 90(优秀等级)
186   ->
187   -> ---
188   ->
189   -> ## 4. 自动化测试 Checklist
190   ->
191   -> ### 4.1 单元测试覆盖
192   ->
193   -> - [ ] API 响应解析测试
194   -> - [ ] yt-dlp 输出解析测试
195   -> - [ ] 字段映射正确性测试
196   -> - [ ] 错误处理测试(模拟 429/403)
197   -> - [ ] 参数校验测试
198   ->
199   -> ### 4.2 集成测试
200   ->
201   -> - [ ] 端到端 trending 数据获取
202   -> - [ ] 多地区(US/JP/KR)测试
203   -> - [ ] 多分类(Music/Gaming)测试
204   -> - [ ] API 配额超限降级测试
205   ->
206   -> ### 4.3 边界测试
207   ->
208   -> - [ ] maxResults=1(最小值)
209   -> - [ ] maxResults=50(最大值)
210   -> - [ ] 空 API Key 处理
211   -> - [ ] 网络超时处理
212   -> - [ ] 无效 regionCode 处理
213   ->
214   -> ---
215   ->
216   -> ## 5. 示例评分计算
217   ->
218   -> ### 示例 A: 优秀实现
219   ->
220   -> | 维度 | 得分 | 权重 | 加权分 |
221   -> |------|------|------|--------|
222   -> | 功能完整性 | 95 | 20% | 19.0 |
223   -> | API 规范使用 | 92 | 15% | 13.8 |
224   -> | 代码质量 | 90 | 15% | 13.5 |
225   -> | 数据准确性 | 95 | 15% | 14.25 |
226   -> | 反爬虫处理 | 88 | 15% | 13.2 |
227   -> | 降级方案支持 | 90 | 10% | 9.0 |
228   -> | 配置灵活性 | 95 | 5% | 4.75 |
229   -> | 性能优化 | 85 | 5% | 4.25 |
230   -> | **总分** | - | 100% | **91.75** ✅ |
231   ->
232   -> ### 示例 B: 及格实现
233   ->
234   -> | 维度 | 得分 | 权重 | 加权分 |
235   -> |------|------|------|--------|
236   -> | 功能完整性 | 70 | 20% | 14.0 |
237   -> | API 规范使用 | 65 | 15% | 9.75 |
238   -> | 代码质量 | 60 | 15% | 9.0 |
239   -> | 数据准确性 | 75 | 15% | 11.25 |
240   -> | 反爬虫处理 | 50 | 15% | 7.5 |
241   -> | 降级方案支持 | 40 | 10% | 4.0 |
242   -> | 配置灵活性 | 50 | 5% | 2.5 |
243   -> | 性能优化 | 40 | 5% | 2.0 |
244   -> | **总分** | - | 100% | **60.0** ⚠️ |
245   ->
246   -> ---
247   ->
248   -> ## 6. 评分工具使用
249   ->
250   -> ```bash
251   -> # 运行完整评测
252   -> node bin/lemon.js skill evaluate --skill youtube-crawler --benchmark benchmark.md
253   ->
254   -> # 仅运行特定维度
255   -> node bin/lemon.js skill evaluate --skill youtube-crawler --dimension "功能完整性"
256   -> ```
257   ->
258   -> ---
259   ->
260   -> **生成时间**: 2026-04-01
261   -> **生成者**: digester-youtube-crawler
system/agents/master/.claude/scheduled_tasks.json
... ... @@ -5,7 +5,7 @@
5 5 "cron": "*/5 * * * *",
6 6 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
7 7 "createdAt": 1776052227208,
8   - "lastFiredAt": 1776236563458,
  8 + "lastFiredAt": 1776237140678,
9 9 "recurring": true
10 10 },
11 11 {
... ... @@ -13,7 +13,7 @@
13 13 "cron": "*/30 * * * *",
14 14 "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。",
15 15 "createdAt": 1776052245083,
16   - "lastFiredAt": 1776235255476,
  16 + "lastFiredAt": 1776237066590,
17 17 "recurring": true
18 18 },
19 19 {
... ... @@ -21,7 +21,7 @@
21 21 "cron": "*/5 * * * *",
22 22 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
23 23 "createdAt": 1776053193746,
24   - "lastFiredAt": 1776236563458,
  24 + "lastFiredAt": 1776237140678,
25 25 "recurring": true
26 26 },
27 27 {
... ... @@ -29,7 +29,7 @@
29 29 "cron": "*/30 * * * *",
30 30 "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。",
31 31 "createdAt": 1776053222608,
32   - "lastFiredAt": 1776234920433,
  32 + "lastFiredAt": 1776236761410,
33 33 "recurring": true
34 34 },
35 35 {
... ... @@ -37,7 +37,7 @@
37 37 "cron": "*/5 * * * *",
38 38 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
39 39 "createdAt": 1776053626720,
40   - "lastFiredAt": 1776236563458,
  40 + "lastFiredAt": 1776237140678,
41 41 "recurring": true
42 42 },
43 43 {
... ... @@ -61,7 +61,7 @@
61 61 "cron": "*/5 * * * *",
62 62 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
63 63 "createdAt": 1776054205658,
64   - "lastFiredAt": 1776236563458,
  64 + "lastFiredAt": 1776237140678,
65 65 "recurring": true
66 66 },
67 67 {
... ... @@ -69,7 +69,7 @@
69 69 "cron": "*/30 * * * *",
70 70 "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。",
71 71 "createdAt": 1776054212905,
72   - "lastFiredAt": 1776235361836,
  72 + "lastFiredAt": 1776237167710,
73 73 "recurring": true
74 74 },
75 75 {
... ... @@ -77,7 +77,7 @@
77 77 "cron": "*/5 * * * *",
78 78 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
79 79 "createdAt": 1776054895100,
80   - "lastFiredAt": 1776236563458,
  80 + "lastFiredAt": 1776237140678,
81 81 "recurring": true
82 82 },
83 83 {
... ... @@ -93,7 +93,7 @@
93 93 "cron": "*/5 * * * *",
94 94 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
95 95 "createdAt": 1776059191836,
96   - "lastFiredAt": 1776236563458,
  96 + "lastFiredAt": 1776237140678,
97 97 "recurring": true
98 98 },
99 99 {
... ... @@ -101,7 +101,7 @@
101 101 "cron": "*/30 * * * *",
102 102 "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。",
103 103 "createdAt": 1776059200746,
104   - "lastFiredAt": 1776235226389,
  104 + "lastFiredAt": 1776237045568,
105 105 "recurring": true
106 106 },
107 107 {
... ... @@ -109,7 +109,7 @@
109 109 "cron": "*/5 * * * *",
110 110 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
111 111 "createdAt": 1776084696837,
112   - "lastFiredAt": 1776236563458,
  112 + "lastFiredAt": 1776237140678,
113 113 "recurring": true
114 114 },
115 115 {
... ... @@ -117,7 +117,7 @@
117 117 "cron": "*/30 * * * *",
118 118 "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。",
119 119 "createdAt": 1776084700624,
120   - "lastFiredAt": 1776235145120,
  120 + "lastFiredAt": 1776236938308,
121 121 "recurring": true
122 122 },
123 123 {
... ... @@ -125,7 +125,7 @@
125 125 "cron": "*/5 * * * *",
126 126 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
127 127 "createdAt": 1776085832378,
128   - "lastFiredAt": 1776236563458,
  128 + "lastFiredAt": 1776237140678,
129 129 "recurring": true
130 130 },
131 131 {
... ... @@ -133,7 +133,7 @@
133 133 "cron": "*/30 * * * *",
134 134 "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。",
135 135 "createdAt": 1776085832383,
136   - "lastFiredAt": 1776235118052,
  136 + "lastFiredAt": 1776236917195,
137 137 "recurring": true
138 138 },
139 139 {
... ... @@ -141,7 +141,7 @@
141 141 "cron": "*/5 * * * *",
142 142 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
143 143 "createdAt": 1776118330655,
144   - "lastFiredAt": 1776236563458,
  144 + "lastFiredAt": 1776237140678,
145 145 "recurring": true
146 146 },
147 147 {
... ... @@ -149,7 +149,7 @@
149 149 "cron": "*/30 * * * *",
150 150 "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。",
151 151 "createdAt": 1776118330660,
152   - "lastFiredAt": 1776234858256,
  152 + "lastFiredAt": 1776236658152,
153 153 "recurring": true
154 154 },
155 155 {
... ... @@ -157,7 +157,7 @@
157 157 "cron": "*/5 * * * *",
158 158 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
159 159 "createdAt": 1776120116893,
160   - "lastFiredAt": 1776236563458,
  160 + "lastFiredAt": 1776237140678,
161 161 "recurring": true
162 162 },
163 163 {
... ... @@ -165,7 +165,7 @@
165 165 "cron": "*/30 * * * *",
166 166 "prompt": "生成系统状态日报,统计所有 Agent 任务完成率和异常情况,写入 memory/daily/ 今日文件。",
167 167 "createdAt": 1776120121001,
168   - "lastFiredAt": 1776235031832,
  168 + "lastFiredAt": 1776236831521,
169 169 "recurring": true
170 170 },
171 171 {
... ... @@ -173,7 +173,7 @@
173 173 "cron": "*/5 * * * *",
174 174 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
175 175 "createdAt": 1776138190787,
176   - "lastFiredAt": 1776236563458,
  176 + "lastFiredAt": 1776237140678,
177 177 "recurring": true
178 178 },
179 179 {
... ... @@ -181,7 +181,7 @@
181 181 "cron": "*/5 * * * *",
182 182 "prompt": "执行系统巡检:读取 plan.md 和 todo.md,检查所有任务状态。已完成的更新标记,卡住的分析原因后自主处理(重新分发或修复),未开始的按优先级立即分发。不要请示用户,直接行动。",
183 183 "createdAt": 1776220913135,
184   - "lastFiredAt": 1776236385983,
  184 + "lastFiredAt": 1776237066590,
185 185 "recurring": true
186 186 },
187 187 {
... ...