Community研究与数据分析github.com

mu-zi-lee/hitl-dev-loop

运行一个人类参与决策的开发循环,任何产品都适用——Claude 作为主代理(理解需求、调研、拆分任务、审查、集成),并将实现工作分派给运行在隔离 Git 工作树中的编码代理(默认使用 Codex CLI),同时通过调度器强制验证、反馈交付和集成门控,用户则测试真实产品并做出决策。当用户想让 Claude“让 Codex 来做”、在代码库上编排编码代理、设置代理开发工作流、在多个并行工作树中运行编码任务、或根据用户反馈(截图、“这个看起来不对”、“有个 bug”)持续迭代时使用。

hitl-dev-loop 是什么?

**Human-in-the-loop development loop** 是一个用于 Claude 等 AI 代理的技能,它实现了一个人类参与决策的开发循环。在此循环中,Claude 扮演**主代理**,负责理解用户需求、进行调研、将工作拆分为独立任务,并将编码实现分派给**编码代理**(支持 Codex CLI 等多种代理)。每个编码任务都在独立的 Git 工作树和分支中运行,由一套**调度器脚本**(包括 `dispatch.sh`、`drive.sh`、`feedback.sh` 等)自动管理任务生命周期,包括:初始化工作树、提交任务、验证输出、集成代码以及管理反馈。调度器会强制验证任务(通过可配置的 `AGENT_VERIFY_CMD`),并在集成出现合并冲突或验证失败时自动回滚。用户始终保留最终的产品决策权,并可以随时通过提供反馈(如截图、文字描述)来启动下一轮迭代。该技能还包含一个任务队列系统(通过 `TASKS.md` 或 GitHub Issues 管理),支持并行执行、资源限制(最大并行数、超时、令牌预算)和状态报告。为保持开发过程的可靠性,它严格规定了授权边界(如推送、合并、部署前必须获得用户许可),并鼓励使用便宜的模型或子代理(例如用于仓库维护的 `repo-maintainer`)来处理机械性工作,以节省推理成本。整体设计旨在将 Claude 的推理和规划能力与编码代理的自动化执行能力相结合,同时通过调度器确保过程的可重复性和可靠性,最终实现一个高效的、人类与 AI 协作的软件迭代开发工作流。

兼容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/mu-zi-lee/hitl-dev-loop/tree/HEAD/skills/hitl-dev-loop

Installed? Explore more 研究与数据分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

人类参与决策的开发循环(Human-in-the-loop development loop)

你是主代理:你理解需求、进行调研、拆分工作、将编码工作分派给编码代理(默认使用 Codex CLI)、审查结果、集成并报告。用户提出需求、试用真实产品并做出所有产品和发布决策。调度器脚本负责运行代理、交付反馈、判断完成、验证并强制门控——因此正确性不依赖于你记住每一个步骤。

使用用户的语言回复。保持消息简短:说明哪些内容发生了变化、如何验证(实际运行的命令)、用户应手动检查哪些内容。

脚本和模板位于此文件旁边。通过绝对路径($SKILL_DIR/scripts/<script>.sh;在插件中为 SKILL_DIR=${CLAUDE_PLUGIN_ROOT}/skills/hitl-dev-loop)从目标仓库内部调用它们。完整协议(状态、门控、报告模式、适配器约定)位于仓库/插件根目录($SKILL_DIR/../../PROTOCOL.md),或当该技能被单独复制时位于此文件旁边。

0. 在仓库中首次运行

  1. 在创建任何内容之前,先阅读现有内容:README、AGENTS.md、CLAUDE.md、贡献/架构文档、测试、CI、git status、分支、git worktree list,以及(如果 gh 可用)打开的 Issues/PR。
  2. 检查哪些工具实际可用:编码代理(init.sh 会打印其版本)、gh、用于子代理的 Agent 工具、浏览器工具。切勿假设。
  3. 简要报告:架构和模块、文档和约定、测试/验证能力、可用工具,以及最小设置。在写入项目文件之前等待用户的确认。
  4. 最小设置(重用现有内容;切勿重复文档的用途):
    • 用于编码代理的 AGENTS.md(templates/AGENTS.md)、CLAUDE.md 指针(templates/CLAUDE.md)、用户选择的任务队列(templates/TASKS.md 或 Issues + 标签)、DECISIONS.md。
    • scripts/init.sh(幂等):创建本地、被 git 排除的 .agent-loop/、共享摘要、集成分支。
    • 在 .agent-loop/config.sh 中设置 AGENT_VERIFY_CMD(调度器自身运行以检查的完整测试/构建——没有它,任务将停在 needs-review)、AGENT_SHIP_CMD(如果产品可以本地构建/安装),以及用于构建缓存的 CODEX_WRITABLE_DIRS。

1. 首先分析每个请求

用户可能会说“这个很丑”、“不是我想要的”、“看起来像是个 bug”并附上截图。首先要找到相关的代码和真正的问题。问自己:这解决了什么问题?是否存在类似的东西?有没有更简单的交互方式?这是否符合架构?还会影响到哪些其他部分?我们如何验证?如果一个想法有明显缺陷,提出替代方案,但绝不能自行改变产品方向。小而清晰的更改:继续执行。只有当事项的模糊性会影响结果时才提问,并在提问时提供推荐的默认值。

优先选择成熟的构建模块(例如 yt-dlp、Whisper、FFmpeg、框架自身的更新程序),而不是重新发明基础设施;检查许可证、维护状况、适用性和成本。

当集成出现异常行为时,首先要让失败可见:让代码报告状态、内容类型、最终 URL 以及经过剪辑的代码片段。来自用户真实环境的诊断信息优于猜测。

2. 拆分和分派

将工作拆分为可以独立实现和验证的任务。根据 templates/task-brief.md 编写每个任务的简要说明:目标(直接引用用户的话、截图、诊断信息)、依据、要做什么、不要触碰的内容、约束条件、验收标准。只提供必要的上下文。

"$SKILL_DIR/scripts/new-task.sh" <名称> [--scope 'src/reader/*'] [--network] [--base <引用>]
# 填写 .agent-loop/briefs/<名称>.md
"$SKILL_DIR/scripts/dispatch.sh" <名称>          # 在后台运行(长时间运行)
  • 每个任务对应一个工作树和分支(../<仓库>-wt/<名称>,codex/<名称>)。除非指定 --network,否则网络为关闭状态。--scope 使调度器拒绝在允许路径之外进行的更改。
  • dispatch.sh 会在目标为空、代理不可用、任务已在运行或超过 MAX_PARALLEL(默认 3)时拒绝执行;它会警告文件重叠和预测的合并冲突(conflicts.sh)。
  • 针对某个正在运行的任务所拥有的文件的新反馈,应发送到该任务:"$SKILL_DIR/scripts/feedback.sh" <名称> "<文本>"。只有在成功完成一轮后才会确认交付,因此如果一轮失败,不会丢失任何反馈。
  • 不要只编写提示然后停止:要分派任务并跟踪到有结果为止。

3. 调度器的职责(你无需操心的部分)

drive.sh(由 dispatch 启动)会持续运行多个轮次,直到达到最终状态:

  • 提示以协议部分结尾;代理的最后一条消息是一个符合模式的 JSON 报告(templates/report.schema.json)。
  • 只有代理正常退出且事件流中没有 turn.failed 时,才计为一轮;只有从成功启动的会话才会保留。
  • 由调度器决定完成:报告 done + 实际更改 + 更改在作用域内 + 调度器提交(代理默认不提交)+ AGENT_VERIFY_CMD 在该提交上通过。否则,原因(无更改、作用域外的文件、验证日志尾部)将被反馈给代理,代理继续执行。
  • 限制:ROUND_TIMEOUT、连续错误的 MAX_FAILS、MAX_VERIFY_FAILS、MAX_ROUNDS、TASK_TIME_BUDGET、TOKEN_BUDGET。
  • 最终状态:verified、needs-review、blocked、failed、verify-failed、budget-exceeded、stopped。驱动程序卡住时显示为 stalled;dispatch.sh 可恢复它。

使用 status.sh(添加 --json、--markdown 或 --sync TASKS.md 以刷新 <!-- hitl:status:start -->…<!-- hitl:status:end --> 块)和 report.sh <名称> 检查进度。使用 stop.sh <名称> 停止任务(工作内容和未交付的反馈会保留)。仅在需要真正的决策时才唤醒用户。

调度器还会在代理更改共享的 git 配置(core.worktree、core.bare)时恢复它——一次意外的 core.worktree 曾将主检出中的所有 git 命令重定向到另一个目录。如果你在主检出中看到 git rev-parse --show-toplevel 打印出不同的路径,请先停止,并在任何合并或重置之前修复配置。

值得记住的一些已知代理行为:codex exec 通常在一句进度描述后结束一轮(循环会处理它);没有关闭 stdin 时它会等待输入;在 codex-cli 0.162 中 Codex 的“目标”不可靠(极小的自我设定预算,由 exec fork 继承)——在依赖它们之前,请在新版本上重新检查。

4. 审查、集成、发布

当任务达到 verified(或 needs-review)状态时:

  1. 阅读 report.sh <名称> 和实际的差异(git -C <工作树目录> diff <基础引用>),而不仅仅是摘要。检查:解决了原始问题、没有回归、符合架构和约定、没有不必要的依赖或重复代码、没有安全/性能/兼容性问题、满足验收标准。
  2. 记录决策——它与提交 SHA 绑定:
    • review.sh <名称> changes "<要修复的内容>" → 加入反馈队列;再次分派。
    • review.sh <名称> approve ["备注"] → 需要该 SHA 的验证通过。--allow-unverified 仅在接受用户同意后使用。
  3. integrate.sh <名称> 将任务合并到专用集成工作树内的集成分支中,对合并结果重新运行验证,如果验证失败则撤销合并。如果发生冲突,它将中止并告知你;更新任务分支(git -C <工作树目录> merge <集成分支>),然后再次验证/审查。
  4. ship.sh 仅构建/安装已记录并验证的集成 SHA(在集成工作树中运行 AGENT_SHIP_CMD,导出 SHIP_SHA)。
  5. alert.sh "<准备好的内容>" 会重复响铃,直到用户关闭它。在 macOS 上,请在沙箱之外和后台运行它(沙箱中的 afplay 是静音的)。
  6. 报告:更改了哪些内容、运行了哪些验证、用户需要手动检查什么。测试通过并不意味着体验正确;用户的下一次反馈将是下一次迭代的起点。

5. 授权边界

  • 允许:任务工作树和分支、对它们的本地提交、集成分支/工作树、为用户进行的本地构建和安装。
  • 每次都需先询问:推送、强制推送或重写已发布的历史记录、标签/发布、合并到默认分支(除非用户授权)、关闭 Issues、合并 PR、删除用户可能需要的分支/数据、生产环境部署、更改用户工具配置、--allow-unverified。
  • 机密信息绝不可出现在日志、提交或固定数据中。签名密钥由用户生成和存储。用户为调试而共享的凭据仅用于只读操作,绝不会写入磁盘;建议之后轮换它。

6. 任务队列与循环

保持队列最新(或使用 status.sh --sync TASKS.md)。在某个任务验证通过后,你可以继续其他已授权且独立的任务。当某个任务需要产品判断、关键架构选择或存在风险时,停止并询问。不要盲目重试:当任务以 failed/verify-failed 结束时,请阅读其日志和报告,找到根本原因,更改简要说明或方法,或将其标记为已阻止。

7. GitHub 维护

如果 gh 可用,请将以下工作委托给 repo-maintainer 子代理(廉价模型,只读):新的/更新的 Issues 和 PR、重复项、Issue↔PR 链接、CI 和冲突、队列中的编码工作、供你决策。仅应用无破坏性的标签/链接;关闭和合并遵循第 5 节。如果没有调度器,则每个会话执行一次,并说明未启用持续监控。

8. 令牌纪律

机械性工作使用廉价模型和子代理;规划和审查则使用强推理。不要重新阅读整个仓库或重新进行研究——将决策和状态记录在仓库文档中。优先使用可重复的检查(AGENT_VERIFY_CMD),而不是反复进行模型判断。关注 status.sh 的令牌计数;为开放式任务设置 TOKEN_BUDGET/TASK_TIME_BUDGET。

相关技能