{"_id":"@57blocks_agb/ab-run","_rev":"3-b86f9ed56d95d25ea728cd48ce7f1486","name":"@57blocks_agb/ab-run","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"@57blocks_agb/ab-run","version":"0.0.1","license":"UNLICENSED","_id":"@57blocks_agb/ab-run@0.0.1","maintainers":[{"name":"evanliu57","email":"evan@57blocks.com"}],"bin":{"agb":"dist/cli.js"},"dist":{"shasum":"e8257e6e02f350d9c21ca3e9cf2a918cdea00325","tarball":"https://registry.npmjs.org/@57blocks_agb/ab-run/-/ab-run-0.0.1.tgz","fileCount":98,"integrity":"sha512-cq/b0Y85qdTVnTm6n5yaqhVQFKrrjZwL53YzI70iV/xQE/8a80FlvTpf9DYKTEQbXZfj8bA0p6if1w3yvZzsqg==","signatures":[{"sig":"MEUCIQDkUTixLbYhk0Hv231gwgbjVa5a1qD53lZSGwjuNbU8kwIgfbh83sfNC13TCQpiLfJoDf+IYA0c2BJEn3cUu1WI9Bo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":469467},"main":"./dist/index.js","type":"module","_from":"file:57blocks_agb-ab-run-0.0.1.tgz","types":"./dist/index.d.ts","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -b","typecheck":"tsc -b"},"_npmUser":{"name":"evanliu57","email":"evan@57blocks.com"},"_resolved":"/private/var/folders/nz/j1h1h9wd01sggb8x9jtbjzr00000gn/T/29879bbb96cbdf77e6e46d817b08e81e/57blocks_agb-ab-run-0.0.1.tgz","_integrity":"sha512-cq/b0Y85qdTVnTm6n5yaqhVQFKrrjZwL53YzI70iV/xQE/8a80FlvTpf9DYKTEQbXZfj8bA0p6if1w3yvZzsqg==","_npmVersion":"11.16.0","description":"**外层循环 —— 整套方案里唯一自研的编排。**","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@57blocks_agb/ab-core":"0.0.1","@57blocks_agb/ab-gate":"0.0.1","@57blocks_agb/ab-knowledge":"0.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ab-run_0.0.1_1788141341131_0.4494649295243587","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@57blocks_agb/ab-run","version":"0.0.2","license":"UNLICENSED","_id":"@57blocks_agb/ab-run@0.0.2","maintainers":[{"name":"evanliu57","email":"evan@57blocks.com"}],"bin":{"agb":"dist/cli.js"},"dist":{"shasum":"ed6e76a81f6967debfe29d738b4d6ea4a2513bb0","tarball":"https://registry.npmjs.org/@57blocks_agb/ab-run/-/ab-run-0.0.2.tgz","fileCount":101,"integrity":"sha512-G9pHEgIhalWjVjW+R+zM+tCTBGVlH81hn84Cm7zrnCszgLgTUZs0Y/ACIboo0sIMd5iUhbNHNtbv0n/KrgN5IA==","signatures":[{"sig":"MEQCICKTz7OHcJtEOc/cG/lsnZtfDxMxDDY+Bkca3ukQFRKDAiARheqKsmT8x6XJsSWhnTRglUyXe9Z8RwiqmWD/e4sMkA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":516232},"main":"./dist/index.js","type":"module","_from":"file:57blocks_agb-ab-run-0.0.2.tgz","types":"./dist/index.d.ts","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -b","typecheck":"tsc -b"},"_npmUser":{"name":"evanliu57","email":"evan@57blocks.com"},"_resolved":"/private/var/folders/nz/j1h1h9wd01sggb8x9jtbjzr00000gn/T/b59d5b2cdfaee8325c1b291e33b5a234/57blocks_agb-ab-run-0.0.2.tgz","_integrity":"sha512-G9pHEgIhalWjVjW+R+zM+tCTBGVlH81hn84Cm7zrnCszgLgTUZs0Y/ACIboo0sIMd5iUhbNHNtbv0n/KrgN5IA==","_npmVersion":"11.16.0","description":"**外层循环 —— 整套方案里唯一自研的编排。**","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@57blocks_agb/ab-core":"0.0.2","@57blocks_agb/ab-gate":"0.0.2","@57blocks_agb/ab-knowledge":"0.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ab-run_0.0.2_1788229875619_0.9970486424091467","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@57blocks_agb/ab-run","version":"0.0.3","license":"UNLICENSED","type":"module","main":"./dist/index.js","bin":{"agb":"dist/cli.js"},"publishConfig":{"access":"public"},"dependencies":{"@57blocks_agb/ab-core":"0.0.3","@57blocks_agb/ab-gate":"0.0.3","@57blocks_agb/ab-knowledge":"0.0.3"},"scripts":{"typecheck":"tsc -b","test":"vitest run --passWithNoTests","build":"tsc -b"},"types":"./dist/index.d.ts","_id":"@57blocks_agb/ab-run@0.0.3","description":"**外层循环 —— 整套方案里唯一自研的编排。**","_integrity":"sha512-FR0TYpdyE26RFv3DTkF3fG3O8VtMkYm4KYRS6CtRiERHpVm2esKQeRx5tTTxWZX9Kdwx9LXL2KrHUL7t7VDoTw==","_resolved":"/private/var/folders/nz/j1h1h9wd01sggb8x9jtbjzr00000gn/T/da1396715f3453a8fe509129dd0bd948/57blocks_agb-ab-run-0.0.3.tgz","_from":"file:57blocks_agb-ab-run-0.0.3.tgz","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-FR0TYpdyE26RFv3DTkF3fG3O8VtMkYm4KYRS6CtRiERHpVm2esKQeRx5tTTxWZX9Kdwx9LXL2KrHUL7t7VDoTw==","shasum":"a6dd4eef684c7e092cf36d0998660730b28cd04c","tarball":"https://registry.npmjs.org/@57blocks_agb/ab-run/-/ab-run-0.0.3.tgz","fileCount":110,"unpackedSize":653821,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCddy/ssLZrJGIfAWAS+fI7DfNY77/jzq5E4sgOd9HODAIgd5n4voVJc8K6p1IjVvxLKuDk9aAY37o0oQ/4DjDWYuM="}]},"_npmUser":{"name":"evanliu57","email":"evan@57blocks.com"},"directories":{},"maintainers":[{"name":"evanliu57","email":"evan@57blocks.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ab-run_0.0.3_1788494268068_0.4289721746025108"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-31T01:55:40.957Z","modified":"2026-09-04T03:57:48.432Z","0.0.1":"2026-08-31T01:55:41.287Z","0.0.2":"2026-09-01T02:31:15.772Z","0.0.3":"2026-09-04T03:57:48.238Z"},"license":"UNLICENSED","description":"**外层循环 —— 整套方案里唯一自研的编排。**","maintainers":[{"name":"evanliu57","email":"evan@57blocks.com"}],"readme":"# ab-run\n\n**外层循环 —— 整套方案里唯一自研的编排。**\n\n一句话分工：`ab-gate` 判断「写得对不对」，`ab-run` 决定\n**「接下来干什么、什么时候放弃」**。\n\n## 入口\n\n```bash\nagb status                  # 现在有哪些产物、缺哪个挡住了什么\nagb plan                    # 只读检查计划（+ 编码前的五条计划期门禁）\nagb run [--dry-run]         # 跑域会话循环\n       [--unattended]       # 绕过权限确认（**只在一次性容器里**）\n       [--allow-dirty]      # 带着未提交改动跑（会卷进第一个 commit）\n```\n\n> `agb` 是 [`docs/PDLC.md`](../../docs/PDLC.md) §8 缺口清单的第 1 条，第 2 周补上。\n> 在它之前这个包只是**库** —— 判定逻辑齐了、测试齐了，但没有入口把它们串成一次\n> 真实运行，而一个只能被 import 的编排层，在无人值守的那个夜里等于不存在。\n\n实测一次两任务的运行（`claude` 2.1.231）：两个任务都完成、每任务一次 commit、\n**前缀缓存命中率 80.2%**、$0.35、25 秒；随后人手改了 agent 写的那个文件，\npost-commit 记下一条 `human.correction` —— 度量 #2 的闭环第一次跑通。\n\n### 会话协议（实测，不是照文档猜的）\n\n```\n第一个任务   claude -p --session-id <uuid>\n之后的任务   claude -p --resume <uuid>\n```\n\n拿同一个 `--session-id` 调第二次会直接失败：`Session ID … is already in use.`\n这件事必须写下来，因为它的表现极具误导性 —— 域里第一个任务成功，第二个起每次都\n「失败」，于是升级阶梯被完整烧一遍，最后报出「这个任务反复失败」。\n**一个把编排缺陷伪装成模型缺陷的 bug，是这一层最贵的 bug。**\n\n## 为什么需要它\n\n因为**终止性不能靠指令获得**（方案 §2 铁律 2）。\n\n你没法在 prompt 里写「如果卡住了就停下来」——模型对「我卡住了」没有可靠的自我\n判断，它总觉得下一次就好了。所以所有「何时停止」的判断必须在**代码**里。\n\n而且必须是**纯函数 + 依赖注入**：`chat` / `verify` / `fix` 都由调用方传入，\n于是整条控制流不需要任何 LLM 往返就能被单测钉死。这也是它们能从 v1 安全移植\n过来的原因 —— v1 的注释原话是「本模块不做 LLM 调用，好让测试能在没有\nOpenRouter 往返的情况下固定行为」。\n\n## 何时停止\n\n| 机制 | 判据 | 参数（v1 实测值，**勿改**） |\n|---|---|---|\n| 5 级停滞升级 | 连续失败次数 | 1 警告 → 2 强硬 → 3 批量 → 4 **丢会话重跑** → 5 终止 |\n| 熔断器 | 同一 scope 的尝试数 | `threshold=3`（与阶梯是两套东西） |\n| PRD 评审收敛 | **身份级**进展，不是 finding 原始数 | `CLOSE_STREAK=2` `STALL_LIMIT=2` `PATIENCE=3` `MAX_FIX_BATCH=8` |\n| Deadlock Escape | blocker 停滞 2 轮 | 降级为 warning 继续，且**永不报 converged** |\n| E2E 无进展 | **确定性**失败数是否下降 | streak ≥ 2 终止 |\n| Anti-Read-Stall | 连续只读不写轮数 | 30 提示 / 50 止损 |\n| 动态预算 | 任务数 | `base + 15 × n`，clamp [20, 2000] |\n| Red-Passed-Too-Early | RED 阶段就通过的测试 | 删了重写，第二次仍通过就报告 |\n\n几个判据值得单独说，因为它们看起来可以简化，其实不行：\n\n- **收敛看「身份级」进展**：一条 finding 连续缺席**两轮**才算关闭。评审抽风漏报\n  一次不能当成修好了 —— v1 的评审工具曾在一份有缺陷的 PRD 上只报 2 项，重构后报 24 项。\n- **无进展看「确定性」失败数**：一个 flaky 测试会让「还有失败」永远成立，\n  于是循环永远不停。\n- **Deadlock Escape 之后永不报 converged**：降级把 blocker 从驱动集里摘出去，\n  账本会自然排空到 0 —— 若此时报「收敛」，就等于用逃生口重新造出了\n  `CLOSE_STREAK` 本来要防的那个虚假收敛。这条是被测试抓出来的真 bug。\n\n## 域 = 会话边界\n\n不是一个任务一个会话，是**一个业务域**一个会话。一个决策解掉三个问题：\n\n| 问题 | 域会话怎么解 |\n|---|---|\n| **接缝爆炸**（AI 之间没有走廊，不能当面吵） | 域内前后端在**同一上下文**，接缝在一个脑子里对齐 |\n| **缓存命中率低** | 域内 prompt 前缀稳定，第 2 个任务起命中前缀缓存 |\n| **上下文累积退化** | 跨域换新会话；Fresh-eyes 成为默认状态 |\n\n域之间靠 `_contracts/` **物化**，不靠沟通。\n\nPrompt 分 6 层，顺序按「越稳定越靠前」排（缓存友好）：\nSkills → 项目约定 → 契约 → 文件清单 → 当前任务 → **升级指令放最后**\n（它每轮都变，放前面会把后面的一切踢出前缀缓存）。\n\n## Skill 条件注入\n\n`selectSkills()` 按 `StackProfile` 决定注哪几包，三条纪律：\n\n- **探不到不注** —— Vue 项目拿不到 React 的规则\n- **谓词看不懂不注**（fail closed）—— 索引比代码旧时，静默注入语义未知的规则更危险\n- **同维度多包报 conflict，但不替调用方决定** —— monorepo 里 react + vue 同时\n  存在是合法的，该注哪包取决于任务碰哪些文件，而这个函数不知道\n\n栈探测复用 `ab-gate` 的实现，不自己再探一遍：两套探测必然分叉，\n而门禁与注入对「这个项目是什么栈」看法不一致是最难查的一类问题。\n\n## 长程无人值守的四个开关\n\n跑在一次性容器里，不在同事开发机上：\n\n1. 每任务预算上限 —— 超 N 次即标失败、跳过、继续\n2. 全局熔断 —— 连续 M 个任务失败即停机（通常是上游出了问题）\n3. **每任务一次 commit** —— 最重要。任何时刻挂掉前面成果都在，早上看 git log 能精确定位\n4. 成本硬上限\n\n目标不是「一晚 20 万行」（行数是可作弊指标），而是：\n**早上拿到 build 通过、测试绿灯、能启动、核心流程跑通的仓库，人接手最后 10–20%。**\n\n## 相关文档\n\n- [`docs/PLAN.md`](../../docs/PLAN.md) §4.3 Workflow 清单 · §5 域会话执行模型\n- [`docs/PDLC.md`](../../docs/PDLC.md) §6 编排层的目标形态与缺口\n","readmeFilename":"README.md"}