@haiyangbg/buildbeat 2.0.0-beta.2 → 2.0.0-beta.4

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.
Files changed (62) hide show
  1. package/CHANGELOG.md +42 -6
  2. package/SKILL.md +76 -2
  3. package/bin/buildbeat-v2.js +13 -1
  4. package/docs/CLI-PILOT-2026-08-23.md +1 -1
  5. package/docs/CLI.md +1 -1
  6. package/docs/EXECUTION-PLAN.md +2 -2
  7. package/docs/PHASE2-PILOT-PREFLIGHT-2026-08-25.md +2 -2
  8. package/docs/PHASE4-V1.20-PILOT-2026-08-25.md +2 -2
  9. package/docs/RELEASING.md +1 -1
  10. package/docs/V2-D2-DECISION-CARD.md +2 -2
  11. package/docs/V2-DECISIONS.md +2 -2
  12. package/docs/V2-ITERATION-01.md +13 -13
  13. package/docs/V2-ITERATION-06.md +2 -2
  14. package/docs/V2-ITERATION-08.md +62 -0
  15. package/docs/V2-PLAN.md +6 -6
  16. package/docs/V2-PROPOSAL.md +2 -2
  17. package/docs/V2.0.0-BETA.1-RELEASE-EVIDENCE-2026-08-28.md +1 -1
  18. package/docs/V2.0.0-BETA.2-RELEASE-EVIDENCE-2026-08-28.md +8 -0
  19. package/docs/V2.0.0-BETA.3-RELEASE-EVIDENCE-2026-09-01.md +8 -0
  20. package/docs/v2/M4-EXTERNAL-PILOT-2026-08-28.md +11 -11
  21. package/docs/v2/{M4-CHICKAI-PILOT-2026-08-28.md → M4-PILOT-APP-2026-08-28.md} +4 -4
  22. package/docs/v2/M4-SELFHOST-2026-08-28.md +1 -1
  23. package/docs/v2/RFC-0001-product-definition.md +2 -2
  24. package/docs/v2/SPEC-0001-events-v1.md +2 -2
  25. package/docs/v2/guide/00-how-to-talk.md +57 -0
  26. package/docs/v2/guide/01-quickstart.md +6 -0
  27. package/docs/v2/guide/02-workflow-guide.md +31 -0
  28. package/docs/v2/guide/04-adapter-guide.md +4 -0
  29. package/docs/v2/guide/05-worker-contract.md +10 -0
  30. package/docs/v2/guide/06-evidence-guide.md +10 -0
  31. package/docs/v2/guide/07-approval-guide.md +50 -0
  32. package/docs/v2/guide/10-recovery.md +25 -2
  33. package/docs/v2/guide/README.md +3 -0
  34. package/example/.buildbeat/manifest.json +1 -1
  35. package/lessons.md +12 -0
  36. package/package.json +1 -1
  37. package/src/v2/adapters/shell.js +87 -14
  38. package/src/v2/cli/run.js +602 -30
  39. package/src/v2/domain/event-registry.js +24 -0
  40. package/src/v2/engine/reducer.js +5 -0
  41. package/src/v2/engine/workflow.js +8 -1
  42. package/src/v2/evidence/collector.js +14 -3
  43. package/src/v2/observe/observe.js +9 -2
  44. package/src/v2/presets/release-readback.yaml +36 -0
  45. package/src/v2/presets/risk/release.yaml +21 -0
  46. package/src/v2/presets/software-delivery.yaml +5 -0
  47. package/src/v2/runtime/cache.js +124 -0
  48. package/src/v2/runtime/decisions.js +6 -4
  49. package/src/v2/runtime/env-contract.js +135 -0
  50. package/src/v2/runtime/envelope.js +183 -0
  51. package/src/v2/runtime/findings.js +158 -0
  52. package/src/v2/runtime/gc.js +182 -0
  53. package/src/v2/runtime/liveness.js +193 -0
  54. package/src/v2/runtime/metrics.js +8 -0
  55. package/src/v2/runtime/notify.js +223 -0
  56. package/src/v2/runtime/orchestrator.js +252 -24
  57. package/src/v2/runtime/overview.js +264 -0
  58. package/src/v2/runtime/repo-ref.js +38 -0
  59. package/src/v2/runtime/run-record.js +18 -3
  60. package/src/v2/workspace/workspace-manager.js +4 -1
  61. package/templates/v2/AGENTS.md +72 -0
  62. package/templates/v2//346/214/207/346/214/245/345/217/260.md +36 -0
package/CHANGELOG.md CHANGED
@@ -2,18 +2,54 @@
2
2
 
3
3
  > 本项目吃自己的狗粮(红线④:必更 CHANGELOG)。格式循 Keep a Changelog,倒序。
4
4
 
5
+ ## v2.0.0-beta.4 — 2026-09-03(迭代 08:等待要能找到人)
6
+
7
+ > 主题:试点工作区 2026-08-28~09-02 全部驾驶会话与 58 个 Run 台账的复盘回灌(复盘文档见迭代 08 记录)。台账数字:58 个 Run 成功 7、失败 17、取消 32,其中多数取消是在 WAITING_HUMAN 挂满一天后批量清掉;人批平均等 7~12 小时。beta.3 治的是"审查循环烧钱",本版治的是**人看不见 Run 在干什么、等的人不知道有东西等他、每次都要手工打扫**。
8
+ > **发布状态**:所有者 2026-09-03 授权(「发布 beta.4 吧,授权也一起」);发布与独立回读证据在发布后回填到 `docs/V2.0.0-BETA.4-RELEASE-EVIDENCE-2026-09-03.md`。
9
+
10
+ - **运行中可见性(C1)**:Shell Adapter 把 worker 的 stdout/stderr **实时**流到 `.buildbeat/runtime/runs/<RUN>/<step>-<n>.{stdout,stderr}.live`,并留 `live.json` 标记(命令、开始时间);步结束即收回,证据日志仍由回读生成。`status` 现在显示每步耗时(本次 / 累计 / 同仓同步骤历史中位数 `typical … n=`)、在飞步骤的已用时间、worker 命令、最后一次输出距今多久与末三行输出;无输出超过阈值(默认 15 分钟,run 配置 `stallAfterMs` 或 `status --stall-after <分钟>`)标 **STALLED**(只标不杀)。`metrics` 增加每步中位耗时。真实事故:所有者一场会话里问了十余次"半小时了正常吗 / 十分钟了是卡住了吗",而 status 只有步骤和次数
11
+ - **同 Work 新 Run 自动取代旧的等待(C2)**:`start` 时同一 Work 下仍在 `WAITING_HUMAN` 的旧 Run 记 `RUN_TERMINAL SUPERSEDED` 并压成 run-record(Git 面),新 Run 的 `RUN_CREATED.data.supersedes` 记血统;inbox 只剩活的等待。run 配置 `supersede: off` 关闭。真实事故:试点子仓两个旧 Run 在 inbox 挂了一天,而后继者早已上线
12
+ - **`gc`:打扫运行时面(C3)**:`buildbeat-v2 gc --repo .` 默认只出计划;`--apply true` 执行。规则 fail-closed 向保留:只动**终态且已压成 run-record** 的 Run;工作树可删(提交都在分支上);分支只在候选**已可从其他 ref 到达**(合并 / 打 tag / 远端)或 Run 未产出候选时删,否则明示"仅此分支可达,保留";脏工作树不带 `--force` 不动;终态 Run 的残留锁一并清。台账不写(终态后只允许 `RUN_COMPACTED`)。真实事故:两个子仓残留 16 个工作树,所有者原话"你先打扫一下卫生"
13
+ - **人批通知出站(C4)**:Git 面 `.buildbeat/notify.yaml` 声明通道(`type: webhook|dingtalk`,URL 只能来自 `urlEnv` 指定的环境变量,写 `url` 直接拒绝),订阅 `HUMAN_REQUESTED` / `RUN_TERMINAL` / `STALLED`。Run 停在人批或终态时由 CLI 出站;失败只记 `notify.log` 与屏幕,**永不影响 Run**;载荷只有标识、原因、候选 SHA 与下一句可复制命令,零日志零候选内容。订阅 `STALLED` 时 `start`/`resume` 自动派一个脱离的 `watch` 进程盯输出静默(编排器在 spawnSync 里看不了表),Run 离开 RUNNING 或父进程退出即自行结束;`watch --once true` 可手工单次探测。`doctor` 报告通道与环境变量是否就位
14
+ - **"下一句该说什么"**:`status` / `inbox` / 通知在每个等待后面直接给出可复制的 `approve` / `reject`(分诊时加 `findings list|adjudicate`)命令;`inbox` 按 Work 分组并显示已等待时长。输出里 `--repo` 只在项目内给相对路径,项目外给 `<repo-path>` 占位——本机绝对路径永不进输出(既有不变量,测试守着)
15
+ - **Work 级总览 `overview`(C5)**:`buildbeat-v2 overview --repo . [--work <ID>] [--json true]` 按 Work 回答「走到哪、下一步该谁」:intent/plan 是否被接受(接受后改过即 `stale`)、Run 数、最新 Run 状态与候选、候选是否已合入当前分支、未裁决 P0/P1 数、是否有 `env-facts.md`;阶段机 `NO_INTENT → INTENT_DRAFT → PLAN_DRAFT/PLAN_STALE → READY_TO_RUN → RUNNING → WAITING_HUMAN/MERGE_DECISION → MERGE_READY → MERGED`,每行附下一句命令。运行时被删后由 Git 面 run-record 补足。所有者原话:「当前代办是什么,从每一个系统的进度说」「pilot-web 上线了吗,离上线还有多远」
16
+ - **信封一等公民(C6)**:run 配置 `envelope:`(`prompts:` 目录 + `vars:` + 可选 `pin: <sha>`)——内核按 `<component>-<worker>.md` / `<worker>.md` 取 prompt、替换 `{vars.x}`、落到 `runs/<RUN>/prompts/<step>-<n>.md` 并以 `BUILDBEAT_PROMPT` 与 `input.envelope` 交给 worker;worker args 支持 `{prompt}` 与 `{vars.x}`;`RUN_CREATED` 记 `envelopeDigest`/`envelopeSource`(additive)。`start --attempt new` 自动编号 `RUN-X-01/02…`(扫运行时面与 Git 面 run-record),一份 config 跑到底,不再每次重试新建 config。`redact:` 正则列表在证据落盘前脱敏(digest 绑脱敏后文本)。真实事故:三源 runner 的 Work 每个 Run 手写 34 行 yaml + 10 KB worker.sh + 4 份 prompt,worker 命令是 `git show <meta sha>:path | bash -s` 咒语,Run ID 手工编到 -30
17
+ - **verify 复用与增量审查(C7)**:run 配置 `cache: {verify: tree}` 后,同树(`HEAD^{tree}`)+ 同 worker 命令 + 同信封 digest 且**已通过**的 verify 不再跑——证据引用来源 Run(`EVIDENCE_RECORDED.reused`,additive),status 标 `(reused from RUN-X)`;失败永不复用,脏树不复用。readonly(reviewer)步的 input 注入 `lastReviewed {candidate, run, range}`(同 Work 最近一次 review 的候选且为当前候选祖先),prompt 可据此只审增量。瘦身计划 A1/B3;试点工作区信封侧自建缓存 25→13 分钟的内核化
18
+ - **合并后车道(C8)**:官方预设 `release-readback`(preflight → apply-readback → observe → wait-close,全部 readonly、`grade: L4`、`maxAttempts 1`)+ 风险预设 `release`(`stopAt: apply-readback`,关窗要求 L4 命令证据)。生产动作仍是人的(不变量 20);这条车道只把「做之前回读 → 人做 → 做之后回读 → 观察 → 人关窗」记成台账,任一步失败即停人批。workflow step 新增 `grade:` 字段(additive)。真实事故:试点项目上线当天 meta 仓约 40 条「Gate4 step N readback」手工提交
19
+ - **可见命名进决策卡(C9,指南层)**:域名、服务名、环境名、自停时长、窗口时长等所有者以后要看见或念出来的名字与参数默认 `BATCH_AT_GATE`,不由 worker 顺手定——写进 v2 AGENTS 模板第 ⑪ 条、Skill 驾驶手册与 Worker 合同。真实事故:一个按内部术语起的服务名让所有者连问四轮
20
+ - **环境事实(C10)**:`requires:` 新增 `probe:` 条目(shell 命令 + 可选 `expect` 正则 + `name`),启动前与二进制版本一起 fail-closed 核验;Work 目录 `env-facts.md` 约定(`overview` 显示 ✓)。真实事故:目标机 Python 3.6 / Redis <7 各烧一窗,同族缺陷第五次出现
21
+ - **Skill 才是入口(所有者 2026-09-02 指出)**:`SKILL.md` 新增 §0.5「v2 驾驶手册」——用户一句话 → 会话调哪条命令 → 回给用户什么;frontmatter 加 v2 触发词;新增 `templates/v2/AGENTS.md`(一页流程 + 视角路由 + 十一条规则 + 红线,蒸馏自试点工作区手写版)与 `templates/v2/指挥台.md`(日常六句话)。此前根目录 SKILL.md 与 plugin SKILL.md 里 v2 出现次数为零,会话装载到的仍是 v1 三域口径
22
+ - 测试:新增 `v2-liveness` / `v2-supersede` / `v2-gc` / `v2-notify` / `v2-envelope` / `v2-cache` / `v2-overview` / `v2-release-lane` 八组 19 项(含 CLI 端到端与本地 HTTP 接收端)
23
+ - **指南第 0 篇「怎么和会话说话」**:`docs/v2/guide/00-how-to-talk.md`——给用户看的一页,按项目阶段(未开始 → 立项定方案 → 准备执行 → 执行推进 → 验收合并 → 上线 → 完结换期复盘)列出你说什么、会话做什么、你得到什么;通用场景,不预设工具或第二个 agent
24
+ - **仓库脱敏**:公司名、本机路径、试点工作区/子仓/产品/服务名、内部 Work/Run 编号、远端平台名全部替换为通用试点标签(历史文档、发布证据、试点记录、源码注释一并处理);两份试点文档改名。开源仓里任何文字都应"换个公司、换个工具、只有一个会话"仍成立
25
+ - 边界:编排器仍是同步 spawnSync(STALLED 通知由独立 `watch` 进程完成);`release` 预设无 finding 门(车道里没有 reviewer,不设满足不了的规则);钉钉通道只支持关键词模式
26
+
27
+ ## v2.0.0-beta.3 — 2026-09-01
28
+
29
+ > 主题:三十轮部署战役(试点 WORK-PILOT-DEPLOY-01,DEPLOY-01~30 + L4 之夜)的机制回灌。战役复盘:`试点工作区的部署战役复盘文档`。
30
+ > **发布状态**:`@haiyangbg/buildbeat@2.0.0-beta.3` 已于 2026-09-01 经 OIDC Trusted Publishing 发布到 dist-tag `next`(run 33460544343,双 job success);`latest` 保持 v1.21.0。独立回读(直连 npmjs.org):dist-tag 路由、integrity、签名+attestation、隔离安装全过,证据见 [`docs/V2.0.0-BETA.3-RELEASE-EVIDENCE-2026-09-01.md`](docs/V2.0.0-BETA.3-RELEASE-EVIDENCE-2026-09-01.md)。
31
+
32
+ - **发现分诊门**(复盘改革条 4):run 配置 `reviewTriage: required` 后,review 的 P0/P1 finding 不再自动派 fixer——停 `WAITING_HUMAN`(kind `finding-triage`)待人逐指纹裁决,approve `enter-fix` 才放行。finding 是处方不是事实;自动路由处方在战役振荡期连烧四轮
33
+ - **锚定审查与裁决台账**(改革条 3):finding 全部落 Git 面 `delivery/work/<id>/review-findings.jsonl`(指纹=严重度+正文规范化 hash);`findings list` / `findings adjudicate --action accept|dismiss` 人裁决;`dismiss` 后同指纹不再阻断(重提记 `RE-RAISED` 可见)、严重度升级自动重开;Reviewer input 注入历史裁决锚(`anchor`)、fixer input 注入带裁决状态的工单(`findings`)。裁决记忆在 Git 面,删 runtime 不丢
34
+ - **环境契约 `requires:`**:run 配置声明信封依赖的二进制与最低版本,Run 启动前 fail-closed 全量核验、一次报清(真实事故:vendored-only `rg`、bash 3.2、新 shell 解析 Node 14 各烧整轮才见真因);`doctor` 同步报告
35
+ - **review 轮数预算原生化**(改革条 1 的机制化):官方预设 `budgets.maxAttempts.review: 2`——第三轮 review 启动前即停人批,无需 prompt 约束兜底
36
+ - **`preflight` 预检通道**:`preflight --config <cfg> --step <id>` 在主 checkout 干跑某步 worker 命令,分钟级打到首个失败边界再进 Run;无 worktree、无台账、零证据(横幅明示 dry signal;`BUILDBEAT_PREFLIGHT=1`),Run 必须复现才算数
37
+ - **fix(v2) 崩溃恢复不再误路由**:被中断的步现在重跑自身(丢失尝试仍计预算),不再按步骤失败走 failure 边——真实事故(deploy-18):宿主超时杀掉 verify worker,crash 被路由去 fix,fixer 面对零 verifier 证据白烧一轮。交互式 shell 里 `start` 现在提示脱离启动(nohup/setsid)
38
+ - 战役期间已并入的内核修复一并随本版发布:预算守卫(final attempt 失败不再派 fix,deploy-14)、porcelain 状态列保护、runtime 证据引用仓库相对化、Node <20 清晰报错(各见对应 commit)
39
+ - 指南更新:验证金字塔警示与"真缺陷类清零即升层"(06)、分诊门与锚定审查(07)、环境契约与 review 预算(02)、崩溃重跑语义与启动纪律(10)
40
+
5
41
  ## v2.0.0-beta.2 — 2026-08-28
6
42
 
7
- > 主题:aiplatform-meta(底座)v2 迁移试点抓出的内核修复。
8
- > **发布状态**:同 beta.1 流程(OIDC Trusted Publishing,dist-tag `next`;`latest` 保持 v1.21.0)。
43
+ > 主题:meta 试点仓v2 迁移试点抓出的内核修复。
44
+ > **发布状态**:`@haiyangbg/buildbeat@2.0.0-beta.2` 已于 2026-08-28 经 OIDC Trusted Publishing 发布到 dist-tag `next`(run 33175013599,双 job success);`latest` 保持 v1.21.0。独立回读:dist-tag 路由、integrity、SLSA provenance、隔离安装全过,证据见 [`docs/V2.0.0-BETA.2-RELEASE-EVIDENCE-2026-08-28.md`](docs/V2.0.0-BETA.2-RELEASE-EVIDENCE-2026-08-28.md)。
9
45
 
10
- - **fix(v2) 范围门中文路径误拦**:git `core.quotepath` 默认把非 ASCII 路径转义为带引号的八进制串,`listChangedPaths` 直接喂给 allowedPaths 前缀检查导致范围内中文文件被判越界(真实事故:底座 `RUN-META-V2-01` 被 `pm/登录二期看板.md` 阻断)。读回改用 `core.quotepath=off`,中文路径永久回归进 `tests/v2-invariants.test.js`
46
+ - **fix(v2) 范围门中文路径误拦**:git `core.quotepath` 默认把非 ASCII 路径转义为带引号的八进制串,`listChangedPaths` 直接喂给 allowedPaths 前缀检查导致范围内中文文件被判越界(真实事故:试点工作区 `RUN-META-V2-01` 被 `pm/登录二期看板.md` 阻断)。读回改用 `core.quotepath=off`,中文路径永久回归进 `tests/v2-invariants.test.js`
11
47
 
12
48
  ## v2.0.0-beta.1 — 2026-08-28
13
49
 
14
50
  > 主题:BuildBeat v2 首个 Beta——确定性内核 + Agent Loop Runtime。事件溯源台账(hash 链、损坏截断、终态压实进 Git 面)、Policy 门(8 算子三值逻辑、`UNVERIFIED` 永不当 PASS)、隔离 Workspace(push 物理封禁、`allowedPaths` 越界即停、Reviewer 只读快照强制)、Shell Adapter 厂商中立接任意 CLI Agent(codex 实证)、digest 绑定人批与 `APPROVAL_STALE`。MVP 承诺兑现:Build–Verify–Fix–Review 自动闭环,停在合并决定,带证据交人。
15
51
  > **发布状态**:`@haiyangbg/buildbeat@2.0.0-beta.1` 已于 2026-08-28 经 GitHub Actions OIDC / Trusted Publishing 发布到 dist-tag `next`;`latest` 保持 v1.21.0,v1 CLI 与文件冻结随包分发(脚手架束钉 `v1.21`)。v2 入口为独立 bin `buildbeat-v2`。registry exact artifact、SLSA provenance、dist-tag 路由、隔离安装、签名审计均已独立回读,证据见 [`docs/V2.0.0-BETA.1-RELEASE-EVIDENCE-2026-08-28.md`](docs/V2.0.0-BETA.1-RELEASE-EVIDENCE-2026-08-28.md)。
16
- > **试点证据**:self-host(RUN-SELF-001)+ 两个外部真实项目(ruoyi-ai RUN-CLI-DW-01 全自动 5.2 分钟到合并决定;chickAI 看板积压含完整 reviewer 阻断→fixer 修复闭环),六退出指标全达标;见 `docs/v2/M4-*.md`。
52
+ > **试点证据**:self-host(RUN-SELF-001)+ 两个外部真实项目(pilot-backend RUN-PILOT-EXT-01 全自动 5.2 分钟到合并决定;pilot-app 看板积压含完整 reviewer 阻断→fixer 修复闭环),六退出指标全达标;见 `docs/v2/M4-*.md`。
17
53
 
18
54
  - **observe v0**(RFC-0003 §8 冻结契约的实现):drift-check/live-status 类探针接为 Evidence Provider(采不到即 `unverified`,同一 Evidence Contract 与链校验台账);bands log→只读诊断→Intent 草稿三层分层响应;草稿只入队 Git 面绝不自动执行;`observe triage` 人分诊,`dismiss` 回调阈值防告警疲劳;分诊记忆活在 Git 面,runtime 可删(不变量 23 有测试)
19
55
  - **文档十件套**(`docs/v2/guide/`):快速开始 / Workflow / Policy / Adapter / Worker 合同 / Evidence / Approval / v1 迁移半天手工 runbook / 安全边界 / 故障恢复
@@ -86,7 +122,7 @@
86
122
  - **Phase 2-B STACK 漂移候选**:Confirmed STACK 新增 `buildbeat-stack-baseline:v1` 精确集合并只读兼容旧 `solobaton-stack-baseline:v1`;`bus-check` 比对 `.nvmrc` / `package.json#engines.node`、npm/pnpm/yarn/bun lockfile 种类与 Dockerfile FROM,确定矛盾进 `stack.drift` conflict,缺源/解析/权限/符号链接/截断边界进 `stack.unverified`;不猜自然语言、不回显原始值、不修改项目文件,matching/conflict/unverified 三类 fixture 已将 Shell 回归扩至 `166/166`
87
123
  - **Phase 2-B Claude 插件分发候选**:新增 `buildbeat-plugins` marketplace 与独立 `buildbeat` 插件 `0.1.0`;插件以 marketplace 内相对符号链接复用 canonical SKILL/templates/docs/example,安装缓存解引用为自包含副本,并刻意排除 npm CLI 顶层 `bin/`。隔离配置回归覆盖严格校验、marketplace 添加、插件安装/启用、缓存同源与二次校验;CI 无 Claude CLI 时只证明静态打包,不冒充安装证据
88
124
  - **分发入口证据边界**:中英 README 首屏加入 Claude plugin 与 scoped npm 路径;legacy `solobaton@latest` 不再承载写入入口,`npx --yes --package=@haiyangbg/buildbeat@latest buildbeat init my-project` 只有在 scoped artifact 完成官方 registry 回读后才宣称可用
89
- - **WP2.7 安全前置**:新增 `standards-partial` fixture,证明仅启用 Confirmed CODE/REVIEW 时缺失 STACK/DESIGN 合法,Shell 回归增至 `176/176`;只读 dry-run 排除 partial 且碰撞的 `chickAI` 与 dirty legacy 安装的 `底座` 作为 Wave 1 adopt 目标
125
+ - **WP2.7 安全前置**:新增 `standards-partial` fixture,证明仅启用 Confirmed CODE/REVIEW 时缺失 STACK/DESIGN 合法,Shell 回归增至 `176/176`;只读 dry-run 排除 partial 且碰撞的 `pilot-app` 与 dirty legacy 安装的 `试点工作区` 作为 Wave 1 adopt 目标
90
126
  - **WP2.7 真实目录本地写入**:获用户点名后,分别保留 init dry-run 零写、交互拒绝零写、default init apply、Tide compact adopt 与 Skill-only 手动 Bootstrap 证据;三个实际骨架完成项目语义渲染,验证套件及离线 `bus-check --strict` exit 0,可选 standards/ADR 均未被为了全绿而生成
91
127
  - **存量保护证据**:Tide 接管前后原 83 个文件的聚合 SHA-256 完全一致;剥离唯一 managed fragment 后,原 `.gitignore` 的 173 字节与 SHA-256 完全一致。没有运行构建、浏览器加载、发布或部署,静态保护证据不得外推为业务验证
92
128
  - **浏览器扩展 UI 探测修复**:真实 Tide 试点暴露 `hasUi=false` 假阴性;项目扫描现在解析嵌套 Manifest V2/V3 的 action/content/options 等 UI 信号,Tide 重探测为 `hasUi=true`,并加入不依赖 `index.html` 或前端框架包的 Node 回归
@@ -283,7 +319,7 @@
283
319
  - **修沙盘时间线硬伤**:Gate3 拍板改 06-19(此前 06-18,早于 P1 发现日,因果倒置);回写落点 ④→⑤;P1 归属统一为"走查发现";README 双语示例块同步
284
320
  - **修 drift-check 基线保护**:`--update-baseline` 任一应用查询失败即拒绝落盘并 exit 1(此前平台 CLI 全失败会用空基线**覆盖好基线**,漂移信号永久丢失);检测模式全失败改报"无法判定"而非谎报"无漂移";APPS 数组清空不再 unbound variable 崩
285
321
  - **bus-check 检测诚实化**:NOW 缺失/占位符时如实报"无法判定/跳过"而非打假 ✅;新增当期看板坏指针告警;meta 仓仅本地领先时提示 git push(此前误导性提示 pull)
286
- - 中文 README:去掉作者本机路径前缀 `AI底座/`;首句"活塞"歧义改"活儿都塞";示例块与脚本实际输出逐字对齐;§6 树补 gitignore.template(中英同)
322
+ - 中文 README:去掉作者本机路径前缀 `<试点工作区>/`;首句"活塞"歧义改"活儿都塞";示例块与脚本实际输出逐字对齐;§6 树补 gitignore.template(中英同)
287
323
  - 英文版:SSOT 统一为 single source of truth 并展开缩写;补漏译(开工四步行/P1 bug 名/或无上游/若干从句);5 处措辞修正(主语错位/It.2 等)
288
324
  - 口径统一:SKILL"两个后端"改"多个"(与 README 一致);SKILL §6 归档清单补"需求";lessons 第 4 条解药行随域改名;模板/沙盘内 lessons 引用注明"solobaton lessons"出处(拷入新项目后不再悬空)
289
325
 
package/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: buildbeat
3
- description: BuildBeat(旧称 Solobaton)—— 面向人和 AI 会话的工程交付协议:帮助一个或多个端到端 Builder 通过 Git 文件总线、四个人工 Gate 和可验证证据闭环需求/功能工作包;产品/全栈/测试是可调用的 AI 专业视角,不是人类岗位流水线。包含会话路由/文件总线/三轨/任务包/审批分层/核查门/决策台账/换期压缩仪式/开工护栏脚本/机器闸 pre-commit:gitleaks+bus-check --strict/引导式 Bootstrap:自查代码+少量提问/接管存量项目仪式/已发布 legacy CLI v0 只读证据与源码候选 init/adopt 受控写入、schema 2 机械 upgrade/证据分级 L0-L4。当用户要为新的中大型项目搭多会话协作架构、**要给已有的存量老项目套上协作流程(接管)**、提到"BuildBeat/Solobaton/协作总线/Builder/人在回路/多 session 协作/AI 团队流程/项目骨架 bootstrap",或抱怨"多个 AI 会话信息不同步、任务过早结束、审批打断过多、review 过于频繁、验收漏验、文档腐烂、返工螺旋"时使用。
3
+ description: BuildBeat(旧称 Solobaton)—— 面向人和 AI 会话的工程交付协议:帮助一个或多个端到端 Builder 通过 Git 文件总线、四个人工 Gate 和可验证证据闭环需求/功能工作包;产品/全栈/测试是可调用的 AI 专业视角,不是人类岗位流水线。包含会话路由/文件总线/三轨/任务包/审批分层/核查门/决策台账/换期压缩仪式/开工护栏脚本/机器闸 pre-commit:gitleaks+bus-check --strict/引导式 Bootstrap:自查代码+少量提问/接管存量项目仪式/已发布 legacy CLI v0 只读证据与源码候选 init/adopt 受控写入、schema 2 机械 upgrade/证据分级 L0-L4。**v2 运行时**(`buildbeat-v2`,由会话调用而非用户手敲):Work 目录 intent/plan digest 绑定接受、隔离 worktree 内 Build→Verify→Review→Fix 自动闭环停在合并决定、overview/inbox/status 回答"到哪了/谁批/卡没卡"、发现分诊与锚定审查、verify 复用、信封与 attempt 自动编号、release-readback 上线回读车道、observe 生产体检、通知出站、gc 打扫。当用户在 AI 会话里说"当前进度/开工/怎么样了/批准/上线/打扫卫生",或要为新的中大型项目搭多会话协作架构、**要给已有的存量老项目套上协作流程(接管)**、提到"BuildBeat/Solobaton/协作总线/Builder/人在回路/多 session 协作/AI 团队流程/项目骨架 bootstrap",或抱怨"多个 AI 会话信息不同步、任务过早结束、审批打断过多、review 过于频繁、验收漏验、文档腐烂、返工螺旋"时使用。
4
4
  ---
5
5
 
6
6
  # BuildBeat —— 面向人和 AI 会话的工程交付协议
@@ -12,6 +12,79 @@ description: BuildBeat(旧称 Solobaton)—— 面向人和 AI 会话的工
12
12
  - **用**:项目要跑多期迭代,或存在多个仓/部署单元/AI 上下文;一个或多个 Builder 需要让需求、契约、状态、Gate 与证据长期同步。
13
13
  - **不用**:单仓小任务、一次性脚本、预计一周内收尾的事——直接开一个会话干完,上总线纯属 ceremony(对应 §5 快轨思想)。
14
14
 
15
+ ## 0.5 v2 驾驶手册 —— Skill 是入口,CLI 是它调用的引擎
16
+
17
+ > 绝大多数人在 Claude Code / Codex / Cursor 这类 AI 会话里使用 BuildBeat,而不是亲手敲 `buildbeat-v2`。所以**这一节是给会话读的**:用户说一句人话,会话按下表调命令、读输出、按格式收口。用户不需要知道任何命令;会话不得把命令名当成对用户的要求。§1–§10 是方法论正文,v1 文件总线(`pm/NOW.md`、看板、`pm/status/*`)在 v2 项目里已冻结只读,**禁止双写**。
18
+ > 装载方式不变:项目根 `AGENTS.md`(v2 模板 [templates/v2/AGENTS.md](templates/v2/AGENTS.md))被任意会话自动装载,`CLAUDE.md` 只是一行指针。运行时 `npm i -g @haiyangbg/buildbeat@next`,Node ≥ 20;没装 CLI 时本节的"会话背后调什么"一列改为会话手工维护同名文件(`delivery/work/<ID>/` 与 `decisions.jsonl`),方法论不因此失效。
19
+
20
+ > 给用户看的完整版(按项目阶段:未开始 → 立项定方案 → 准备执行 → 执行推进 → 验收合并 → 上线 → 完结换期复盘)在 [docs/v2/guide/00-how-to-talk.md](docs/v2/guide/00-how-to-talk.md);用户问"我该怎么说"时把它给用户,不要复述命令。
21
+
22
+ ### 0.5.1 用户一句话 → 会话做什么
23
+
24
+ | 用户说 | 会话背后调什么 | 会话回给用户什么 |
25
+ |---|---|---|
26
+ | 「当前进度」「待办是什么」「X 上线了吗」「离上线还差多远」 | `buildbeat-v2 overview --repo .`(每个 Work 的阶段 + 下一步该谁)+ `observe status --repo .` | 每件事一句:走到哪、卡在谁、下一步;**不列命令** |
27
+ | 「有什么要我拍板」 | `buildbeat-v2 inbox --repo .` | 逐项:等什么、证据在哪、推荐 A/B;用户回「批准/拒绝」后会话调 `approve`/`reject` |
28
+ | 「开个 Work:〔目标〕」 | 写 `delivery/work/<ID>/intent.md`(为什么做)+ `plan.md`(怎么做)+ `run-config.yaml`;给用户看摘要 | 「看完说接受」;用户说「接受」→ `accept --artifact intent` / `--artifact plan`(digest 绑定) |
29
+ | 「开工」「再来一轮」 | `buildbeat-v2 start --config <run-config.yaml> --attempt new`(自动编号 RUN-X-01/02…,自动作废同 Work 的旧等待;**用 nohup/setsid 脱离启动**) | 「已起 RUN-X-02,停在合并决定时会通知/我会告诉你」 |
30
+ | 「怎么样了」「卡住了吗」「正常吗」 | `buildbeat-v2 status --repo . --run <RUN>` | 一句:在跑第几步、跑了多久、历史通常多久、最后一次输出几分钟前;`STALLED` 就说「疑似卡住,建议停/等」 |
31
+ | 「批准 RUN-X」「拒绝,原因…」 | `approve --transition <t> --by <用户名>` / `reject --reason` → 若非终态再 `resume` | 「批准=merge-ready;合并/push/部署要你另说」 |
32
+ | 「这条 finding 不算,那条接受」 | `findings list` / `findings adjudicate --action dismiss|accept` → `approve --transition enter-fix` | 裁决结果一句 |
33
+ | 「上线」「做生产动作」 | 用 `release-readback` 预设 + `riskPreset: release` 开 Run:preflight 回读 → 停 `enter-apply-readback` | 「回读全绿,现在轮到你做〔动作〕;做完说一声」→ 用户说「做完了」→ `approve enter-apply-readback` → 回读+观察 → 停关窗 |
34
+ | 「打扫卫生」 | `buildbeat-v2 gc --repo .`(先出计划)→ 用户点头 → `--apply true` | 清了几个工作树、留了哪些分支及为什么 |
35
+ | 「生产报警」「体检」 | `observe run --config .buildbeat/observe.yaml` → 看 `delivery/observe/intents/` | 草稿一句 + 「fix_now / schedule / dismiss 你选」 |
36
+
37
+ ### 0.5.2 会话必须遵守的读法
38
+
39
+ - **能实查的不问人**:`overview` / `status` / `inbox` / `metrics` / `observe status` 全是只读,先跑再答;不信文档、不信上游转述。
40
+ - **数字要落地**:`status` 给了耗时和历史中位数,回答「正常吗」必须带对比("verify 已 14 分钟,历史中位 6 分钟,最后输出 2 分钟前,还在动");没数据就说没数据。
41
+ - **输出里的 `next:` 行是给会话的**,会话据此调命令,不把命令原文丢给用户;用户只需要回「批准 / 拒绝 / 接受 / 做完了 / A / B」。
42
+ - **人批三级**(§AGENTS 2.5):`STOP_NOW` 只用于跨发布门 / 扩范围 / 改冻结契约 / 不可逆外部动作 / 接受风险;可逆取舍攒到门前一次批 2~5 个;事实与派生约束自己定。**所有者以后要看见或念出来的名字与参数(域名、服务名、环境名、自停时长、窗口时长)属于门前决策项,不由 worker 顺手定**——真实事故:一个按内部术语起的服务名让所有者连问四轮才改成他听得懂的业务名。
43
+ - **环境事实是交付物**:跑出来的"目标机 Python 3.6 / Redis 必须 ≥7 / 端口 8080 被占"写进 `delivery/work/<ID>/env-facts.md`,并尽量转成 run-config `requires:` 的 `probe:` 条目,下窗直接引用,禁止口口相传。
44
+ - **收口格式**统一「已做 → 未做 → 下一步」,各一句,证据紧跟事项(§6.4);中间探索不套模板。
45
+
46
+ ### 0.5.3 写 run-config 时的最小样板(会话代写,用户不用看)
47
+
48
+ ```yaml
49
+ repo: ../../..
50
+ work: WORK-X
51
+ run: RUN-X # 家族名;start --attempt new 自动编成 RUN-X-01/02…
52
+ workflow: <buildbeat>/src/v2/presets/software-delivery.yaml
53
+ riskPreset: standard # fast | standard | controlled | release(配 release-readback 预设)
54
+ entry: build
55
+ allowedPaths:
56
+ - src
57
+ - tests
58
+ reviewTriage: required # P0/P1 先过人分诊再派 fixer
59
+ cache:
60
+ verify: tree # 同树+同命令+同信封已通过就复用证据(标 REUSED)
61
+ envelope:
62
+ prompts: prompts # prompts/<component>-<worker>.md 或 <worker>.md;内核喂给 worker($BUILDBEAT_PROMPT)
63
+ vars:
64
+ component: auth
65
+ # pin: <meta 提交 sha> # 冻结信封时钉住
66
+ requires:
67
+ - command: node
68
+ min: "20"
69
+ - probe: "redis-cli -h $REDIS_HOST ping"
70
+ expect: PONG
71
+ name: redis-reachable
72
+ redact:
73
+ - "(?i)(token|secret|password)=[^\\s]+"
74
+ workers:
75
+ builder:
76
+ command: codex
77
+ args: [exec, -s, workspace-write, "按 $BUILDBEAT_PROMPT 实施,改动后 git commit"]
78
+ verifier:
79
+ command: bash
80
+ args: [-lc, "npm test"]
81
+ reviewer:
82
+ command: codex
83
+ args: [exec, -s, read-only, "只读审查;若 BUILDBEAT_INPUT 里有 lastReviewed 只看 range 内 diff;JSON 信封写入 $BUILDBEAT_OUTPUT"]
84
+ ```
85
+
86
+ (严格 YAML 子集:上面为省行用了行内 `[]`,实际文件要写成块列表。)通知通道另放 `.buildbeat/notify.yaml`(URL 只能来自环境变量),见 [docs/v2/guide/07-approval-guide.md](docs/v2/guide/07-approval-guide.md);十件套指南索引 [docs/v2/guide/README.md](docs/v2/guide/README.md)。
87
+
15
88
  ## 1. 四根支柱(命根子,所有零件都为它们服务)
16
89
 
17
90
  1. **端到端工作包**:一个 Builder 对一个需求/功能工作包的产品判断、实现、测试、合并与发布证据负责;需要隔离时再调用独立 AI 视角(独立 cwd / 上下文 / 写边界)。
@@ -302,7 +375,8 @@ Gate1 规格(人批) → Gate2 设计(人对着真渲染原型批) → 实现+
302
375
 
303
376
  | 模板 | 用途 |
304
377
  |---|---|
305
- | [templates/AGENTS.md](templates/AGENTS.md) | 工作区路由 + 十条规则 + 红线(开放标准,每会话自动装载) |
378
+ | [templates/v2/AGENTS.md](templates/v2/AGENTS.md) / [templates/v2/指挥台.md](templates/v2/指挥台.md) | **v2 项目用这两份**:一页流程 + 视角路由 + 十一条规则(含可见命名进决策卡)+ 红线;指挥台是"用户一句话 → 会话调什么"的操作卡 |
379
+ | [templates/AGENTS.md](templates/AGENTS.md) | v1 工作区路由 + 十条规则 + 红线(开放标准,每会话自动装载) |
306
380
  | [templates/CLAUDE.md](templates/CLAUDE.md) | 一行指针 → `AGENTS.md`(兼容只认此名的工具;🔴 不复制内容) |
307
381
  | [templates/ARCHITECTURE.md](templates/ARCHITECTURE.md) | 全栈总图骨架(架构/基础设施/凭据位置/子项目索引) |
308
382
  | [templates/指挥台.md](templates/指挥台.md) | 给人看的一页操作卡 |
@@ -2,5 +2,17 @@
2
2
 
3
3
  // v2 runtime CLI entry. The v1 `buildbeat` bin stays frozen on src/cli.js;
4
4
  // v2 ships as a separate entry until it takes over `latest`.
5
+ //
6
+ // Guard before loading any module: the kernel uses Node>=20 syntax, and on a
7
+ // machine whose default node drifted older the raw SyntaxError stack hides
8
+ // the actual problem (real incident: default node v14 during the meta pilot).
9
+ const major = Number(process.versions.node.split(".")[0]);
10
+ if (major < 20) {
11
+ console.error(
12
+ `buildbeat-v2 needs Node >= 20; this shell resolved v${process.versions.node}.\n` +
13
+ "Check `which node` / nvm default, then rerun (e.g. `nvm use 23`).",
14
+ );
15
+ process.exit(1);
16
+ }
5
17
 
6
- import "../src/v2/cli/run.js";
18
+ import("../src/v2/cli/run.js");
@@ -14,7 +14,7 @@ For every target, the Git `HEAD` and a digest of `git status --porcelain=v1 -z`
14
14
  |---|---|---|---|
15
15
  | Solobaton source repository | Exit 1: no installed scaffold; missing hook warning | Ready to plan compact layout; one path collision warning | Git-visible state unchanged |
16
16
  | AI foundation coordination repository | Exit 0: default layout `v1.14`; legacy manifest and placeholder warnings | Exit 1: existing installation blocked; 10 collisions reported | Git-visible state unchanged |
17
- | ChickAI product repository | Exit 1: partial default layout; missing hook and placeholder warnings | Exit 1: partial installation blocked; 10 collisions reported | Git-visible state unchanged |
17
+ | pilot-app product repository | Exit 1: partial default layout; missing hook and placeholder warnings | Exit 1: partial installation blocked; 10 collisions reported | Git-visible state unchanged |
18
18
 
19
19
  All scans completed without truncation or skipped symbolic links. The two larger brownfield targets exposed three to four nested repositories, five to seven deployment markers, tests, and UI signals without returning source contents or configuration values.
20
20
 
package/docs/CLI.md CHANGED
@@ -128,7 +128,7 @@ Schema 2 is the first write-capable shape targeted by Wave 1:
128
128
  {
129
129
  "schemaVersion": 2,
130
130
  "scaffoldVersion": "v1.21",
131
- "cliVersion": "2.0.0-beta.2",
131
+ "cliVersion": "2.0.0-beta.4",
132
132
  "layout": "default",
133
133
  "installedAt": "2026-08-24T00:00:00.000Z",
134
134
  "files": {
@@ -204,7 +204,7 @@ Skill = 全部语义:占位符渲染、Bootstrap 提问、Adopt 摸底、Gat
204
204
 
205
205
  ### WP1.6 真实项目试点(候选完成,发布闸)
206
206
 
207
- - `example/` + 一个活跃多仓项目(建议老乡鸡 AI 底座工作区)+ 一个单仓项目;人工制造三类不一致验证检出;结论记 CHANGELOG。**不过不发。**
207
+ - `example/` + 一个活跃多仓项目(建议一个真实企业工作区工作区)+ 一个单仓项目;人工制造三类不一致验证检出;结论记 CHANGELOG。**不过不发。**
208
208
  - 证据:[`PHASE1-PILOT-2026-08-24.md`](PHASE1-PILOT-2026-08-24.md);全部在临时副本/共享 clone 中只读运行,三类源项目 Git 可见状态前后一致。
209
209
 
210
210
  **v1.18 发布**:脚本属 replace-if-unmodified 可整文件替换;看板/NOW/status 只给迁移手册。
@@ -277,7 +277,7 @@ Skill = 全部语义:占位符渲染、Bootstrap 提问、Adopt 摸底、Gat
277
277
 
278
278
  - 一个全新项目走 `init` 真写 + Skill/手动初始化 Git + AI 渲染 + bus-check 干净;一个存量项目走 `adopt`;一个项目走 Skill-only 手动 Bootstrap 交叉验证(完成这些后 doctor 对三者全绿)。
279
279
  - fixture:`standards-partial/` 已证明 CODE/REVIEW 部分存在时缺失 STACK/DESIGN 合法,Shell 回归由 166 增至 176;`stack-conflict/` 已在 WP2.5 提前闭环。
280
- - 只读预检见 [`PHASE2-PILOT-PREFLIGHT-2026-08-25.md`](PHASE2-PILOT-PREFLIGHT-2026-08-25.md):相邻 `../chickAI` 为 partial 安装且 9 个碰撞,`../底座` 为 dirty legacy v1.14 安装且 9 个碰撞,均不具备 Wave 1 adopt 写入资格。剩余三条真实路径须用户点名绝对路径并明确授权;不得用 disposable fixture 冒充真实试点。
280
+ - 只读预检见 [`PHASE2-PILOT-PREFLIGHT-2026-08-25.md`](PHASE2-PILOT-PREFLIGHT-2026-08-25.md):相邻 `../pilot-app` 为 partial 安装且 9 个碰撞,`../试点工作区` 为 dirty legacy v1.14 安装且 9 个碰撞,均不具备 Wave 1 adopt 写入资格。剩余三条真实路径须用户点名绝对路径并明确授权;不得用 disposable fixture 冒充真实试点。
281
281
  - 用户已点名 `~/Downloads/solobaton测试/{1,2,3}`、`~/Downloads/tide_副本` 与 `~/Downloads/solobaton-skill测试`;dry-run、人工拒绝、init apply、adopt apply 和 Skill-only Bootstrap 均已按边界执行,详见 [`PHASE2-PILOT-2026-08-25.md`](PHASE2-PILOT-2026-08-25.md)。
282
282
  - `1`/`2` 保持零条目;两个 CLI 目标 manifest 有效,三个实际骨架项目占位符清零,验证套件与离线 strict exit 0。Tide 原 83 文件聚合 SHA-256 与原 ignore 173 字节 SHA-256 前后一致。
283
283
  - 真实 Tide 暴露浏览器扩展 UI 假阴性;源码已从 Manifest V2/V3 的 action/content/options 等信号识别 UI,重跑 Tide 得到 `hasUi=true` 并加入 Node 回归。
@@ -14,8 +14,8 @@
14
14
 
15
15
  | 候选 | 只读事实 | WP2.7 结论 |
16
16
  |---|---|---|
17
- | `../chickAI` | 根 Git 干净,HEAD `8c7d3f322fb0`;doctor 判为 partial default layout、无 version marker/manifest;adopt 发现 9 个目标碰撞并返回 `ready=false` | 不能作为当前 Wave 1 adopt 写试点。须另立人工接管/所有权对账工作包,不能让 CLI 猜已有文件归属 |
18
- | `../底座` | 根 Git 有 15 个可见变更,HEAD `8e1b32db4885`;doctor 判为已安装 legacy v1.14、manifest 缺失;adopt 发现 9 个目标碰撞,并同时返回 already-installed、dirty、collision blockers | 不能作为 Wave 1 adopt 目标;它属于未来 legacy migration/upgrade 路径。当前脏工作区也不满足任何写前条件 |
17
+ | `../pilot-app` | 根 Git 干净,HEAD `8c7d3f322fb0`;doctor 判为 partial default layout、无 version marker/manifest;adopt 发现 9 个目标碰撞并返回 `ready=false` | 不能作为当前 Wave 1 adopt 写试点。须另立人工接管/所有权对账工作包,不能让 CLI 猜已有文件归属 |
18
+ | `../试点工作区` | 根 Git 有 15 个可见变更,HEAD `8e1b32db4885`;doctor 判为已安装 legacy v1.14、manifest 缺失;adopt 发现 9 个目标碰撞,并同时返回 already-installed、dirty、collision blockers | 不能作为 Wave 1 adopt 目标;它属于未来 legacy migration/upgrade 路径。当前脏工作区也不满足任何写前条件 |
19
19
 
20
20
  未读取或记录两仓的变更文件名、源码内容、配置值、凭据、远端状态或生产事实。上表是 2026-08-25 的点时只读结果,执行前必须重新预检。
21
21
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  | 项 | 观测值 |
8
8
  |---|---|
9
- | 目标 | `/Users/zhouhaiyang/Downloads/buildbeat测试/init` |
9
+ | 目标 | `<本机路径>/buildbeat测试/init` |
10
10
  | 升级前基线 | `main@4ea29a94a3a29fa905ae99662359ec561298135d`,schema `2`,scaffold `v1.16`,CLI `1.16.3` |
11
11
  | 专用分支 | `buildbeat-v1.20-upgrade` |
12
12
  | 升级来源 | 当前源码 `@haiyangbg/buildbeat@1.20.0`,scaffold `v1.20` |
@@ -27,7 +27,7 @@
27
27
 
28
28
  ## B. 真实多仓 / 扫描边界刷新
29
29
 
30
- 刷新对象为 `/Users/zhouhaiyang/Documents/Obsidian Vault/AI底座/底座`。为避免改动一个约 `4.6G` 且带本地在途工作的真实协调仓,本次建立只读投影:复制 meta/subrepo Git object、`pm/`、`contracts/`、项目脚本及四个已发现子仓 `ai-admin`、`chickDEV`、`lxj-CLI`、`ruoyi-ai` 的顶层版本来源;只用当前候选 `bus-check.sh` 替换投影中的检查器。原仓零写入、零 stage、零 commit。
30
+ 刷新对象为 `<本机路径>/<试点工作区>`。为避免改动一个约 `4.6G` 且带本地在途工作的真实协调仓,本次建立只读投影:复制 meta/subrepo Git object、`pm/`、`contracts/`、项目脚本及四个已发现子仓 `ai-admin`、`pilot-web`、`pilot-cli`、`pilot-backend` 的顶层版本来源;只用当前候选 `bus-check.sh` 替换投影中的检查器。原仓零写入、零 stage、零 commit。
31
31
 
32
32
  首轮刷新发现当前检查器把 legacy prose 中实际留在根内的 `../contracts/...` 链接误判为 traversal。源码随后收窄为:canonical Gate/evidence 仍只接受仓根相对路径;只有 scoped legacy prose 可以解析 `../` / `./`,且 realpath 必须留在协调根内,symlink/权限边界仍不跟随。新增“根内 parent link 通过、根外逃逸阻断”回归后,Shell 套件为 `222/222`。
33
33
 
package/docs/RELEASING.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  This runbook governs BuildBeat's public npm distribution. The canonical package is `@haiyangbg/buildbeat` in `HaiYangBG1/BuildBeat`; the canonical executable is `buildbeat`, while `solobaton` remains an executable alias. The old `solobaton` npm package is a frozen legacy distribution ID and must not receive the scoped write/upgrade command surface.
4
4
 
5
- Release evidence at source package version `@haiyangbg/buildbeat@2.0.0-beta.2` (pending publication verification); latest independently verified BuildBeat npm distribution `@haiyangbg/buildbeat@2.0.0-beta.1` (dist-tag `next`; `latest` remains `1.21.0`), anchored by annotated tag `v2.0.0-beta.1` at commit `946d43f`, workflow run [33171071539](https://github.com/HaiYangBG1/BuildBeat/actions/runs/33171071539), and archived in [`V2.0.0-BETA.1-RELEASE-EVIDENCE-2026-08-28.md`](V2.0.0-BETA.1-RELEASE-EVIDENCE-2026-08-28.md). The latest stable distribution stays `@haiyangbg/buildbeat@1.21.0`, anchored by annotated tag `v1.21.0` at commit `ce69a05`, workflow run [32864438692](https://github.com/HaiYangBG1/BuildBeat/actions/runs/32864438692), and the matching [GitHub Release](https://github.com/HaiYangBG1/BuildBeat/releases/tag/v1.21.0). Exact registry identity, provenance, signatures, isolated-install readback, Environment approval, and immutable-artifact boundary are archived in [`V1.21-RELEASE-EVIDENCE-2026-08-25.md`](V1.21-RELEASE-EVIDENCE-2026-08-25.md). First-scoped-release bootstrap behavior and legacy deprecation remain archived in [`WP4.3-RELEASE-EVIDENCE-2026-08-25.md`](WP4.3-RELEASE-EVIDENCE-2026-08-25.md). The legacy distribution remains `solobaton@1.16.3`; all three published legacy versions are retained and deprecated toward the scoped package.
5
+ Release evidence at source package version `@haiyangbg/buildbeat@2.0.0-beta.4` (pending publication verification); latest independently verified BuildBeat npm distribution `@haiyangbg/buildbeat@2.0.0-beta.3` (dist-tag `next`; `latest` remains `1.21.0`), anchored by annotated tag `v2.0.0-beta.3` at commit `02d1f5a`, workflow run [33460544343](https://github.com/HaiYangBG1/BuildBeat/actions/runs/33460544343), and archived in [`V2.0.0-BETA.3-RELEASE-EVIDENCE-2026-09-01.md`](V2.0.0-BETA.3-RELEASE-EVIDENCE-2026-09-01.md). The beta.2 chain stays archived in [`V2.0.0-BETA.2-RELEASE-EVIDENCE-2026-08-28.md`](V2.0.0-BETA.2-RELEASE-EVIDENCE-2026-08-28.md); the beta.1 chain stays archived in [`V2.0.0-BETA.1-RELEASE-EVIDENCE-2026-08-28.md`](V2.0.0-BETA.1-RELEASE-EVIDENCE-2026-08-28.md). The latest stable distribution stays `@haiyangbg/buildbeat@1.21.0`, anchored by annotated tag `v1.21.0` at commit `ce69a05`, workflow run [32864438692](https://github.com/HaiYangBG1/BuildBeat/actions/runs/32864438692), and the matching [GitHub Release](https://github.com/HaiYangBG1/BuildBeat/releases/tag/v1.21.0). Exact registry identity, provenance, signatures, isolated-install readback, Environment approval, and immutable-artifact boundary are archived in [`V1.21-RELEASE-EVIDENCE-2026-08-25.md`](V1.21-RELEASE-EVIDENCE-2026-08-25.md). First-scoped-release bootstrap behavior and legacy deprecation remain archived in [`WP4.3-RELEASE-EVIDENCE-2026-08-25.md`](WP4.3-RELEASE-EVIDENCE-2026-08-25.md). The legacy distribution remains `solobaton@1.16.3`; all three published legacy versions are retained and deprecated toward the scoped package.
6
6
 
7
7
  ## Release invariants
8
8
 
@@ -8,7 +8,7 @@
8
8
  ## 已确认事实
9
9
 
10
10
  - `V2-D0=B` 已决定建设 v2;本卡只决定内核范围,不再讨论做不做。
11
- - ChickAI、Tide、AI 底座三次真实工作都没有由 `pilot/loop.sh` 自动激活,自动 Run ledger 为 `0/3`;三者均只能作为真实流程/负向证据,不能伪装成合格自动 Run。
11
+ - pilot-app、Tide、AI 试点工作区三次真实工作都没有由 `pilot/loop.sh` 自动激活,自动 Run ledger 为 `0/3`;三者均只能作为真实流程/负向证据,不能伪装成合格自动 Run。
12
12
  - F1~F4 的 fail-closed fixture 通过;F5 已确认只能阻断、不能恢复;F6 已确认没有持久化 Approval 对象,也不会自动产生 stale 事件。
13
13
  - 当前暂定可组装能力加权覆盖率为 `45.8%(5.5/12)`,低于薄内核路线要求的 `80%`。
14
14
  - 当前仍没有 v2 tag、`next` 预发布、远端发布或目标项目原地升级。
@@ -23,7 +23,7 @@
23
23
 
24
24
  ## B:继续 M-1
25
25
 
26
- 保持 `V2-D2=PENDING`,等待 AI 底座出现下一项自然、已授权、低风险的非生产开发任务,再要求它从干净 oracle 进入现有 `pilot/loop.sh`。不补造演示需求,不回放旧 candidate。
26
+ 保持 `V2-D2=PENDING`,等待 AI 试点工作区出现下一项自然、已授权、低风险的非生产开发任务,再要求它从干净 oracle 进入现有 `pilot/loop.sh`。不补造演示需求,不回放旧 candidate。
27
27
 
28
28
  代价:脚本本身没有自动触发、恢复和 Approval 对象;在新增这些能力前,第四次任务仍可能被人工流程绕过,且即使成功也无法消除已确认的 F5/F6 缺口。
29
29
 
@@ -6,6 +6,6 @@
6
6
  |---|---|---|---|---|---|
7
7
  | 2026-08-28 | `V2-D3` | 项目所有者 | M0 退出评审通过:定稿 [`v2/RFC-0001`](v2/RFC-0001-product-definition.md)(产品定位 + 自研面理由)、[`v2/RFC-0002`](v2/RFC-0002-domain-model.md)(领域模型 + 名词消歧 + v1 处置)、[`v2/RFC-0003`](v2/RFC-0003-workflow-policy.md)(Workflow/Policy + observe/bands schema)与 [`v2/SPEC-0001-events-v1.md`](v2/SPEC-0001-events-v1.md)(事件格式) | M0 关闭,进入 M1 最小纵切;SPEC-0001 进入 `FROZEN`,此后 additive-only、破坏性变更须升 `v`;RFC 与 `V2-PLAN.md` 冲突仍以 V2-PLAN 为准,改判须回写台账 | M1 验收:真实项目上 `build → verify` 两步由 Shell Adapter 驱动跑通,证据全部来自回读 |
8
8
  | 2026-08-28 | `V2-D2` | 项目所有者 | 选择方案 **A**:M-1 分叉结论为**完整内核**。主判据为重复出现的 CRITICAL 运行缺口——三次真实任务自动激活 `0/3`、F5 中断恢复缺失、F6 Approval 对象缺失,满足结论 (a)「至少两个 CRITICAL 缺口在两轮以上重复出现」;暂定可组装覆盖率 45.8% 按 [`pilot/metrics.md`](../pilot/metrics.md) 口径仅作旁证,不作分叉依据。原计划三轮中的「修 bug 轮」未执行,记为已接受偏差 | M-1 关闭,迭代 01 收尾;进入 M0(三份 RFC + events.jsonl v1 冻结 + observe/bands schema 冻结),随后 M1 最小纵切,总窗口按 ~12–15 周执行;F5/F6 分别在 M1/M2 关闭。本决策只授权本地 `v2` 分支的 M0/M1 实现与验证,不含 push、merge、npm publish、tag、部署、生产动作或目标项目原地升级 | M0 退出评审:三份 RFC 与事件格式 v1 定稿为下一道人工门 |
9
- | 2026-08-27 | `V2-D1A` | 项目所有者 | M-1 第三个目标项目选定为 `AI底座/底座`;该项目开发活跃,已按 legacy 路径手工接入 BuildBeat 1.x,适合验证旧项目、多仓与接力棒场景 | 既有 `WP-B1-AUTHZ` 只作回放/兼容性证据,不倒算为自动 Loop;第三个有效 run 使用该项目下一项自然发生、已授权、低风险的非生产开发任务,并从干净 oracle commit 启动。当前不原地升级目标项目、不补造 manifest、不改/关现有 Gate,也不授权 push、merge、migration、部署或生产动作 | 有合适工作项时冻结 intent/plan/oracle;若跨多仓,先让试点明确绑定全部 workspace,不能静默退化成单仓证据 |
10
- | 2026-08-27 | `V2-D1` | 项目所有者 | M-1 首批选择两个真实工作项:① ChickAI 额度耗尽时仍可正常登录网站,但模型不可用且不得补发 Key 绕额度;② Tide 悬浮球空闲时缩入左侧并半透明隐藏,交互时立即展开 | 迭代 01 从本日启动;两项均只允许在本地 `pilot/*` 分支实施与验证,不授权 merge、push、发布、部署或生产操作;第三个工作项暂留空,不影响先跑前两轮 | 两轮证据完成后决定是否补第三轮;最终形成 `V2-D2` |
9
+ | 2026-08-27 | `V2-D1A` | 项目所有者 | M-1 第三个目标项目选定为 `<试点工作区>`;该项目开发活跃,已按 legacy 路径手工接入 BuildBeat 1.x,适合验证旧项目、多仓与接力棒场景 | 既有 `WP-B1-AUTHZ` 只作回放/兼容性证据,不倒算为自动 Loop;第三个有效 run 使用该项目下一项自然发生、已授权、低风险的非生产开发任务,并从干净 oracle commit 启动。当前不原地升级目标项目、不补造 manifest、不改/关现有 Gate,也不授权 push、merge、migration、部署或生产动作 | 有合适工作项时冻结 intent/plan/oracle;若跨多仓,先让试点明确绑定全部 workspace,不能静默退化成单仓证据 |
10
+ | 2026-08-27 | `V2-D1` | 项目所有者 | M-1 首批选择两个真实工作项:① pilot-app 额度耗尽时仍可正常登录网站,但模型不可用且不得补发 Key 绕额度;② Tide 悬浮球空闲时缩入左侧并半透明隐藏,交互时立即展开 | 迭代 01 从本日启动;两项均只允许在本地 `pilot/*` 分支实施与验证,不授权 merge、push、发布、部署或生产操作;第三个工作项暂留空,不影响先跑前两轮 | 两轮证据完成后决定是否补第三轮;最终形成 `V2-D2` |
11
11
  | 2026-08-27 | `V2-D0` | 项目所有者 | 选择方案 **B**:正式采用 [`V2-PLAN.md`](V2-PLAN.md) 作为 BuildBeat v2 执行基线,不再把 M-1 当作“是否做 v2”的试验 | v1 转入维护线;建立本地 `v1-maintenance` 与 `v2` 开发线;`V2-PLAN.md` D1–D6 推荐项同步生效;M-1 只决定薄内核或完整内核;本决策不授权 push、发布、部署或生产操作 | `V2-D1`:M-1 工作项;`V2-D2`:M-1 分叉结论 |
@@ -1,6 +1,6 @@
1
1
  # v2 迭代 01:M-1 人肉内核试点
2
2
 
3
- > 状态:**已收尾——`V2-D2=A` 已拍板(2026-08-28,完整内核)**。ChickAI、Tide 与后续 AI 底座 `WP-B1-AUTHZ` 推进均由当前会话人工编排,自动 Run ledger 为 `0/3`;F5/F6 已从 `UNVERIFIED` 收敛为 `MISSING`。决策卡见 [`V2-D2-DECISION-CARD.md`](V2-D2-DECISION-CARD.md),台账见 [`V2-DECISIONS.md`](V2-DECISIONS.md);M-1 关闭,进入迭代 02(M0)
3
+ > 状态:**已收尾——`V2-D2=A` 已拍板(2026-08-28,完整内核)**。pilot-app、Tide 与后续 AI 试点工作区 `WP-B1-AUTHZ` 推进均由当前会话人工编排,自动 Run ledger 为 `0/3`;F5/F6 已从 `UNVERIFIED` 收敛为 `MISSING`。决策卡见 [`V2-D2-DECISION-CARD.md`](V2-D2-DECISION-CARD.md),台账见 [`V2-DECISIONS.md`](V2-DECISIONS.md);M-1 关闭,进入迭代 02(M0)
4
4
  > 上游:[`V2-PLAN.md`](V2-PLAN.md) §8;决策台账:[`V2-DECISIONS.md`](V2-DECISIONS.md);试点套件:[`pilot/`](../pilot/README.md)
5
5
  > 时间盒:**≤2 周**(自 `V2-D1` 起算);到期未跑完也必须按已有证据形成分叉结论或明确 `UNVERIFIED`
6
6
 
@@ -15,11 +15,11 @@ v2 已由 `V2-D0=B` 决定正式实施;M-1 不再拥有“放弃 v2”的隐
15
15
 
16
16
  ## 任务清单
17
17
 
18
- - [x] **T1(项目所有者,`V2-D1` + `V2-D1A`)**:首批工作项为 ChickAI 额度耗尽仍可登录(含 UI)与 Tide 悬浮球空闲收纳(小功能);第三个目标项目已选定为 `AI底座/底座`,具体采用该项目下一项自然发生、已授权、低风险的非生产开发任务,不另造演示需求。
19
- - [ ] **T2(每个执行工作项)**:ChickAI 与 Tide 均已准备独立 `ACCEPT_CMD`,在原基线先失败、实现后通过;第三项尚未冻结工作项与 oracle。
20
- - [ ] **T3(每个执行工作项)**:ChickAI 与 Tide 均使用 `pilot/*` 专用 branch/worktree,intent、plan、protected paths 与验收 oracle 先独立提交;第三项尚未建立隔离现场。
18
+ - [x] **T1(项目所有者,`V2-D1` + `V2-D1A`)**:首批工作项为 pilot-app 额度耗尽仍可登录(含 UI)与 Tide 悬浮球空闲收纳(小功能);第三个目标项目已选定为 `<试点工作区>`,具体采用该项目下一项自然发生、已授权、低风险的非生产开发任务,不另造演示需求。
19
+ - [ ] **T2(每个执行工作项)**:pilot-app 与 Tide 均已准备独立 `ACCEPT_CMD`,在原基线先失败、实现后通过;第三项尚未冻结工作项与 oracle。
20
+ - [ ] **T3(每个执行工作项)**:pilot-app 与 Tide 均使用 `pilot/*` 专用 branch/worktree,intent、plan、protected paths 与验收 oracle 先独立提交;第三项尚未建立隔离现场。
21
21
  - [ ] **T4(每轮)**:当前两项没有运行 [`pilot/loop.sh`](../pilot/loop.sh),attempts/token/费用也没有统一 ledger;人工阶段数不得冒充自动 Loop 数据。下一轮必须由脚本从干净 oracle commit 开跑。
22
- - [ ] **T5(每轮)**:ChickAI 候选与两个精确 release commit 均完成独立只读审查;其中 reviewer 抓出单阶段滚动 P1,最终 stage1/stage2 分别收敛为无 P0/P1。Tide 仅完成回归/验收与视觉检查;两项均未由脚本产生 `WAITING_HUMAN` 终态,故本项未完成。
22
+ - [ ] **T5(每轮)**:pilot-app 候选与两个精确 release commit 均完成独立只读审查;其中 reviewer 抓出单阶段滚动 P1,最终 stage1/stage2 分别收敛为无 P0/P1。Tide 仅完成回归/验收与视觉检查;两项均未由脚本产生 `WAITING_HUMAN` 终态,故本项未完成。
23
23
  - [x] **T6(故障注入)**:`npm run test:pilot` 当前 15/15;F1~F4 保持 fail-closed,F5 证实中断后只能阻断、不能恢复,F6 证实无持久化 Approval 对象、无 stale 事件。测试绿只表示缺口被稳定观测,不表示 F5/F6 能力通过。
24
24
  - [x] **T7(三轮或时间盒到期)**:[`V2-D2-DECISION-CARD.md`](V2-D2-DECISION-CARD.md) 已形成并于 2026-08-28 由项目所有者拍板 `V2-D2=A`;已回写 [`V2-PLAN.md`](V2-PLAN.md) §8 与 [`V2-DECISIONS.md`](V2-DECISIONS.md)。
25
25
 
@@ -27,17 +27,17 @@ v2 已由 `V2-D0=B` 决定正式实施;M-1 不再拥有“放弃 v2”的隐
27
27
 
28
28
  ## 2026-08-27 当前证据
29
29
 
30
- - **ChickAI(含 UI + 生产)**:原始实现 `f78f64c`、证据 `d31c056`;生产 reviewer 发现单阶段滚动 P1 后拆为 `0.17.84@8e41661` 铺服务端门,再以 `0.17.85@7aa570c` 开启。最终 ops `f2495d5`、tag `v0.17.85`、digest `30d4ebc0…`、ChangeOrder `4ba5f72d…`;unit 158/158、额度 UI5 3/3、两实例同 revision、Running/Healthy/0 重启、逐实例/公网/钉钉 smoke 通过。真人 quota OAuth 仍待回访。
30
+ - **pilot-app(含 UI + 生产)**:原始实现 `f78f64c`、证据 `d31c056`;生产 reviewer 发现单阶段滚动 P1 后拆为 `0.17.84@8e41661` 铺服务端门,再以 `0.17.85@7aa570c` 开启。最终 ops `f2495d5`、tag `v0.17.85`、digest `30d4ebc0…`、ChangeOrder `4ba5f72d…`;unit 158/158、额度 UI5 3/3、两实例同 revision、Running/Healthy/0 重启、逐实例/公网/钉钉 smoke 通过。真人 quota OAuth 仍待回访。
31
31
  - **Tide(小功能)**:`pilot/tide-idle-ball`,实现 `723289c`,证据 `4217708`;Node 测试 3/3、Rollup build、syntax/diff check 通过。证据目录:`pilot-work/tide-idle-ball/evidence/`。
32
- - **AI 底座(第三次激活失败观察,不倒算自动 Run)**:在 `V2-D1A` 已明确“下一项自然任务必须进 Loop”之后,`WP-B1-AUTHZ` 仍由当前会话在脚本外推进到 Gate3 写者 L4,meta 记录为 `9d258ee`;没有 Run ID、attempt/cost ledger、checkpoint 或 Approval 对象。用户下一轮主动指出目标应是升级 BuildBeat v2,才把主线拉回。该事件不冒充低风险开发任务或合格自动 Run,但构成第三次真实激活失败。完整证据见 [`pilot/evidence/2026-08-28-m1-runtime-gap.md`](../pilot/evidence/2026-08-28-m1-runtime-gap.md)。
33
- - **共同边界**:ChickAI 的 push/deploy 来自试点之后的单独生产授权,不反向扩大 M-1 权限;Tide 未更新 `tide.zip`、未发布。两个交付完成与一次生产发布都不等于两轮自动 Loop 通过。
32
+ - **AI 试点工作区(第三次激活失败观察,不倒算自动 Run)**:在 `V2-D1A` 已明确“下一项自然任务必须进 Loop”之后,`WP-B1-AUTHZ` 仍由当前会话在脚本外推进到 Gate3 写者 L4,meta 记录为 `9d258ee`;没有 Run ID、attempt/cost ledger、checkpoint 或 Approval 对象。用户下一轮主动指出目标应是升级 BuildBeat v2,才把主线拉回。该事件不冒充低风险开发任务或合格自动 Run,但构成第三次真实激活失败。完整证据见 [`pilot/evidence/2026-08-28-m1-runtime-gap.md`](../pilot/evidence/2026-08-28-m1-runtime-gap.md)。
33
+ - **共同边界**:pilot-app 的 push/deploy 来自试点之后的单独生产授权,不反向扩大 M-1 权限;Tide 未更新 `tide.zip`、未发布。两个交付完成与一次生产发布都不等于两轮自动 Loop 通过。
34
34
 
35
35
  ## 使用判定(回答“两个例子够不够”)
36
36
 
37
- - **够投入使用**:含 UI 与小功能两种任务都走通了冻结 oracle、隔离 worktree、实现、回归与证据;ChickAI 的独立 reviewer 还真实阻止了一次不安全的单阶段生产滚动,证明协议不是摆设。
37
+ - **够投入使用**:含 UI 与小功能两种任务都走通了冻结 oracle、隔离 worktree、实现、回归与证据;pilot-app 的独立 reviewer 还真实阻止了一次不安全的单阶段生产滚动,证明协议不是摆设。
38
38
  - **足够形成 `V2-D2` 决策卡,但不支持薄内核结论**:三次真实工作均没有自动激活;F5/F6 已确认 `MISSING`,暂定可组装覆盖率仍为 45.8%。这些负向证据不能冒充成功 Run,却已满足完整内核路线的提前止损信号。
39
- - **第三项目已选定**:`AI底座/底座` 同时覆盖 legacy 1.x、多仓、在途 Gate 与高密度历史证据,是比演示项目更有价值的第三例;但选择项目不等于产生有效 run。
40
- - **执行口径**:`V2-D2=A` 已拍板,进入完整内核 M0/M1,不再等待 AI 底座第四项任务。不回放改写旧 candidate,也不专门造演示需求。
39
+ - **第三项目已选定**:`<试点工作区>` 同时覆盖 legacy 1.x、多仓、在途 Gate 与高密度历史证据,是比演示项目更有价值的第三例;但选择项目不等于产生有效 run。
40
+ - **执行口径**:`V2-D2=A` 已拍板,进入完整内核 M0/M1,不再等待 AI 试点工作区第四项任务。不回放改写旧 candidate,也不专门造演示需求。
41
41
 
42
42
  ## 分叉判据
43
43
 
@@ -49,8 +49,8 @@ v2 已由 `V2-D0=B` 决定正式实施;M-1 不再拥有“放弃 v2”的隐
49
49
 
50
50
  ## 边界
51
51
 
52
- - M-1 本身不授权 merge/push/deploy;ChickAI 后续生产动作来自项目所有者另行明确授权,不能外推给 Tide 或其它试点任务。
53
- - AI 底座当前不做 in-place v2 升级:v2 尚无发布 tag/预发布包,目标项目又没有可机械升级的 manifest,且现有工作树/在途 Gate 不能被试点污染。第三轮采用旁路 `pilot/*` worktree;若工作项跨仓,所有 candidate 必须由同一 run 显式绑定。
52
+ - M-1 本身不授权 merge/push/deploy;pilot-app 后续生产动作来自项目所有者另行明确授权,不能外推给 Tide 或其它试点任务。
53
+ - AI 试点工作区当前不做 in-place v2 升级:v2 尚无发布 tag/预发布包,目标项目又没有可机械升级的 manifest,且现有工作树/在途 Gate 不能被试点污染。第三轮采用旁路 `pilot/*` worktree;若工作项跨仓,所有 candidate 必须由同一 run 显式绑定。
54
54
  - 提示词禁令只算 `ADVISORY`;必须移除 agent 的生产/发布凭据,并尽量使用宿主权限与网络限制。做不到就登记缺口,不得宣称已机器强制。
55
55
  - 只选低风险工作项;v1 维护线不因试点而改变运行行为。
56
56
  - 零新增运行时依赖;试点 evidence 留在专用工作目录,清理 branch/worktree 前先保留。
@@ -1,6 +1,6 @@
1
1
  # v2 迭代 06:M4 evals、度量与试点
2
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 → 二轮全绿)
3
+ > 状态:**已完成——M4 于 2026-08-28 关闭**。外部试点项目数 2(pilot-backend + pilot-app),D6 原文口径满足;六退出指标全部达标(试点 Run 自动到达率 4/4)。第二项目证据:[`v2/M4-PILOT-APP-2026-08-28.md`](v2/M4-PILOT-APP-2026-08-28.md)(含完整 Build–Verify–Fix–Review 闭环实战:reviewer 阻断 → codex fixer → 二轮全绿)
4
4
  > 上游:[`V2-PLAN.md`](V2-PLAN.md) §8 M4;M3 收尾:[`V2-ITERATION-05.md`](V2-ITERATION-05.md)
5
5
  > 时间盒:**≤3 周**;授权边界沿用 `V2-D2=A`(仅本地 `v2` 分支;self-host 试点 Run 停在 `WAITING_HUMAN`,不 merge、不 push)
6
6
 
@@ -10,7 +10,7 @@
10
10
  - [x] **T2 行为 evals 九目录(WP5.2)**:[`evals/`](../evals/README.md) 九场景卡 + 机器检查全部进 `tests/v2-evals.test.js`(`npm test` 单入口);每次真实事故收敛后在此追加永久回归。
11
11
  - [x] **T3 `metrics` v0**:本地只读,从 ledger 派生——终态分布、自动到达 `WAITING_HUMAN` 率、fix 轮次分布、人批等待、证据完整率、stale/预算计数;`--json` 可选(`tests/v2-metrics.test.js`)。
12
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 正式关闭。**
13
+ - [x] **T5 外部试点**:所有者点名真实需求 `LXJ-AUTH-PILOT-EXT-01`(pilot-backend 单仓,"文档 web 页面理解为 UI")——`RUN-PILOT-EXT-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
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
15
 
16
16
  ## 完成定义
@@ -0,0 +1,62 @@
1
+ # v2 迭代 08:等待要能找到人(会话复盘回灌)
2
+
3
+ > 状态:**C1–C10 + Skill 驾驶手册已实现(源码在 `v2` 分支,未发布)**
4
+ > 上游:[`V2-PLAN.md`](V2-PLAN.md);上一迭代 [`V2-ITERATION-07.md`](V2-ITERATION-07.md);变更明细见 [`CHANGELOG.md`](../CHANGELOG.md) Unreleased
5
+ > 授权边界沿用 `V2-D2=A`(仅本地 `v2` 分支,不含 push、merge、tag、发布);`npm publish 2.0.0-beta.4` 是独立生产动作,须所有者单独授权
6
+
7
+ ## 输入:复盘了什么
8
+
9
+ - 试点工作区 2026-08-28~09-02 的全部 Claude / Codex 驾驶会话(8-30「当前进度极其缓慢」、9-1「Codex 进度好像又卡住了」、9-2「当前代办是什么,从每一个系统的进度说」、9-1「这个服务名字怎么起的」)
10
+ - `pilot-backend` 与 `pilot-web` 两个子仓的 58 个 Run 台账(`buildbeat-v2 metrics` + 逐 Run events)
11
+ - `pm/2026-09-01-BuildBeat三十轮复盘.md`、`pm/2026-09-01-首证复跑卡点经验.md`、`pm/2026-08-31-验证优化与瘦身计划.md`
12
+ - 所有者 2026-09-02 两次拍板:「你说的我认可」(C1–C4 先做)→「继续下一轮,直到全部完成」;并指出**大部分人在其他 AI agent 里用 BuildBeat,Skill 才是真正入口,CLI 是被 Skill 调用的**
13
+
14
+ | 试点工作区两个子仓的 Run | 数量 |
15
+ |---|---|
16
+ | 总数 | 58 |
17
+ | 成功 | 7 |
18
+ | 失败 | 17 |
19
+ | 取消 | 32(多数在 WAITING_HUMAN 挂满一天后批量清掉) |
20
+ | 人批平均等待 | 7~12 小时 |
21
+
22
+ 结论:beta.3 吸收的是「审查循环烧钱」;这一周暴露的是另一族——**人看不见 Run 在干什么、看不见离目标还差多远、每开一个 Run 的手工成本**;以及 **AI 会话装载到的 Skill 还是 v1**。
23
+
24
+ ## 任务清单
25
+
26
+ - [x] **C1 运行中可见性**:Shell Adapter 实时流式落盘 + `status` 耗时/历史中位数/最后输出/STALLED(只标不杀)+ `metrics` 每步中位耗时。→ `src/v2/adapters/shell.js`、`src/v2/runtime/liveness.js`
27
+ - [x] **C2 supersede**:同 Work 新 Run 起跑时旧的 `WAITING_HUMAN` 记 `SUPERSEDED`;`RUN_CREATED.data.supersedes`;`supersede: off`。→ `orchestrator.js`
28
+ - [x] **C3 gc**:`gc --repo .` / `--apply true` / `--force true`;分支仅候选可从其他 ref 到达或无候选时删。→ `src/v2/runtime/gc.js`
29
+ - [x] **C4 通知出站**:`.buildbeat/notify.yaml`(webhook|dingtalk,URL 只能 `urlEnv`);`HUMAN_REQUESTED` / `RUN_TERMINAL` / `STALLED`;fail-open;`watch` 脱离进程。→ `src/v2/runtime/notify.js`
30
+ - [x] **C5 overview**:Work 级阶段机 + 下一步该谁;运行时删后由 run-record 补足。→ `src/v2/runtime/overview.js`
31
+ - [x] **C6 信封一等公民**:`envelope:`(prompts / vars / pin)→ `BUILDBEAT_PROMPT` + `input.envelope`;`start --attempt new` 自动编号;`redact:` 证据脱敏。→ `src/v2/runtime/envelope.js`、`collector.js`
32
+ - [x] **C7 verify 复用与增量审查**:`cache: {verify: tree}` 同树同命令同信封已通过即复用(`reused` 可见);reviewer input `lastReviewed`。→ `src/v2/runtime/cache.js`
33
+ - [x] **C8 合并后车道**:预设 `release-readback` + 风险预设 `release`;workflow step `grade:`。→ `src/v2/presets/`
34
+ - [x] **C9 可见命名进决策卡**:v2 AGENTS 模板第 ⑪ 条、Skill §0.5.2、Worker 合同。
35
+ - [x] **C10 环境事实**:`requires:` `probe:` 条目;`env-facts.md` 约定(overview 显示)。→ `env-contract.js`
36
+ - [x] **Skill 驾驶手册**:`SKILL.md` §0.5(用户一句话 → 会话调什么 → 回什么;run-config 最小样板)+ frontmatter v2 触发词;`templates/v2/AGENTS.md`、`templates/v2/指挥台.md`。
37
+ - [x] **下一句该说什么**:`status` / `inbox` / `overview` / 通知附可复制命令(给会话用,不丢给用户)。
38
+ - [x] 文档:CHANGELOG、指南 01/02/04/05/06/07/10、SPEC-0001 additive 注记、lessons #20/#21。
39
+
40
+ ## 完成定义
41
+
42
+ `npm test` 全绿(含新增 8 组测试);`check:docs` 通过;对试点工作区真实子仓跑 `gc`(计划模式)、`inbox`、`overview` 的输出符合预期且未改动任何东西(两个挂了 21 小时的 pilot-web 旧 Run 由所有者授权后 `stop`)。
43
+
44
+ ## 边界(如实声明)
45
+
46
+ - **编排器仍同步**:worker 在 `spawnSync` 里跑,`STALLED` 的通知由独立 `watch` 进程完成;`status` 的 STALLED 判定不需要它。异步化(进程内看表、并行 Run)不在本迭代。
47
+ - **supersede 只碰 WAITING_HUMAN**;被另一进程锁住的旧 Run 跳过并明示。
48
+ - **gc 永不写台账**;候选仅此分支可达时分支一律保留。
49
+ - **通知不是审批通道**;钉钉走关键词模式,签名模式暂不支持。
50
+ - **verify 复用只看树、命令、信封**:verifier 若依赖树之外的东西(远端服务、时间),项目不要开 `cache`。
51
+ - **release 车道没有 finding 门**:车道里没有 reviewer,不设满足不了的规则;生产动作仍是人的(不变量 20)。
52
+ - **`overview` 的"已合入"只对当前 checkout 分支判定**(`merge-base --is-ancestor`),远端是否推送不在其内。
53
+ - **Skill 与 CLI 的关系**:Skill 是入口,CLI 是引擎;没装 CLI 时 §0.5 表格右列退化为会话手工维护同名文件,方法论不失效——但 Run 的机器强制(隔离 worktree、写者≠审者、digest 绑定)只有 CLI 才提供。
54
+
55
+ ## 后续候选(未拍板)
56
+
57
+ | # | 项 | 一句话 |
58
+ |---|---|---|
59
+ | N1 | 编排器异步化 | 进程内 STALLED、并行 Run、去掉 `watch` 子进程 |
60
+ | N2 | `overview` 跨仓 | meta 仓一次看所有子仓的 Work(试点工作区是 meta + 3 子仓) |
61
+ | N3 | 钉钉签名模式 | `secret` 也走 env,HMAC 签名 |
62
+ | N4 | Skill 的 Bootstrap v2 | §8 引导式 Bootstrap 直接生成 v2 骨架(`delivery/`、`.buildbeat/`、v2 AGENTS) |
package/docs/V2-PLAN.md CHANGED
@@ -222,7 +222,7 @@ v1 的"Skill-only 完整等价"拆成两个承诺分别处置:
222
222
  - **结论 (b)** 可组装能力覆盖率 ≥80%、三轮平均计划外介入 ≤2,且无重复的未处置 CRITICAL 运行缺口 → M1–M3 收缩为**薄内核**(只造 approval staleness、统一证据台账、policy/gate 检查器三件),总窗口 ~5–8 周;
223
223
  - 未跑场景一律记 `UNVERIFIED`,不得按通过计分;中间态默认少造,将存疑能力挂到 M4 复验。
224
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)。
225
+ > **进展(2026-08-28)**:pilot-app、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
226
 
227
227
  ### M0 — 核心重置(1 周)
228
228
 
@@ -268,14 +268,14 @@ v1 的"Skill-only 完整等价"拆成两个承诺分别处置:
268
268
 
269
269
  - 确定性测试套件(B WP5.1)+ 行为 evals(B WP5.2 九目录);
270
270
  - `buildbeat metrics` v0;
271
- - Self-host 试点(BuildBeat builds BuildBeat)+ 外部试点 ≥2(一个有真实测试的单仓项目 + 一个含 UI 变更的项目,建议从老乡鸡底座选);
271
+ - Self-host 试点(BuildBeat builds BuildBeat)+ 外部试点 ≥2(一个有真实测试的单仓项目 + 一个含 UI 变更的项目,建议从一个真实企业工作区选);
272
272
  - **退出指标**(B M5 表采纳):状态转换可追溯 100%、stale Approval 复用 0、超预算继续运行 0、试点 Run 自动到达 WAITING_HUMAN ≥70%、证据完整率 ≥95%、Reviewer 改代码 0。
273
273
 
274
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
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 关闭。
276
+ > **进展(2026-08-28 补)**:外部试点完成——所有者点名的真实需求 `LXJ-AUTH-PILOT-EXT-01`(pilot-backend)由 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
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。
278
+ > **进展(2026-08-28 再补):M4 关闭。** 第二外部项目 pilot-app Bug 看板积压批处理([`v2/M4-PILOT-APP-2026-08-28.md`](v2/M4-PILOT-APP-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
279
 
280
280
  ### M5 — 闭环起步、迁移与 Beta(2–3 周)
281
281
 
@@ -325,8 +325,8 @@ B §24 的 1–20 原样进入测试矩阵。追加:
325
325
  | D3 | spec 步默认策略 | UI 项目强制、其余可选、快轨跳过 | 裁决 #3 |
326
326
  | D4 | 首个专用 Adapter | M3 末按试点主力工具定(此前 Shell Adapter 已可驱动任意 CLI agent) | 裁决 #5 |
327
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、不发布、不部署 |
328
+ | D6 | 试点组合(M4) | Self-host + 试点工作区内一个有测试的单仓项目 + 一个含 UI 项目 | 合并 A-D5 与 B-WP5.3/5.4 |
329
+ | D7 / `V2-D1` + `V2-D1A` | **M-1 试点工作项与第三目标项目(已决)** | 首批为 pilot-app 额度耗尽仍可登录(含 UI)与 Tide 悬浮球空闲收纳(小功能);第三目标项目为 `<试点工作区>`,具体使用其下一项自然发生、已授权、低风险的非生产开发任务 | 执行细则见 [`V2-ITERATION-01.md`](V2-ITERATION-01.md);既有候选只作回放证据,授权边界仍是不 merge、不 push、不发布、不部署 |
330
330
 
331
331
  ---
332
332
 
@@ -254,7 +254,7 @@ gates:
254
254
  | WP1.3 | human Gate 异步审批:`.pending` 工件 + `buildbeat approve` + `inbox` | 审批落 decisions.md,闭环等文件恢复流转 |
255
255
  | WP1.4 | `buildbeat watch`:监听工件事件自动触发下一步 | 真实项目从 intent.md 提交到 merge 候选,人仅两次介入 |
256
256
  | WP1.5 | `buildbeat status` 派生视图 v0 | 与手工盘点一致,无手写状态文件 |
257
- | WP1.6 | 真实项目试点(建议从老乡鸡底座里选一个单仓小项目) | 试点记录入库(沿用 v1 的 PILOT 文档传统) |
257
+ | WP1.6 | 真实项目试点(建议从一个真实企业工作区里选一个单仓小项目) | 试点记录入库(沿用 v1 的 PILOT 文档传统) |
258
258
 
259
259
  **止损**:试点显示 loop 开销 > 收益(solo 小项目场景),则 Runner 降级为"半自动"——只做 `run --stage` 单步 + inbox,watch 缓建;协议层成果不受影响。
260
260
 
@@ -312,7 +312,7 @@ gates:
312
312
  | D2 | Runner 载体 | **扩展现有 `@haiyangbg/buildbeat` CLI**(复用 Node 地基与发布链) | 新仓另起:边界干净但分裂维护面 |
313
313
  | D3 | 首个 agent adapter | **按你日常主力工具定**(cursor-agent 或 claude -p) | 双 adapter 齐发验证接口普适性,成本 +30% |
314
314
  | D4 | v1 手写状态废除节奏 | **v2 新项目直接无手写状态**;v1 项目迁移时一步到位 | 过渡期双轨(手写+派生并存)——强烈不建议,等于自造 SSOT 腐烂 |
315
- | D5 | Phase 1 试点项目 | 老乡鸡底座内选一个单仓、有测试、迭代活跃的小项目 | 用 BuildBeat 仓库自举:戏剧性强但元问题(用未验证的引擎改引擎)风险高 |
315
+ | D5 | Phase 1 试点项目 | 一个真实企业工作区内选一个单仓、有测试、迭代活跃的小项目 | 用 BuildBeat 仓库自举:戏剧性强但元问题(用未验证的引擎改引擎)风险高 |
316
316
 
317
317
  ---
318
318