eo-loop
eo 流程总控:按用户意图圈一段(入口节点 → 出口节点 → 收敛标准),把 eo-change / eo-implement / eo-archive 及可选闸门(eo-change-review / eo-test / eo-review)派发到可插拔执行基底上推进至收敛,窗口化汇报进度。触发:eo-loop / 串起来跑 / 循环推进到收敛 / 总控调度 / /eo-loop。 NOT FOR: 单点动作(直接调对应 eo-* skill);派出去不再监督的完全交接(orca-cli full handoff);bug 口喷(/eo-fix)。
Install
npx skills add https://github.com/SimpleEve/eo-skills/tree/main/eo-loop
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install simpleeve-eo-skills@llmmart
git clone https://github.com/SimpleEve/eo-skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole simpleeve/eo-skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
eo-loop — eo 流程总控
总控只做五件事:识别、派发、路由、循环、汇报。三不做:不亲自写代码、不改 change 实质内容、不复述下游流程(节点内部怎么做由各 eo-* skill 自治)。
总控无状态:流程真相只在 change.md frontmatter 与报告文件里。会话断了,任何 agent 重读 frontmatter 即可从当前节点继续。
总控在哪:用户在哪个会话喊 /eo-loop,哪个会话就是总控。
前置条件
- 必须能找到
.eo-project.json。同目录存在.eo-project.local.json时顶层字段覆盖合并(local 优先)。找不到 → 报错退出,提示运行/eo-project-init - 线段涉及已有 change 时,定位其
eo-doc/changes/<NN>-<slug>/(口头引用按 ../eo-shared/conventions.md §2 经 INDEX 解析)
调度哲学(四步闭环)
① 圈线段:从用户话语确定三要素——入口节点、出口节点、收敛标准。v3 默认线段很短:
默认主路:change → implement → archive
信号命中:主路对应位置插入闸门(change 确认后插 change-review;implement 后插 test / review)
地图是 ../eo-shared/conventions.md §3 的状态机。三要素判不出的,先查偏好文件补缺省(见「经验沉淀」);仍缺 → 按封闭选择协议(../eo-shared/questioning.md §4)问一次,不追问第二轮。
入口是已确认的 change 序列(带「依赖 #N」标注,如 brainstorming 捕获出口确认后的产物)时:按依赖序串行推进(无标注 = 串行),逐个 change 走完对应 eo-* 节点(默认主路,信号命中照常插闸门);节点边界 = 观测点,按「可观测性」节口径汇报。
随手小改先过 trivial 闸:总控会话里用户随手提的修改,先按 ../eo-shared/granularity.md §2 判定——trivial → 总控直改(需起环境验证才派原 impl worker),commit 前缀按 conventions §2.5,不进状态机、不产工件;改动使活跃 change 的 AC / 文本与实际不符时,顺手就地精化文本。四判据任一不满足 → 回到正常圈段。
举例措辞判据:用户意图含「比如 / 之类 / 例如」= 形态未定稿——先安排探针对齐(change 确认)把形态钉下来再派实施节点,不得让例子直接当定稿进派发 prompt。
条件式 Execution Guard:圈段后若命中任一条件——长程(跨多轮或跨节点)、并行、无人值守、高风险(安全 / 权限 / 数据 / 不可逆动作)、存在开放未知——本线段启用 ../eo-shared/goal-contract.md,总控在每个节点派发前从现有真相源即时编译控制包。来源限于当前 change.md、报告、Git 基线与用户本轮授权;本轮授权只能收紧运行边界,若与已冻结的 Why / 范围 / AC 冲突,必须先走用户裁决与 change 回炉。控制包只存在于本轮派发上下文,不落盘、不造第二信源。未命中条件则沿用普通调度。
控制包只投影六项,不创造新要求:意图与出口 / 证据门(每项结论由哪个角色基于什么工件证明)/ 运行边界 / 取舍顺序(引 goal-contract)/ 未知权限(引 goal-contract Unknown 分流)/ 路由事实。
Unknown 的运行时动作(分类语义以 goal-contract 为唯一来源):
- A 类:核对确在权限包络内 → 允许 worker 先做后报
- B 类:worker 变更前发求裁决信号并暂停受影响分支;总控把同窗 B 类合并成一次封闭选择交用户
- C 类:worker 变更前立即停下,总控立即上交用户
- 证据未知:只允许一次有界探测(写清问题、预算、停止条件);仍拿不到 → fail-closed,结论只能「未验证 / 阻塞」,不得用 worker 自述补证
② 选基底:对线段上每个节点确定执行者与模型,三级优先:本次用户显式指定 > 偏好文件 > 探测缺省。偏好层与探测缺省均不静默生效:命中偏好条目或探测选定后,开跑前列出「节点 → 基底/模型」与依据问一次「按此跑?」;确认后收口照常回写偏好。运行时 ls 本 skill references/substrates/*.md 得到基底清单,读候选文件按其「探测」节确认可用。
③ 派发、路由与风险升级:按基底文件「派发」节把节点交出去。worker 完成后,默认只读取决定下一步所需的路由事实:frontmatter 当前状态、预期工件指针、报告结论、未决清单。这是路由职责,不是对 worker 内容再做一轮核查;正常路径不打开完整 diff、不重跑节点命令。
无风险即推进:路由事实齐备且不冲突 → 直接进下一节点。交付来自其他 agent、worker 首次参与、换基底、普通节点交接,均不是风险信号;不得因此抽查或信任分层。
只有出现下列可指认的风险信号才升级核查;主观不信任不构成信号:
- frontmatter、预期工件、报告结论、worker 完成声明互相冲突
- 推进所必需的工件或字段缺失、不可解析,或存在未提交交付改动
- 已有可观察证据显示节点越过角色权限或约定文件边界
- AC、安全、权限、数据或不可逆动作发生本轮计划外变化
- worker 主动上报 Unknown B / C、证据未知、阻塞或决策门
- 同一交付被打回后仍重复出现同类异常
升级后只处理触发信号对应的范围:状态/工件缺陷打回原 worker;需要实质判断时派对应有权节点;产品/架构分歧、范围变更、AC 豁免、熔断等超总控权限事项停下上交用户。同一节点打回 2 次仍不合格 → 升级为卡点问用户。总控不得亲自实施、改测试、兼任审查。
并行派发(判据与合流见 ../eo-shared/granularity.md §6):同一 change 的同层并行批(Batch 2a/2b)。纪律:
- 派发前先做文件集机械校验(两两不相交;不过 → 降级串行并一句话报告)
- 一并行 worker 一独立 worktree;同层全部收口后指派其一执行合并与合流 checkpoint
- 并行派发 >2 个 worker 前先报数量与预算,等用户点头
④ 收敛判定:对照收敛标准——出口节点达成 + 所有已产报告无未决阻塞项。未收敛走反馈回路:
- 报告有未决 P0/P1 或测试失败 → 原 impl worker 走 /eo-fix 循环内分支修复 → 回原复审方核销(增量,不重开全文)
- acceptance 打回 → implement 修复 → 有 review 闸门的回原 reviewer 核销
- 方案需实质修订 → eo-change 回炉
收敛即交付汇报:出口节点达成时,总控向用户发完整交付汇报——回复契约四条(../eo-shared/reply-contract.md)+ 证据面渲染(引 change 目录 evidence.md 与 frontmatter brief,引用不重建、不转述 worker 速报);出口是 archive 时,归档确认提问按 eo-archive 第一层口径与该汇报同条发出。线段收尾不得只有三行归档速报。
打地鼠信号与裁决门:同一 change 修复轮次 ≥2 且各轮失败触发位置互不相同(凭报告未决清单的位置列机械可判),或修复轮次 ≥3 → 停下向用户发封闭选择四选一:
- 全链审查(链路类缺陷缺省推荐)——原 impl worker 走 /eo-fix 深挖链路变体:枚举链上全部可死点、逐点配恢复证明,按死点矩阵批量修复
- 继续逐点修复——缺陷相互独立、非链路形态时
- 卡点检查——方向存疑,新鲜上下文做根因分类(/eo-fix 子流程)
- 回炉——方案本身要改
总控不代答、不以任何形式默认继续逐点修复。
节点清单
| 节点 | 消费 | 产出 | 边界 |
|---|---|---|---|
| eo-change | 意图 / 回炉反馈 | change.md(draft → confirmed 经用户确认) | 含风险信号播报与回炉子流程 |
| eo-change-review(可选闸门) | draft/confirmed 的 change.md | change-review.md | 信号命中或点名才派 |
| eo-implement | confirmed 的 change.md | 业务代码 + 测试 + AC 勾选(implementing) | 反馈修复归 /eo-fix 循环内分支 |
| eo-test(可选闸门) | implementing 后的代码 | 测试补缺 + test.md | 严禁改业务代码 |
| eo-review(可选闸门) | implementing 后的代码 | review.md(通过 → reviewed) | 代码级审查 |
| eo-archive | implementing / reviewed | archived(不可逆) | 四问核对门 |
执行基底(可插拔)
基底 = 「把一个节点交给谁执行」的载体。一基底一文件,放 references/substrates/,增减基底 = 加删文件。每个基底文件必须含五节(照 references/substrates/_template.md):探测 / 派发 / 等待与观测 / 回收 / 已知陷阱。「已知陷阱」节只放出厂陷阱——运行时新学到的坑记进偏好文件的「已知陷阱」节(~/.eo-skills/loop/preferences/,条目前缀 [<基底名>],跨项目写 _global.md),读基底文件时一并读。
初始三基底与优先倾向(被 ② 的三级优先覆盖):
| 调用形态 | 倾向基底 |
|---|---|
| 总控是 Claude Code,执行者也是 Claude | claude-subagent |
| 总控运行在 Codex 侧 | codex-subagent |
| 节点要跨 agent 运行 | orca-orchestration |
交互式硬约束(全基底通用):节点派发一律走交互式通道——总控会话内 subagent,或 orca 交互终端 + dispatch task。严禁 codex exec、claude -p 等一次性非交互式调用承载节点:纯黑盒、无会话复用、无求裁决通道。
派发 prompt 纪律:写目标、不写步骤——只给节点 skill 名、change 目录路径、本轮收敛标准、必要输入;命中 Execution Guard 时再附即时控制包;不复述下游流程;不要求 worker 中途回报进度。Unknown 上报:仅 A 类可先斩后奏随交付记录;B / C 类须变更前求裁决。
worker 复用纪律:一个 change 的 loop 内,worker 按角色一次创建、跨轮次复用——修复回原 impl worker,核销回原复审方(增量核销依赖其上下文)。三条边界:① 复用边界 = 单个 change——收敛组切换到下一 change 时按角色一律重建;上一 change 的 worker 上下文只属于该 change 的方案与代码真相,跨 change 续用即视为上下文污染;闸门结论(如 change-review)不可跨 change 继承,每个 change 独立过信号判定(granularity §5)。② 跨角色必须隔离(review / test 绝不复用 impl worker——独立性是审查的价值)。③ 同 change 内重建仅当换执行者/模型、上下文已污染、或 worker 不可达。
可观测性:窗口化等待 + 主动观测
进度是总控查出来的,不是 worker 报上来的:worker 除完成/求裁决信号外零回报义务。总控在窗口内主动读证据——终端输出、change.md 勾选、报告增量、git log——手段见各基底文件「等待与观测」节。
一切等待必须窗口化,单窗 ≤10 分钟。窗口到期或观测点(节点边界),无论有无进展,向用户发进度报告并追加到 tmp/eo/loop/<slug>/journal.md:
• <HH:MM> <本窗口事件标题>
<是否需要用户裁决——无则明说「没有需要你裁决的事项」;brief 级摘要:原样引用当前 change 的 brief,未写则明说「brief 未写」>
<实质摘要:按主题归组的要点,不是操作流水账>
- 派发:<task / dispatch 凭据或 worker 标识>
- owner:<基底 + 模型>
- 当前规则:<本轮循环策略一句>
下一次固定进度报告约 <HH:MM +10min>。
brief 级摘要取 change.md frontmatter 的 brief(写法与生产时机见 ../eo-shared/summary.md):总控只引用、不代写不改写;窗口中途 brief 无变化时一句带过。
journal 属 tmp/eo 命名空间(conventions §1):可丢弃、不作信源。
经验沉淀(调度偏好)
位置 ~/.eo-skills/loop/preferences/:_global.md(跨项目)+ <项目短名>.md(覆盖全局同名条目);格式见 references/preferences-format.md。
- 读:② 选基底时第二优先级——列出命中条目请用户确认后生效;① 圈线段判不出时查「习惯线段」节
- 写:收口时回写本次实际生效的「节点 → 基底/模型」映射,缺省写进
<项目短名>.md;用户明示跨项目或同一映射已在 ≥2 个项目文件出现时才写_global.md。用户当场纠偏 → 立即写入 - 性质:提示而非保证——按偏好调度失败 → 回退探测缺省,并把失败记进该文件陷阱节
- 基底操作层的坑(注入被吞、handle 漂移这类)也记进偏好文件的「已知陷阱」节:条目前缀
[<基底名>],跨项目通用写_global.md、项目特有写<项目短名>.md;基底文件的「已知陷阱」节只放出厂内容,不写
事实说明
- codex 的 skill 前缀是
$不是/;模型与 effort 是启动参数,中途不可切换 - worker 的完成声明 ≠ 状态推进;状态真相只在 frontmatter 与报告
- 回退边(status 置回)由产出该结果的 skill 当场执行(conventions §3),总控不代写 status
- review 结果不授权总控动手修——修复一律派回原 impl worker 走 /eo-fix 循环内分支
- 并行派发 >2 个 worker 前,先报数量与预算,等用户点头
关键约束
| 约束 | 说明 |
|---|---|
| 三不做 | 总控不写码、不改 change 实质、不复述下游流程 |
| 严禁非交互派发 | 节点执行必须走交互式通道;一次性调用全面禁止 |
| 条件式控制包 | 仅长程 / 并行 / 无人值守 / 高风险 / 开放未知时即时编译;不落盘 |
| Unknown 权限 | 仅 A 类可先做后报;B / C 类变更前进决策门;证据未知有界探测后 fail-closed |
| 风险触发式核查 | 正常交付只消费路由事实并推进;仅有客观风险信号时针对异常范围升级 |
| worker 按角色复用 | 同角色跨轮次复用;跨角色隔离;跨 change 必重建、闸门结论不继承;同 change 内换模型 / 污染 / 不可达才重建 |
| 无状态 | 不落自有状态文件;中断恢复 = 重读 frontmatter |
| 熔断只消费 | 打地鼠/轮次到限即停、按协议问用户,绝不无限循环 |
| 汇报硬窗口 | 任何等待 ≤10 分钟必有一次进度报告;报告首要回答「需不需要你裁决」 |
| 收尾必发交付汇报 | 线段收敛 / 归档确认前,交付汇报(回复契约四条 + 证据面渲染)与确认提问同条发出,不得只有三行速报 |
| worker 零回报 | 进度由总控主动观测;派发 prompt 不得附加中途回报要求 |
| 基底即文件 | 新基底照 _template.md 建文件即生效;禁止把基底细节写回本文件 |
| 一次一收敛组 | 缺省逐 change 收敛;带「依赖 #N」标注的 change 序列按依赖序串行推进 |
Files (eo-skills)
-
references
-
substrates
-
claude-subagent.md 3.1 KB
--- substrate: claude-subagent 适用: 总控是 Claude Code,节点执行者也是 Claude(自调自) updated: 2026-07-28 --- ## 探测 Claude Code 会话内 Agent 工具原生可用,恒成立。模型按偏好或用户指定通过 model 参数传入(不指定则继承会话模型)。 ## 派发 - 一**角色**一后台子 agent(起名如 `impl-<slug>` / `review-<slug>`,便于 SendMessage 寻址),跨轮次复用。首派 prompt 给四样:加载哪个 eo-* skill、change 目录路径、本轮收敛标准、必要输入(如 review 反馈路径);命中 SKILL.md 的条件式 Execution Guard 时再附其即时控制包,不落独立文件 - 控制包要求 worker 仅把 A 类选择随交付记录;命中 B / C 类时在变更前停止受影响分支,通过 SendMessage 向总控发结构化求裁决信号(类别、分叉、影响、推荐),等总控回灌裁决后再续原 agent - **轮次复用 = SendMessage 发回原 agent**:修复轮、增量复审、打回重做、追问,一律续原上下文,不重开新 agent;重建时机见 SKILL.md 复用纪律 - 相互独立的节点(如同一基线上的 test 与 review)才并行;并行 >2 个先报预算等点头 - 并行组 worker(同层批 / 并行收敛组,SKILL.md ③):spawn 时启用 worktree 隔离(Agent 工具 `isolation: worktree`),一 worker 一现场;合流 checkpoint 按 granularity §6 指派执行 ## 等待与观测 后台子 agent 完成会自动唤醒总控(harness 级信号,无需 worker 配合),这是主信号。10 分钟兜底窗口:等待期挂起必须带超时(定时唤醒 / Monitor 均可)。窗口内观测**只读产物不打扰 worker**:change.md 勾选、review/test 台账增量、git log——不 SendMessage 问「进展如何」(打断即污染 worker 上下文)。到点发进度报告再续等。 ## 回收 完成通知只用于唤醒总控和定位产物。正常路径按 SKILL.md ③ 读取 frontmatter 当前状态、预期工件指针、当前基线与最新结构化处置后直接路由,不打开完整 diff、不抽查或复做节点内容。只有这些事实缺失 / 冲突、出现可观察越界、计划外判据变化、Unknown B / C 或证据探测失败等客观风险信号时,才针对对应异常升级;需要实质判断就派 eo-review / eo-test,不由总控补做节点工作。 ## 已知陷阱 > 本节只放出厂陷阱;运行时陷阱记在 `~/.eo-skills/loop/preferences/` 的「已知陷阱」节(前缀 `[claude-subagent]`),一并读。 - (2026-07-19) 子 agent 上下文独立:prompt 里不给 change 路径它就会自己猜——路径必给 - (2026-07-19) 用词锚定:prompt 写「看看 / 检查一下」会弱化执行强度——用节点本义动词(审查 / 实施 / 验证) - (2026-07-24) Agent 工具偶发 teammate pane 创建超时(「Timed out waiting for the Orca runtime / tmux split pane handle」,orca status 却显示 ready、CLI 建终端正常):重试 2 次仍失败即切换基底——orca 终端跑 `claude --model <id> --dangerously-skip-permissions`,走 orca-orchestration 的 task/dispatch 流程,模型钉住不变 -
codex-subagent.md 2.3 KB
--- substrate: codex-subagent 适用: 总控运行在 Codex CLI 侧(eo-loop 被 Codex 加载执行) updated: 2026-07-28 --- ## 探测 运行环境即 Codex(`$` 前缀 skill 可用)即成立。总控在 Claude 侧而节点要 codex 模型的**跨侧**场景不属本基底——走 orca-orchestration。 ## 派发 - skill 前缀是 **`$`**:`$eo-review <change 路径>`。任何时候不能写成 `/` - prompt 遵守 SKILL.md 的最小输入;仅命中条件式 Execution Guard 时附即时控制包,不将控制包写成 `PROGRESS.md` 或其他状态文件 - 控制包要求仅 A 类随交付记录;命中 B / C 类时在变更前停止受影响工作,通过当前 Codex runtime 的 agent 消息能力发结构化求裁决信号;无可用消息能力则停止节点并以 `DECISION GATE` 结果返回,不得先采假设实施 - 子 agent / spawn 能力按 Codex 当前版本探测使用;不可用则降级为本会话顺序执行节点 - 模型与 effort 是启动参数、中途不可切——需要不同 effort 的节点分开派发 - **同角色跨轮次复用同一子会话**续发下一轮;机制上续不了则同参数重开,prompt 附上一轮报告路径作上下文补偿 - 并行组 worker(同层批 / 并行收敛组,SKILL.md ③):一 worker 一独立现场(`git worktree add`);无法隔离现场则不并行,降级串行 ## 等待与观测 Codex 侧无完成自动唤醒时,总控主动轮询**产物**(frontmatter、台账、git log),间隔 ≥5 分钟;不向 worker 发消息催报。单窗 ≤10 分钟,到点发进度报告再续等。 ## 回收 完成消息只用于唤醒总控和定位产物。正常路径按 SKILL.md ③ 读取 frontmatter 当前状态、预期工件指针、当前基线与最新结构化处置后直接路由,不打开完整 diff、不抽查或复做节点内容。只有这些事实缺失 / 冲突、出现可观察越界、计划外判据变化、Unknown B / C 或证据探测后仍未知等客观风险信号时,才针对对应异常升级;需要实质判断就派 eo-review / eo-test,总控不兼任实施、测试、审查。 ## 已知陷阱 > 本节只放出厂陷阱;运行时陷阱记在 `~/.eo-skills/loop/preferences/` 的「已知陷阱」节(前缀 `[codex-subagent]`),一并读。 - `$` / `/` 前缀混写是派发高频错误,派发前自查一遍 -
orca-orchestration.md 8.4 KB
--- substrate: orca-orchestration 适用: 节点要跨 agent 运行(执行者与总控不是同一 agent/模型栈),且需要总控监督 updated: 2026-07-28 --- ## 探测 1. **先加载 `orchestration` skill 本体**(Claude 侧用 Skill 工具调 `orchestration`,codex 侧 `$orchestration`),加载完成前不得敲任何 `orca orchestration` 命令。本文件不是命令手册,只是 eo-loop 场景的增补与陷阱清单——命令契约、生命周期语义(worker_done 自动完结、handle 解析、preamble 规则)一律以 skill 本体为准,两边冲突时信 skill 并回修本文件。 2. `orca status --json` 显示 runtime 运行中,且 orchestration 实验特性已开启。失败 → 向用户提示启动 Orca 或换基底。 ## 派发 1. **总控身份钉桩**(每次派发前、每个等待窗开始时重做):按自己的 `$ORCA_PANE_KEY`(= `tabId:leafId`,跨 Orca 重启稳定)从 terminal list 解析自己 pane 的**当前** handle: ```sh COORD=$(orca terminal list --json | jq -r --arg pk "$ORCA_PANE_KEY" '.result.terminals[] | select((.tabId + ":" + .leafId) == $pk) | .handle') ``` 后续收发一律显式带 `$COORD`,**禁用隐式身份解析**(省略 `--from`/`--terminal` 时 CLI 按 `$ORCA_TERMINAL_HANDLE` 环境变量解析——那是会话启动时烙死的,Orca 重启后即过期,见陷阱节) 2. `orca orchestration task-create --spec "<节点目标 + change 路径 + 收敛标准>"`;命中 SKILL.md 的条件式 Execution Guard 时,把即时控制包一并放进 spec,不额外落盘,并要求 worker 仅随交付记录 A 类、B / C 类在变更前发 `decision_gate` 后暂停 3. 建 worker 终端:implement / test / review 依赖当前工作区状态,用 `orca terminal create --worktree active --command "<agent 启动命令>"`;自定义模型/effort 写进启动命令(如 `codex --dangerously-bypass-approvals-and-sandbox -m <model> -c model_reasoning_effort="high"`——codex 不带 bypass 会每步卡权限审批) 4. `orca terminal wait --terminal <handle> --for tui-idle --timeout-ms 60000` 就绪后 `orca orchestration dispatch --task <id> --to <handle> --from $COORD --inject` 5. **轮次复用**:`worker_done` 后 worker 停在 agent 提示符,正好接下一轮——同一 change 内的同角色新任务 `task-create` 后 `dispatch --to <同一 handle> --inject` 续用同一终端,不重建;收敛组切换到下一 change 时按 SKILL.md 复用纪律一律重建终端重派。模型/effort 是启动参数,复用即锁定该组合;要换模型才重建终端(handle 报 stale 时 `terminal list` 重解析后仍按原终端续用) 6. **并行组 worker**(同层批 / 并行收敛组,SKILL.md ③):一 worker 一独立 Orca child worktree 起终端,**不得共用 active 工作区**;合流 checkpoint 按 granularity §6 指派其一执行合并 ## 等待与观测 每窗开始先重做「派发」第 1 步的身份钉桩(Orca 若重启过,handle 已漂移),然后 `orca orchestration check --wait --terminal $COORD --types worker_done,escalation,decision_gate --timeout-ms 600000`——只等**必要信号**(完成 / 升级 / 求裁决),**不要求 worker 发 heartbeat**(dispatch 注入的 preamble 之外不追加任何回报要求,worker 专注任务)。窗口超时不是 worker 失败:总控主动观测——`terminal read` 看输出、`tui-idle` 探活、读台账增量——活着就发进度报告进下一窗。禁止 sleep 轮询。收到 `decision_gate` / `ask` 用 `reply` 应答后继续等。 ## 回收 `worker_done` 只用于唤醒总控和定位产物。正常路径按 SKILL.md ③ 读取 frontmatter 当前状态、预期工件指针、当前基线与最新结构化处置后直接路由,不打开完整 diff、不抽查或复做节点内容。只有这些事实缺失 / 冲突、出现可观察越界、计划外判据变化、Unknown B / C 或证据探测失败等客观风险信号时,才针对对应异常升级;review-only 的 `worker_done` 不授权总控动手修,修复派回原 impl worker 走 /eo-fix 循环内分支,需要实质判断则按 owner 规则派 eo-review / eo-test。 ## 已知陷阱 > 本节只放出厂陷阱;运行时陷阱记在 `~/.eo-skills/loop/preferences/` 的「已知陷阱」节(前缀 `[orca-orchestration]`),一并读。 - (2026-07-19) 终端有输出 ≠ 完成,不要据此杀 worker 重派;长任务 15-60 分钟是常态 - (2026-07-19) terminal handle 重启后会变,报 `terminal_handle_stale` 时用 `terminal list` 重解析;绝不用 handle 对比判归属 - (2026-07-19) 同一 task 连败 3 次会被 runtime 熔断置 failed——第 2 次失败就该停下向用户报卡点,别撞到熔断 - (2026-07-25) **claude TUI worker 的注入/提交竞态**(codex 弹窗吞注入的姊妹陷阱):dispatch --inject 后立刻补回车会**跑在注入文本前面**——空回车先落、任务文本后到,文本干坐输入框永不执行;有时注入整体被吞(框内空无一物)。标准姿势:dispatch 后先 `terminal read` 验证任务文本**已在框内**再 `send --enter`;框内为空 = 注入被吞,用 task-list 取 spec 原文 `terminal send --text "<spec>" --enter` 补投(附 worker_done 上报命令)。另:claude worker 终端在完成一轮 worker_done 后常变 terminal_not_writable——轮次复用前先探测,不可写即重建终端重派 - (2026-07-24) codex 终端刚创建即 dispatch --inject,注入会被启动期的目录信任弹窗吞掉(dispatch 状态仍显示成功):必须先 `terminal wait --for tui-idle` **满足**(satisfied:true)再 dispatch;已被吞时任务卡 dispatched 态无法重派,救法 = `terminal send --enter` 手动补投任务文本(附 worker_done 上报命令,--to 填总控终端 handle) - (2026-07-24) worker_done 未必自动完结任务:skill 本体口径是**有效** worker_done 会自动置 completed;总控收信身份脱节时(见下条)runtime 关联不上就不会。同终端派下一轮前先 `task-list` 核对上轮状态,仍卡 dispatched 才手动 `task-update --id <上轮task> --status completed` 兜底(合法状态枚举:pending/ready/dispatched/completed/failed/blocked,没有 done) - (2026-07-24) **隐式身份解析的真实机制与失效条件**(受控实验实证,修正本条早先「每次 Bash 调用都不可信」的错误结论):省略 `--from`/`--terminal` 时 CLI 按 `$ORCA_TERMINAL_HANDLE` 环境变量解析身份——该值会话启动时烙死、同会话所有 Bash 子进程恒定(解析是**确定性**的,不随调用漂移),Orca 重启后 pane 换发新 handle 而 env 不更新,即过期。runtime 对死 handle 的收发**静默成功**(check 返回空、send 照收,零报错),过期后自动解析 = 稳定守着死信箱瞎等。最危险的是**混用**:dispatch 按 terminal list 显式解析活 handle、check 靠 env 自动解析死 handle,收发指向两个信箱——worker 回包完好排队、任务正常自动完结,总控却永远收不到。pull 模型信件永久排队:身份钉对后迟到的 check 也能全量补收,「监听没在场所以错过」不成立、唯一致死因就是身份不对。防治即「派发」第 1 步身份钉桩;`inbox`(跨收件人非消费)兜底审计;task-list+git 工件为完成判据的持久真相。另:check 消费型语义,同一时刻只留一个监听,起新先杀旧。 - (2026-08-07) **`reply --id` 对 `decision_gate` 类型消息回注可能不达**:codex worker 的 decision_gate 等待中,总控 `reply --id <gate_msg>` 返回 ok 但 worker 两轮超时未收到(最终 escalation)。可靠回注通道 = `send --to dispatch:<dispatch_id>`(worker 下次 check 必收)+ 并行 `reply` escalation 线程留痕。低层 `dispatch --inject` 创建的 ctx_* dispatch 不被 `worker-show`/`worker-release` 识别(dispatch_not_found),清理用 `terminal close`。 - (2026-08-08) **worker-start 的 receipt 不可信为注入凭证**:worker-start 返回 `stage: input_accepted` 但注入文本撞上 codex 启动期 MCP 引导刷屏(尤其 MCP 启动失败重试时)仍会被吞,输入框实际为空。dispatch/worker-start 后必须 `terminal read` 亲验任务文本在框内或已进入 transcript;被吞救法 = `terminal send --text "<spec 原文 + worker_done 上报命令(task-id/dispatch-id)>" --enter` 补投,补投后再次 read 验证 -
_template.md 1.7 KB
--- substrate: <kebab-name> 适用: <一句话:什么调用形态下选它> updated: <YYYY-MM-DD> --- ## 探测 <确认本基底当前可用的命令或条件;不可用即跳过本基底,换下一候选。 若本基底包装的是既有 skill(有独立 SKILL.md),探测第一步必须是**加载该 skill 本体**——基底文件只写 eo-loop 场景增补与陷阱,不复制命令契约,冲突时以 skill 本体为准> ## 派发 <把一个 eo 节点交给它执行的具体方式:调用入口、模型/effort 如何指定、prompt 必备要素(遵守 SKILL.md 的「写目标不写步骤」纪律;命中条件式 Execution Guard 时附总控从既有 SoT 即时编译的控制包,不另行落盘;明确本基底怎样传递 Unknown 求裁决信号——仅 A 类可随交付记录,B / C 类必须在变更前停下并求裁决)> ## 等待与观测 <如何窗口化等待(单窗 ≤10 分钟);总控如何**主动**观测进度与探活(读什么产物 / 终端 / 台账)——不得要求 worker 中途回报;窗口到期无完成信号时的动作> ## 回收 <结果如何取回;正常路径从哪里读取推进所需的路由事实(frontmatter / 工件指针 / 基线 / 结构化处置),并明确不抽查、不复做节点内容。列出本基底能观察到的客观风险信号及针对性升级方式;命中 Unknown B / C、证据有界探测失败或路由事实缺失 / 冲突时只处理对应异常,不让总控兼任实施、测试或审查> ## 已知陷阱 <(YYYY-MM-DD) 已验证的坑,一条一行。本节只放出厂陷阱;运行时新学到的坑记进 `~/.eo-skills/loop/preferences/` 的「已知陷阱」节(条目前缀 `[<基底名>]`),读本节时一并读>
-
-
preferences-format.md 1.8 KB
# 调度偏好文件格式(经验沉淀) 位置 `~/.eo-skills/loop/preferences/`(不在仓库内——个人习惯不随 skill 分发,重装 skill 不丢经验): - `_global.md` —— 跨项目习惯 - `<项目短名>.md` —— 覆盖全局同名条目。项目短名取 `.eo-project.json` 的项目名,无则 git 仓库目录名 ## 文件格式 ```markdown --- scope: global | <项目短名> updated: YYYY-MM-DD --- ## 节点偏好 - <节点> → <基底> <模型/effort>(YYYY-MM-DD 起;依据:连续 N 次采用 / 用户明示原话) ## 习惯线段 - <入口 → 出口,收敛标准>(YYYY-MM-DD 起) ## 已知陷阱 - (YYYY-MM-DD) [<基底名>] <坑的记录:调度偏好失败、基底操作坑(注入被吞 / handle 漂移等);什么组合在什么场景失败、回退到了什么> ``` ## 读写纪律(与 web-access 站点经验同款) - **消费必确认**:偏好只用于填补用户本次未指定的空位,且开跑前必须列出命中条目请用户确认(封闭选择:按偏好跑 / 逐项调整),不静默套用;调整结果按纠偏规则回写项目文件 - **回写缺省进 `<项目短名>.md`**(调度习惯首先是项目属性);`_global.md` 只收用户明示跨项目的条目,或已在 ≥2 个项目文件重复出现的映射(写入时注明来源项目) - 条目是**可能有效的提示,不是保证**:按偏好调度失败 → 回退探测缺省,并把失败记入陷阱节 - 只写两类来源:用户明示(「以后 review 都用 codex」→ 立即写,附原话);隐式惯性(收口时发现连续 ≥2 次同一映射 → 写入并注明次数)。单次偶然不写 - 每条带日期;更新同一条目刷日期、不新增重复行 - 用户本次显式指定永远覆盖偏好,且不反写偏好(除非用户说「以后都这样」)
-
-
SKILL.md 15.7 KB
--- name: eo-loop description: | eo 流程总控:按用户意图圈一段(入口节点 → 出口节点 → 收敛标准),把 eo-change / eo-implement / eo-archive 及可选闸门(eo-change-review / eo-test / eo-review)派发到可插拔执行基底上推进至收敛,窗口化汇报进度。触发:eo-loop / 串起来跑 / 循环推进到收敛 / 总控调度 / /eo-loop。 NOT FOR: 单点动作(直接调对应 eo-* skill);派出去不再监督的完全交接(orca-cli full handoff);bug 口喷(/eo-fix)。 --- # eo-loop — eo 流程总控 总控只做五件事:**识别、派发、路由、循环、汇报**。三不做:不亲自写代码、不改 change 实质内容、不复述下游流程(节点内部怎么做由各 eo-* skill 自治)。 **总控无状态**:流程真相只在 change.md frontmatter 与报告文件里。会话断了,任何 agent 重读 frontmatter 即可从当前节点继续。 **总控在哪**:用户在哪个会话喊 /eo-loop,哪个会话就是总控。 ## 前置条件 - **必须能找到 `.eo-project.json`**。同目录存在 `.eo-project.local.json` 时顶层字段覆盖合并(local 优先)。找不到 → 报错退出,提示运行 `/eo-project-init` - 线段涉及已有 change 时,定位其 `eo-doc/changes/<NN>-<slug>/`(口头引用按 [../eo-shared/conventions.md](../eo-shared/conventions.md) §2 经 INDEX 解析) ## 调度哲学(四步闭环) **① 圈线段**:从用户话语确定三要素——**入口节点、出口节点、收敛标准**。v3 默认线段很短: ``` 默认主路:change → implement → archive 信号命中:主路对应位置插入闸门(change 确认后插 change-review;implement 后插 test / review) ``` 地图是 [../eo-shared/conventions.md](../eo-shared/conventions.md) §3 的状态机。三要素判不出的,先查偏好文件补缺省(见「经验沉淀」);仍缺 → 按封闭选择协议([../eo-shared/questioning.md](../eo-shared/questioning.md) §4)问一次,不追问第二轮。 **入口是已确认的 change 序列**(带「依赖 #N」标注,如 brainstorming 捕获出口确认后的产物)时:按依赖序串行推进(无标注 = 串行),逐个 change 走完对应 eo-* 节点(默认主路,信号命中照常插闸门);节点边界 = 观测点,按「可观测性」节口径汇报。 **随手小改先过 trivial 闸**:总控会话里用户随手提的修改,先按 [../eo-shared/granularity.md](../eo-shared/granularity.md) §2 判定——trivial → 总控直改(需起环境验证才派原 impl worker),commit 前缀按 conventions §2.5,不进状态机、不产工件;改动使活跃 change 的 AC / 文本与实际不符时,顺手就地精化文本。四判据任一不满足 → 回到正常圈段。 **举例措辞判据**:用户意图含「比如 / 之类 / 例如」= 形态未定稿——先安排探针对齐(change 确认)把形态钉下来再派实施节点,不得让例子直接当定稿进派发 prompt。 **条件式 Execution Guard**:圈段后若命中任一条件——**长程**(跨多轮或跨节点)、**并行**、**无人值守**、**高风险**(安全 / 权限 / 数据 / 不可逆动作)、存在**开放未知**——本线段启用 [../eo-shared/goal-contract.md](../eo-shared/goal-contract.md),总控在**每个节点派发前**从现有真相源即时编译控制包。来源限于当前 change.md、报告、Git 基线与用户本轮授权;本轮授权只能收紧运行边界,若与已冻结的 Why / 范围 / AC 冲突,必须先走用户裁决与 change 回炉。控制包只存在于本轮派发上下文,不落盘、不造第二信源。未命中条件则沿用普通调度。 控制包只投影六项,不创造新要求:**意图与出口 / 证据门(每项结论由哪个角色基于什么工件证明)/ 运行边界 / 取舍顺序(引 goal-contract)/ 未知权限(引 goal-contract Unknown 分流)/ 路由事实**。 Unknown 的运行时动作(分类语义以 goal-contract 为唯一来源): - **A 类**:核对确在权限包络内 → 允许 worker 先做后报 - **B 类**:worker 变更前发求裁决信号并暂停受影响分支;总控把同窗 B 类合并成一次封闭选择交用户 - **C 类**:worker 变更前立即停下,总控立即上交用户 - **证据未知**:只允许一次有界探测(写清问题、预算、停止条件);仍拿不到 → fail-closed,结论只能「未验证 / 阻塞」,不得用 worker 自述补证 **② 选基底**:对线段上每个节点确定执行者与模型,三级优先:**本次用户显式指定 > 偏好文件 > 探测缺省**。偏好层与探测缺省均**不静默生效**:命中偏好条目或探测选定后,开跑前列出「节点 → 基底/模型」与依据问一次「按此跑?」;确认后收口照常回写偏好。运行时 `ls` 本 skill `references/substrates/*.md` 得到基底清单,读候选文件按其「探测」节确认可用。 **③ 派发、路由与风险升级**:按基底文件「派发」节把节点交出去。worker 完成后,默认只读取决定下一步所需的**路由事实**:frontmatter 当前状态、预期工件指针、报告结论、未决清单。这是路由职责,不是对 worker 内容再做一轮核查;正常路径不打开完整 diff、不重跑节点命令。 **无风险即推进**:路由事实齐备且不冲突 → 直接进下一节点。交付来自其他 agent、worker 首次参与、换基底、普通节点交接,均**不是风险信号**;不得因此抽查或信任分层。 只有出现下列**可指认的风险信号**才升级核查;主观不信任不构成信号: - frontmatter、预期工件、报告结论、worker 完成声明互相冲突 - 推进所必需的工件或字段缺失、不可解析,或存在未提交交付改动 - 已有可观察证据显示节点越过角色权限或约定文件边界 - AC、安全、权限、数据或不可逆动作发生本轮计划外变化 - worker 主动上报 Unknown B / C、证据未知、阻塞或决策门 - 同一交付被打回后仍重复出现同类异常 升级后只处理触发信号对应的范围:状态/工件缺陷打回原 worker;需要实质判断时派对应有权节点;产品/架构分歧、范围变更、AC 豁免、熔断等超总控权限事项停下上交用户。同一节点打回 2 次仍不合格 → 升级为卡点问用户。总控不得亲自实施、改测试、兼任审查。 **并行派发**(判据与合流见 [../eo-shared/granularity.md](../eo-shared/granularity.md) §6):同一 change 的同层并行批(Batch 2a/2b)。纪律: - 派发前先做**文件集机械校验**(两两不相交;不过 → 降级串行并一句话报告) - 一并行 worker 一**独立 worktree**;同层全部收口后指派其一执行合并与合流 checkpoint - 并行派发 >2 个 worker 前先报数量与预算,等用户点头 **④ 收敛判定**:对照收敛标准——出口节点达成 + 所有已产报告无未决阻塞项。未收敛走反馈回路: - 报告有未决 P0/P1 或测试失败 → 原 impl worker 走 /eo-fix 循环内分支修复 → 回**原**复审方核销(增量,不重开全文) - acceptance 打回 → implement 修复 → 有 review 闸门的回原 reviewer 核销 - 方案需实质修订 → eo-change 回炉 **收敛即交付汇报**:出口节点达成时,总控向用户发**完整交付汇报**——回复契约四条([../eo-shared/reply-contract.md](../eo-shared/reply-contract.md))+ 证据面渲染(引 change 目录 `evidence.md` 与 frontmatter `brief`,引用不重建、不转述 worker 速报);出口是 archive 时,归档确认提问按 eo-archive 第一层口径与该汇报同条发出。线段收尾不得只有三行归档速报。 **打地鼠信号与裁决门**:同一 change 修复轮次 ≥2 且各轮**失败触发位置互不相同**(凭报告未决清单的位置列机械可判),或修复轮次 ≥3 → 停下向用户发封闭选择四选一: a) **全链审查**(链路类缺陷缺省推荐)——原 impl worker 走 /eo-fix 深挖链路变体:枚举链上全部可死点、逐点配恢复证明,按死点矩阵批量修复 b) **继续逐点修复**——缺陷相互独立、非链路形态时 c) **卡点检查**——方向存疑,新鲜上下文做根因分类(/eo-fix 子流程) d) **回炉**——方案本身要改 总控不代答、不以任何形式默认继续逐点修复。 ## 节点清单 | 节点 | 消费 | 产出 | 边界 | |------|------|------|------| | eo-change | 意图 / 回炉反馈 | change.md(draft → confirmed 经用户确认) | 含风险信号播报与回炉子流程 | | eo-change-review(可选闸门) | draft/confirmed 的 change.md | change-review.md | 信号命中或点名才派 | | eo-implement | confirmed 的 change.md | 业务代码 + 测试 + AC 勾选(implementing) | 反馈修复归 /eo-fix 循环内分支 | | eo-test(可选闸门) | implementing 后的代码 | 测试补缺 + test.md | 严禁改业务代码 | | eo-review(可选闸门) | implementing 后的代码 | review.md(通过 → reviewed) | 代码级审查 | | eo-archive | implementing / reviewed | archived(不可逆) | 四问核对门 | ## 执行基底(可插拔) 基底 = 「把一个节点交给谁执行」的载体。一基底一文件,放 `references/substrates/`,增减基底 = 加删文件。每个基底文件必须含五节(照 `references/substrates/_template.md`):**探测 / 派发 / 等待与观测 / 回收 / 已知陷阱**。「已知陷阱」节只放出厂陷阱——运行时新学到的坑记进偏好文件的「已知陷阱」节(`~/.eo-skills/loop/preferences/`,条目前缀 `[<基底名>]`,跨项目写 `_global.md`),读基底文件时一并读。 初始三基底与优先倾向(被 ② 的三级优先覆盖): | 调用形态 | 倾向基底 | |----------|----------| | 总控是 Claude Code,执行者也是 Claude | claude-subagent | | 总控运行在 Codex 侧 | codex-subagent | | 节点要跨 agent 运行 | orca-orchestration | **交互式硬约束(全基底通用)**:节点派发一律走**交互式通道**——总控会话内 subagent,或 orca 交互终端 + dispatch task。**严禁 `codex exec`、`claude -p` 等一次性非交互式调用**承载节点:纯黑盒、无会话复用、无求裁决通道。 **派发 prompt 纪律**:写目标、不写步骤——只给节点 skill 名、change 目录路径、本轮收敛标准、必要输入;命中 Execution Guard 时再附即时控制包;不复述下游流程;不要求 worker 中途回报进度。**Unknown 上报**:仅 A 类可先斩后奏随交付记录;B / C 类须变更前求裁决。 **worker 复用纪律**:一个 change 的 loop 内,worker 按**角色**一次创建、跨轮次复用——修复回原 impl worker,核销回原复审方(增量核销依赖其上下文)。三条边界:① **复用边界 = 单个 change**——收敛组切换到下一 change 时按角色一律重建;上一 change 的 worker 上下文只属于该 change 的方案与代码真相,跨 change 续用即视为上下文污染;闸门结论(如 change-review)不可跨 change 继承,每个 change 独立过信号判定(granularity §5)。② **跨角色必须隔离**(review / test 绝不复用 impl worker——独立性是审查的价值)。③ 同 change 内重建仅当换执行者/模型、上下文已污染、或 worker 不可达。 ## 可观测性:窗口化等待 + 主动观测 **进度是总控查出来的,不是 worker 报上来的**:worker 除完成/求裁决信号外零回报义务。总控在窗口内主动读证据——终端输出、change.md 勾选、报告增量、git log——手段见各基底文件「等待与观测」节。 一切等待必须窗口化,单窗 ≤10 分钟。**窗口到期或观测点(节点边界),无论有无进展**,向用户发进度报告并追加到 `tmp/eo/loop/<slug>/journal.md`: ``` • <HH:MM> <本窗口事件标题> <是否需要用户裁决——无则明说「没有需要你裁决的事项」;brief 级摘要:原样引用当前 change 的 brief,未写则明说「brief 未写」> <实质摘要:按主题归组的要点,不是操作流水账> - 派发:<task / dispatch 凭据或 worker 标识> - owner:<基底 + 模型> - 当前规则:<本轮循环策略一句> 下一次固定进度报告约 <HH:MM +10min>。 ``` brief 级摘要取 change.md frontmatter 的 `brief`(写法与生产时机见 [../eo-shared/summary.md](../eo-shared/summary.md)):总控只引用、不代写不改写;窗口中途 brief 无变化时一句带过。 journal 属 tmp/eo 命名空间(conventions §1):可丢弃、不作信源。 ## 经验沉淀(调度偏好) 位置 `~/.eo-skills/loop/preferences/`:`_global.md`(跨项目)+ `<项目短名>.md`(覆盖全局同名条目);格式见 [references/preferences-format.md](references/preferences-format.md)。 - **读**:② 选基底时第二优先级——列出命中条目请用户确认后生效;① 圈线段判不出时查「习惯线段」节 - **写**:收口时回写本次实际生效的「节点 → 基底/模型」映射,**缺省写进 `<项目短名>.md`**;用户明示跨项目或同一映射已在 ≥2 个项目文件出现时才写 `_global.md`。用户当场纠偏 → 立即写入 - **性质**:提示而非保证——按偏好调度失败 → 回退探测缺省,并把失败记进该文件陷阱节 - **基底操作层的坑**(注入被吞、handle 漂移这类)也记进偏好文件的「已知陷阱」节:条目前缀 `[<基底名>]`,跨项目通用写 `_global.md`、项目特有写 `<项目短名>.md`;基底文件的「已知陷阱」节只放出厂内容,不写 ## 事实说明 - codex 的 skill 前缀是 **`$` 不是 `/`**;模型与 effort 是启动参数,中途不可切换 - worker 的完成声明 ≠ 状态推进;状态真相只在 frontmatter 与报告 - 回退边(status 置回)由产出该结果的 skill 当场执行(conventions §3),总控不代写 status - review 结果不授权总控动手修——修复一律派回原 impl worker 走 /eo-fix 循环内分支 - 并行派发 >2 个 worker 前,先报数量与预算,等用户点头 ## 关键约束 | 约束 | 说明 | |------|------| | 三不做 | 总控不写码、不改 change 实质、不复述下游流程 | | 严禁非交互派发 | 节点执行必须走交互式通道;一次性调用全面禁止 | | 条件式控制包 | 仅长程 / 并行 / 无人值守 / 高风险 / 开放未知时即时编译;不落盘 | | Unknown 权限 | 仅 A 类可先做后报;B / C 类变更前进决策门;证据未知有界探测后 fail-closed | | 风险触发式核查 | 正常交付只消费路由事实并推进;仅有客观风险信号时针对异常范围升级 | | worker 按角色复用 | 同角色跨轮次复用;跨角色隔离;跨 change 必重建、闸门结论不继承;同 change 内换模型 / 污染 / 不可达才重建 | | 无状态 | 不落自有状态文件;中断恢复 = 重读 frontmatter | | 熔断只消费 | 打地鼠/轮次到限即停、按协议问用户,绝不无限循环 | | 汇报硬窗口 | 任何等待 ≤10 分钟必有一次进度报告;报告首要回答「需不需要你裁决」 | | 收尾必发交付汇报 | 线段收敛 / 归档确认前,交付汇报(回复契约四条 + 证据面渲染)与确认提问同条发出,不得只有三行速报 | | worker 零回报 | 进度由总控主动观测;派发 prompt 不得附加中途回报要求 | | 基底即文件 | 新基底照 _template.md 建文件即生效;禁止把基底细节写回本文件 | | 一次一收敛组 | 缺省逐 change 收敛;带「依赖 #N」标注的 change 序列按依赖序串行推进 |
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.