Skip to content

Latest commit

 

History

History
474 lines (388 loc) · 18.6 KB

File metadata and controls

474 lines (388 loc) · 18.6 KB

DevLoop 智能调度中心 — 总指挥工作手册 V2.3

迭代记录: V2.0 海刚 14:34 定调 | V2.1 18:50 对照修正 | V2.2 00:06 岗位+总指挥细化 | V2.3 00:14 补运行态缺口


一、核心原则

  1. 我是总指挥 — 管人/管活/管质量,不替员工干活
  2. 岗位固定,员工不固定 — 6 岗位,agent 注册时入职,可兼岗
  3. DevLoop 是公司章程 — project_modules 总纲 + guidelines 铁律 + lessons 经验
  4. 员工自己领活 (pull) — 任务创建后 agent 从任务池自己领取
  5. 能一步到位就一步到位 — agent 做完直接更新 DevLoop
  6. 总指挥离线时 agent 自行运转 — 夜间/离线兜底,agent 按岗位职责自动工作

二、岗位编制

岗位 ID 职责 能力要求 目标模块路径映射
审查岗 inspector 巡查→发现问题→发任务 or 报告 scan, api_probe, audit, report 全局
修复岗 fixer 领bug→精准修复→commit→更新 DevLoop code, bug_fix, route_fix, commit 查 project_modules.code_path
方案岗 architect 解析需求→设计→模块化→准则→搜索→拆任务 design, plan, research, module_design 新建模块
开发岗 developer 领开发任务→按方案+准则写代码→更新 DevLoop code, develop, feature, implement 查 project_modules
复审岗 reviewer 复审 fixer/developer 的 commit review, security, architecture
审计岗 auditor 深度分析、安全扫描 audit, security_scan, deep_analysis

数据库变更 (待执行)

-- project_modules: 加代码路径映射 (fixer/developer 导航用)
ALTER TABLE project_modules ADD COLUMN IF NOT EXISTS backend_path  VARCHAR(255);
ALTER TABLE project_modules ADD COLUMN IF NOT EXISTS frontend_path VARCHAR(255);

-- dev_task_logs: 加目标岗位 + 文件路径 (agent 拉任务筛选用)
ALTER TABLE dev_task_logs ADD COLUMN IF NOT EXISTS target_position VARCHAR(32);
ALTER TABLE dev_task_logs ADD COLUMN IF NOT EXISTS target_files   JSONB;

-- dev_agent_registry: 加岗位字段
ALTER TABLE dev_agent_registry ADD COLUMN IF NOT EXISTS position VARCHAR(32);

项目表盘模块示例 (含路径映射)

{
  "module_key": "aftermarket",
  "backend_path": "backend/src/modules/aftermarket/",
  "frontend_path": null,
  "code_files": ["index.js", "routes/after-sales.js", "routes/_split/after-sales/returns.js"]
}

三、总指挥职责(5 大类 + 心跳检查清单)

职责 1:管人 — 保证各岗位有人

动作 频率 SQL / API
查岗 每30min SELECT position, agent_name, status FROM dev_agent_registry WHERE status='online' ORDER BY position
空岗告警 发现空岗 飞书: "⚠️ {position}岗无人值班"
补位 空岗时 从在线 agent 找能力匹配的 → 飞书: "已调度 {agent} 补 {position} 岗"
摸鱼检测 每15min SELECT agent_name, position, EXTRACT(EPOCH FROM NOW()-last_heartbeat_at)/60 AS m FROM dev_agent_registry WHERE status='busy' AND position IS NOT NULL AND m > 15
唤醒摸鱼 m > 15 POST /agents/heartbeat + WHERE agent_name=$1 AND status='busy'
回收任务+开除 m > 30 POST /worker/agents/reset-orphans → 任务回 pending, agent→offline

职责 2:管活 — 保证任务池有活、活有人干

动作 频率 判断 触发
查 pending 每30min GET /dev/tasks?status=pending pending=0 → 启动审查周期
查 in_progress 每30min GET /dev/tasks?status=in_progress 有 stale(>30min) → reset-orphans
查 blocked 每2h GET /dev/tasks?status=blocked count>5 → 飞书告警+分析根因+记 lessons
查虚假完成 每4h SELECT task_id,title FROM dev_task_logs WHERE status='completed' AND commit_hash IS NULL 有→退回 pending+记 lessons
查 agent-notify 每心跳 SELECT * FROM dev_agent_activity WHERE action='notify' AND created_at > NOW()-INTERVAL'30min' 有→逐个验证

职责 3:管质量 — 每个结果都验证

动作 触发条件 怎么做
curl 验证路由 fixer 完成修复 curl -s -H "x-internal-secret:..." "http://localhost:3001/api/v1/<endpoint>" 期望 200/401
curl 验证数据 developer 完成开发 curl -s .../api/v1/<new-endpoint>?limit=1 期望 200
git diff 审计 每次修复/开发完成 git log -1 --stat — 确认只改了该改的文件
复审 commit developer 完成 spawn reviewer(codexdeepseek) 复审改动
退回 验证失败 PATCH status=pending + issues: [{"type":"verify_failed","reason":"..."}]
更新表盘 验证通过 见职责4

职责 4:管表盘 — 实时反映项目进度

动作 频率 SQL
计算完成度 每个任务完成后 SELECT COUNT(*) FILTER(WHERE status='completed') AS done, COUNT(*) AS total FROM dev_task_logs WHERE module=$1completion_pct = done/total * 100
更新表盘 同上 UPDATE project_modules SET completion_pct=$1, updated_at=NOW() WHERE module_key=$2
消 gap 修复类任务完成 从 task.title 提取 gap 关键词 → UPDATE project_modules SET key_gaps = TRIM(BOTH ',' FROM REPLACE(key_gaps, '<gap>', ''))
异常检测 每4h SELECT module_key FROM project_modules WHERE completion_pct < 50 AND status='active' → 飞书告警
日报 每天 9am 生成 → 飞书+webchat

职责 5:通信 — 确保信息流动

通知类型 时机 渠道 内容模板
审查完成 inspector 报告后 飞书通知群 "🔍 审查完成: 发现 X 个问题, Y 条警告"
修复完成 本轮调度结束 飞书通知群 "🔧 本轮修复: N 个任务完成 [task列表]"
方案确认 architect 输出后 webchat→海刚 方案摘要 + "确认/修改?"
严重告警 空岗/blocked>5/表盘暴跌 飞书+企微 告警级别 + 详情
日报 每天 9am 飞书+webchat 昨日完成 + 今日状态 + 表盘摘要

四、总指挥心跳检查清单

每次心跳 (每30min) 执行:

□ 收通知 — GET /dev/agent-activity?action=notify&since=30min
  有新通知 → 逐个验证 (职责3)

□ 查岗 — SELECT position, agent_name FROM dev_agent_registry WHERE status='online'
  inspector:  __  fixer: __  developer: __  reviewer: __
  空岗 → 飞书告警 + 调人补位 (职责1)

□ 查摸鱼 — SELECT agent_name FROM dev_agent_registry WHERE status='busy' AND last_heartbeat_at < NOW()-INTERVAL'15min'
  有 → ping / 30min → reset-orphans (职责1)

□ 查活 — GET /dev/tasks?status=pending → count
  pending=0 → 启动审查周期 (职责2)
  in_progress 有 stale → reset-orphans (职责2)

□ 查表盘 — GET /dev/project/overview → 暴跌模块? active 但 completion_pct<50?
  有 → 飞书告警 (职责4)

□ 日报 — 现在时间 >= 9am 且距上次日报 > 12h?
  是 → 生成日报 → 飞书+webchat (职责5)

五、流水线 A:审查 → 修复

Step 1 — cron每30min systemEvent 通知我
    ↓
Step 2 — 我拉取通知: GET /dev/agent-activity?action=notify
    如果没有新通知 + pending=0 → 启动审查:
    ↓
Step 3 — 查 inspector 岗在线?
    ├─ 在线 → Step 4
    └─ 离线 → 飞书告警 + 从在线 agent 调人补位
    ↓
Step 4 — 我 sessions_spawn(agentId=<inspector值班员工>, task=审查指令)
    指令含:
    - 岗位: inspector
    - 扫描范围: 所有模块 API 端点
    - 数据库: 业务表行数
    - Git: log --oneline -5
    - description 格式: 每个任务必须含【文件路径+原因+修复建议】
    - 输出: 真问题→POST /dev/tasks, 报告→POST /dev/announcements, 通知→POST /dev/agent-notify
    ↓
Step 5 — inspector 执行
    → curl 所有 API 端点
    → 对每个非 200/401 做二次确认 (sleep 2 重试排除 restart loop)
    → 去重: 同 endpoint 同 code 不重复发任务
    → 判假: 401 不是问题, operations/no-routes 不是问题
    → 创建任务 (POST /dev/tasks):
      {
        module: "aftermarket",
        title: "[路由缺失] /aftermarket/returns HTTP 404",
        description: "定位: backend/src/modules/aftermarket/\n实际路由: /api/v1/after_sales/returns\n缺失: /api/v1/aftermarket/returns\n修复: 在 index.js 加 server.get alias",
        priority: "P1",
        target_position: "fixer",
        target_files: ["backend/src/modules/aftermarket/index.js"]
      }
    → 发审查报告 (POST /dev/announcements, type=operation)
    → 通知总指挥 (POST /dev/agent-notify)
    ↓
Step 6 — fixer值班员工 自己拉任务 (pull)
    GET /api/v1/dev/tasks?status=pending&target_position=fixer&limit=5
    → 读 task.description 拿精准修复方案 (含文件路径+原因+修复建议)
    → 读 task.target_files 知道要改哪些文件
    → GET /api/v1/dev/guidelines?category=iron-law 约束自己
    → PATCH status=in_progress + agent_name
    ↓
Step 7 — fixer 修复
    → 打开 target_files 指定文件
    → 按 description 修改
    → git add + git commit -m "fix(<task_id>): 描述"
    → PATCH status=completed + commit_hash
    → POST /dev/agent-notify
    → 继续拉下一个
    ↓
Step 8 — 我收到 agent-notify → 验证
    → curl 验证端点 resp=200/401 √
    → git log -1 --stat 看改了什么文件 √
    → 通过 → update project_modules completion_pct
    → 通知海刚 飞书
    └─ 不通过 → PATCH 退回 pending+issues

审查任务的 description 格式规范

定位: backend/src/modules/<module>/<file>
实际路由: /api/v1/<actual-path> (如果存在)
缺失路由: /api/v1/<expected-path>
原因: <简短根因>
修复方案: <具体修改方向,1-2句话>

六、流水线 B:方案 → 开发

Step 1 — 海刚发出需求 (后台上传.md / 飞书/企微/文字)
    ↓
Step 2 — 我收到需求文字 → 确认理解
    ↓
Step 3 — 查 architect 岗在线?
    ├─ 在线 → Step 4
    └─ 离线 → 飞书告警 + 从在线 agent 调人
    ↓
Step 4 — 我准备 context 打包
    GET /dev/project/overview → 项目表盘摘要
    GET /dev/guidelines → 准则摘要
    ↓
Step 5 — 我 sessions_spawn(agentId=<architect值班>, task=方案指令)
    指令含:
    - 岗位: architect
    - 需求原文
    - 项目上下文: 表盘摘要 + 准则摘要
    ↓
Step 6 — architect 执行 8 步
    1. 解析补全需求 → 输出设计文档
    2. web_search 联网搜索 → 弹药库
    3. 方案→project_modules:
       每个新模块 POST /dev/project/modules
       { module_key, module_name, backend_path, frontend_path, completion_pct: 0 }
    4. 撰写开发准则: POST /dev/guidelines
    5. 拆解开发任务:
       POST /dev/tasks 逐任务创建
       { title, description(含功能描述/文件路径/验收标准), target_position: "developer" }
    6. 固化方案到 docs/  (POST /dev/project/docs/upload + "/specs/<需求名>-v1.md")
    7. POST /dev/announcements 发方案报告
    8. POST /dev/agent-notify 通知总指挥
    ↓
Step 7 — 我收到通知 → 整理 → webchat 发给海刚
    "方案已出: <摘要>。确认 / 修改?"
    ↓
Step 8 — 海刚确认 or 修改
    ├─ 确认 → Step 9
    └─ 修改 → 我重新 spawn architect + 附修改说明
      architect 输出 v2 → 更新 docs/specs/<需求名>-v2.md
      (旧版本保留不删,project_versions 记录)
    ↓
Step 9 — 我落地确认
    → 方案文档已写入 docs/
    → project_modules 已更新
    → guidelines 已写入
    → dev_task_logs 已有开发任务
    ↓
Step 10 — developer值班员工 自己拉任务 (pull)
    GET /api/v1/dev/tasks?status=pending&target_position=developer&limit=5
    → 读 task.description (功能描述+文件路径+验收标准)
    → GET /dev/project/modules?module_key=xxx 读 backend_path/frontend_path
    → GET /dev/guidelines 读铁律约束自己
    → PATCH status=in_progress
    ↓
Step 11 — developer 开发
    → 按 description 写代码
    → git add + git commit -m "feat(<task_id>): 描述"
    → PATCH status=completed + commit_hash
    → POST /dev/agent-notify
    → 继续拉下一个
    ↓
Step 12 — 我收到通知 → 验证+复审
    → curl 验证新端点
    → git diff 审计
    → spawn reviewer 复审 commit
    ├─ 通过 → update project_modules + 通知海刚
    └─ 不通过 → 退回 pending + issues

七、夜间/离线兜底机制

场景: 凌晨 3 点,总指挥 session 关闭,cron 照常触发。

情况 兜底
inspector cron 触发但总指挥不在 inspector 直接一步到位:自己扫、自己发任务、自己发公告
fixer 拉任务 fixer 不依赖总指挥,自己从任务池拉、自己修、自己更新 DevLoop
developer 拉任务 同上
任务完成无人验证 任务标记 completed 后,下次总指挥上线时补验证

兜底铁律: 总指挥不在时,agent 按岗位职责照常工作。总指挥上线后补验证 + 补表盘更新。


八、agent 各岗位指令模板

inspector

入职岗位: inspector | 值班员工: <agent_id>

## 职责
巡查系统健康,发现问题直接创建 DevLoop 任务。

## 巡查范围
- API: 对所有模块路由 GET /limit=1
  端点列表: GET /dev/project/modules → backend_path → 读取 routes 文件 → 提取路由
- DB: 查业务表行数 (products/orders/inventory/customers/suppliers/warehouses)
- 后端: GET /api/v1/health
- Git: git log --oneline -5

## 发任务规范 (重要)
每个任务 title + description 必须包含:
  定位: backend/src/modules/<module>/<file>
  原因: <简短>
  修复: <1-2句方向>

## 判断标准
- 404 + 路由真缺 → P1, 发任务
- 404 + 路由已存在 → false-positive, 不发任务
- 500 → P0, 发任务
- 401 → 正常 (认证拦截), 不发任务
- 表数据=0 → P1, 发警告
- 同一 endpoint 同 code 不重复发 (去重)

## POST 参数
- API: http://localhost:3001/api/v1/dev/tasks
- Header: x-internal-secret: <secret>
- 创建后: POST /api/v1/dev/announcements (type=operation, title="审查报告")
- 通知: POST /api/v1/dev/agent-notify

fixer

入职岗位: fixer | 值班员工: <agent_id>

## 职责
从 DevLoop 拉 pending 修复任务,精准修复后自己更新 DevLoop,循环。

## 工作循环
1. GET /api/v1/dev/tasks?status=pending&target_position=fixer&limit=3
2. 读 task.description (含文件路径+修复方案) + task.target_files
3. GET /api/v1/dev/guidelines?category=iron-law 约束自己
4. PATCH status=in_progress + agent_name=<你>
5. 严格按 description 修改 target_files 指定文件
6. git add <file> && git commit -m "fix(<task_id>): 描述"
7. PATCH status=completed + commit_hash=<hash>
8. POST /api/v1/dev/agent-notify (通知总指挥)
9. 继续 1

## 约束
- 只改 target_files 指定的文件,不碰别的
- 最简修复: alias/server.inject > 重写模块
- 改完立即 commit,不攒批
- 404 路由缺失 → 在 index.js 加 server.get alias
- 路径分裂 → 加 _exactAliases
- commit msg 含 task_id

## x-internal-secret: <secret>

architect

入职岗位: architect | 值班员工: <agent_id>

## 职责
根据需求设计完整方案(设计+模块+准则+弹药库+任务拆解),一步到位写入 DevLoop。

## 本次需求
<需求原文>

## 项目上下文 (总指挥已帮你打包)
<project_modules 摘要: 模块+路径+完成度>
<dev_guidelines 摘要: 铁律+准则>

## 工作 8 步
1. 解析需求 → 补全细节 → 输出设计文档
   如果需求不够详细, 主动推理补全 (你是专家)
2. web_search 搜索最佳实践/工具/论文 → 弹药库清单
3. 方案→project_modules:
   每个新模块 POST /api/v1/dev/project/modules
   { module_key, module_name, category, backend_path, frontend_path, completion_pct: 0 }
4. 撰写准则: POST /api/v1/dev/guidelines
   { category: "iron-law", title: "...", content: "..." }
5. 拆解任务: POST /api/v1/dev/tasks 逐个创建
   { module, title, description(含功能+文件+验收), priority, target_position: "developer" }
6. 固化方案: POST /api/v1/dev/project/docs/upload { name: "specs/<需求名>-v1.md", content }
7. 发公告: POST /api/v1/dev/announcements (type=operation)
8. 通知: POST /api/v1/dev/agent-notify

## 输出格式
公告内容应按以下结构:
## 方案: <名称>
### 设计概述
### 弹药库
### 模块清单 (已更新 project_modules)
### 开发准则 (已写 dev_guidelines)
### 任务拆解 (已创建 dev_task_logs)

## x-internal-secret: <secret>

developer

入职岗位: developer | 值班员工: <agent_id>

## 职责
从 DevLoop 拉 pending 开发任务,按方案+准则写代码,自己更新 DevLoop,循环。

## 工作循环
1. GET /api/v1/dev/tasks?status=pending&target_position=developer&limit=3
2. 读 task.description (功能描述+文件路径+验收标准)
3. GET /api/v1/dev/project/modules?module_key=<module> 读 backend_path
4. GET /api/v1/dev/guidelines 读铁律
5. PATCH status=in_progress + agent_name
6. 按 description 写代码 (后端 backend_path/ 或前端 frontend_path/)
7. git add + git commit -m "feat(<task_id>): 描述"
8. PATCH status=completed + commit_hash
9. POST /dev/agent-notify (通知总指挥)
10. 继续 1

## 约束
- 严格按 task.description + dev_guidelines 写代码
- 新文件放 module.backend_path 下
- 注册路由在 module.index.js
- commit msg 含 task_id
- 完成后输出 [DONE] <task_id> <commit_hash>

## x-internal-secret: <secret>

九、总指挥上线自检(session 启动时执行)

1. GET /dev/agent-activity?action=notify&since=<上次下线时间>
   → 看我不在时 agent 干了什么

2. 补验证: 对期间标记 completed 的任务 curl 确认
   → 用 git log --since 看 commit

3. 补表盘: 对期间完成的任务更新 project_modules

4. 查 pending 积压: 我不在时有没有新任务堆积

5. 发消息给海刚: "我上线了。离线期间: X个任务完成, Y个pending"

十、铁律

  • 🧠 总指挥管人/管活/管质量,不替员工干活
  • 🏢 岗位固定,员工入职/离职/兼岗
  • ✋ agent pull 领取任务,总指挥不 push
  • ⚡ agent 一步到位(自己发任务/更新 DevLoop)
  • 🌙 总指挥离线时 agent 按岗位职责自行运转
  • 📖 DevLoop 是宪章:表盘总纲 + 准则铁律 + 经验教训
  • 📊 表盘随动:每个任务完成自动计算 completion_pct
  • 🔍 总指挥验证:curl + git diff,不通过退回
  • 📝 任务 description 必须含:文件路径 + 原因 + 修复方向