@haiyangbg/buildbeat 1.20.0 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -7
- package/README.en.md +6 -4
- package/README.md +6 -4
- package/SKILL.md +33 -2
- package/bin/buildbeat-v2.js +6 -0
- package/docs/BuildBeat v2/357/274/232AI /345/216/237/347/224/237/350/275/257/344/273/266/344/272/244/344/273/230/346/216/247/345/210/266/345/271/263/351/235/242.md" +2053 -0
- package/docs/CAPABILITY-MATRIX.md +4 -4
- package/docs/CLI.md +6 -6
- package/docs/EXECUTION-PLAN.md +9 -9
- package/docs/PHASE4-STABILITY-AUDIT-2026-08-25.md +10 -8
- package/docs/PHASE4-V1.20-PILOT-2026-08-25.md +4 -0
- package/docs/RELEASING.md +6 -6
- package/docs/ROADMAP.md +16 -14
- package/docs/V1.21-RELEASE-EVIDENCE-2026-08-25.md +55 -0
- package/docs/V2-D2-DECISION-CARD.md +37 -0
- package/docs/V2-DECISIONS.md +11 -0
- package/docs/V2-ITERATION-01.md +60 -0
- package/docs/V2-ITERATION-02.md +32 -0
- package/docs/V2-ITERATION-03.md +30 -0
- package/docs/V2-ITERATION-04.md +29 -0
- package/docs/V2-ITERATION-05.md +20 -0
- package/docs/V2-ITERATION-06.md +18 -0
- package/docs/V2-ITERATION-07.md +36 -0
- package/docs/V2-PLAN.md +333 -0
- package/docs/V2-PROPOSAL.md +319 -0
- package/docs/WP4.3-RELEASE-EVIDENCE-2026-08-25.md +73 -0
- package/docs/v2/M1-ACCEPTANCE-2026-08-28.md +38 -0
- package/docs/v2/M2-DOD-2026-08-28.md +34 -0
- package/docs/v2/M4-CHICKAI-PILOT-2026-08-28.md +44 -0
- package/docs/v2/M4-EXTERNAL-PILOT-2026-08-28.md +46 -0
- package/docs/v2/M4-SELFHOST-2026-08-28.md +53 -0
- package/docs/v2/RFC-0001-product-definition.md +92 -0
- package/docs/v2/RFC-0002-domain-model.md +149 -0
- package/docs/v2/RFC-0003-workflow-policy.md +204 -0
- package/docs/v2/SPEC-0001-events-v1.md +98 -0
- package/docs/v2/guide/01-quickstart.md +92 -0
- package/docs/v2/guide/02-workflow-guide.md +42 -0
- package/docs/v2/guide/03-policy-guide.md +53 -0
- package/docs/v2/guide/04-adapter-guide.md +45 -0
- package/docs/v2/guide/05-worker-contract.md +37 -0
- package/docs/v2/guide/06-evidence-guide.md +38 -0
- package/docs/v2/guide/07-approval-guide.md +34 -0
- package/docs/v2/guide/08-migration-v1.md +68 -0
- package/docs/v2/guide/09-security-boundaries.md +28 -0
- package/docs/v2/guide/10-recovery.md +55 -0
- package/docs/v2/guide/README.md +18 -0
- package/example/.buildbeat/manifest.json +3 -3
- package/example/BUILDBEAT.md +1 -1
- package/example/README.md +22 -0
- package/lessons.md +8 -0
- package/package.json +4 -2
- package/src/constants.js +4 -1
- package/src/project.js +6 -1
- package/src/v2/adapters/mock.js +67 -0
- package/src/v2/adapters/shell.js +78 -0
- package/src/v2/cli/run.js +494 -0
- package/src/v2/domain/event-registry.js +100 -0
- package/src/v2/domain/model.js +61 -0
- package/src/v2/engine/reducer.js +253 -0
- package/src/v2/engine/risk-preset.js +48 -0
- package/src/v2/engine/workflow.js +201 -0
- package/src/v2/engine/yaml-subset.js +194 -0
- package/src/v2/evidence/collector.js +63 -0
- package/src/v2/observe/observe-config.js +194 -0
- package/src/v2/observe/observe-reducer.js +117 -0
- package/src/v2/observe/observe.js +420 -0
- package/src/v2/policy/policy.js +302 -0
- package/src/v2/presets/observe.yaml +45 -0
- package/src/v2/presets/policies/ui-render-gate.yaml +13 -0
- package/src/v2/presets/risk/controlled.yaml +39 -0
- package/src/v2/presets/risk/fast.yaml +19 -0
- package/src/v2/presets/risk/legacy-four-gates.yaml +44 -0
- package/src/v2/presets/risk/standard.yaml +28 -0
- package/src/v2/presets/software-delivery.yaml +39 -0
- package/src/v2/runtime/decisions.js +288 -0
- package/src/v2/runtime/metrics.js +140 -0
- package/src/v2/runtime/orchestrator.js +754 -0
- package/src/v2/runtime/run-record.js +55 -0
- package/src/v2/storage/event-ledger.js +154 -0
- package/src/v2/workspace/workspace-manager.js +137 -0
- package/templates/AGENTS.md +21 -0
- package/templates//346/214/207/346/214/245/345/217/260.md +23 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# v2 迭代 04:M2 自动修复环
|
|
2
|
+
|
|
3
|
+
> 状态:**已完成——M2 于 2026-08-28 核验 18/20 通过**(2 项 `PARTIAL` 挂 M3;核验表:[`v2/M2-DOD-2026-08-28.md`](v2/M2-DOD-2026-08-28.md))
|
|
4
|
+
> 上游:[`V2-PLAN.md`](V2-PLAN.md) §8 M2;M1 验收:[`v2/M1-ACCEPTANCE-2026-08-28.md`](v2/M1-ACCEPTANCE-2026-08-28.md)
|
|
5
|
+
> 时间盒:**≤3 周**;授权边界沿用 `V2-D2=A`(仅本地 `v2` 分支,不含 push/merge/发布/部署/生产)
|
|
6
|
+
|
|
7
|
+
## 迭代目标
|
|
8
|
+
|
|
9
|
+
MVP 核心承诺在此达成:**给 BuildBeat 一个已批准的目标和计划,它会自动完成 Build–Verify–Fix–Review 循环,并携带完整证据停在合并决定前。** 验收 = 报告 B §20 的 20 条 MVP DoD 逐条通过。
|
|
10
|
+
|
|
11
|
+
## 任务清单
|
|
12
|
+
|
|
13
|
+
- [x] **T1 Worker 输出信封 v0**:adapter 经 `BUILDBEAT_OUTPUT` 提供信封文件路径;Worker 写 JSON(status/findings);信封非法即 `invalid-output`,fail-closed(`v2-review-loop` 第 3 例)。
|
|
14
|
+
- [x] **T2 Review 闭环**:review 步消费信封 findings;P0/P1 → `findings-blocking` 边回 Fix(POLICY 结果 ROUTE);Reviewer **只读强制**(步前后 workspace 回读比对,写入即 BLOCK 停人);findings 落 Evidence(kind review)。测试 `tests/v2-review-loop.test.js`。
|
|
15
|
+
- [x] **T3 决策运行时**:`src/v2/runtime/decisions.js` + CLI `inbox`/`approve`/`reject`——approve 前重验 subject 新鲜度(candidate 变了就刷新请求而不是盖章);决策同时落 `DECISION_RECORDED` 事件与 `delivery/work/<id>/decisions.jsonl`;final-decision 批准 → `RUN_TERMINAL SUCCEEDED` + 压实(merge 本身仍是人工外部动作)。测试 `tests/v2-approval.test.js`。
|
|
16
|
+
- [x] **T4 F6 运行时关闭**:批准后 candidate/plan 变化 → resume 时机器检出 → `APPROVAL_STALE` → 回 `WAITING_HUMAN`;stale 请求的重批先刷新 subject 再绑定新对象;批准后干净恢复则跳过已批边界继续驱动(`v2-approval` 第 1/2 例)。
|
|
17
|
+
- [x] **T5 Intent/Plan 读取**:run 启动读取 work 目录 intent/plan 并 pin digest 进 RUN_CREATED 与 Approval subject(`v2-mvp-loop` 断言 planDigest 贯穿到 final-decision subject)。
|
|
18
|
+
- [x] **T6 预埋 Bug 自动修复端到端**:真实测试项目 fixture——builder 提交带 bug 候选 → verify 真实红 → fixer 修复 → verify 绿 → review 只读通过 → 停在合并前 → approve 终态 + 压实 + ledger 重放一致(`tests/v2-mvp-loop.test.js`)。
|
|
19
|
+
- [x] **T7 MVP DoD 20 条逐条核验**:[`v2/M2-DOD-2026-08-28.md`](v2/M2-DOD-2026-08-28.md)——18/20 通过;#1(plan 的"被接受"强制)与 #20(coverage 纪律)标 `PARTIAL` 挂 M3,属 M3 Policy Engine 既定范围。
|
|
20
|
+
|
|
21
|
+
## 实现口径
|
|
22
|
+
|
|
23
|
+
- workflow step 新增 `readonly` 字段(schema additive 演进;正式 JSON Schema 文件仍按 WP1.1 后补);官方预设 review 步 `readonly: true`。
|
|
24
|
+
- `HUMAN_REQUESTED` data 新增 `kind`(`boundary` / `final-decision`;additive);`RUN_CREATED` data 新增 `planDigest` / `intentDigest`(additive)。SPEC-0001 信封与既有必填集不变。
|
|
25
|
+
- 继续零运行时依赖 + `node --test`。
|
|
26
|
+
|
|
27
|
+
## 完成定义
|
|
28
|
+
|
|
29
|
+
T7 的 DoD 核验表全绿(或逐条标注去向)并留证据;`V2-PLAN.md` §8 M2 标记完成后进入 M3(治理硬化)。**已于 2026-08-28 达成**:18/20 ✓,#1/#20 `PARTIAL` 且去向明确(M3 Policy Engine);MVP 核心承诺由 `tests/v2-mvp-loop.test.js` 端到端复现。进入 M3。
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# v2 迭代 05:M3 治理硬化
|
|
2
|
+
|
|
3
|
+
> 状态:**已完成**(2026-08-28;M2 DoD #1 复核为 ✓,#20 收窄为仅剩 coverage 字段纪律挂 M4)
|
|
4
|
+
> 上游:[`V2-PLAN.md`](V2-PLAN.md) §8 M3;M2 核验:[`v2/M2-DOD-2026-08-28.md`](v2/M2-DOD-2026-08-28.md)(#1/#20 PARTIAL 在本迭代关闭)
|
|
5
|
+
> 时间盒:**≤2 周**;授权边界沿用 `V2-D2=A`(仅本地 `v2` 分支,不含 push/merge/发布/部署/生产)
|
|
6
|
+
|
|
7
|
+
## 任务清单
|
|
8
|
+
|
|
9
|
+
- [x] **T1 Policy Engine**:`src/v2/policy/policy.js`——解析 fail-closed(未知算子/字段/类型拒绝);算子 `all/any/not`、`evidence.exists{kind,minGrade}`、`artifact.accepted`、`attempts.lt`、`budget.remaining`、`candidate.clean`、`human.approved`、`finding.maxSeverity`;三值逻辑,`UNVERIFIED` 永不当 PASS(`tests/v2-policy.test.js`)。
|
|
10
|
+
- [x] **T2 四类接线**:pre/post 进 orchestrator(fail → WAIT_HUMAN,`onFail: BLOCK` → 终态;`ADVISORY` 只记录);transition 在 approve 时强制——`LOCAL_ENFORCED` 不满足即拒绝盖章并留 POLICY_EVALUATED 审计,`ADVISORY` 仅随结果警告;action 由 T3 能力剥离承担(`tests/v2-governance.test.js`)。
|
|
11
|
+
- [x] **T3 Protected Actions 真实强制**:① Shell Adapter 默认**环境变量白名单**(宿主凭据 env 不达 Worker,`inheritEnv: true` 显式 opt-in 且 doctor 警告);② workspace 创建时对全部 remote 设 worktree 级 `pushurl=protected://…`(worktree 内 push 直接失败,主检出不受影响);merge/deploy/publish 内核无调用路径(不变量 20)。
|
|
12
|
+
- [x] **T4 artifact.accepted + accept 命令**:接受即绑定文件 digest 的决策落 `decisions.jsonl`;工件再改动接受即 stale,重新接受重新绑定(关闭 DoD #1;`v2-policy` + `v2-governance` 第 1 例)。
|
|
13
|
+
- [x] **T5 Risk Preset ×4**:`src/v2/presets/risk/{fast,standard,controlled,legacy-four-gates}.yaml` + 加载器;四预设全部保留人工合并门 + 证据地板;legacy 映射 G1→intent 接受、G2→plan 接受 + build 前人批、G3→合并决定、G4→超出 MVP(`tests/v2-risk-presets.test.js`)。
|
|
14
|
+
- [x] **T6 UI 真渲染 Gate**:`src/v2/presets/policies/ui-render-gate.yaml`(approval 前必须存在带 digest 的 screenshot 证据);approve 侧强制验证(`v2-governance` 第 2 例,不变量 22)。
|
|
15
|
+
- [x] **T7 doctor 强制等级报告**:逐条 Policy 报告声明 vs 实际等级;`SERVER_ENFORCED` 一律报"本地不可验证,不宣称";Worker env 模式与推送保护状态一并报告(CLI e2e 断言)。
|
|
16
|
+
- [x] **T8 events / replay 补全**:`events`(台账列印 + 损坏警告)与 `replay`(digest/prev/seq 链校验 + 派生状态摘要)(CLI e2e 断言)。
|
|
17
|
+
|
|
18
|
+
## 完成定义
|
|
19
|
+
|
|
20
|
+
上述能力各有测试;M2 DoD #1/#20 复核为 ✓;`V2-PLAN.md` §8 M3 标记完成后进入 M4(evals、度量与试点)。**2026-08-28 达成**:T1–T8 全绿(v2 套件 58 项);DoD #1 已 ✓(digest 绑定接受 + staleness);#20 的 M3 部分(grade 地板 + `UNVERIFIED` 门控)已 ✓,coverage 字段纪律按原计划随 M4 evals 落地。进入 M4。
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# v2 迭代 06:M4 evals、度量与试点
|
|
2
|
+
|
|
3
|
+
> 状态:**已完成——M4 于 2026-08-28 关闭**。外部试点项目数 2(ruoyi-ai + chickAI),D6 原文口径满足;六退出指标全部达标(试点 Run 自动到达率 4/4)。第二项目证据:[`v2/M4-CHICKAI-PILOT-2026-08-28.md`](v2/M4-CHICKAI-PILOT-2026-08-28.md)(含完整 Build–Verify–Fix–Review 闭环实战:reviewer 阻断 → codex fixer → 二轮全绿)
|
|
4
|
+
> 上游:[`V2-PLAN.md`](V2-PLAN.md) §8 M4;M3 收尾:[`V2-ITERATION-05.md`](V2-ITERATION-05.md)
|
|
5
|
+
> 时间盒:**≤3 周**;授权边界沿用 `V2-D2=A`(仅本地 `v2` 分支;self-host 试点 Run 停在 `WAITING_HUMAN`,不 merge、不 push)
|
|
6
|
+
|
|
7
|
+
## 任务清单
|
|
8
|
+
|
|
9
|
+
- [x] **T1 确定性套件补洞(WP5.1)**:Scope 越界即停(`allowedPaths`,越界不 pin candidate、`workspace.scope` BLOCK 落账);仓库级单活动 Run 锁;Adapter 故障路径 timeout/crash/spawn-error 端到端(`tests/v2-invariants.test.js`)。
|
|
10
|
+
- [x] **T2 行为 evals 九目录(WP5.2)**:[`evals/`](../evals/README.md) 九场景卡 + 机器检查全部进 `tests/v2-evals.test.js`(`npm test` 单入口);每次真实事故收敛后在此追加永久回归。
|
|
11
|
+
- [x] **T3 `metrics` v0**:本地只读,从 ledger 派生——终态分布、自动到达 `WAITING_HUMAN` 率、fix 轮次分布、人批等待、证据完整率、stale/预算计数;`--json` 可选(`tests/v2-metrics.test.js`)。
|
|
12
|
+
- [x] **T4 Self-host 试点**:`RUN-SELF-001` 在本仓库真实跑通 build→verify(真实测试)→只读 review→停在合并决定,28 事件链校验通过;真实 remote 上实测推送保护生效;**试点抓到并修复一个真实缺陷**(YAML 子集引号标量误判)。证据:[`v2/M4-SELFHOST-2026-08-28.md`](v2/M4-SELFHOST-2026-08-28.md);Run 留在 inbox 待项目所有者处置。
|
|
13
|
+
- [x] **T5 外部试点**:所有者点名真实需求 `LXJ-AUTH-CLI-DW-01`(ruoyi-ai 单仓,"文档 web 页面理解为 UI")——`RUN-CLI-DW-01` 由 **codex CLI 经 Shell Adapter** 全自动 5.2 分钟到合并决定:15 文件候选全在范围内、JDK17 全量 + portal 测试一次全绿、只读 review 零 findings、portal 页真渲染截图证据在册;停在 inbox 待所有者。证据:[`v2/M4-EXTERNAL-PILOT-2026-08-28.md`](v2/M4-EXTERNAL-PILOT-2026-08-28.md)。**D6 口径(1 项目双验收面 vs ≥2 项目)待所有者定夺后 M4 正式关闭。**
|
|
14
|
+
- [x] **T6 M4 退出指标核验**:六指标表见 [`v2/M4-SELFHOST-2026-08-28.md`](v2/M4-SELFHOST-2026-08-28.md) §4——五项达标;"试点 Run 自动到达率"分母仅 self-host(1/1),外部试点部分如实标 `UNVERIFIED` 待 T5 回填。
|
|
15
|
+
|
|
16
|
+
## 完成定义
|
|
17
|
+
|
|
18
|
+
T1–T4 全绿 + T6 核验表(外部试点相关行允许 `UNVERIFIED` 并注明等待 T5);T5 完成后回填指标,`V2-PLAN.md` §8 M4 标记完成后进入 M5。
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# v2 迭代 07:M5 闭环起步、迁移与 Beta
|
|
2
|
+
|
|
3
|
+
> 状态:**beta-ready**(2026-08-28 开工并完成 T1–T4;T5 发布等待所有者单独授权)
|
|
4
|
+
> 上游:[`V2-PLAN.md`](V2-PLAN.md) §8 M5;M4 收尾:[`V2-ITERATION-06.md`](V2-ITERATION-06.md)
|
|
5
|
+
> 时间盒:**≤3 周**;授权边界沿用 `V2-D2=A`(仅本地 `v2` 分支,不含 push、merge、tag、部署);**`npm publish 2.0.0-beta.1` 是独立生产动作,须所有者单独授权后执行**
|
|
6
|
+
|
|
7
|
+
## 任务清单
|
|
8
|
+
|
|
9
|
+
- [x] **T1 observe v0(RFC-0003 §8 冻结契约的实现)**:
|
|
10
|
+
- `observe.yaml` 解析与校验(yaml-subset,fail-closed;bands 固定 log/diagnose/intent 三层,`triage.actions` 固定,`dismissFeedback: bands`);
|
|
11
|
+
- Provider 执行(单周期 `observe run`;调度 v0 交给宿主 cron,见边界)→ 产出满足 Evidence Contract 的记录(采不到即 `unverified`,永不静默)→ 复用 `EVIDENCE_RECORDED` 进独立 observe 台账(同一 EventLedger 机制,链校验一致);
|
|
12
|
+
- bands 分层:log(只落账)→ diagnose(触发配置的**只读**诊断命令,产出 `diagnosis` 证据)→ intent(**草稿**入队 Git 面 `delivery/observe/intents/`,绝不自动执行);
|
|
13
|
+
- 人分诊 `observe triage`:fix_now / schedule / dismiss;**dismiss 回调 bands**——同指纹被 dismiss 后不再重复出 intent 草稿(除非严重度升级),分诊终态写在 Git 面草稿文件里(不变量 23:删 runtime 不丢分诊记忆);
|
|
14
|
+
- 新事件类型 additive 注册(SPEC-0001 演进规则):`BAND_TRIGGERED` / `INTENT_DRAFTED` / `TRIAGE_RECORDED`;
|
|
15
|
+
- 测试:配置 fail-closed、unverified 传导、band 路由、intent 只入队不执行、dismiss 反馈、runtime 可删。
|
|
16
|
+
- [x] **T2 v1→v2 迁移 runbook(半天手工,WP6.2 原则)**:只读分析 v1 → 草稿 → 人工确认活动 Work → 冻结旧看板 → 新工作只进 v2 → 归档不双写 → 一个真实 Run 后才正式切换;装机量 N=1,不写 importer 工具。→ [`guide/08-migration-v1.md`](v2/guide/08-migration-v1.md)
|
|
17
|
+
- [x] **T3 文档十件套(WP6.3)**:快速开始 / Workflow 编写 / Policy / Adapter / Worker 合同 / Evidence / Human Approval / v1 迁移(=T2)/ 安全与权限边界 / 故障恢复,落 [`docs/v2/guide/`](v2/guide/README.md)。
|
|
18
|
+
- [x] **T4 Beta 打包准备**:`package.json` 版本 `2.0.0-beta.1`、`bin/buildbeat-v2.js` 入口、`files` 覆盖 `src/v2/`、`pack:check` 通过、v1 全套测试保持绿(v1 只冻结不删除,`latest` 不动)。文档一致性守卫(`tests/check_docs.py`)教会识别 prerelease 版本号(additive),教学快照/CLI 契约/RELEASING 版本联动完成。
|
|
19
|
+
- [ ] **T5 发布 `@haiyangbg/buildbeat@2.0.0-beta.1`(dist-tag `next`)**:**等待所有者单独授权后执行**。
|
|
20
|
+
|
|
21
|
+
## 完成定义
|
|
22
|
+
|
|
23
|
+
T1 测试全绿并入 `npm test` 单入口;T2/T3 文档齐十件且互链自洽;T4 `pack:check` 与全套测试通过;T5 授权前 M5 停在"beta-ready",授权后发布并回填证据。
|
|
24
|
+
|
|
25
|
+
## 进展(2026-08-28)
|
|
26
|
+
|
|
27
|
+
- **T1**:`src/v2/observe/`(config fail-closed / runner / reducer / triage)+ 3 个 additive 事件类型(`BAND_TRIGGERED`/`INTENT_DRAFTED`/`TRIAGE_RECORDED`,`EVIDENCE_RECORDED` 复用即"同一 Evidence Contract 与台账"的冻结语义);`EventLedger` reducer 可插拔(additive,默认行为不变);`tests/v2-observe.test.js` 8 项覆盖 fail-closed/unverified 传导/band 路由/只入队/dismiss 反馈/不变量 23/链纪律。全量 `npm test` **139/139 绿**(观测新增前 131,零回归)。
|
|
28
|
+
- **Self-host 试点**:本仓库真实接入([`.buildbeat/observe.yaml`](../.buildbeat/observe.yaml),探针=`tests/check-docs.sh` 文档漂移守卫)——cycle 1 真实跑通,`docs-drift: passed` 证据入账(`EVIDENCE_RECORDED`,digest 在 observe 台账),无误报、无草稿。
|
|
29
|
+
- **T4 核验**:`check:docs` 162 文件全绿;`pack:check` 出包 `2.0.0-beta.1`(141 文件);`buildbeat-v2` bin 冒烟通过(usage / observe 三子命令 / 错误路径)。
|
|
30
|
+
- **T5 未做**:`npm publish` 是生产动作,等待所有者授权(届时 `prepublishOnly` 会再整套跑一遍作为发布门)。
|
|
31
|
+
|
|
32
|
+
## v0 边界(如实声明)
|
|
33
|
+
|
|
34
|
+
- Provider `schedule` 字段按冻结 schema 解析并落账,但 v0 不内置调度器——周期运行由宿主(cron / CI / 手动)反复调 `observe run` 实现;
|
|
35
|
+
- diagnose 层 v0 执行配置的只读诊断命令(env 白名单继承 Shell Adapter 纪律),不是完整 fresh-context Agent Worker;
|
|
36
|
+
- fix_now / schedule 的后续(把接受的 Intent 带进 `software-delivery` Run)v0 由人工发起,CLI 打印建议命令。
|
package/docs/V2-PLAN.md
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# BuildBeat v2 终版规划:工件协议 × 确定性内核 × 可恢复 Agent Loop
|
|
2
|
+
|
|
3
|
+
> 文档状态:**正式执行基线**(2026-08-27,项目所有者已拍板 `V2-D0=B`;决策见 [`V2-DECISIONS.md`](V2-DECISIONS.md))
|
|
4
|
+
> 基线日期:2026-08-27
|
|
5
|
+
> 合并来源:报告 A([`V2-PROPOSAL.md`](V2-PROPOSAL.md),产品/方向层)× 报告 B([《BuildBeat v2:AI 原生软件交付控制平面》](BuildBeat%20v2%EF%BC%9AAI%20%E5%8E%9F%E7%94%9F%E8%BD%AF%E4%BB%B6%E4%BA%A4%E4%BB%98%E6%8E%A7%E5%88%B6%E5%B9%B3%E9%9D%A2.md),运行时工程层)
|
|
6
|
+
> 合并原则:**"为什么做、做成什么样"以 A 为准;"引擎怎么造"以 B 为准**;两者冲突处在 §2 逐条裁决并给理由。
|
|
7
|
+
> 收尾修订:纳入盲点复盘的三处修正(§2 末「收尾修正」)——**M-1 人肉内核试点先于一切**、**组装优先于自研**、范围裁剪与新增风险。第一个迭代已就绪:[`V2-ITERATION-01.md`](V2-ITERATION-01.md) + 试点套件 [`pilot/`](../pilot/README.md)。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 0. 一页结论
|
|
12
|
+
|
|
13
|
+
### 定位语
|
|
14
|
+
|
|
15
|
+
> **BuildBeat v2 是一个工件驱动的 AI 交付闭环。确定性内核按 Workflow 与 Policy 推进状态,外部 Agent 作为 Worker 执行计划、构建、验证、修复与审查;一切完成以 Runner 回读的真实证据为准;人只在不可委托的判断点被请求最小决策。协议(工件 + 证据 + 决策)永远人机可读、落在 Git——Runner 是引擎,不是协议存在的前提。**
|
|
16
|
+
|
|
17
|
+
### 产品公式(采纳 B)
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
BuildBeat v2
|
|
21
|
+
= Artifact Protocol(工件协议,Git 中,人机可读)
|
|
22
|
+
+ Deterministic Kernel(状态机 / 事件 / Policy,不解释自然语言)
|
|
23
|
+
+ Agent Loop Runtime(调度 / 重试 / 预算 / 恢复)
|
|
24
|
+
+ Execution Adapters(Mock / Shell / 专用 Agent,厂商中立)
|
|
25
|
+
+ Evidence Ledger(回读证据,不信自然语言声明)
|
|
26
|
+
+ Human Escalation(最小决策请求 + 精确绑定的 Approval)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### MVP 核心承诺(采纳 B,原文保留)
|
|
30
|
+
|
|
31
|
+
> **给 BuildBeat 一个已批准的目标和计划,它会自动完成 Build–Verify–Fix–Review 循环,并携带完整证据停在合并决定前。**
|
|
32
|
+
|
|
33
|
+
### v1 → v2 关键变化
|
|
34
|
+
|
|
35
|
+
| 维度 | v1 | v2 终版 |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| 节拍器 | 人 | Orchestrator(人只保留拍板者角色) |
|
|
38
|
+
| Gate | 固定四个,看板令牌,事后检查 | Policy 附着在任意状态转换与危险动作上,行动时裁决,六值结果 |
|
|
39
|
+
| 阶段 | 写死在协议里 | **内核阶段无关**;`plan/build/review` 等由 Workflow 预设定义 |
|
|
40
|
+
| 状态 | 手写 NOW/看板/status | 事件派生;手写状态文件全部废除 |
|
|
41
|
+
| Approval | `Gate3: passed` 文字令牌 | 绑定 transition + candidate + digest,对象一变自动失效 |
|
|
42
|
+
| 完成证据 | 会话自报 + bus-check 抽查 | Runner 回读命令退出码 / Git / 报告,自然语言不算证据 |
|
|
43
|
+
| Skill-only | 与 CLI 完整等价 | **协议等价保留,自动化等价取消**(见 §5) |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 1. 为什么合并,而不是二选一
|
|
48
|
+
|
|
49
|
+
两份报告单独执行都会失败,且失败方式互补:
|
|
50
|
+
|
|
51
|
+
- **只按 A 做**:产品方向正确但运行时欠设计。"Runner 零私有状态、一切在 git"在锁、重试计数、会话信息这类高频运行态上不成立,开工两周内必然返工;没有 Approval 过期模型、没有失败指纹和无进展检测、没有 Worker 输入输出合同——自动 Loop 的安全性全靠"到时候再说"。
|
|
52
|
+
- **只按 B 做**:工程蓝图精良但产品层有三个盲区。① 默认 Workflow 是 Intent→Plan→Build,**没有 spec/设计阶段**——v1 单项目最大成本来源(lessons #3:静态稿拍板→返工螺旋)会原样复发;② 全盘取消 Skill-only 等价、宣布手工模式为降级兼容,把 v1 最有价值的护城河(协议不依赖任何安装、任何厂商即可用)一并扔掉;③ Kernel-first 的推进顺序(前 4–5 周只有模拟器可看)对单人项目的动力学很危险,且没有度量、observe 闭环只有一个名字。
|
|
53
|
+
|
|
54
|
+
合并的分工一句话:**B 造引擎,A 定方向和护城河。**
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 2. A/B 冲突裁决表
|
|
59
|
+
|
|
60
|
+
| # | 冲突点 | A 的主张 | B 的主张 | 终版裁决 | 理由 |
|
|
61
|
+
|---|---|---|---|---|---|
|
|
62
|
+
| 1 | 运行时状态放哪 | 全在 git,Runner 零私有状态 | 双平面:工件在 git,运行态在 `.buildbeat/runtime/` | **B**,加一条 A 精神的硬约束:runtime 目录可整体删除,只丢进行中 Run,不丢任何已接受事实 | 锁/重试/会话逐条 commit 进 git 不现实;但"删 runtime 无损"保住了 git 作为唯一长期真相 |
|
|
63
|
+
| 2 | 阶段是否进内核 | 六工件闭环是核心模型 | 内核只认通用 Run/Step 状态,业务阶段由 Workflow 定义 | **B**;A 的六工件降级为官方默认预设 `software-delivery` 的内容 | A 在这点上重复了 v1 写死四 Gate 的错误;阶段可配置才对得起"Gate 可增删改"的前提 |
|
|
64
|
+
| 3 | spec/设计阶段 | 保留,UI 项目强制真渲染拍板 | 默认流程无 spec | **A**:默认预设含可选 spec 步;UI 项目的 spec approval 对象必须包含可渲染入口 + 截图 digest | lessons #3 是 v1 付出代价最大的教训,不能因为换架构就重新交一次学费 |
|
|
65
|
+
| 4 | Skill-only / 手工模式 | 双驱动模式,工件不可区分 | 取消等价,手工是降级兼容 | **折中,偏 A**:把 v1 的一个承诺拆成两个——**协议等价保留**(工件人手可写可读、attended 会话是一等公民、任何 AI 工具可参与),**自动化等价取消**(没有 Runner 就没有调度/重试/恢复,不假装有) | 协议中立是 BuildBeat 区别于厂商 runtime 的生存位;B 的诚实(自动能力无法无 runtime 等价)也该保留 |
|
|
66
|
+
| 5 | 首个 Adapter | 直接绑日常主力工具 | Mock + Shell 先行,专用 Adapter 后置 | **B** | Shell Adapter 配置化后本来就能驱动 `claude -p` / `cursor-agent`,A 的目标经由 B 的路径达成,还不绑厂商(lessons #15) |
|
|
67
|
+
| 6 | observe / 生命周期闭环 | 现在就设计(bands.yaml、自动 intent) | 点名为后续版本,无设计 | **折中**:实现推后到 M5 起步,但**接口现在冻结**——drift-check/live-status 定义为 Evidence Provider,bands 分层响应进 RFC | 不提前设计,M5 时会发现内核缺事件入口;提前实现则 MVP 失焦 |
|
|
68
|
+
| 7 | 度量 | git 派生指标进范围 | 缺席(仅 M5 有验收指标) | **A**:`buildbeat metrics` 本地只读,六指标起步;B 的 M5 指标表并入验收 | lessons #8(没数据就永远在"精密地做不重要的事");文章的度量纪律不需要遥测服务 |
|
|
69
|
+
| 8 | 里程碑顺序 | 纵切优先,每段止损 | Kernel-first,M3 才见真实 Loop | **折中,偏 A 的顺序 + B 的内容**:events.jsonl 格式 day-1 冻结(事后补事件溯源最痛),但 replay/simulator 打磨推后;M1 就出真实项目可跑的纵切 | 单人项目最大风险是 B 自己列的"长期停留在架构设计";纵切早见价值 + ledger 格式先冻结,两头都保 |
|
|
70
|
+
| 9 | 定位词 | 工件驱动闭环 | AI 原生交付控制平面 | **对外用"交付闭环/控制面"皆可,产品之魂写明是协议** | 运行时正被厂商商品化(Claude Code hooks、Cursor 云 agent、GitHub agentic workflow);协议 + 参考实现才是可防守的位置,纯 orchestrator 是和厂商正面对撞 |
|
|
71
|
+
| 10 | 时间线 | 8–14 周 | 15 周 | **5–15 周,由 M-1 结论决定**(见收尾修正一),每个里程碑带独立止损 | 两边估计都按单人 + AI 辅助;取重排后的现实值 |
|
|
72
|
+
|
|
73
|
+
### 收尾修正(2026-08-27 盲点复盘后追加)
|
|
74
|
+
|
|
75
|
+
A/B 两份报告共享三个盲区,本节修正对合并结论生效:
|
|
76
|
+
|
|
77
|
+
1. **修正一:验证顺序倒置。** v1 的每个零件蒸馏自实践(19 条 lessons),而 v2 此前的全部工程决策只有文档来源——`intent→plan→build→verify→fix→review` 这条工作流没有任何人在真实项目上手动完整走过一遍。文章自己的采用路径是"先手动逐步跑,循环是终态"。因此新增里程碑 **M-1 人肉内核试点**,置于一切工程投入之前;M1–M3 的内核范围由 M-1 结论决定(分叉见 §8)。
|
|
78
|
+
2. **修正二:组装优先于自研。** 裁决 #9 已认定"运行时正被厂商商品化、协议才是护城河",但原排期把约 7 周花在自研运行时(kernel / 事件溯源 / scheduler)上——这是计划内部的自相矛盾。确立原则:**能由厂商 runtime + 薄脚本组装出来的能力一律不自研**;自研只保留厂商结构性不会做的部分(跨工具的 approval staleness、统一证据台账、policy/gate 语义检查器)。
|
|
79
|
+
3. **修正三:范围裁剪与新增风险。** ① `migrate-v1` importer 砍掉——真实装机量 N=1(自己的几个项目),半天手工 runbook 替代;② 风险表新增两项此前无人列出的成本:**运维者角色转变**(v2 是需要 debug 的常驻系统,v1 是零运维的文档+脚本)与 **prompt injection 成为一等攻击面**(无人值守 Worker 消费仓库内任意文件)。
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 3. 核心模型
|
|
84
|
+
|
|
85
|
+
### 3.1 实体(采纳 B)
|
|
86
|
+
|
|
87
|
+
Project / Work / Run / Workflow / Step / Worker / Adapter / Artifact / Evidence / Policy / Decision / Event / Workspace 十三实体,定义照 B §6.1。要点:
|
|
88
|
+
|
|
89
|
+
- **Work**(用户级目标)与 **Run**(一次执行)分离:一个 Work 可多次 Run,只有一个最终 accepted candidate——这是 v1"任务包信封"的严格化。
|
|
90
|
+
- **内核阶段无关**:Kernel 只认 Run/Step 通用状态(CREATED/QUEUED/RUNNING/WAITING_HUMAN/BLOCKED/SUCCEEDED/FAILED/CANCELLED/SUPERSEDED 等);`plan/build/verify/review` 由 Workflow 文件定义。
|
|
91
|
+
|
|
92
|
+
### 3.2 官方 Workflow 预设(A 的内容装进 B 的容器)
|
|
93
|
+
|
|
94
|
+
内核不写死阶段,但产品必须开箱可用,提供两个官方预设:
|
|
95
|
+
|
|
96
|
+
**`software-delivery`**(MVP 交付):
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
Intent → [Spec] → Plan → Build → Verify ⇄ Fix → Independent Review ⇄ Fix → WAIT_HUMAN(merge)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
- `Spec` 步默认可选;**识别到 UI/视觉/交互交付时强制**,且其 Approval subject 必须包含可渲染入口与截图 digest(v1 规则⑩ + lessons #3 的 v2 化)。
|
|
103
|
+
- 快轨(fast preset)跳过 Intent/Spec 人批;重轨(controlled preset)在 Intent、Plan、Merge、Release 四处人批——v1 三轨映射为三个 Risk Preset(B §WP4.3),四旧 Gate 完整形态保留为 `legacy-four-gates` 迁移预设。
|
|
104
|
+
|
|
105
|
+
**`observe`**(M5 起步,接口 M0 冻结):
|
|
106
|
+
|
|
107
|
+
```text
|
|
108
|
+
探测器(drift-check / live-status / verify-status 重组为 Evidence Provider,周期运行)
|
|
109
|
+
→ bands 分层:log → 只读诊断 → 生成 Intent 草稿入队
|
|
110
|
+
→ 人分诊(fix now / schedule / dismiss,dismiss 回调 bands 阈值)
|
|
111
|
+
→ 接受的 Intent 进入 software-delivery,闭环成立
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 3.3 Gate 统一结果(采纳 B)
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
PASS / RETRY / ROUTE / WAIT_HUMAN / BLOCK / UNVERIFIED
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`UNVERIFIED` 永不隐式当作 `PASS`——v1 fail-closed 文化的内核化。
|
|
121
|
+
|
|
122
|
+
### 3.4 Policy 四类 + 强制三等级(采纳 B,A 的 hook 编译并入)
|
|
123
|
+
|
|
124
|
+
前置 / 后置 / 转换 / Action 四类 Policy(B §11.2);每条声明强制等级:
|
|
125
|
+
|
|
126
|
+
| 等级 | 手段 |
|
|
127
|
+
|---|---|
|
|
128
|
+
| `ADVISORY` | prompt / 规则提示 Worker |
|
|
129
|
+
| `LOCAL_ENFORCED` | Runner 关卡、Workspace 写路径限制、git hook、工具层 hook(Claude Code hooks 等由 gates 配置编译生成) |
|
|
130
|
+
| `SERVER_ENFORCED` | 分支保护、CI、部署平台 |
|
|
131
|
+
|
|
132
|
+
`buildbeat doctor` 报告每条 Policy 实际达到的强制等级,不宣称未强制的规则已被强制(B §11.4 + v1 fail-closed)。
|
|
133
|
+
|
|
134
|
+
### 3.5 Approval 合同(采纳 B;这是 lessons #18 的机器化)
|
|
135
|
+
|
|
136
|
+
人批绑定精确对象:`transition + candidate commit + planDigest + evidenceDigest`。任一受保护输入变化 → `APPROVAL_STALE`,Run 回到 `WAITING_HUMAN`。v1 靠纪律维持的 `SUPERSEDED` 语义从此由内核保证。审批动作同时落 `Decision` 事件与 git 中的决策记录(v1 decisions.md 语义保留,录入自动化)。
|
|
137
|
+
|
|
138
|
+
### 3.6 Evidence Contract(采纳 B,保留 A/v1 的分级)
|
|
139
|
+
|
|
140
|
+
字段照 B §13(kind/subject/producer/command/exitCode/digest/coverage/status/adapter…),追加一个字段:`grade: L0–L4`——v1 的证据分级语义原样保留,作为 Policy 可引用的最低证据门槛(如"标准轨合并最低 L3")。**Worker 的自然语言总结永远不能单独作为通过证据**;candidate、工作树、测试结果、截图一律由 Runner 回读。
|
|
141
|
+
|
|
142
|
+
### 3.7 Loop 与终止条件(采纳 B)
|
|
143
|
+
|
|
144
|
+
三种 Loop(Step 内反馈 / Workflow 交付 / 生命周期)与全部终止条件照 B §9–10:maxAttempts、失败指纹(step+command+exitCode+错误摘要+diff digest)连续两次相同即停、无进展检测、预算与超时、越 Scope 即 `BLOCK`。MVP 默认值照 B §10。
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 4. 存储与状态
|
|
149
|
+
|
|
150
|
+
**双平面**(采纳 B §14):
|
|
151
|
+
|
|
152
|
+
- **Git 平面**:Workflow/Policy/Worker 定义、standards、Intent/Spec/Plan、accepted candidate 引用、Review 报告、Decision、Evidence manifest、Work 最终摘要,以及每个终态 Run 的不可变 `run-record.json`。
|
|
153
|
+
- **Runtime 平面**(`.buildbeat/runtime/`,gitignored):events.jsonl(append-only,唯一权威)、state.json(加速快照,可丢弃重建)、锁、会话、临时日志。
|
|
154
|
+
|
|
155
|
+
**终态压实合同**:Run 进入 `SUCCEEDED / FAILED / CANCELLED / SUPERSEDED` 后、允许清理 runtime 前,Runner 必须在对应 Work 下生成 `runs/<run-id>/run-record.json`,至少固化事件区间与 digest、开始/结束时间、attempts/budget、终止原因、base/candidate、Evidence manifest digest、Decision/Approval 引用和未验证范围。压实失败时不得宣称 Run 已归档,也不得清理其 Event Ledger。原始高频事件和临时日志可留在本地;长期审计、度量和终态解释不得依赖仍然存在的 runtime 目录。
|
|
156
|
+
|
|
157
|
+
**附加硬约束**(A 的精神,写进不变量):删除整个 runtime 目录只损失进行中的 Run 与未承诺长期保留的原始日志,不损失任何已接受事实或已压实的终态 Run 记录;`state.json` 损坏不影响 events.jsonl;事件格式自 M1 起冻结版本号。
|
|
158
|
+
|
|
159
|
+
**派生视图**(采纳 A):`buildbeat status` / `work list` 从事件与工件渲染全景;需要落盘时输出 `*.generated.md` 并标注生成时间,只读。v1 的 NOW/看板/status 手写体系不迁移——lessons #1/5/7/11 整类问题从"被检查器抓"变为"结构上不可能"。
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 5. 协议与 Runner 的关系(对 B §17.2 的修正)
|
|
164
|
+
|
|
165
|
+
v1 的"Skill-only 完整等价"拆成两个承诺分别处置:
|
|
166
|
+
|
|
167
|
+
| 承诺 | v2 处置 |
|
|
168
|
+
|---|---|
|
|
169
|
+
| **协议等价** | **保留**。工件是 markdown/YAML,人手可写可读;attended 交互会话(人开 Cursor/Claude Code 推进某一步)产出的工件与 headless run 不可区分;任何 AI 工具无需安装 BuildBeat 即可消费和产出工件 |
|
|
170
|
+
| **自动化等价** | **取消**(B 正确)。调度、重试、恢复、预算、staleness 检测只存在于 Runner;手工模式不假装拥有它们 |
|
|
171
|
+
|
|
172
|
+
理由:协议中立(不绑厂商、不绑安装)是 BuildBeat 相对于各家 agent runtime 的差异化生存位,也是 v1 用户的迁移桥;但 v1 把"手工能做所有事"扩大成"手工与工具等价",在自动 Loop 时代确实不再成立。
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 6. evals 与度量
|
|
177
|
+
|
|
178
|
+
- **evals/**(B WP5.2 目录结构 + A 的触发时机):AGENTS.md、Workflow、Policy、Worker prompt 任一变更即全跑;每次真实事故收敛后新增一条永久回归;BuildBeat 自身仓库同样适用。
|
|
179
|
+
- **`buildbeat metrics`**(A):本地只读,从事件与 git 计算——Intent→accepted 时长、Plan→merge-ready 时长、首轮 Run 直达 WAITING_HUMAN 率、Fix 轮次分布、每个人批点等待时长、observe 发现→合并修复转化率。无采集无上传;B 的 M5 退出指标表并入 M4 验收(§8)。
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 7. 目录结构(B 为基础,A 增补)
|
|
184
|
+
|
|
185
|
+
```text
|
|
186
|
+
<project>/
|
|
187
|
+
├── AGENTS.md # 项目规则入口(保留;不再承载状态/调度)
|
|
188
|
+
├── standards/ # STACK/CODE/REVIEW/DESIGN(保留,Policy 输入)
|
|
189
|
+
├── .buildbeat/
|
|
190
|
+
│ ├── project.yaml
|
|
191
|
+
│ ├── workflows/
|
|
192
|
+
│ │ ├── software-delivery.yaml # 官方预设(含可选 spec 步)
|
|
193
|
+
│ │ └── observe.yaml # M5 起步;schema M0 冻结
|
|
194
|
+
│ ├── policies/ # default / protected-actions / risk-preset
|
|
195
|
+
│ ├── workers/ # planner/builder/fixer/verifier/reviewer
|
|
196
|
+
│ ├── adapters/ # mock / shell / manual
|
|
197
|
+
│ ├── evals/ # 行为回归
|
|
198
|
+
│ └── runtime/ # gitignored;可整体删除
|
|
199
|
+
└── delivery/
|
|
200
|
+
└── work/WORK-001/
|
|
201
|
+
├── work.yaml / intent.md / spec.md / plan.md
|
|
202
|
+
├── decisions.jsonl / reviews/ / evidence/ / summary.md
|
|
203
|
+
├── runs/RUN-001/run-record.json # 终态事件摘要、digest 与度量事实
|
|
204
|
+
└── ...
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 8. 里程碑(重排:试点先行 → 纵切优先,每段独立止损)
|
|
210
|
+
|
|
211
|
+
总窗口 **~12–15 周**(`V2-D2=A` 已决完整内核,2026-08-28;单人 + AI 辅助)。仓库策略采纳 B:`v1-maintenance` 分支冻结 1.x(只修安全/严重缺陷),`v2` 分支开发,npm `latest` 留 v1、`next` 发 v2 预发布。
|
|
212
|
+
|
|
213
|
+
### M-1 — 人肉内核试点(1–2 周,先于一切工程投入)★ 收尾新增
|
|
214
|
+
|
|
215
|
+
在真实项目上手动完整走一遍 v2 工作流:**人扮演 Kernel**(批转换、做合并决定),一个百行级 shell 脚本只自动化 build→verify→fix 内环,agent 经 CLI headless 调用。
|
|
216
|
+
|
|
217
|
+
- 试点套件已就绪:[`pilot/`](../pilot/README.md)(驱动脚本 + intent/plan 模板 + 度量表);执行细则见 [`V2-ITERATION-01.md`](V2-ITERATION-01.md);
|
|
218
|
+
- 建议跑 3 轮(修 bug / 小功能 / 含 UI 各一),同时执行 F1–F6 故障注入;记录计划外人工介入、token/费用、卡点,并按 [`pilot/metrics.md`](../pilot/metrics.md) 计算有明确分母的**可组装能力加权覆盖率**;
|
|
219
|
+
- 时间盒 ≤2 周,超时即按已有记录强制做分叉决定,防止试点本身变成拖延;
|
|
220
|
+
- **分叉退出(M-1 唯一的交付就是这个决定)**:
|
|
221
|
+
- **结论 (a)** 可组装能力覆盖率 <80%,或重复出现无法由薄控制面修补的 CRITICAL 运行缺口 → 按完整 M1–M3 造内核,需求以试点记录为准,总窗口 ~12–15 周;
|
|
222
|
+
- **结论 (b)** 可组装能力覆盖率 ≥80%、三轮平均计划外介入 ≤2,且无重复的未处置 CRITICAL 运行缺口 → M1–M3 收缩为**薄内核**(只造 approval staleness、统一证据台账、policy/gate 检查器三件),总窗口 ~5–8 周;
|
|
223
|
+
- 未跑场景一律记 `UNVERIFIED`,不得按通过计分;中间态默认少造,将存疑能力挂到 M4 复验。
|
|
224
|
+
|
|
225
|
+
> **进展(2026-08-28)**:ChickAI、Tide 与 `V2-D1A` 后续的 AI 底座 `WP-B1-AUTHZ` 推进均未激活 `pilot/loop.sh`,自动 Run ledger 为 `0/3`;第三项不倒算合格自动 Run,只作为重复激活失败的负向证据。F5 已确认只能 fail-closed、不能恢复,F6 已确认没有持久化 Approval 对象或 stale 事件;暂定可组装覆盖率仍为 45.8%。[`V2-D2-DECISION-CARD.md`](V2-D2-DECISION-CARD.md) 推荐完整内核,项目所有者已于 2026-08-28 拍板 **`V2-D2=A`**:M-1 关闭,进入 M0;主判据为重复 CRITICAL 缺口,暂定覆盖率仅旁证(台账见 [`V2-DECISIONS.md`](V2-DECISIONS.md))。明细见 [`V2-ITERATION-01.md`](V2-ITERATION-01.md)、[`pilot/metrics.md`](../pilot/metrics.md) 与 [`pilot/evidence/2026-08-28-m1-runtime-gap.md`](../pilot/evidence/2026-08-28-m1-runtime-gap.md)。
|
|
226
|
+
|
|
227
|
+
### M0 — 核心重置(1 周)
|
|
228
|
+
|
|
229
|
+
- 三份 RFC(产品定位 / 领域模型 / Workflow+Policy,B WP0.1–0.3),**需求来源必须引用 M-1 试点记录**,**observe 与 bands 的 schema 一并冻结**(裁决 #6);
|
|
230
|
+
- 内核范围按 M-1 分叉结论定稿(完整内核 vs 薄内核),并逐项标注"自研理由 = 厂商结构性不做"(收尾修正二);
|
|
231
|
+
- events.jsonl 事件格式 v1 冻结(裁决 #8);
|
|
232
|
+
- v1 冻结 + 分支建立;本文档拍板即 M0 的人工 Gate。
|
|
233
|
+
- **退出**:核心名词、MVP 范围、旧概念处置(保留/转换/删除)无歧义。
|
|
234
|
+
|
|
235
|
+
> **进展(2026-08-28)**:三份 RFC 草案与事件格式规格已就绪——[`v2/RFC-0001-product-definition.md`](v2/RFC-0001-product-definition.md)(含自研面逐项"厂商结构性不做"标注)、[`v2/RFC-0002-domain-model.md`](v2/RFC-0002-domain-model.md)(含核心名词消歧与 v1 概念处置表)、[`v2/RFC-0003-workflow-policy.md`](v2/RFC-0003-workflow-policy.md)(含 observe/bands schema 冻结)、[`v2/SPEC-0001-events-v1.md`](v2/SPEC-0001-events-v1.md)(定稿即 FROZEN)。项目所有者已于 2026-08-28 定稿(`V2-D3`),M0 退出,SPEC-0001 进入 FROZEN;进入 M1,跟踪见 [`V2-ITERATION-02.md`](V2-ITERATION-02.md) 与 [`V2-ITERATION-03.md`](V2-ITERATION-03.md)。
|
|
236
|
+
|
|
237
|
+
### M1 — 最小纵切(2–3 周)
|
|
238
|
+
|
|
239
|
+
不追求内核完备,追求**一条真实可跑的纵线**:
|
|
240
|
+
|
|
241
|
+
- events.jsonl + 简化 reducer(replay/simulator 打磨推后);
|
|
242
|
+
- 最小 Workflow parser;Workspace Manager(worktree + 锁 + candidate 回读);
|
|
243
|
+
- Mock + Shell Adapter;Evidence Collector v0(command/exitCode/diff/digest);
|
|
244
|
+
- `run start/status/stop`,单 Project 单 Run 前台;
|
|
245
|
+
- **验收**:真实项目上 `build → verify` 两步由 Shell Adapter 驱动跑通,证据全部来自回读。
|
|
246
|
+
- **止损**:纵切显示单人维护成本过高 → 降级为"单步推进 + 审批收件箱"半自动形态,M2 以后重排。
|
|
247
|
+
|
|
248
|
+
> **进展(2026-08-28)**:M1 验收通过——BuildBeat 仓库 self-host,Shell Adapter 驱动 build(真实 candidate `30b3a0d`)→ verify(真实测试 20/20 回读),停在 `WAITING_HUMAN` 后终态压实;`resume`(F5 纵切)同迭代关闭。证据见 [`v2/M1-ACCEPTANCE-2026-08-28.md`](v2/M1-ACCEPTANCE-2026-08-28.md),跟踪见 [`V2-ITERATION-03.md`](V2-ITERATION-03.md)。进入 M2。
|
|
249
|
+
|
|
250
|
+
### M2 — 自动修复环(2–3 周)★ MVP 承诺在此达成
|
|
251
|
+
|
|
252
|
+
- Verify 失败 → Fix → Verify 循环;Review(fresh-context 只读 Reviewer Worker,v1 reviewer 机制迁入)→ P0/P1 回 Fix;
|
|
253
|
+
- budgets / 失败指纹 / 无进展检测 / 超时;
|
|
254
|
+
- `WAITING_HUMAN` + `approve/reject` + inbox;Approval 绑定与 stale 检测;
|
|
255
|
+
- **验收**:B §20 的 20 条 MVP DoD 逐条通过(含预埋 Bug 自动修复、进程中断可恢复、candidate 变更 Approval 失效、停在合并前不自动 merge)。
|
|
256
|
+
|
|
257
|
+
> **进展(2026-08-28)**:M2 核验 **18/20 通过**——预埋 Bug 自动修复端到端(真实红测试→fix→绿→只读 review→停在合并前→人批终态)、F6 Approval stale 运行时关闭、approve/reject + inbox、决策落 Git。#1(plan"被接受"的 Policy 强制)与 #20(coverage 纪律)标 `PARTIAL` 挂 M3 既定范围。核验表见 [`v2/M2-DOD-2026-08-28.md`](v2/M2-DOD-2026-08-28.md),跟踪见 [`V2-ITERATION-04.md`](V2-ITERATION-04.md)。进入 M3。
|
|
258
|
+
|
|
259
|
+
### M3 — 治理硬化(2 周)
|
|
260
|
+
|
|
261
|
+
- Policy Engine 完整(四类 + 组合算子);Protected Actions(merge/deploy/publish/force-push 无凭据即无能力,B WP4.4);
|
|
262
|
+
- 强制等级报告;三个 Risk Preset(fast/standard/controlled)+ `legacy-four-gates` 迁移预设;
|
|
263
|
+
- UI 真渲染 Gate(spec approval subject 含渲染证据);resume/replay 补全。
|
|
264
|
+
|
|
265
|
+
> **进展(2026-08-28)**:M3 完成——Policy Engine(八算子 + 三值逻辑)四类全接线;Protected Actions 落到能力剥离(Worker env 白名单 + worktree pushurl 保护);`doctor` 逐条报告声明 vs 实际强制等级(SERVER_ENFORCED 一律报本地不可验证);四个 Risk Preset + UI 真渲染 Gate + `accept`/`events`/`replay`。M2 DoD #1 复核 ✓,#20 收窄至 coverage 字段纪律挂 M4。跟踪见 [`V2-ITERATION-05.md`](V2-ITERATION-05.md)。进入 M4。
|
|
266
|
+
|
|
267
|
+
### M4 — evals、度量与试点(2–3 周)
|
|
268
|
+
|
|
269
|
+
- 确定性测试套件(B WP5.1)+ 行为 evals(B WP5.2 九目录);
|
|
270
|
+
- `buildbeat metrics` v0;
|
|
271
|
+
- Self-host 试点(BuildBeat builds BuildBeat)+ 外部试点 ≥2(一个有真实测试的单仓项目 + 一个含 UI 变更的项目,建议从老乡鸡底座选);
|
|
272
|
+
- **退出指标**(B M5 表采纳):状态转换可追溯 100%、stale Approval 复用 0、超预算继续运行 0、试点 Run 自动到达 WAITING_HUMAN ≥70%、证据完整率 ≥95%、Reviewer 改代码 0。
|
|
273
|
+
|
|
274
|
+
> **进展(2026-08-28)**:工程面完成——九场景行为 evals([`evals/`](../evals/README.md))、`metrics` v0、Scope 越界即停、单活动 Run 锁、Adapter 故障路径回归;Self-host 试点 `RUN-SELF-001` 真实跑通并停在合并决定(真实 remote 上实测推送保护、抓到并修复一个 YAML 解析真实缺陷),证据与六指标核验见 [`v2/M4-SELFHOST-2026-08-28.md`](v2/M4-SELFHOST-2026-08-28.md)。**外部试点 ≥2 待项目所有者点名(D6),回填指标后 M4 关闭**;跟踪见 [`V2-ITERATION-06.md`](V2-ITERATION-06.md)。
|
|
275
|
+
>
|
|
276
|
+
> **进展(2026-08-28 补)**:外部试点完成——所有者点名的真实需求 `LXJ-AUTH-CLI-DW-01`(ruoyi-ai)由 codex CLI 经 Shell Adapter 全自动 5.2 分钟推进到合并决定(15 文件干净候选、JDK17 全量真实测试、只读 review、portal 页真渲染截图 + UI 门),证据见 [`v2/M4-EXTERNAL-PILOT-2026-08-28.md`](v2/M4-EXTERNAL-PILOT-2026-08-28.md)。六退出指标全部达标(自动到达率 2/2);仅余 D6 口径(1 项目覆盖双验收面是否即满足"≥2")待所有者定夺后 M4 关闭。
|
|
277
|
+
>
|
|
278
|
+
> **进展(2026-08-28 再补):M4 关闭。** 第二外部项目 chickAI Bug 看板积压批处理([`v2/M4-CHICKAI-PILOT-2026-08-28.md`](v2/M4-CHICKAI-PILOT-2026-08-28.md)):钉钉 AI 表格读积压 → 两个 bug 各一 Run,其中 RUN-CHICK-0037 走出**完整 Build–Verify–Fix–Review 闭环**(reviewer 以 P1/P2 真实阻断、codex fixer 修复、二轮全绿)。外部项目数 2,D6 原文满足;六指标 4/4 Run 同向达标。进入 M5。
|
|
279
|
+
|
|
280
|
+
### M5 — 闭环起步、迁移与 Beta(2–3 周)
|
|
281
|
+
|
|
282
|
+
- observe v0:drift-check/live-status 接入为 Evidence Provider,bands 前两层(log / 只读诊断)上线,自动 Intent 草稿入队;
|
|
283
|
+
- v1 迁移改为**半天手工 runbook**(收尾修正三:装机量 N=1,importer 工具砍掉;"不猜旧状态有效性、单向迁移、禁止双写"原则不变);
|
|
284
|
+
- 文档十件套(B WP6.3);发布 `@haiyangbg/buildbeat@2.0.0-beta.1`(dist-tag `next`)。
|
|
285
|
+
|
|
286
|
+
> **进展(2026-08-28):beta-ready。** observe v0 按 RFC-0003 §8 冻结契约实现(bands 三层 + intent 草稿只入队 + dismiss 回调;`tests/v2-observe.test.js` 8 项,含不变量 23)并在本仓库真实接入(探针=文档漂移守卫,cycle 1 证据入账);迁移 runbook 与文档十件套落 [`v2/guide/`](v2/guide/README.md);`2.0.0-beta.1` 打包核验通过(独立 bin `buildbeat-v2`,`latest` 不动)。全量测试 139/139。**仅剩 T5 `npm publish`(dist-tag `next`)等所有者授权**;跟踪见 [`V2-ITERATION-07.md`](V2-ITERATION-07.md)。
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## 9. 系统不变量(B 的 20 条全部采纳,另加 3 条)
|
|
291
|
+
|
|
292
|
+
B §24 的 1–20 原样进入测试矩阵。追加:
|
|
293
|
+
|
|
294
|
+
21. 手写状态文件不得成为任何状态的权威来源;派生视图只读且标注生成时间。
|
|
295
|
+
22. UI 交付的 spec/design Approval subject 必须包含可渲染证据(入口 + 截图 digest),静态描述不构成拍板对象。
|
|
296
|
+
23. 删除 `.buildbeat/runtime/` 整个目录后,所有已接受工件、Decision、Evidence manifest 与已终结 Run 的压实记录必须仍可从 Git 完整读出;长期度量与终态解释不得依赖已删除的 runtime。
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 10. 风险(合并去重)
|
|
301
|
+
|
|
302
|
+
| 风险 | 应对 |
|
|
303
|
+
|---|---|
|
|
304
|
+
| 范围过大、停在架构设计(B 首要风险,A 的单人带宽风险同源) | 纵切优先的里程碑重排 + 每段止损;M1 结束必须有真实项目可跑证据 |
|
|
305
|
+
| 过早绑定 Agent 工具 | Mock/Shell 先行;专用 Adapter M3 末按试点主力工具再选(裁决 #5) |
|
|
306
|
+
| Agent 无限修复 / 伪造证据 / 改控制文件 | budgets + 失败指纹 + 回读制证据 + 控制文件只读与 Workspace 隔离(B) |
|
|
307
|
+
| Approval 过期 / 人批退化成盖章 | digest 绑定 + stale(B);待批项强制携带 findings 摘要与风险声明,秒批率入 metrics(A) |
|
|
308
|
+
| Runtime 损坏 | 事件溯源 + 原子快照 + 不变量 23(runtime 可全删) |
|
|
309
|
+
| 设计返工螺旋复发 | UI 真渲染 Gate 进默认预设与不变量 22(A / lessons #3) |
|
|
310
|
+
| v1 用户断层 / 双写冲突 | v1 只冻结不删除;手工 runbook 单向迁移;`latest` 在 Beta 前不指向 v2(B) |
|
|
311
|
+
| 定位与厂商 runtime 对撞 | 协议中立写进产品之魂(裁决 #9)+ 组装优先原则(收尾修正二):自研面只留厂商结构性不做的部分 |
|
|
312
|
+
| 运维者角色转变(v2 是需要 debug 的常驻系统,v1 是零运维文档+脚本) | 薄内核路线压缩自研面;不变量 23(runtime 可全删重建)让"删了重启"成为默认排障手段 |
|
|
313
|
+
| prompt injection 成为一等攻击面(无人值守 Worker 消费仓库内任意文件) | unattended run 自 MVP 起要求工具白名单 + 出网限制 + 无生产凭据;无法满足时降级 attended |
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## 11. 已生效决策与下一道人工门
|
|
318
|
+
|
|
319
|
+
`V2-D0=B` 采用的是本文整份执行基线,因此 D1–D6 已按下表推荐项同步生效,无需重复拍板;D7 / `V2-D1` 也已于 2026-08-27 点名两个真实工作项,当前进入试点执行与证据收集。
|
|
320
|
+
|
|
321
|
+
| # | 决策 | 推荐 | 备注 |
|
|
322
|
+
|---|---|---|---|
|
|
323
|
+
| D1 | 对外定位词 | "AI 原生交付控制面/闭环",文档明示协议是产品之魂 | 裁决 #9 的理由 |
|
|
324
|
+
| D2 | 仓库与版本策略 | 同仓双分支 + `latest`/`next` 双 dist-tag(B §18) | v1 资产不迁不删 |
|
|
325
|
+
| D3 | spec 步默认策略 | UI 项目强制、其余可选、快轨跳过 | 裁决 #3 |
|
|
326
|
+
| D4 | 首个专用 Adapter | M3 末按试点主力工具定(此前 Shell Adapter 已可驱动任意 CLI agent) | 裁决 #5 |
|
|
327
|
+
| D5 | v1 手写状态处置 | 迁移即一步到位废除,无过渡双轨 | A-D4 原结论,B 同向 |
|
|
328
|
+
| D6 | 试点组合(M4) | Self-host + 底座内一个有测试的单仓项目 + 一个含 UI 项目 | 合并 A-D5 与 B-WP5.3/5.4 |
|
|
329
|
+
| D7 / `V2-D1` + `V2-D1A` | **M-1 试点工作项与第三目标项目(已决)** | 首批为 ChickAI 额度耗尽仍可登录(含 UI)与 Tide 悬浮球空闲收纳(小功能);第三目标项目为 `AI底座/底座`,具体使用其下一项自然发生、已授权、低风险的非生产开发任务 | 执行细则见 [`V2-ITERATION-01.md`](V2-ITERATION-01.md);既有候选只作回放证据,授权边界仍是不 merge、不 push、不发布、不部署 |
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
_本文已由项目所有者以 `V2-D0=B` 拍板为 v2 执行基线:报告 A 降级为方向背景(其对文章与 v1 教训的论证继续有效),报告 B 降级为运行时设计输入(其 §6/§10–14/§19–24 被本文引用的部分随本文生效)。v1 的 `ROADMAP.md` / `EXECUTION-PLAN.md` 转入 v1-maintenance 语境,不再指导新开发。_
|