[Feature] 需求间阻塞依赖:定时派发只认领依赖已完成的需求,按优先级排序,上游完成自动放行
維護者通常 1 天內回覆
還沒有人認領這個 Issue。
評估
- 難度
- 5/5
- 預估耗時
- 一週以上
- 新手友好度
- 22/100
研究方向
Start with the scheduler path: execute() and matchingIssues() in internal/schedule/service.go, the candidate ordering from Issues() in internal/repo/issues.go, and the Issue type in internal/domain/issue.go. Also read internal/httpapi/dispatch.go and internal/tracker/github.go. Done means the acceptance checklist in the issue passes, including readiness and cycle-detection unit tests and a migration under migrations/.
由索引模型根據 Issue 內容生成。
描述
背景与借鉴来源
需求一多,AI 自动认领就会遇到顺序问题:B 需求必须等 A 合入才能做,但调度器不知道,照样把 B 派给 Agent,结果要么在旧代码上实现、要么和 A 冲突,最后只能人工撤回。主流「给 Agent 用的任务系统」都把需求间的阻塞依赖 + 只派发就绪项当作核心能力:
| 项目 | 规模/活跃度(2026-11-13) | 相关能力 |
|---|---|---|
| steveyegge/beads | ~28.7k stars,当天有提交,v1.3.4(2026-11-04) | 依赖图驱动的 Agent 任务记忆:bd dep add B A(A 阻塞 B),bd ready 只列出没有未关闭阻塞项的任务,bd ready --claim 原子认领;A 关闭后 B 自动解除阻塞。依赖分阻塞型(blocks/parent-child/waits-for)和非阻塞型(related/discovered-from),见 Dependencies 文档 |
| MrLesk/Backlog.md | ~7.4k stars,11-11 有提交,v1.55.3 | 面向 AI 助手的任务看板,任务支持 dependencies,详情页同时显示「我在等谁」和「谁在等我」 |
| eyaltoledano/claude-task-master | ~28.4k stars | 任务带 dependencies,next 命令只返回依赖已完成、按优先级排序的下一项 |
| GitHub Issues | — | 原生已支持 issue 的 blocked by / blocking 关系和 sub-issues(REST /issues/{n}/dependencies/blocked_by,GraphQL issueDependenciesSummary) |
共同做法:依赖关系存在任务上;调度/认领只看「就绪」集合;上游完成自动放行下游;界面能看见卡在谁身上。
LoopForge 现状与不足
- 需求之间没有依赖字段。
internal/domain/issue.go的Issue只有SOPBindings[].DependsOn(internal/domain/issue_sop.go),那是同一个需求内多条 SOP 泳道之间的先后,不能表达「需求 #12 要等需求 #9 完成」。 - 定时派发不看依赖和优先级。
internal/schedule/service.go的execute()→matchingIssues()只按项目、状态、来源筛选;可派发判断只有IssueHasTask/DeliveryLocked/已关闭/AutomationState=ignored,以及集成分支阻塞(guard,按仓库)。候选顺序来自IssuesRepo.Issues()(internal/repo/issues.go)按Number倒序,即最新的需求最先派,Issue.Priority不参与;MaxDispatch名额可能被新的、低优先级、或依赖没完成的需求占掉。 blocked状态只是手工/失败标记。internal/httpapi/dispatch.go里 run 启动失败会把需求置为blocked,但没有「被谁阻塞」的数据,上游完成后也不会自动恢复。- 外部来源的依赖关系丢失。
internal/tracker/github.go同步 GitHub issue 时只取标题/正文/状态,GitHub 原生的 blocked-by、sub-issue 关系没有带进来(TAPD、工蜂同理)。
建议方案
- 数据模型:
Issue增加BlockedBy []string(同项目内需求 ID);读取时反查生成Blocks(谁在等我),不重复存。基线变更按 AGENTS.md 规范写migrations/NNN_issue_dependencies.sql,如需单独关系表放在IssuesRepo。 - 就绪判定(
domain层纯函数,便于测试):IssueReady(issue, lookup):所有BlockedBy都已完成(Completed(),或DeliveryMRState为 merged/integrated,可配置哪个算完成)才算就绪;阻塞项被取消/删除时视为解除并记一条IssueOperation。新增/修改依赖时检测环,有环直接拒绝。 - 定时派发:
schedule.Service.execute在筛eligible时跳过未就绪需求,并把原因写进job.Blockers(如「#12 等待 #9 完成」),与现有集成阻塞一起在任务结果里展示;候选排序改为「优先级 → 创建时间早的先派」,可在ScheduleJob上保留按编号倒序的旧行为开关。 - 手动派发:
dispatchIssue对未就绪需求返回 409 并列出阻塞项;提供force参数让有权限的人显式越过,记操作日志。 - 自动放行:上游需求完成或 MR 合入时,下游需求在下一次调度扫描中自然进入就绪集合;可选:此时给下游负责人发一条通知(复用
internal/notification)。 - 外部同步(可分期):GitHub 同步时读取 issue 的 blocked-by 关系,映射为
BlockedBy(两端都已同步进 LoopForge 才建立);TAPD/工蜂后续按各自 API 补。 - 界面与 API/MCP:需求详情显示「等待中 / 阻塞了」两个列表,可增删依赖;需求列表支持「仅就绪」筛选;平台 MCP 增加查询就绪需求和维护依赖的工具,方便澄清/拆分类 SOP 拆出子需求时直接写上先后关系。
验收标准
- 可以在需求上添加/删除「被阻塞于」关系,接口和 UI 都能用;自依赖和成环被拒绝并给出明确提示。
- 定时任务扫描时,依赖未完成的需求不会被派发,任务结果里能看到「#X 等待 #Y」的原因;上游完成后,下一轮扫描能自动派发下游。
- 定时任务候选按优先级从高到低派发,同优先级先建先派;
MaxDispatch名额不被未就绪需求占用。 - 手动派发未就绪需求默认被拒绝(409 + 阻塞清单),带
force可越过并在需求操作记录里留痕。 - 上游需求被取消/删除时,下游不会永久卡住(自动解除并记录)。
- 需求详情能同时看到「等待中」和「阻塞了」;需求列表可筛选「仅就绪」。
-
domain就绪判定、环检测、schedule跳过与排序逻辑有单元测试;新增表/列有对应migrations/脚本,不在启动路径里做迁移。 - (可选,分期)GitHub 同步能带入原生 blocked-by 关系。
- 主要語言
- Go
- 星號
- 141
- 分支
- 28
- 平均合併
- 1 天 15 小時
- 30 天內合併 PR
- 113
環境準備
- 提供 Dockerfile 或 Docker Compose 檔案
- 有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
Tencent/LoopForge 的其他 Issue
-
難度 2/5 1-3 小時 新手友好度 74/100
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 75/100
維護者通常 1 天內回覆
-
[Bug]: 官方镜像未安装 wecom-cli,企业微信通知报「通知服务未安装 wecom-cli」可能已有人在做 @newexploreor 於 1 天前認領。 未關閉bug
難度 2/5 1-3 小時 新手友好度 76/100
Tencent/LoopForge#156 · 1 則留言 · 已指派 1 人 ·
維護者通常 1 天內回覆
-
【架构优化】合并 gitwork/workbranch.go 中 push/pull 重复的默认提交身份注入为 withFallbackIdentity可能已有人在做 @fx-kurumi 今天認領。 未關閉
難度 2/5 1-3 小時 新手友好度 40/100
維護者通常 1 天內回覆
-
【架构优化】从 runtime.installNPMCLI 中拆出 npm 参数拼装 npmCLIInstallArgs 与安装结果启用 activateNPMStage可能已有人在做 @fx-kurumi 今天認領。 未關閉
難度 2/5 1-3 小時 新手友好度 30/100
維護者通常 1 天內回覆
查看 Tencent/LoopForge 的全部 Issue
相似的 Issue
-
team:library-maintainers
難度 2/5 1-3 小時 新手友好度 82/100
padok-team/burrito#1208 · 1 則留言 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 62/100
bazel-contrib/rules_go#4784 · 1 則留言 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 75/100
-
難度 2/5 1-3 小時 新手友好度 62/100
POSIdev-community/aictl#40 ·
-
難度 1/5 1 小時以內 新手友好度 62/100
prime-radiant-inc/evener#6306 ·
維護者通常 1 天內回覆