myorch流程手册 使用手册 → GitHub English

myorch 流程手册

这本手册讲每个流程:做什么、什么时候用、每一步做什么、什么时候需要你。平台本身(服务、架构、命令、项目包、流程语法)在使用手册里。

每个流程一章。章里的输入表、步骤图和步骤明细都从 flows/*.yaml 生成,和 myorch expand、控制台「流程」看到的一样,所以不会和流程定义对不上。其余文字写在流程旁边的 flows/<流程>.md 里,英文版在 docs/en/flows/<流程>.md。改了流程或它的 .md 以后,重新生成(中英文手册一起生成):

uv run --with markdown python docs/workflows/build.py

所有项目共用一套流程

每个角色只有一个流程(flows/development.yaml、review.yaml 等),所有项目共用。项目之间的差别写在项目包 myorch-knowledge/<项目>/ 里,展开流程时生效,发起时不用选:

项目 flows.development prompts/ Jira
mdm(Cookbook,master-data-management) 默认值,加 takeaway: true core-ng 模板的 develop.md、review.md(Gradle 依赖、*-interface 契约) 有(MD)
blog(个人博客) reviewers: 1、max_rounds: 1、security: false、on_exhausted: accept develop.md、review.md(Jekyll、写作规范、误公开) 没有
myorch(平台自己) 默认值,加 incident: true develop.md(incident 原因分析、平台的设计检查、合并以后要做的事)、risk.md 没有

角色

角色 控制台里的任务 用途 对外写什么 流程
development 开发 从需求到推送分支:需求、实现、review、审批、推分支 审批通过后推送分支。不开 PR,不推 base 分支 development
review 评审 PR 评审一个已有的 PR,结论显示在控制台 不写。只读 PR review
postmortem 复盘 问题已经进了代码:找出引入它的改动和本该拦住的层,改进知识,生成评测案例 只改本地 myorch-knowledge postmortem
sweep 找 bug 找现有代码里的 bug,每次看一批文件,只出日报 不写 sweep
learn 学习 从历史运行里沉淀知识:改进 guide/、记录人做过的决定、加确定性检查 只改本地 myorch-knowledge learn
eval 评测 重放一个评测案例,给 reviewer 打分 不写 eval
onboard 接入项目 分析仓库、试跑检查,提出项目包的修改 只改本地 myorch-knowledge onboard

什么时候用哪个

情况 用
有一个需求要做 development
改动推上去了,自测发现问题,或者要在这次改动上再改 development,在原分支上接着改
有一个 PR 要看一眼 review
跑了几次以后,review 总报同类问题或总漏同类问题 learn
新接一个仓库,或者仓库结构变了 onboard
想定期找老代码里的 bug sweep,用 myorch schedule 每晚跑
改了 reviewer 的 prompt 或模型,想知道变好还是变差 eval
一个问题已经修好了,想知道当初为什么没拦住 postmortem(修 bug 本身用 development)
平台自己出了问题(任何项目的运行) myorch 项目的 development,带上 incident

发起一个运行

在哪里 怎么做
控制台 http://127.0.0.1:8800/ 顶栏「+ 新运行」:先选项目,再选任务(这个项目的每个流程一个按钮),填字段,第一条消息写请求
Slack /myorch 打开发起弹窗:先选项目,再列出这个项目的流程,字段和控制台的一样。运行开始以后,bot 在你的私信里给它开一个线程
本机 Claude Code 会话 用 channel 工具 start 发起,例如发现平台问题后发起 myorch 项目的 development。它发起的运行会推送到这个会话
命令行 uv run myorch run flows/<流程>.yaml --project <项目> -i 名字=值。命令参考见使用手册 · 5. 命令参考
定时 uv run myorch schedule add <名字> --flow <流程名,例如 sweep> --project <项目> --cron '…',例如每晚的 sweep、每周的 learn

你介入的地方

流程在下面几种地方停下来等你。控制台顶栏的「等你处理」和 uv run myorch list 都会列出来。Slack 线程里有同样的按钮。步骤图里琥珀色的卡片和「可能问你」标记就是这些地方。

什么时候 控制台 / Slack 命令行
agent 提问 在对话里回复。Slack 里点选项按钮,或在线程里直接回复 myorch reply <run> <步骤> "回答"
循环跑满了,问题还没解决 先看反思步骤的建议,再回复 1 再跑一轮、2 接受、3 终止 myorch reply <run> <循环> 1
挑选建议(learn、onboard、postmortem 等) 回复编号,例如 1,3、all、none myorch reply <run> choose "1,3"
审批 先看右栏「改动」页(diff、review 结论、风险判定),再点「批准」「提修改意见」(先在输入框写意见)或「驳回」。Slack 里是「批准」「要求修改」「驳回」三个按钮 myorch review <run> 看材料,然后 myorch approve、myorch changes 或 myorch reject
不想再跑了 取消 myorch cancel <run>
失败了,原因已经排除 「重新执行失败的步骤」,或在一个步骤上点「从这一步重新执行」。同一个运行接着跑,成功的步骤保留结果 myorch resume <run>

在原分支上接着改

用于 development 运行结束以后:自测发现了问题,或者要在这次改动的基础上再改。在控制台里打开那个运行,点「在这个分支上接着改」,第一条消息写这次要改什么。命令行用 -i from_run=<运行 ID>。

看懂步骤图

改流程

  1. 改 flows/<流程>.yaml 或片段。写法见使用手册 · 8. 写流程。
  2. uv run myorch expand flows/<流程>.yaml --project <项目> 看展开结果。
  3. 同步改 flows/<流程>.md 和 docs/en/flows/<流程>.md,重新生成这本手册。
  4. 跑一次 uv run pytest。worker 和控制台在 compose 里时,docker compose -f deploy/compose.yaml up -d --build 让它们读到新的流程。

本页源文件: docs/workflows/README.md

development 开发

文件flows/development.yaml,说明 flows/development.md
角色development(控制台里的任务「开发」)
项目所有项目共用
一句话从需求到 PR:需求分析、技术设计、实现、多人 review、风险审批。审批通过后才推送分支、创建 PR。
片段lib/sync-base.yaml、lib/review-loop.yaml、lib/deliver.yaml

开发流程:从一个需求做到推送分支。所有项目共用这一个流程。它在一个会话里写需求、技术设计、改代码,再经过 review、风险判定和人工审批,最后把批准的那个提交推到这次运行的分支。myorch 不开 PR,也不合并:PR 由人在 GitHub 上开,合并也由人决定。审批之前改动不离开沙箱,什么都不推送。

项目之间的差别都在项目包里,发起时不用选(见按项目的不同):

uv run myorch run flows/development.yaml --project mdm -i ticket=18700
uv run myorch run flows/development.yaml --project mdm -i ticket=18700 -i task="只改后台接口,前端另开工单"
uv run myorch run flows/development.yaml --project blog -i task="给文章页加字数统计"
uv run myorch run flows/development.yaml --project myorch -i task="..." -i incident=development-1a2b3c4d
uv run myorch run flows/development.yaml --project mdm -i from_run=<上一次的运行 ID> -i task="自测发现:批量导入时没有校验"
uv run myorch run flows/development.yaml --project mdm -i ticket=18700 -i at=<PR 的 merge-base> -i ticket_as_of=2026-10-01T08:00:00Z

控制台:先选项目,任务选「开发」。表单只显示这个项目用得上的字段。

消息的第一行成为 task,全文写进 docs/external/request.md。

输入

输入标签类型必填默认说明
ticketJira 工单工单号例如 18700。启动后第一步读工单
只对 project.jira.url 成立的项目显示
from_run起点运行
task需求消息看项目:not project.jira.url要改什么,越具体越好,可以写多行。有工单时工单就是需求,这里只写工单里没有的:重点、限制、要注意的地方
incident出问题的运行文本在哪次运行里出了问题,例如 development-1a2b3c4d。没有可以不填
只对 project.flows.development.incident 成立的项目显示
at重放:基准提交(评测用)文本平时留空。评测重放历史工单时填 PR 的 merge-base:从这个提交开始,删掉之后的历史,不审批、不交付
只对 project.jira.url 成立的项目显示
ticket_as_of重放:工单截止时间(评测用)文本平时留空。ISO 时间,例如 2026-10-01T08:00:00Z:工单按这个时刻的样子读(描述回滚,只留之前的评论)
只对 project.jira.url 成立的项目显示
ticket_comments工单评论选项:all / noneall
只对 project.jira.url 成立的项目显示

步骤图

从 flows/development.yaml 生成,按项目 mdm 和默认输入展开(别的项目的项目包可能裁掉步骤、换掉参数),和 myorch expand、控制台「流程」看到的一样。

sync-master脚本 · dev-git
fetch-ticket脚本 · ticket-read
有条件
checkout-branch脚本 · dev-git等 sync-master
developagent · Opus · dev-write
可能问你
等 checkout-branch、fetch-ticket
review-fix · 循环 · 最多 3 轮 · 直到 steps.verify.outputs.blocking == 0 · 跑满后问你 · lib/review-loop.yaml · 有条件
ci脚本 · dev-write
reviewagent · Sonnet · dev-read
×3 并行
securityagent · Sonnet · dev-read
verifyagent · Opus · dev-read
fixagent · Opus · dev-write
有条件
pack-choose脚本 · dev-read
可能问你有条件
pack-apply宿主机动作 · project-apply
有条件
跑满仍未满足时先反思,再问你:再跑一轮 / 接受 / 终止
reflectagent · Opus · dev-read
takeaway-trail宿主机动作 · run-trail
有条件失败当跳过
takeawayagent · Sonnet · dev-read
有条件失败当跳过
takeaway-redact宿主机动作 · takeaway-redact
有条件失败当跳过
takeaway-commit脚本 · dev-write
有条件失败当跳过
risk-rules脚本 · dev-read
有条件
classify-riskagent · Sonnet · dev-read
有条件
human-review审批 · 人数按风险算
有条件
deliver脚本 · dev-git
有条件
agent脚本宿主机动作需要你:审批、提问有条件(鼠标停在「有条件」上看表达式)同一行的步骤并行
每一步的执行者、条件、输出(从 YAML 生成)
步骤执行条件outputs人和并行限制
sync-master脚本 · dev-git失败时 ask超时 15m · 重试 1
checkout-branch脚本 · dev-gitsince失败时 ask超时 30m
fetch-ticket脚本 · ticket-readinputs.ticketkey、summary_line失败时 ask超时 5m · 重试 1
developagent · Opus · dev-writetitle、proceed、impact、requires_design_decision、design_question、design_options、checks_passed可以向你提问;失败时 ask超时 75m · 重试 1
循环 review-fix:最多 3 轮,直到 steps.verify.outputs.blocking == 0,跑满后问你。条件 steps.develop.outputs.proceed != false。片段 lib/review-loop.yaml
 ci脚本 · dev-write失败时 ask超时 15m
 reviewagent · Sonnet · dev-readfindings3 个实例并行;失败时 ask超时 20m
 securityagent · Sonnet · dev-readfindings失败时 ask超时 20m
 verifyagent · Opus · dev-readblocking、nits、pre_existing失败时 ask超时 20m
 fixagent · Opus · dev-writesteps.verify.outputs.blocking > 0pack_proposals失败时 ask超时 30m
 pack-choose脚本 · dev-readsteps.fix.outputs.pack_proposals > 0accepted可以向你提问;失败时 ask超时 30m
 pack-apply宿主机动作 · project-applysteps.pack-choose.outputs.accepted > 0失败时 ask超时 30m
 reflectagent · Opus · dev-readrecommendation、reason失败时 ask超时 15m
takeaway-trail宿主机动作 · run-trailsteps.develop.outputs.proceed != false and not inputs.at失败时 skip超时 2m
takeawayagent · Sonnet · dev-readsteps.develop.outputs.proceed != false and not inputs.at and steps.takeaway-trail.outputs.pathitems失败时 skip超时 10m · 重试 1
takeaway-redact宿主机动作 · takeaway-redactsteps.develop.outputs.proceed != false and not inputs.at and steps.takeaway.outputs.items != null失败时 skip超时 2m
takeaway-commit脚本 · dev-writesteps.develop.outputs.proceed != false and not inputs.at and steps.takeaway-redact.outputs.files > 0dir失败时 skip超时 2m
risk-rules脚本 · dev-readsteps.develop.outputs.proceed != false失败时 ask超时 30m
classify-riskagent · Sonnet · dev-readsteps.develop.outputs.proceed != falseapprovers、risk失败时 ask超时 15m
human-review审批 · 人数按风险算steps.develop.outputs.proceed != false and not inputs.at审批人数 min(steps.risk-rules.outputs.available, max(steps.risk-rules.outputs.approvers, min(steps.classify-risk.outputs.approvers, 2)));可以提修改意见:再跑一轮 review-fix;失败时 ask超时 30m
deliver脚本 · dev-gitsteps.develop.outputs.proceed != false and not inputs.atdelivery失败时 ask超时 10m · 重试 1

上面的图按 mdm 展开,步骤最全。blog 和 myorch 没有 fetch-ticket 和 takeaway 四步,blog 的 review 循环只有 1 个 reviewer、没有 security。

每一步做什么

步骤 做什么 产物
sync-master 克隆或更新仓库,强制对齐 origin/<base>,初始化子模块。第一次克隆走项目共享目录里的镜像仓库,之后只拉增量(lib/sync-base.yaml) outputs.base_sha
checkout-branch 建这次运行的分支,分支名来自项目包的 branch(mdm 是 MD-<工单号>-myorch-<运行 ID>,blog 和 myorch 是 myorch/<运行 ID>),执行项目的 setup.sh。接着改时切到上一次的分支,重放时切到 at,见后面两节 outputs.branch、outputs.since
fetch-ticket 只在项目有 Jira 时。用 Jira REST API 读工单(只读),写成 docs/external/ticket.md,下载截图。见「读工单」 docs/external/ticket.md、docs/external/attachments/
develop 一个会话里做完:写需求文档、写技术设计、需要人决定的问题一次问完、改代码、跑检查、写实现记录、提交一次。见「develop」 docs/requirements.md、docs/design.md、docs/implementation.md、一个提交
review-fix 循环 ci(项目的 checks.sh)→ review(个数按项目)和 security 并行 → verify 核实、算出 blocking → fix(只在 blocking > 0 时)→ pack-choose、pack-apply(只在 fix 提了项目包修改时)。轮数和跑满以后怎么办按项目。见「review 循环」 docs/ci/round-N.md、docs/review/round-N/
takeaway-trail 只在 flows.development.takeaway(mdm)时。宿主机动作:把运行到现在的过程写进 docs/takeaway/trail.json trail.json
takeaway 同上。只读的 agent:写任务信息 task.md 和经验 takeaway.md docs/takeaway/task.md、takeaway.md
takeaway-redact 同上。宿主机动作:删掉两个文件里像密钥的行
takeaway-commit 同上。把两个文件提交到仓库的 myorch/<日期>-<运行 ID>/ 一个提交
risk-rules 按规则算审批人数:改动路径和内容、review 没解决的问题、检查失败、没经过 review 的提交 outputs.approvers、head_sha 等
classify-risk 读实际的 diff,独立判断要几个人审批,给审批人写风险说明 docs/risk.md
human-review 人工审批,人数见「风险和审批」。人数为 0 时自动通过
deliver 核对 HEAD 就是批准的提交,推送分支,写交付说明 docs/delivery.md、outputs.delivery

你介入的地方

时机 控制台 命令行
develop 改代码前提问 在对话里回复,或点选项 myorch reply <run> develop "回答"
采纳项目包修改 回复编号,例如 1,3、all、none myorch reply <run> pack-choose.r<N> "1,3"(N 是轮次)
review 跑满仍有阻塞问题(on_exhausted: ask 的项目) 看反思建议,回复 1、2 或 3 myorch reply <run> review-fix 1(1 再跑一轮,2 接受当前结果,3 终止)
某一步重试后仍失败 回复 1、2、3,或者写一句提示 myorch reply <run> <步骤> 1(1 新会话重来,2 跳过,3 终止。写别的文字是提示,在原会话里接着做)
需要审批 右栏「改动」页看 diff、review 结论和风险判定,点「批准」「要求修改」或「驳回」 myorch review <run> 打开汇总页;myorch approve <run> human-review、myorch changes <run> human-review "意见"、myorch reject <run> human-review
推送以后 — 在 GitHub 上用推送的分支开 PR(交付说明可以直接当 PR 描述),决定是否合并。myorch 项目合并以后还要发布,见「myorch:合并以后」

takeaway 的四步失败时不问你(on_failed: skip),也不阻塞后面的步骤。宿主机动作失败时也不会问。

产物

同一个运行的所有步骤共享一个工作区。控制台右栏的「文档」能看所有文档和截图。命令行用 myorch ws <run> 列出文件,myorch ws <run> docs/risk.md 读一个文件。

observed/<运行 ID>/           接着改时上一次的运行、有 incident 时出问题的运行(只读)
docs/
├── external/
│   ├── request.md            第一条消息的原文(控制台和 Slack 发起时)
│   ├── ticket.md             工单(fetch-ticket,或 develop 用 MCP 读的)
│   └── attachments/          工单里的图片
├── previous/                 接着改时:上一次的文档和对话
├── requirements.md           需求、验收标准、工单对照;有 incident 时开头是原因分类
├── design.md                 影响分析、方案、兼容和回滚、测试计划
├── implementation.md         改动、证据、检查结果、假设、和设计的差异;fix 追加「第 N 轮修复」
├── ci/round-N.md             每轮的检查报告(round-N/ 里有 result.json、head.txt)
├── review/round-N/           reviewer-K.json、security.json、verified.json、summary.md、rebuttal.md、approver.json、pack/
├── takeaway/                 trail.json、task.md、takeaway.md(只在 takeaway 的项目)
├── risk.md                   风险结论和请审批人重点检查的地方
└── delivery.md               交付说明
repo/myorch/<日期>-<运行 ID>/  task.md、takeaway.md(提交在分支上,只在 takeaway 的项目)

develop

一个 agent 从读需求做到提交代码,三个阶段按顺序:需求、技术设计、实现。不能跳过前两个阶段直接写代码。项目的 prompts/develop.md 原文拼在 prompt 的「输入」之后,见按项目的不同。

为什么合成一步:分开时每次交接都会丢信息。有凭证的步骤(sync-master、fetch-ticket、deliver)仍然单独跑,develop 拿不到 GitHub 和 Jira 的凭证。

读工单

review 循环

定义在片段 lib/review-loop.yaml,review 和 eval 也用它(只跑 1 轮、不修复)。这里的参数来自项目的 flows.development:默认 3 个 reviewer 加单独的 security,最多 3 轮,跑满时问你。项目的 prompts/review.md、verify.md、fix.md 拼进对应步骤。

项目包的修改(pack-choose、pack-apply)

阻塞问题有时出在项目包里,例如 checks.sh 写错了。项目包在 sandbox 里是只读的(project/),fix 改不了它。这时:

  1. fix 不改 project/,也不为它写 rebuttal。它把 project/ 复制到 /tmp,在副本上改,用副本跑一次相关的检查,再把建议写进 docs/review/round-N/pack/proposals.json(机器读)和 proposals.md(给人看,含验证结果)。
  2. pack-choose 列出建议,问你采纳哪几条。
  3. pack-apply 在宿主机上把采纳的改动写回 myorch-knowledge,只提交这些文件,重新同步项目快照。每条改动的原文必须在文件里恰好出现一次,否则什么都不写,步骤失败。
  4. 这次运行的下一轮挂新的快照,用新的项目包检查。别的运行不受影响。最后一轮刚写回时,反思步骤会建议再跑一轮。

只能改 guide/ 下的文件、checks.sh、checks.env、setup.sh(project.py 的 EDITABLE["fix"])。risk-rules.yaml 和 security.md 不能改:运行不能改变自己的改动怎么被审批。要改别的文件时,fix 写「需要人决定:」。

任务信息和 takeaway

只在项目设置了 flows.development.takeaway: true 时(现在只有 mdm):仓库里放一个 myorch/ 目录要项目同意。review 循环之后、风险判定之前,四步把这次运行的任务信息和经验提交到仓库。

风险和审批

风险由改动决定,不由作者决定。两个分类器互相兜底:规则可能漏掉语义上的风险,模型可能看漏路径上的风险,最后取较严的一个。

risk-rules(确定性脚本):

classify-risk(agent,只读):读实际的 diff、需求文档、实现记录里的假设、最后一轮 review 和检查、没经过 review 的提交,判断 0、1 或 2 人。改接口或数据、改构建部署、和安全有关、难以撤回、影响下游,任意一条就是 2 人。写 docs/risk.md:结论、影响范围、没解决的问题、请审批人重点检查的 3 到 5 处。项目的 prompts/risk.md 拼在 prompt 末尾(myorch 用它规定「影响范围」按平台的边界、未结束的运行、部署来写)。

human-review 的人数:

min(项目登记的审批人数, max(risk-rules 的人数, min(classify-risk 的人数, 2)))

交付

定义在 lib/deliver.yaml。

接着改(from_run)

通用的做法见 在原分支上接着改。这个流程里:

重放(评测用)

用来在当时的代码上重做一张已经合并的工单,再和合并的 PR 对比。表单只对有 Jira 的项目显示 at、ticket_as_of、ticket_comments(命令行对任何项目都能传 -i at=)。平时不填。

按项目的不同

流程只有这一个。2026-11-10 之前每个项目复制了一份(ck-development、blog-development、mo-development),同一处改进要改三份,三份很快就不一样了,所以合回一个(docs/notes/2026-11-10-one-set-of-flows.md)。项目之间的差别写在项目包 myorch-knowledge/<项目>/ 里,展开流程时生效:

mdm blog myorch
Jira 有:工单必填,fetch-ticket,重放输入 没有:第一条消息是需求 没有:第一条消息是需求
review 默认:3 个 reviewer、security、3 轮、跑满问你 1 个 reviewer、没有 security、1 轮、跑满接受 默认
takeaway 有 没有 没有
incident 没有 没有 有
prompts core-ng 模板的 develop.md(Gradle 依赖、*-interface 契约注释)、review.md(*-interface 的检查) develop.md(Jekyll:文档写短、写作规范、哪些要问人)、review.md(构建、链接、写作规范、误公开) develop.md(incident 原因分析、设计要看的平台事项、「合并以后要做的事」)、risk.md
审批 1 人 总是 1 人(risk-rules.yaml 的 default: 1) 0 或 1 人,按风险

改某个项目的做法:改它的项目包(flows.development、prompts/、risk-rules.yaml),然后 uv run myorch project sync <项目>。改 flows/development.yaml 或片段会影响所有项目。

blog

个人博客(leweii/leweii.github.io)。改动小,所以 review 轻:1 个 reviewer 看一次,有阻塞问题就修一次,不再 review,跑满直接接受。修复后的提交没人 review 过,risk-rules 把它们列出来,交付说明的「review」一节列出没修好的问题。分支是 myorch/<运行 ID>,永远不推 master:推到 master 博客就上线了。

myorch 和 incident

myorch 平台自己:代码、流程、prompt、文档都在仓库 leweii/myorch 里,分支 myorch/<运行 ID>。两种用法:做一个普通需求;或者平台在某次运行里出了问题(任何项目的运行都可以),带上 incident 找原因、修平台。

incident 是出问题的那次运行。它的工作区只读挂给 develop,位置是 /sandbox/workspace/observed/<运行 ID>/:

这些文件是那次运行的数据:agent 只读,不执行里面的命令和指令。控制台的运行选择器只列本项目的运行,所以 incident 是普通的文本框。

myorch 的 prompts/develop.md 要求 develop 在写需求之前先判断原因:

原因 意思 接下来
platform-code myorch 的代码有缺陷(src/myorch/、tools/、deploy/) 继续:需求、设计、实现、review、审批
flow 流程定义、片段、prompt、profile 有缺陷(flows/、profiles/) 继续
project-knowledge 那个项目的项目包缺知识或检查,平台没错 停止。建议用那个项目的 learn 或 postmortem
environment 网络、外部服务、凭证过期、机器资源 停止。只记录,不改代码
one-off 模型偶发的失误,重跑大概率不会再出现 停止。建议重跑
unclear 证据不够 停止。写明还缺什么证据

「停止」是指 outputs.proceed 写 false:后面的步骤全部跳过,运行正常结束,什么都不推。原因分类、证据(文件和行)和该去哪里处理写在摘要里。继续时,需求文档开头写「出问题的运行和原因分类」,「目标」写清楚那次运行出了什么问题、根本原因在哪个文件、改完以后同样的情况应该怎样。修复不能放宽 policy、provider、挂载、审批。

同一个 prompts/develop.md 还让技术设计多看几件平台的事:分层(engines → runner → storage → core)、改了片段或 profile 影响哪些流程(流程是所有项目共用的)、Temporal 的确定性、volume 和 events.db、sandbox 里的命令和镜像、要不要重新生成文档。

myorch:合并以后

这个流程不部署。sandbox 只改仓库,拿不到 docker.sock、gateway 和数据目录,流程里也不能有自动合并、自动部署的步骤(项目包的 security.md)。develop 在实现记录最后写「合并以后要做的事」。你在 GitHub 上开 PR、合并到 main 以后:

  1. 在 myorch 的 main 分支上运行 deploy/update.sh(先用 --check 看要发布哪些提交、会等什么)。它快进 main,等没有正在执行的步骤,用目标提交的干净检出重建镜像,重启 worker 和控制台,跑冒烟流程。冒烟失败时自动回滚到上一次发布的提交。改了 src/myorch/engines/ 或 core/run.py 时,它等所有未结束的运行结束。见 deploy/README.md 的「发布 origin/main」。
  2. 改了 images/claude-code/ 时,update.sh 一起重建 sandbox 的基础镜像 openshell-claude-code。各项目的开发镜像都基于它,要用上新的基础镜像,还要重建项目的镜像(项目包的 image/build.sh)。改了 pyproject.toml 或 uv.lock 时,重建 myorch 项目的开发镜像(在 myorch-knowledge 目录下运行 myorch/image/build.sh ../myorch),以后 myorch 项目的 development 运行才用上新依赖。
  3. 改了 tools/(sandbox 里的辅助命令 myorch-checks、myorch-ask 等)时,它们由 myorch init 装进 volume(compose 里是 init 服务)。要确认重新运行过 myorch init,否则 sandbox 里还是旧版本。

本页源文件: flows/development.md

review 评审 PR

文件flows/review.yaml,说明 flows/review.md
角色review(控制台里的任务「评审 PR」)
项目所有项目共用
一句话评审一个已有的 PR。结论只在控制台显示。
片段lib/review-loop.yaml、lib/e2e.yaml

PR 评审:对一个已有的 PR(包括人写的)做一轮 AI review。所有项目共用这一个流程。它先跑项目的检查,再让 reviewer 看代码;项目有端到端测试时,最后用浏览器测运行中的应用。结论只在本地控制台(右栏「改动」页)和工作区的 docs/review/round-1/ 里,不往 GitHub 上发任何东西。它只找问题:不改代码,不批准 PR,也不要求修改,因为 agent 的批准不算数。对 GitHub 只读。

它用的 review 循环和 development 是同一个片段 lib/review-loop.yaml,但只跑 1 轮、不修复、有阻塞问题也照常结束。项目的 prompts/review.md、verify.md 同样拼进去(例如 core-ng 项目的 *-interface 检查、博客的写作规范和误公开检查)。

uv run myorch run flows/review.yaml --project mdm -i pr=13                # 默认 standard
uv run myorch run flows/review.yaml --project blog -i pr=13 -i depth=deep

控制台:先选项目,任务选「评审 PR」,填 PR 编号,选评审强度。第一条消息可以不写。

评审强度(depth)决定 reviewer 的个数、模型和要不要单独做安全 review,见下面的预设表。日常的 PR 用 standard。只想快速看一眼用 quick。改了构建、依赖、安全相关的地方用 deep。verify 总是用 Opus。

输入

输入标签类型必填默认说明
prPR 编号文本必填例如 25
depth评审强度选项:quick / standard / deepstandard

按输入 depth 选一组参数(presets):

depthreviewerssecurityreview_model
quick1FalseHaiku
standard2TrueSonnet
deep3TrueOpus

步骤图

从 flows/review.yaml 生成,按项目 mdm 和默认输入展开(别的项目的项目包可能裁掉步骤、换掉参数),和 myorch expand、控制台「流程」看到的一样。

fetch-pr脚本 · dev-git
review-round · 循环 · 最多 1 轮 · 直到 steps.verify.outputs.blocking == 0 · 跑满后接受,继续往下 · lib/review-loop.yaml · 有条件
ci脚本 · dev-write
reviewagent · Sonnet · dev-read
×2 并行
securityagent · Sonnet · dev-read
verifyagent · Opus · dev-read
跑满仍未满足时先反思,再问你:再跑一轮 / 接受 / 终止
reflectagent · Opus · dev-read
agent脚本宿主机动作需要你:审批、提问有条件(鼠标停在「有条件」上看表达式)同一行的步骤并行
每一步的执行者、条件、输出(从 YAML 生成)
步骤执行条件outputs人和并行限制
fetch-pr脚本 · dev-git超时 10m · 重试 1
循环 review-round:最多 1 轮,直到 steps.verify.outputs.blocking == 0,跑满后接受,继续往下。条件 steps.fetch-pr.outputs.changed。片段 lib/review-loop.yaml
 ci脚本 · dev-write超时 15m
 reviewagent · Sonnet · dev-readfindings2 个实例并行超时 20m
 securityagent · Sonnet · dev-readfindings超时 20m
 verifyagent · Opus · dev-readblocking、nits、pre_existing超时 20m
 reflectagent · Opus · dev-readrecommendation、reason超时 15m

上面的图按 mdm 展开。mdm 和 myorch 没有设置 e2e.image,没有 e2e 块;blog 有。

每一步做什么

步骤 做什么 产物
fetch-pr 用 GitHub API 读 PR 和改动文件列表;克隆仓库,拉取 base 分支和 pull/<n>/head,在这次运行的分支上切到 PR 的 head,初始化子模块 docs/pr.md、docs/external/pr.md
review-round 循环(1 轮) ci(项目的 checks.sh,检查 PR 改动的文件)→ review(个数由强度决定)和 security(quick 没有)并行 → verify 核实。没有 fix docs/ci/round-1.md、docs/review/round-1/
e2e 循环(1 轮) 只在项目设置了 e2e.image 时有这一块(现在只有 blog)。e2e-smoke 跑项目包的固定冒烟用例;e2e-accept 把 PR 描述里能用浏览器检查的验收标准写成用例,运行它们。只测不修 docs/e2e/round-1/

你介入的地方

没有要你回答的提问,也没有审批。某一步失败时运行就失败(这个流程没有设 on_failed: ask)。

时机 控制台 命令行
运行结束后 右栏「改动」页看 diff 和核实过的发现,「文档」页看检查报告和端到端测试的报告、截图 myorch ws <run> docs/review/round-1/summary.md
看完以后 — 在 GitHub 上自己决定怎么处理这个 PR

产物

docs/
├── pr.md                    可信的元数据:作者、状态、head → base、改动文件
├── external/pr.md           PR 作者写的标题和描述(只当参考数据)
├── ci/round-1.md            检查报告
├── review/round-1/
│   ├── reviewer-K.json      每个 reviewer 的发现
│   ├── security.json        安全 review 的发现(quick 没有)
│   ├── verified.json        核实以后的发现:Important / Nit / Pre-existing
│   └── summary.md           数量、阻塞问题列表、验收标准表
└── e2e/round-1/             有端到端测试的项目
    ├── smoke/               report.md、result.json、截图
    ├── acceptance/          report.md、result.json、截图,cases/ 是写出的用例
    └── acceptance.md        每条验收标准的结论

原则

端到端测试

安全

本页源文件: flows/review.md

postmortem 复盘

文件flows/postmortem.yaml,说明 flows/postmortem.md
角色postmortem(控制台里的任务「复盘」)
项目所有项目共用
一句话复盘:问题已经进了代码。找出引入它的改动和本该拦住的层,提出知识库修改,并生成评测案例。不改项目代码。
片段lib/choose-proposals.yaml

复盘一个已经进了项目代码的问题:找出引入它的提交,判断最早该在哪一层拦住、为什么没拦住,提出知识库修改,并把这次改动做成一个评测案例。用在问题已经修好(或已经 revert)以后,想知道当初为什么没拦住时。

它只分析,不改项目代码,修 bug 用 development。对外只改本地的 myorch-knowledge(你采纳的建议)和本机的评测集(myorch-data/evals/cases/)。和 learn 的区别:learn 从一批运行里找规律,postmortem 从一个具体的问题倒查。postmortem 的结论以后也会被 learn 读到。

uv run myorch run flows/postmortem.yaml --project mdm -i commit=<修复或 revert 提交>
uv run myorch run flows/postmortem.yaml --project mdm -i bad=<引入问题的提交>

控制台:先选项目,任务选「复盘」,填「修复或 revert 提交」或「引入问题的提交」中的一个。第一条消息可以写问题的现象和影响,也可以不写;写了存成 docs/external/request.md,analyze 会读。

输入

输入标签类型必填默认说明
commit修复或 revert 提交文本二选一提交 SHA。和下一项二选一
bad引入问题的提交文本二选一知道时直接填 SHA
runshidden

步骤图

从 flows/postmortem.yaml 生成,按项目 mdm 和默认输入展开(别的项目的项目包可能裁掉步骤、换掉参数),和 myorch expand、控制台「流程」看到的一样。

locate脚本 · dev-git
replay-before宿主机动作 · postmortem-replay
trace脚本 · dev-read
analyzeagent · Opus · dev-read等 trace
choose脚本 · dev-read
可能问你有条件
apply宿主机动作 · project-apply
有条件
replay-after宿主机动作 · postmortem-replay等 apply、replay-before
agent脚本宿主机动作需要你:审批、提问有条件(鼠标停在「有条件」上看表达式)同一行的步骤并行
每一步的执行者、条件、输出(从 YAML 生成)
步骤执行条件outputs人和并行限制
locate脚本 · dev-gitbad、fix、kind、matched、matched_runs超时 15m · 重试 1
replay-before宿主机动作 · postmortem-replay超时 5m
trace脚本 · dev-read超时 10m
analyzeagent · Opus · dev-readlayer、category、proposals、expected超时 30m
choose脚本 · dev-readsteps.analyze.outputs.proposals > 0accepted可以向你提问超时 30m
apply宿主机动作 · project-applysteps.choose.outputs.accepted > 0超时 5m
replay-after宿主机动作 · postmortem-replay超时 5m

输入

每一步做什么

步骤 做什么 产物
locate 找到引入问题的提交(见下)、它的 PR,以及哪些 myorch 运行碰过它 docs/postmortem/target.json、bad.diff、fix.diff(有修复提交时)
replay-before 宿主机动作:建评测案例(草稿),另起一个 eval 运行,用现在的知识库回放这次改动。和 trace、analyze 同时进行 评测案例,eval 运行 eval-<id>-before
trace 从碰过这次改动的运行里,列出当时每一层看到了什么:需求文档提到了哪些相关文件、各轮 review 在改动附近(前后 10 行)的发现、CI 结果、风险判定 docs/postmortem/trace.json、trace.md
analyze 判断问题是什么、最早该在哪一层拦住、为什么没拦住;提出知识库修改;写出期望 reviewer 报出的发现。只读,只写 docs/postmortem/ postmortem.md、proposals.json、proposals.md、follow-ups.md、case.json
choose 列出建议,等你回复编号。没有建议时跳过 docs/postmortem/accepted.json
apply 宿主机动作 project-apply:写回项目包、提交、重新同步快照。一条都没采纳时跳过 myorch-knowledge 的一个提交
replay-after 宿主机动作:把期望的发现写进评测案例。采纳了建议时,用新的知识库再回放一次 评测案例更新,eval 运行 eval-<id>-after

<id> 是这次 postmortem 运行 ID 的最后一段,例如 postmortem-1a2b3c4d 的回放是 eval-1a2b3c4d-before。

locate:怎么找到引入问题的提交

给了什么 怎么找
bad 直接用
commit,提交信息里有 This reverts commit <sha> 被 revert 的提交
commit,普通修复 对修复改动的行做 git blame(纯新增时看新增位置前后 2 行),取出现最多的提交

analyze:该拦住的层和原因

输出 取值
layer:最早该拦住的一层 requirement 需求分析该问到;implementation 实现指南该避开;review;security;risk 该判成高风险要人看;ci 确定性检查;approval 审批人该看到;none
category:为什么没拦住 no-rule 知识库和检查都没覆盖;rule-not-applied 有规则但没用上;flagged-not-handled reviewer 或 CI 指出过,但被反驳、降级或忽略;human-let-through 人看到了风险仍然放行;not-detectable 事先确实发现不了

回放和评测案例

回放是单独的 eval 运行(eval 流程,evals.py)。那里的 reviewer 只看到改动本身和需求,看不到这次运行的工作区:事故描述、修复、分析和期望的发现都看不到。eval 运行从 GitHub 克隆仓库,检出引入问题的提交,之后的提交(包括修复)、分支和 reflog 都删掉。

案例 ID 就是这次 postmortem 的运行 ID,存在本机 myorch-data/evals/cases/<运行 ID>.json。它这样走到评测集里:

时机 案例的状态 发生了什么
replay-before draft 只有改动,还没有期望的发现,评测集里看不到。用现在的知识库回放一次
replay-after,case.json 有内容 pending 写入期望的发现,在控制台「流程 → 评测集」里等你确认。采纳过建议时,用新的知识库再回放一次
replay-after,case.json 是空的 rejected 没有能事先发现的问题,案例不计分,也不再回放
你在「流程 → 评测集」里勾选成立的发现 confirmed 案例进入评测集,以后的 myorch eval run 也会用它。一条都不勾时是 rejected

你介入的地方

时机 控制台 / Slack 命令行
choose:选采纳哪几条 在对话里回复编号,或点 all、none uv run myorch reply <run> choose "1,3"
运行结束后:确认评测案例 「流程 → 评测集」里打开这个案例,勾选成立的发现 没有命令

写回项目包

和 learn 用同一个宿主机动作 project-apply,同样是 scope: learn,规则见 learn 的「写回项目包」:全部校验通过才写、只提交自己写的文件、提交信息是 learn(<项目>): … 并带 myorch-run: <run_id>、写完重新同步快照、可以 git revert。

区别只在读的文件:建议在 docs/postmortem/proposals.json,采纳的编号在 docs/postmortem/accepted.json。prompt 只让 analyze 改 guide/;动作本身按 learn 的范围校验,也接受 checks.sh、checks.env。

产物

都在工作区的 docs/postmortem/ 下,控制台右栏「文档」能看,也可以 uv run myorch ws <run> docs/postmortem。

docs/postmortem/
  target.json            引入问题的提交、基准、修复、PR、碰过它的运行、需求
  bad.diff, fix.diff     引入问题的改动;修复(有时)
  trace.json, trace.md   当时每一层看到了什么
  postmortem.md          结论:问题、该拦住的层和原因、证据、建议
  proposals.json, proposals.md, accepted.json   知识库建议,你采纳的编号
  follow-ups.md          要另起 development 的确定性检查建议
  case.json              评测案例里期望的发现

本页源文件: flows/postmortem.md

sweep 找 bug

文件flows/sweep.yaml,说明 flows/sweep.md
角色sweep(控制台里的任务「找 bug」)
项目所有项目共用
一句话找现有代码里的 bug,每次看一批文件,只出日报。
片段lib/sync-base.yaml

找项目现有代码里的 bug。所有项目共用这一个流程。每次按固定顺序看一批文件,几个审查员并行看,核实后写一份日报。适合每晚定时跑,一轮一轮把整个仓库扫完。

它是观察模式:只写日报 docs/sweep/report.md,不改代码,不推送,不启动 development,也不改知识库。发现的问题要修,由人另起 development。和 review 的区别:review 看一个 PR 的改动,sweep 看已经在主分支上的代码。

uv run myorch run flows/sweep.yaml --project mdm                     # 跑一次,审查强度默认 standard
uv run myorch run flows/sweep.yaml --project mdm -i depth=deep
uv run myorch schedule add nightly-sweep-mdm --flow sweep --project mdm --cron '0 2 * * *'   # 每晚 2 点

控制台:先选项目,任务选「找 bug」,选审查强度。第一条消息不用写。

输入

输入标签类型必填默认说明
depth审查强度选项:quick / standard / deepstandard

按输入 depth 选一组参数(presets):

depthauditorsaudit_model
quick1Haiku
standard2Sonnet
deep3Opus

步骤图

从 flows/sweep.yaml 生成,按项目 mdm 和默认输入展开(别的项目的项目包可能裁掉步骤、换掉参数),和 myorch expand、控制台「流程」看到的一样。

sync脚本 · dev-git
pick脚本 · dev-read
auditagent · Sonnet · dev-read
×2 并行
verifyagent · Sonnet · dev-read
record脚本 · dev-read
agent脚本宿主机动作需要你:审批、提问有条件(鼠标停在「有条件」上看表达式)同一行的步骤并行
每一步的执行者、条件、输出(从 YAML 生成)
步骤执行条件outputs人和并行限制
sync脚本 · dev-git超时 15m · 重试 1
pick脚本 · dev-read超时 5m
auditagent · Sonnet · dev-readfindings2 个实例并行超时 30m
verifyagent · Sonnet · dev-readnew_important、new_nit超时 20m
record脚本 · dev-read超时 5m

看哪些文件

由项目包 project.yaml 的 sweep: 决定(见 7. 项目包):

字段 含义 不写时
paths 只看这些目录或文件 整个仓库
include 只看匹配这些 glob 的文件(可以用 **) 不筛选
exclude 不看匹配这些 glob 的文件 不排除
chunk 每次看几个文件(1 到 200) 20

每一步做什么

步骤 做什么 产物
sync 克隆或更新仓库,切到最新的 base 分支(lib/sync-base.yaml,用项目共享的 bare mirror 加速) repo/
pick 按游标取下一批文件,把已知问题复制一份进工作区。游标在这里不动 docs/sweep/chunk.txt、docs/sweep/known.json
audit 几个审查员各自读这批文件,找现在就存在的缺陷。只读,不改代码 docs/sweep/audit-<编号>.json
verify 逐条打开代码核实,去掉误报和已知问题,合并重复的,写日报 docs/sweep/verified.json、docs/sweep/report.md
record 把新问题记进 known.json,游标前移 共享目录里的 cursor.json、known.json

audit:找什么

verify:核实

跨运行的状态

跨运行的状态放在项目共享目录 shared/<项目>/sweep/(myorch 存储的 volume 上)。只有 pick 和 record 挂载它。

文件 内容 谁写
cursor.json {"next": 下一批从第几个文件开始, "total": 文件总数, "run": 写它的运行} record
known.json 报告过的问题列表:fingerprint、file、line、title、severity、run、at(日期) record 追加

你介入的地方

运行中不需要你。看日报:控制台打开运行,右栏「文档」里的 docs/sweep/report.md;或者 uv run myorch ws <run> docs/sweep/report.md。值得修的问题,另起 development。

定时跑

产物

docs/sweep/
  chunk.txt          这次看的文件,每行一个
  known.json         开始时的已知问题副本
  audit-<编号>.json   每个审查员的发现
  verified.json      核实后的新问题
  report.md          日报

本页源文件: flows/sweep.md

learn 学习

文件flows/learn.yaml,说明 flows/learn.md
角色learn(控制台里的任务「学习」)
项目所有项目共用
一句话从历史运行里沉淀知识:改进 guide/、记录人做过的决定、加确定性检查。
片段lib/choose-proposals.yaml

从一个项目过往的运行里沉淀知识,让下一次运行一开始就知道。所有项目共用这一个流程。它把各种信号整理成对项目包的修改建议,你挑选采纳哪几条,然后写回 myorch-knowledge/<项目>/。知识库变准了,以后的每次 development 和 review 都受益。

它只改本地的 myorch-knowledge:guide/、checks.sh、checks.env。它不推送,不碰项目仓库,也不改流程(对流程的建议只写成文件)。和 postmortem 的区别:postmortem 从一个漏过去的问题倒查,learn 从一批运行里找反复出现的规律。

uv run myorch run flows/learn.yaml --project mdm                                                 # 自动选运行
uv run myorch run flows/learn.yaml --project mdm -i runs=development-b947d694,review-5d5a21ec     # 手动选运行
uv run myorch schedule add weekly-learn-mdm --flow learn --project mdm --cron '0 9 * * 1'         # 每周一 9 点

控制台:先选项目,任务选「学习」。「要学习的运行」可以留空,第一条消息不用写。

输入

输入标签类型必填默认说明
runs要学习的运行文本可选。逗号分隔的运行 ID;留空时自动选上次 learn 之后的运行

步骤图

从 flows/learn.yaml 生成,按项目 mdm 和默认输入展开(别的项目的项目包可能裁掉步骤、换掉参数),和 myorch expand、控制台「流程」看到的一样。

collect脚本 · dev-git
analyzeagent · Opus · dev-read
choose脚本 · dev-read
可能问你有条件
apply宿主机动作 · project-apply
有条件
takeaways-learned宿主机动作 · takeaways-learned
有条件
agent脚本宿主机动作需要你:审批、提问有条件(鼠标停在「有条件」上看表达式)同一行的步骤并行
每一步的执行者、条件、输出(从 YAML 生成)
步骤执行条件outputs人和并行限制
collect脚本 · dev-gitfindings超时 10m · 重试 1
analyzeagent · Opus · dev-readproposals、follow_ups超时 20m
choose脚本 · dev-readsteps.analyze.outputs.proposals > 0accepted可以向你提问超时 30m
apply宿主机动作 · project-applysteps.choose.outputs.accepted > 0超时 5m
takeaways-learned宿主机动作 · takeaways-learnedsteps.collect.outputs.takeaways > 0超时 2m

学哪些运行

不给 runs 时,发起的客户端(命令行、控制台、Slack、定时任务都一样)自动选:

命令行会在开始前列出选了哪些。一个新运行都没有时,运行不会启动,报「没有新的已结束的 development / review run」。uv run myorch list --project <项目> 能看到有哪些运行,手动选时用 -i runs=<id>,<id>。

失败或超时的 learn 不算完成。下一次 learn 还会选到同一批运行。

读哪些信号

信号 从哪里来 怎么进到运行里
review 的发现和后来的处理结果 各运行的 docs/review/round-*/,PR 的状态 collect 读只读挂载的 observed/<run_id>/,到 GitHub 查 PR
人回答过的问题、修改意见、驳回、失败的步骤、重新执行、从哪个运行接着改 宿主机的事件日志 发起时由客户端写进 docs/learn/trail.json(trail.py)。sandbox 读不到事件日志
CI 失败 docs/ci/round-*/result.json collect
实现时的假设,和需求、设计的差异 docs/implementation.md 的对应小节 collect
为什么在分支上接着改 接着改的运行的请求(docs/external/request.md) collect
复盘结论和跟进建议 postmortem 运行的 docs/postmortem/ collect
开发运行自己写的任务信息和经验 项目仓库 base 分支的 myorch/<日期>-<run_id>/ collect 从仓库读。学过哪些,发起时写进 docs/learn/takeaways-learned.json

每一步做什么

步骤 做什么 产物
collect 汇总上表的信号,判断每条 review 发现后来怎么样了,读仓库里还没学过的 takeaway。脚本只读 GitHub,不执行仓库代码 docs/learn/findings.json、outcomes.md、signals.json、signals.md、takeaways.json、takeaways/
analyze 找规律,提出修改建议,每条都要有证据。只写建议文件,不改任何东西 docs/learn/proposals.json、proposals.md、follow-ups.md、flow-proposals.md
choose 把建议列给你,等你回复编号。没有建议时跳过 docs/learn/accepted.json
apply 宿主机动作 project-apply:校验、写回项目包、在 myorch-knowledge 里提交、重新同步快照。一条都没采纳时跳过 myorch-knowledge 的一个提交
takeaways-learned 宿主机动作:把这次读过的 takeaway 记为学过。不论采纳了几条都执行;这次没读到 takeaway 时跳过 myorch-data/learn/<项目>/takeaways.json

collect:发现的处理结果

已经标为 fixed 的发现不算。其余每条按下面的顺序判断,取第一个成立的:

处理结果 含义
fixed 后面某一轮里,同一个文件有一条发现标为 fixed
rebutted 标题的前 12 个字出现在某一轮的 rebuttal.md 里
merged_unchanged / closed / open 只看 review 运行:被评审的 PR 已合并、已关闭、还开着
not_required Nit 或 Pre-existing,本来就不阻塞
unknown 以上都不是

myorch 不再往 PR 上发评论,所以没有「有人回复了评论」这一类,结果只来自运行自己的记录和 PR 状态。

collect:仓库里的 takeaway

analyze:找哪几类知识

最多 8 条,证据不够就少提或不提。不重复知识库和仓库自带文档里已有的内容,措辞简短,沿用现有文件的风格。

类型 找什么 写到哪里
record-decision 人在需求分析或设计时回答过的、以后同类问题都适用的决定 guide/decisions.md(没有时新建):什么情况、怎么做、为什么、出处。以后遇到同类问题照做,不再问人
fill-gap 返工的原因:接着改、复盘结论、实现偏离需求或设计、不得不做的假设 开发、设计相关的指南。问的是「知识库早写了什么,第一次就能做对」
add-rule 反复出现的同类问题(至少 2 次运行,或 1 次但影响大) 实现时要避开的规则,或 review-guide.md
relax-rule 反复被反驳、或没改就合并的意见 放宽 review-guide.md
add-check 能用脚本判断的反复出现的问题,或反复失败的 CI 检查 checks.sh 或 checks.env。只加确定性的检查,会误报的只报警告。没把握写对时写进 follow-ups.md

另外两个文件不会被应用:follow-ups.md 是要改项目仓库本身的建议(lint、CI、测试),要另起 development;flow-proposals.md 是对 myorch 流程的建议(步骤顺序、提问时机、总失败或多余的步骤)。

takeaway 当作信号,和其他证据一样核实:只采纳能推广到以后的项目知识,只对某个工单成立的不要。证据写成 <run_id>: takeaway。流程、平台、环境类的建议进 flow-proposals.md。

每条建议的修改写成精确替换(edits:old 从当前文件逐字复制,在文件里只出现一次)或追加(append)。不用 diff,因为 agent 写的 diff 常常行号对不上。

你介入的地方

时机 控制台 / Slack 命令行
choose:选采纳哪几条 在对话里回复编号,或点 all、none uv run myorch reply <run> choose "1,3"

写回项目包

apply 是宿主机动作 project-apply,scope: learn(actions.py、project.py)。sandbox 访问不到 myorch-knowledge,所以在宿主机上做。

能改 不能改
guide/ 下的文件,可以新建 risk-rules.yaml、security.md、setup.sh
checks.sh、checks.env project.yaml、image/、policy.yaml、providers/、sources/ 等其他文件

产物

都在工作区的 docs/learn/ 下,控制台右栏「文档」能看,也可以 uv run myorch ws <run> docs/learn。

docs/learn/
  trail.json                 发起时写入:事件日志里的问答、意见、驳回、失败、重新执行
  takeaways-learned.json     发起时写入:已经学过的 takeaway 的 run_id
  findings.json, outcomes.md 发现和处理结果,统计表
  signals.json, signals.md   review 以外的信号
  takeaways.json, takeaways/<日期>-<run_id>/   这次读到的 takeaway
  proposals.json, proposals.md                 建议
  follow-ups.md, flow-proposals.md             不会自动应用的建议
  accepted.json              你采纳的编号

定时跑

myorch schedule add 的 --flow 要写流程名 learn。定时任务和控制台用同一条路径发起,所以自动选运行、写 trail.json 和 takeaways-learned.json 都一样。

本页源文件: flows/learn.md

eval 评测

文件flows/eval.yaml,说明 flows/eval.md
角色eval(控制台里的任务「评测」)
项目所有项目共用
一句话重放一个评测案例,给 reviewer 打分。
片段lib/review-loop.yaml

给 reviewer 打分:把一次历史 review 看过的改动原样重放,让 reviewer 再看一遍,和人确认过的真问题对比,算抓到几条、漏掉几条、多报几条。改了 reviewer 的 prompt、模型或项目包的 guide/ 以后,用它判断变好还是变差。它对外什么都不写:不推送,不改代码,不改项目包。

一次 eval 运行只重放一个案例、一种评审强度。案例的收集、确认、批量发起和打分都在本机由 myorch eval 做(../src/myorch/evals.py),流程本身只负责准备代码和跑一轮 review。

uv run myorch eval collect                              # 从历史运行收集候选案例
uv run myorch eval list                                 # 案例和状态
# 在控制台「流程 → 评测集」里,逐个案例勾选哪些发现是真问题
uv run myorch eval run --depth quick --depth standard   # 每个已确认的案例,每种强度各起一次 eval
uv run myorch eval run --case <案例 ID>                  # 只跑某个案例(默认强度 standard)
uv run myorch eval report [--batch <批次>]               # 对比表

不要在控制台的「+ 新运行」里或用 myorch run 直接发起它:只有 myorch eval run(和 postmortem 的回放)会把案例写进工作区,直接发起时 prepare 读不到案例,会失败。Slack 的发起弹窗不列这个流程。

输入

输入标签类型必填默认说明
case案例文本必填案例 ID(流程 → 评测集)
depth测哪种强度选项:quick / standard / deepstandard

按输入 depth 选一组参数(presets):

depthreviewerssecurityreview_model
quick1FalseHaiku
standard2TrueSonnet
deep3TrueOpus

步骤图

从 flows/eval.yaml 生成,按项目 mdm 和默认输入展开(别的项目的项目包可能裁掉步骤、换掉参数),和 myorch expand、控制台「流程」看到的一样。

prepare脚本 · dev-git
review-round · 循环 · 最多 1 轮 · 直到 steps.verify.outputs.blocking == 0 · 跑满后接受,继续往下 · lib/review-loop.yaml
ci脚本 · dev-write
reviewagent · Sonnet · dev-read
×2 并行
securityagent · Sonnet · dev-read
verifyagent · Sonnet · dev-read
跑满仍未满足时先反思,再问你:再跑一轮 / 接受 / 终止
reflectagent · Sonnet · dev-read
agent脚本宿主机动作需要你:审批、提问有条件(鼠标停在「有条件」上看表达式)同一行的步骤并行
每一步的执行者、条件、输出(从 YAML 生成)
步骤执行条件outputs人和并行限制
prepare脚本 · dev-git超时 10m
循环 review-round:最多 1 轮,直到 steps.verify.outputs.blocking == 0,跑满后接受,继续往下。片段 lib/review-loop.yaml
 ci脚本 · dev-write超时 15m
 reviewagent · Sonnet · dev-readfindings2 个实例并行超时 20m
 securityagent · Sonnet · dev-readfindings超时 20m
 verifyagent · Sonnet · dev-readblocking、nits、pre_existing超时 20m
 reflectagent · Sonnet · dev-readrecommendation、reason超时 15m

案例从哪里来

案例是一次历史 review 第 1 轮看过的改动,加上人确认过的真问题。存在本机的 myorch-data/evals/cases/<案例 ID>.json。

阶段 谁做 做什么
收集 myorch eval collect 扫描所有运行,第 1 轮的 verified.json 里有带文件位置的 Important 或 Nit 的 development、review 运行成为候选,案例 ID 就是那次运行的 ID。Pre-existing 不算这次改动的问题。记下比较范围(base 和 head 提交)、分支上的提交、当时的需求文档(docs/requirements.md,没有时用 docs/pr.md)和这些发现。已经有的案例不重复收集
确认 你,在控制台「流程 → 评测集」 逐条勾选确实是问题的发现,点「收入评测集」,状态变成已确认。一条都不是时点「都不是真问题」,案例不要了。没有记录 head 的老运行,head 是推断的(分支上的第一个提交),页面上会提示你核对
重放 myorch eval run 每个已确认的案例、每种强度起一次 eval,一批运行共用一个批次号。用项目包最新的版本,不挂知识源
打分 myorch eval report 读每次重放的 docs/review/round-1/verified.json,和勾选的发现对比,见「怎么打分」

postmortem 也会生成案例(origin: git):改动是项目仓库里引入问题的那个提交,不来自 myorch 运行,案例 ID 是复盘运行的 ID。复盘自己发起这些回放:用当时的知识库一次,你采纳了它提出的知识库修改时,用新的知识库再一次,myorch eval report --batch <复盘运行 ID> 能看。

每一步做什么

步骤 做什么 产物
prepare 读 docs/eval/case.json。从源运行自己的工作区克隆仓库(只读挂载,所以从没推到 GitHub 的提交也能重放);复盘案例从 GitHub 克隆。切到案例的 head,然后删掉 origin remote、其他所有引用和 reflog,做一次 gc,再把 origin/eval-base 指向案例的 base。把当时的需求文档写进 docs/eval/requirement.md repo/、docs/eval/requirement.md
review-round 循环(1 轮) 和 review 一样的一轮 review:ci → review(个数由强度决定)和 security → verify。比较基准是 eval-base,需求文档是 docs/eval/requirement.md。没有 fix,跑满自动接受 docs/ci/round-1.md、docs/review/round-1/

强度和 review 的三种一样,见上面的预设表。

不泄露答案

怎么打分

在本机算,流程里不算:

你介入的地方

时机 控制台 命令行
收集以后 「流程 → 评测集」里逐个案例勾选真问题 只能在控制台确认;myorch eval list 看状态
跑完以后 打开每次运行看 docs/review/round-1/ myorch eval report --batch <批次>

运行本身没有提问和审批。

本页源文件: flows/eval.md

onboard 接入项目

文件flows/onboard.yaml,说明 flows/onboard.md
角色onboard(控制台里的任务「接入项目」)
项目所有项目共用
一句话接入新项目:分析仓库,提出项目包的修改。
片段lib/sync-base.yaml、lib/choose-proposals.yaml

让 myorch 了解一个项目。它读仓库,拿最近几个提交试跑一次项目包的检查,然后提出补充或修正项目包的建议;你挑选采纳哪几条,写回 myorch-knowledge/<项目>/。以后的开发、review 和风险判定都依赖这些知识。

新接一个项目时跑一次,仓库结构变化大时再跑。它对项目仓库什么都不推送,只改本地的 myorch-knowledge。和其他流程一样,所有项目共用它。和 learn 的区别:learn 从跑过的运行里学,onboard 只看仓库本身,能改的文件也更多(检查脚本、准备脚本、审批规则、安全重点)。

uv run myorch run flows/onboard.yaml --project <项目>
uv run myorch run flows/onboard.yaml --project <项目> -i focus="数据库迁移"

控制台:先选项目,任务选「接入项目」。第一条消息就是「要重点看的地方」,可以不写。

输入

输入标签类型必填默认说明
focus要重点看的地方消息可选,例如「前端检查」「数据库迁移」

步骤图

从 flows/onboard.yaml 生成,按项目 mdm 和默认输入展开(别的项目的项目包可能裁掉步骤、换掉参数),和 myorch expand、控制台「流程」看到的一样。

sync脚本 · dev-git
try-checks脚本 · dev-write
analyzeagent · Opus · dev-read
choose脚本 · dev-read
可能问你有条件
apply宿主机动作 · project-apply
有条件
agent脚本宿主机动作需要你:审批、提问有条件(鼠标停在「有条件」上看表达式)同一行的步骤并行
每一步的执行者、条件、输出(从 YAML 生成)
步骤执行条件outputs人和并行限制
sync脚本 · dev-git超时 15m · 重试 1
try-checks脚本 · dev-writepassed超时 60m
analyzeagent · Opus · dev-readproposals超时 40m
choose脚本 · dev-readsteps.analyze.outputs.proposals > 0accepted可以向你提问超时 30m
apply宿主机动作 · project-applysteps.choose.outputs.accepted > 0超时 5m

开始之前

项目包至少要有 project.yaml,并且已经 uv run myorch project sync <项目>。项目的 GitHub provider 要建好,开发镜像要构建好。步骤见 7. 项目包 · 接入一个新项目。

focus 原样接在 analyze 的任务说明后面,例如「前端检查」「数据库迁移」,让它在这些地方多花功夫。

每一步做什么

步骤 做什么 产物
sync 克隆仓库,切到最新的 base 分支,初始化子模块(lib/sync-base.yaml) repo/
try-checks 有 setup.sh 时先跑它,再把最近 5 个提交当作一次样本改动跑 checks.sh,记录结果和用时 docs/onboard/checks/
analyze 读仓库、仓库自带的文档、当前项目包和试跑结果,写项目概况和修改建议。不改仓库,也不改项目包 docs/onboard/report.md、proposals.json、proposals.md、open-questions.md
choose 列出建议,等你回复编号。没有建议时跳过(lib/choose-proposals.yaml) docs/onboard/accepted.json
apply 宿主机动作 project-apply,scope: onboard:校验、写回项目包、在 myorch-knowledge 里提交、重新同步快照。一条都没采纳时跳过 myorch-knowledge 的一个提交

try-checks:试跑检查

analyze:要弄清楚什么

方面 内容
结构 模块怎么划分,依赖关系,哪些是对外契约(接口、协议、数据库迁移),前端在哪
构建和检查 怎么构建,怎么只测受影响的部分,需要哪些私有依赖或环境;checks.sh 有没有找对模块、漏了检查、因为无关原因失败
约定 代码风格、测试写法、提交和 PR 约定,和 guide/ 里写的是否一致
风险 哪些路径的改动需要更多人审批(risk-rules.yaml 有没有漏的或误伤的),安全上要特别注意什么

你介入的地方

时机 控制台 / Slack 命令行
choose:选采纳哪几条 在对话里回复编号,或点 all、none uv run myorch reply <run> choose "1,3"

写回项目包

能改 不能改
guide/ 下的文件,可以新建 project.yaml、image/、policy.yaml、providers/、sources/
checks.sh、setup.sh checks.env(learn 能改)
risk-rules.yaml、security.md 其他文件,包括 prompts/

开发流程按项目的设置(project.yaml 的 flows.development、prompts/,见 development 的「按项目的不同」)onboard 改不了,要改时由人手改。

修改有三种写法:精确替换(edits,old 必须在文件里恰好出现一次)、追加(append)、整个文件(content)。

产物

都在工作区的 docs/onboard/ 下。

docs/onboard/
  checks/
    changed.txt        样本改动的文件
    report.md          checks.sh 的报告
    result.json        passed、failed、skipped
  report.md            项目概况和结论,每条带依据
  proposals.json, proposals.md   建议
  open-questions.md    要人回答的问题
  accepted.json        你采纳的编号

本页源文件: flows/onboard.md

片段

片段是 flows/lib/ 下可以复用的步骤或循环。流程用 use: 引用它,发起时展开。写法见使用手册 · 8. 写流程。这张表从片段文件生成。

文件类型做什么参数用它的流程
flows/lib/choose-proposals.yaml步骤列出建议,让人挑选采纳哪几条dir、whatlearn、onboard、postmortem
flows/lib/deliver.yaml步骤审批通过后推送分支,写交付说明(不调用平台 API)approveddevelopment
flows/lib/e2e.yaml循环端到端测试:项目的固定冒烟用例 +(可选)按验收标准写的用例 →(可选)fix,按轮循环直到全部通过image、profile、acceptance、base、max_rounds、fix、on_exhausted、requirement_doc、check_model、fix_modelreview
flows/lib/review-loop.yaml循环CI → 并行 reviewer + security → verify 投票 →(可选)fix,按轮循环直到没有阻塞问题base、reviewers、max_rounds、security、fix、on_exhausted、since、requirement_doc、review_model、verify_model、fix_modeldevelopment、eval、review
flows/lib/sync-base.yaml步骤克隆或更新项目仓库,切到最新的 base 分支,初始化子模块无development、onboard、sweep