omo-senpi 适配器 Live 驱动验证:DAG 依赖前沿(dependency-frontier)调度变更的隔离沙箱端到端证据

omo-senpi 适配器 Live 驱动验证:DAG 依赖前沿(dependency-frontier)调度变更的隔离沙箱端到端证据 omo-senpi 适配器 Live 驱动验证DAG 依赖前沿dependency-frontier调度变更的隔离沙箱端到端证据【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent本文讲解 omo-senpi 适配器packages/omo-senpi与packages/senpi-task在调度器语义变更时的 Live 验证方法论如何用drive.mjs驱动真实 senpi 进程在严格隔离的沙箱中加载重新生成的omo-task.js扩展包并通过resolve-evidence-dir.mjs把证据写入仓库唯一的规范目录。文章以20260825-dag-dep-frontier变更DAG 调度器以依赖前沿准入取代严格 wave 屏障为完整案例读者可借此掌握 senpi 适配器的隔离 QA 流程、结果 JSON 解读与覆盖边界判断。一、场景起点一次 DAG 调度变更为何需要 Live 验证2026-08-25 的 incidentdag_530ad299sisyphuslabs omo startup fixes PR wave暴露了 DAG 调度器的一个真实缺陷严格 wave 屏障strict barrier让 wave N1 只能等待 wave N 最慢的节点全部结束即使某个节点的依赖早已就绪也会被无关的兄弟节点阻塞。修复分支fix/dag-dep-frontier将准入语义改为依赖前沿dependency-frontier节点准入只看每个dependsOn节点是否completed 是否有空闲 resident 槽位不再等待整波静止详见变更证据 .omo/evidence/20260825-dag-dep-frontier/README.md。关键点在于调度器变更会被打进packages/omo-senpi/plugin/extensions/omo-task.jsminified 重写 build marker——重新生成的 bundle 才是调度器变更真正对外发布的表面。因此仅靠引擎级单元测试还不够必须验证真实 senpi 进程能否加载这个重新生成的 bundle且适配器在 live harness 上仍然工作。这正是本文主角——Live Senpi 驱动验证——的职责驱动脚本packages/omo-senpi/scripts/qa/drive.mjs含--self-test验证对象分支 worktree 上重新生成的omo-task.js扩展包运行方式一个真实senpi会话加载插件跑在 driver 自建的隔离沙箱中证据落盘.omo/evidence/omo-senpi-adapter/20260825-dag-dep-frontier/二、证据目录契约resolve-evidence-dir.mjs 唯一路径Live Senpi QA 的证据只能放在.omo/evidence/omo-senpi-adapter/slug/这是仓库级约定根目录AGENTS.md与 senpi-qa 技能共同指向的规范位置。手工输入的替代路径local-ignore/qa-evidence/...、临时目录、路径穿越会静默地把证据丢弃在 PR 无法引用的地方因此解析路径必须走脚本而不是约定。resolve-evidence-dir.mjs.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs只做计算 校验不创建目录ev$(node .agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs \ --repo-root $(git rev-parse --show-toplevel) --slug 20260825-dag-dep-frontier) mkdir -p $ev校验规则源码见resolveEvidenceDir与SAFE_SLUG正则/^[a-z0-9](?:-[a-z0-9])*$/约束说明repoRoot 必须是 git worktree根目录下必须存在.git否则以非零退出码拒绝slug 必须是单个相对段小写字母、数字、单连字符/、.、..、路径穿越、绝对路径全部被正则拒绝只解析不创建目录是否出现由调用方决定被拒绝的 slug 不会留下游离目录输出为绝对路径stdout 打印退出码 0 表示通过三、drive.mjs 隔离沙箱让真实 senpi 运行在受控环境3.1 沙箱结构与种子文件createSandbox()在系统临时目录mkdtempSync(join(tmpdir(), omo-senpi-qa-))下创建一整套隔离目录并用realpathSync.native解析出规范路径防止符号链接逃逸drive.mjs 中createSandbox/seedSandbox沙箱成员用途root任务专属沙箱根如.../omo-senpi-qa-GAEztsproject沙箱工作目录cwdagent隔离的 SENPI/OMO/PI coding agent 目录xdg/xdg-data/xdg-cache隔离的 XDG 三目录home隔离的 HOMEseedSandbox在 agent 目录写入两个关键文件settings.json{defaultProjectTrust: ask, packages: [pluginRoot]}——只加载被测插件包packages/omo-senpi/plugin不继承开发者的真实配置trust.json{ canonicalCwd: true }——只信任沙箱项目目录。注释源码原文特别指出omo 配置加载器从XDG_CONFIG_HOME读取用户作用域如果不隔离每条 lane 都会继承开发者真实的~/.config/omoagents 与 categories结果就不可复现。3.2 环境变量隔离与调用者目录被忽略runSenpi派生子进程时强制覆写环境变量drive.mjsOMO_CODING_AGENT_DIR / SENPI_CODING_AGENT_DIR / PI_CODING_AGENT_DIR → 沙箱 agent 目录 HOME / USERPROFILE → 沙箱 home XDG_CONFIG_HOME / XDG_DATA_HOME / XDG_CACHE_HOME → 沙箱 xdg 三目录 PI_OFFLINE1, OMO_SENPI_QA1其中最关键的行为driver 会忽略调用者通过环境变量传入的SENPI_CODING_AGENT_DIR。证据 JSON 中providedSenpiCodingAgentDir: IGNORED即表示调用者提供的目录被设计性地无视——driver 永远使用自己新建的沙箱 agent 目录因此真实的~/.senpi/agent永远不会被写入对应 SKILL.md 的黄金规则The real agent dir stays untouched。runSelfTest也会显式断言沙箱目录不等于process.env.SENPI_CODING_AGENT_DIR和process.env.XDG_CONFIG_HOME。3.3 认证根目录certification roots为了证明隔离真实有效driver 会在沙箱内预置认证根目录并做前后快照对比seedCertificationRoots/snapshotCertificationRoots沙箱 home 下的~/.senpi/agent、~/.omo/agent预置PROTECTED_STATE_FILES各文件与persistent-state.json三个 xdg 目录各写入.qa-sentinel哨兵文件。同时用snapshotProtectedState/snapshotRealObserved对真实的~/.senpi/agent与~/.omo/agent做前后快照。最终realSenpiUntouched: true只有在目录身份可用directoryIdentityAvailable()且 senpi 判定为 untouched 时才为真——注意 SKILL.md 的提醒整目录 digest 是佐证而非证明本身结论要看 changed-path / untouched 字段。四、验证流程--self-test 与 live run 的判定逻辑drive.mjs的入口分支import.meta.url判定带--self-test走runSelfTest()否则走main()。4.1--self-test先证明 harness 本身可靠runSelfTest()创建沙箱、种子化、然后断言trust.json包含规范 cwd沙箱 agent 目录不等于调用者传入的SENPI_CODING_AGENT_DIR未被复用沙箱 xdg config home 不等于调用者的XDG_CONFIG_HOME沙箱 xdg config home 确实存在不存在的目录 digest 应为absent。全部通过输出SELF-TEST OK即证据文件 drive-self-test.txt 的内容。4.2 Live run两个真实 senpi 会话main()的流程scheduler 变更验证时实际执行前置快照对真实~/.senpi/agent、~/.omo/agent做保护态与观测态快照二进制解析SENPI_BIN环境变量指定 senpi 路径若含/但文件不存在或 PATH 上找不到则结果为SKIPreason:senpi-binary-unavailable——无二进制时报 SKIP/FAIL 而不是静默降级到真实 home黄金规则会话一ultrawork 注入以senpi -e environment-receipt-entry -e mock-provider-entry -p --provider omo-mock --model mock-1 ulw please respond启动mock 脚本为steps: [{type:text, text:ultrawork scenario complete}]。判定ultraworkInjected子进程退出码为 0且沙箱 agent 目录内收集到的.json/.jsonl/.log/.md文本包含ultrawork-mode标记会话二comment-checker以write qa slop提示词驱动 mock 的write工具调用写出qa-slop.ts并通过OMO_COMMENT_CHECKER_BIN注入 comment-checker CLIresolveCommentCheckerBin用createRequire从仓库解析code-yeongyu/comment-checker/cli.js。判定commentChecker退出码 0 且沙箱文本包含comment-checker found issues in头则PASS否则FAIL找不到二进制则为SKIPPED-no-binary汇总判定result ultraworkInjected (commentChecker PASS || commentChecker SKIPPED-no-binary) ? PASS : FAIL收尾finally中rmSync(sandbox.root)删除任务专属沙箱omo-senpi-qa-*目录在运行后被清理driver 已退出不留 QA 子进程。五、结果解读drive-live.txt 逐字段本次运行的证据 JSON 见 drive-live.txt{result:PASS,ultraworkInjected:true,commentChecker:PASS,realSenpiUntouched:true,providedSenpiCodingAgentDir:IGNORED,sandboxAgentDir:.../omo-senpi-qa-GAEzts/agent,sandboxCwd:.../omo-senpi-qa-GAEzts/project}字段值含义resultPASSultrawork 注入成功且 comment-checker 通过或按设计跳过ultraworkInjectedtrue真实 senpi 会话加载插件后注入了ultrawork-modecommentCheckerPASScomment-checker 在隔离会话中工作并识别出问题realSenpiUntouchedtrue真实的~/.senpi/agent未被写入providedSenpiCodingAgentDirIGNORED调用者传入的 agent 目录被设计性忽略符合预期sandboxAgentDir.../omo-senpi-qa-GAEzts/agent沙箱内隔离的 agent 目录sandboxCwd.../omo-senpi-qa-GAEzts/project沙箱工作目录printResult完整输出还包含isolationCertified、realHomeIsolationCertified、certificationLane、realSenpiChangedPaths、observationLimits、protectedStateFiles、realHomesChecked等字段见 drive.mjs 中printResult的 payload 构造供证据 README 引用 changed-path / isolation 字段。清理观察任务专属沙箱omo-senpi-qa-GAEzts在运行后被删除driver 已退出因此本次 QA 不残留子 PID。主机上长期存在的 senpi 进程属于用户全局 omo-ai 安装~/.bun/install/global/...与本 QA 无关。六、为什么这就够了覆盖边界与省略项关联证据文档明确论证了为什么 Live 驱动证明已足够bundle 即发布表面重新生成的omo-task.js是调度器变更的对外载体真实 senpi 进程端到端加载它证明 bundle 可加载、适配器在 live harness 上仍然工作准入语义由引擎级测试证明admission 语义本身是 engine-level 的由20260825-dag-dep-frontier目录中的 failing-first 回归证明senpi-qa 路由表将 DAG state machine / runners 映射到bun test packages/senpi-task不存在专门的 live DAG-admission driverdag-gate-proof.ts只是 manager 级 start 校验——这与兄弟 PR #7320 的作用域决策一致。明确的省略项原文记录task-e2e.mjs/team-e2e.mjs未运行它们演练 task/team 引擎而本 PR 不修改该引擎DAG 通过不变的startOwned契约驱动它由bun test packages/senpi-task与消费方 gate 覆盖捕获的 JSON 中不包含任何 secrets、token 或凭据。七、配套门禁回归 RED/GREEN 与引擎级 gateLive 驱动只是证据链的一环DAG 变更本身由完整门禁矩阵支撑见 .omo/evidence/20260825-dag-dep-frontier/README.md门禁结果bun test packages/senpi-task/src/dag/scheduler-frontier.test.tspristineorigin/devRED适配后的 R2 回归在 barrier 上失败red-origin-dev.txt同一测试本分支GREENgreen-branch.txtbun test packages/senpi-task×21749 pass / 1 skip / 0 failrebased 后 1753 pass / 1 skip / 0 faildag suite 250 pass / 0 failtsgo --noEmit -p packages/senpi-task/tsconfig.json通过exit 0bun test packages/omo-senpi/src/components/task483 pass / 0 fail消费方 wiringdag tool runtimebun test packages/omo-senpi/src/bundle-size.test.ts1 pass / 0 fail重新生成的 bundle 体积node packages/omo-senpi/scripts/qa/drive.mjs--self-test{result:PASS,...,realSenpiUntouched:true}回归测试精确钉住生产症状就绪的依赖节点被无关的 running 兄弟节点饿死且是事件驱动、journal-backedwhenStarted/状态订阅无 sleep不会靠时序运气通过。值得注意的连带变化SCHEDULER_FINGERPRINT_INPUT.waveAdmission从strict-barrier迁移到dependency-frontiermanager 层、fingerprint.ts中定型——准入语义变化时指纹输入必须变化否则旧指纹下的运行不会被复用同一 key 重新提交同一定义会报definition_conflict直到 7 天保留期清理该 key。八、写在最后Live 驱动的适用边界从 .agents/skills/senpi-qa/SKILL.md 的路由表可以总结出适用范围Live driver 是 harness 证明单元测试不算 Live QA。修改适配器 wiring 时用drive.mjs快速前置条件先跑--self-test改 DAG 状态机/runner 时跑bun test packages/senpi-task单元 chaos 不变量两者各司其职。每条证据 README 都必须包含仓库统一的四段式tested / observed / why it is enough / omitted并记录 driver 的 changed-path / isolation 字段与沙箱 agent 目录路径若 driver 未自删沙箱调用方必须在写入清理回执前删除任务专属沙箱并确认子 PID 已终止。一句话总结这套方法论的核心用真实进程、隔离沙箱、可复现路径把bundle 可加载、适配器仍工作、真实 home 未被碰变成一份 reviewer 无需重跑即可审计的 JSON 证据。【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考