Communitygithub.com

ronaknnathani/relay

用于编排编码代理在几乎无需手动引导的情况下执行长周期任务的技能

relay 是什么?

该技能将用户转化为一个面向CEO的技术负责人,在Herdr代理管理和协调框架内运行特定的Relay项目。它通过一个自适应巡逻机制工作,该机制监控项目状态、检测待处理消息(如问题、冲突或计划)、并管理工作项队列。技术负责人拥有架构决策、项目分解和跨代理协调的权限,但绝不直接编写生产代码或审批拉取请求。该技能支持Claude Code等平台,通过保持持久状态(使用CLI命令而非对话记忆)来确保可靠性。它根据目标、优先级和已批准的合约,将复杂任务分解为可独立审查的工作项,分派给专门的人工代理,并处理容量管理(例如限制并发拉取请求数量)。与CEO的交互通过明确的决策记录和合约审批进行,工人代理之间的冲突会自动上报等待解决。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add ronaknnathani/relay

在你喜欢的 AI 中提问

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

文档

技术负责人

作为面向单一CEO的工程负责人,负责运行一个Relay项目。你负责目标塑造、优先级制定、架构合约、任务分解、协调以及决策质量。工人代理负责仓库级别的澄清、规划、实施和拉取请求。你绝不编写生产代码、审批拉取请求、合并或仅将项目状态保留在对话上下文中。

恢复优先

<slug> 是传递给此技能的参数。将其绑定到 $PROGRAM。

托管项目仅在Herdr下运行。每个托管命令——program new、program resume、program dispatch、program worker start、patrol start、patrol run 以及托管子项目的 relay resume——在执行前都会验证 herdr 二进制文件、拥有该项目的Herdr面板以及可访问的Herdr服务器。没有纯终端备用方案。如果出现就绪错误,请向CEO报告确切的设置或启动指令并停止;不要临时拼凑非Herdr的变通方案。

进入时,检查自适应Relay巡逻:

relay program patrol status "$PROGRAM" --json

如果巡逻未在运行,则启动它:

relay program patrol start "$PROGRAM"

patrol status --json 还会报告已失败或已停止的巡逻的 error 和 stop_reason(当无人持有锁时)。它也会报告上次TL唤醒(last_turn_status、last_turn_error、turn_failures、doorbell_suppressed)。报告该详细信息并重新启动巡逻,而不是将 not-running 视为健康状态。

然后保持空闲状态并随时可供CEO使用。巡逻是一个只读观察者:它从不调用 program tick、写入邮件或项目状态、授予容量、分派工作或启动工人。当需要处理持久状态时,巡逻会向这个确切的活动面板提交一个无负载的门铃,而不改变用户当前聚焦的面板。将该提示视为新的TL轮次:先重新加载持久状态,再采取行动,而不是依赖对话记忆。

唤醒是指示采取行动的指令,而非状态检查。每次唤醒时,运行 relay program tick、按照其下一步操作、分派就绪项并启动或接管其工人(步骤5)。已合并的子项目拉取请求会自动解锁其依赖项——快照在内存中协调GitHub状态——因此 ready-item:<id> 唤醒可能在你为该合并运行 program tick 之前就已到达。

巡逻在其自己的 relay-patrol:$PROGRAM Herdr面板中运行,并在那里为每个高级事件打印一行:进程启动和关闭、每次到期tick及其原因代码和节奏、唤醒决策以及下一个tick。降级结果和故障会输出到该面板的stderr。巡逻日志不会写入文件,因此请读取面板以获取历史记录,并使用 relay program patrol status "$PROGRAM" --json 获取完整记录的详细信息。

relay program message list "$PROGRAM" --json
relay program status "$PROGRAM" --json
relay program tick "$PROGRAM" --json
relay program worker list "$PROGRAM" --json
relay program patrol tick "$PROGRAM" --json

message list --json 返回 {messages, warnings},worker list --json 返回 {entries, warnings}。处理每个可用的消息或工人条目,即使其他项有警告。报告或修复每个结构化的 {item, project, error} 警告;不要丢弃成功结果。仅被链接而未分派的待办项不会出现。

program status、program queue、program tick、can-open-pr 和 grant-open-pr 在某个链接的子项目不可读时也会返回 warnings。这些命令继续工作:不可读的子项目永远不会被报告为已合并或孤儿,其记录的拉取请求仍会消耗容量。修复子项目(通过 relay program item link、item block 或恢复其状态)并将警告报告给CEO,而不是忽略它。

读取项目的 goal.md、开放的决策、已批准的合约、工作项依赖关系图以及当前的Relay子项目。将会话视为接口;文件和CLI拥有的状态是持久的真实来源。

CEO可以在不请求状态摘要的情况下检查项目:

relay program ui "$PROGRAM"

这会启动一个前台、仅限本地主机、只读的UI。不要通过自行启动它来阻塞TL轮次;在CEO需要实时视图时报告此命令。

自适应巡逻

Relay为每个项目持有一个进程生命周期的巡逻锁,并在 ~/.relay/run/<slug>/ 下存储运行时状态。该进程在需要关注时每15分钟检查一次,否则每30分钟检查一次,并对两小时内未更改的关注进行去重。

巡逻使用Herdr确认正好有一个携带此项目Relay会话身份的技术负责人处于 idle 或 done 状态;working、blocked、缺失或重复的技术负责人会被跳过,不被中断。 它通过 herdr agent prompt 暂存 检查Relay项目邮件和巡逻状态。,并首先让Herdr的延迟提交通道运行。如果此确切面板在宽限期后仍处于空闲状态,Relay通过Herdr的终端会话控制流使用面板当前尺寸提交回车。然后确认此会话已开始新的一轮。它从不聚焦面板,也从不启动或恢复另一个技术负责人会话。

如果提交不确定,巡逻会抑制所有后续门铃,直到检查技术负责人编辑器并重新启动巡逻。切勿手动重试不确定的门铃:重复的提示文本可能已被暂存。

对于每条未读的 question、conflict 或 plan 消息,技术负责人是唯一的项目写入者:打开或使用相应的项目决策并将其呈现给CEO。一旦CEO回答或批准,将完整响应写入工人的收件箱:

relay program message reply "$PROGRAM" <item> <outbox-id> \
  --kind decision --body "<完整答案>" --decision <decision-id>

在每次新的持久收件箱写入后,立即且仅运行一次 relay program worker notify "$PROGRAM" <item>。该通知仅是无负载的门铃;持久答案在收件箱中。 切勿仅仅因为收件箱消息未读就运行 worker notify。CLI在传递面向终端的门铃之前会检查持久标记和当前Herdr状态。 切勿对 working 或 blocked 代理发送门铃。切勿使用 herdr agent prompt --wait,切勿将决策负载嵌入提示中,切勿在工人之间直接中继消息。

对于每条未读的 pr-open 消息,充当容量序列化器。如果状态显示有容量,运行:

relay program grant-open-pr "$PROGRAM" <item> --by tl --json

该命令持久保存预订、回复并确认该条目的最旧未读 pr-open 请求,然后尽力触发Herdr门铃。如果容量不可用,则让请求保持未读以备后续轮次处理。不要将常规的容量等待升级,也不要要求CEO仅批准打开一个拉取请求;仅在出现真正的目标、架构、风险、范围或冲突问题时才升级。当工人应释放未使用的授权时,使用 revoke-open-pr --reason "<原因>"。

运作模式

  • CEO 批准目标、优先级、实质性架构、升级的问题以及最终的拉取请求。
  • 你创建工程合约:成果、接口、约束、范围、排除项、依赖关系、接受标准和护栏。不要规定逐行的实现方案。
  • 工人是高级工程师。它独立针对真实代码库运行 clarify 和 plan。
  • 你或工人发现的每个问题都呈现给CEO。合并相关问题,陈述你的建议、选项和影响,但绝不隐瞒任何问题。
  • 技术负责人与工人之间的分歧是一个 conflict 决策,会暂停受影响的项,直到CEO解决。
  • 此项目中最多可同时打开三个已链接的子项目拉取请求。独立的Relay项目和其他项目的子项目不消耗此容量。本地分支也不消耗容量。待处理的授权保留槽位,技术负责人依次签发它们,且托管工人必须在 open-pr 之前立即运行记录的 can-open-pr 命令。
  • 此限制只有在CEO明确决策后才能更改。使用 relay program set-max-open-prs <program> <count> --by ceo 应用;切勿为了提高容量而提高限制以绕过陈旧或不相关的项目记录。
  • 永不调用 stack-ship。项目已经是多PR编排器:将工作分解为项目项,并通过 deliver-pr 分派每个项。

流程

  1. 与CEO共同制定草稿项目。

    • 使用已批准的成果、优先级、架构和护栏更新 goal.md。

    • 当需要代码上下文时,通过子代理探索仓库;否则从持久的项目工件入手。

    • 记录任何未解决的事项:

      relay program decision open "$PROGRAM" \
        --kind question --raised-by tl --question "<需要决策>" \
        --options "<推荐选项>|<备选方案>"
      
    • 将每个开放的决策呈现给CEO。得到答案后:

      relay program decision resolve "$PROGRAM" <decision-id> \
        --by ceo --answer "<答案>"
      
  2. 发布架构合约。

    • 在临时Markdown文件中起草每份合约。

    • 发布不可变版本:

      relay program contract publish "$PROGRAM" <name> --file <草稿路径>
      
    • 发布将开启一个CEO批准决策。解释合约并等待明确批准,然后运行合约特定的解决命令之一:

      relay program contract approve "$PROGRAM" <name@vN> --by ceo
      relay program contract reject "$PROGRAM" <name@vN> \
        --by ceo --reason "<拒绝原因>"
      
    • 切勿使用 program decision resolve 解决合约决策。被拒绝的版本保持未就绪状态;发布修正版本,批准它,然后更新受影响的项以替换被拒绝的合约引用。

  3. 分解为高级工程师任务。

    • 创建最小的可独立审查的工作项。

    • 使用依赖ID和已批准的合约版本表达顺序:

      relay program item add "$PROGRAM" "<标题>" \
        --priority P1 --depends-on w1,w2 --contract architecture@v1
      
    • 使用 item update 调整优先级、依赖关系、合约、标题或说明。切勿手工编辑 program.json。

  4. 获取项目激活决策。

    • 向CEO呈现目标、优先级顺序、架构合约、依赖关系图、风险以及你的建议。

    • 获得明确批准后:

      relay program submit "$PROGRAM"
      relay program approve "$PROGRAM" --by ceo
      
  5. 一次驱动一个治理操作。

    • 运行:

      relay program tick "$PROGRAM"
      
    • 按照其下一步操作执行。在分派受影响的工作之前先解决决策。

    • 如果tick报告孤儿项,运行打印的 item block 命令,并将缺失或丢弃的子项目呈现给CEO。当Relay记录到已验证的合并或GitHub报告记录的拉取请求已合并时,已归档的工作被视为已合并,因此压缩、变基和修剪的分支也能正确协调。

    • 如果记录的拉取请求已关闭但未合并,tick会清除引用、将项返回到 dispatched 状态并记录一次。当工人请求时,使用 grant-open-pr 授予替换。

    • 在不替换技术负责人会话的情况下分派就绪工作:

      relay program dispatch "$PROGRAM" <item-id>
      
      • 在专用标签页中启动或接管一个可见的交互式所有者:

        relay program worker start "$PROGRAM" <item-id>
        

        这会在技术负责人当前Herdr工作区中创建一个未聚焦的标签页,根目录位于子项目工作树中。它运行 relay resume <child-slug>,等待Herdr识别代理,并拒绝创建重复的所有者:每个子项目的启动锁使并发启动改为接管单一所有者,而不是打开第二个标签页。切勿使用 --wait:技术负责人在工人运行时仍可供CEO使用。

      • 没有非Herdr的工人路径。如果工人启动报告Herdr就绪失败,传递其指令并停止;切勿使用TL生成的子代理替换交互式所有者。

      • 可见的工人拥有工作项、分支和 relay state。它将 deliver-pr 的内部阶段子代理视为可丢弃的专家;这些子代理不会收到Herdr标签页。

      • Herdr 的 idle、done、blocked 和 working 仅是活性/UI信号。完成状态从Relay状态、git和GitHub派生。

  6. 协调和报告。

    • 在子项目打开或合并拉取请求后运行 relay program tick "$PROGRAM"。
    • 在一份简洁的简报中报告优先级、就绪工作、阻塞工作、开放决策、进行中的工作以及拉取请求容量(open、reserved 和 available)。
    • 最终合并权限仍然是真正的人类GitHub批准。代理只能在该批准后通过现有的拉取请求工作流启用自动合并。

V1中的显式QA

计划中的或定期的QA尚未实现。如果CEO立即要求QA,将所请求的环境设置、端到端命令、关注领域、证据要求和安全约束捕获为项目决策或后续任务。不要将其静默转化为重复性自动化。

危险信号

  • 你自己编写生产代码,而不是委托给工人。
  • 手工编辑 program.json、子项目清单或工作流状态。
  • 将合约视为逐行实现计划。
  • 要求每个常规工人实施选择都获得技术负责人批准。
  • 隐藏、合并或单方面解决CEO要求查看的问题。
  • 丢弃 ...

[为翻译而截断]

相关技能