@abelxiaoxing/cadence 1.8.2 → 1.8.3

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/README.md CHANGED
@@ -1,252 +1,83 @@
1
1
  # @abelxiaoxing/cadence
2
2
 
3
- [![npm](https://img.shields.io/npm/v/@abelxiaoxing/cadence)](https://www.npmjs.com/package/@abelxiaoxing/cadence)
4
- [![GitHub](https://img.shields.io/github/license/abelxiaoxing/cadence)](https://github.com/abelxiaoxing/cadence)
3
+ 面向 Pi 的 Abel 工作流扩展:提供 Design、Implement、Diagnose 和 Init 四个显式命令。
4
+ 普通任务无需启用工作流;只有用户主动输入斜杠命令时才会激活。
5
5
 
6
- ## 先看这里:适用范围与最短路径
6
+ ## 安装
7
7
 
8
- 适合需要明确验收、跨任务验证和断点恢复的修改;普通的小修小补可以直接使用 Pi,不必启用完整工作流。
9
- 只有你显式输入阶段命令才会进入 Abel。
8
+ 要求:Node.js >= 22.13、Git、Pi,以及 `@fission-ai/openspec@1.5.0`。
10
9
 
11
- 1. 安装 Node.js >=22.13、Git、Pi,以及 `@fission-ai/openspec@1.5.0`。
12
- 2. 在 Pi 中安装:`pi install npm:@abelxiaoxing/cadence`。
13
- 3. 默认 Implement 使用 Linux Bubblewrap;Windows x64 可信项目可显式选择 `host-trusted`,构建与验收见 [Windows 原生执行](docs/windows-host-trusted.md)。
14
- 4. 首次进入项目先运行 `/abel-init`,然后 `/abel-design <需求>`,确认集中呈现的目标与方案,设计完成后运行 `/abel-implement <change>`。
15
- 5. 暂停时先查看原因和建议,不要靠反复 resume 或重启“碰运气”;未完成的工作会保留。
10
+ ```sh
11
+ pi install npm:@abelxiaoxing/cadence
12
+ ```
16
13
 
17
- ### 每次加载时的配置提示卡
14
+ ## 使用
18
15
 
19
- 每次扩展启动、重载或恢复会话,Cadence 都会在输入框上方显示一张简短研究能力提示卡,不需要额外记住配置或诊断命令。
20
- 卡片只检查本地配置,显示 Context7、Grok 与可选 Tavily 的配置状态及当前生效文件;“已配置”不代表网络、认证或服务能力已验证。
21
- 开始处理任务后卡片收起,下次加载重新显示;不记录“已看过”或“暂时不用”来抑制后续提示。
22
- 安装 Cadence 时会创建用户级模板 `~/.pi/agent/cadence/.env`(已有文件不会覆盖);卡片本身不会联网、调用模型、写入配置、索要密钥或自动激活 Abel 工作流,可选服务未配置不阻塞普通任务。
23
- 未信任的项目只显示未检查提示,不读取研究配置。
16
+ ```text
17
+ /abel-init
18
+ /abel-design <需求>
19
+ /abel-implement <change>
20
+ /abel-diagnose <问题描述>
21
+ ```
24
22
 
25
- 安装后用户级模板已包含 Grok 配置占位字段;Context7 无配置文件时仍使用默认地址匿名访问,显式配置文件损坏仍会报错。
26
- 联网搜索需要在本地文件中配置以下内容,每项一行(替换为实际服务地址和密钥):
23
+ - `abel-init`:初始化或修复项目的 OpenSpec 与 AGENTS 基础结构。
24
+ - `abel-design`:调查需求并生成可执行交付计划。
25
+ - `abel-implement`:执行已批准的计划,支持暂停、恢复和取消。
26
+ - `abel-diagnose`:复现问题并执行最小修复。
27
27
 
28
- ```dotenv
29
- GROK_API_URL=https://api.x.ai/v1
30
- GROK_API_KEY=<your-api-key>
31
- ```
28
+ Implement 默认使用 Linux Bubblewrap 隔离。
32
29
 
33
- 安装器会创建用户级 `~/.pi/agent/cadence/.env` 及其父目录,并且只在文件不存在时写入模板;也可手动创建该文件以跨项目复用。
34
- 如果项目已有 `.pi/cadence/.env`,它按整文件优先,**不会与用户级文件合并**;请编辑卡片显示的生效文件,不要覆盖已有无关配置。
35
- 研究 Skills 不读取 shell 中的 API 环境变量,也不读取安装包旁的 `.env`;保存后下次 Skill 调用生效,无需重启。
36
- 可选 `CONTEXT7_API_KEY` 提供认证访问;可选 `TAVILY_API_KEY` 启用扩展检索、抓取和站点映射,`TAVILY_ENABLED=false` 可关闭它。
37
- 完整字段见 [配置模板](config/.env.example),配置文件限普通文件且不超过 64 KiB。
38
- 密钥只在本地编辑,勿发送到聊天或提交 Git;使用项目级文件时应将其加入忽略规则。
30
+ 可信 Linux 项目可显式设置 `ABEL_EXECUTION_MODE=local-trusted`。
39
31
 
40
- TUI 显示卡片;RPC 通过非阻塞 `setWidget` 事件发送同一卡片,Web UI 需实现该事件的展示。
41
- Print / JSON 无交互界面,不额外输出卡片、不等待输入,也不污染标准输出;可按上述路径直接配置。
42
- 本版本提供提示与本地编辑指引,不提供密钥输入向导或自动重试搜索。
32
+ Windows x64 的可信模式见 [Windows 执行说明](docs/windows-host-trusted.md)。
43
33
 
44
- ### Pi / Web UI 阶段启动约定
34
+ ## 配置
45
35
 
46
- 阶段命令需要 Cadence 扩展与包内 prompts 同时加载;只有提示正文可见,不代表 `abel_dispatch` 已注册或已激活。
47
- Web UI / SDK 集成应在会话空闲时提交原始命令:`session.prompt("/abel-design <需求>", { source: "rpc" })`。
48
- 不要在客户端预展开模板,也不要通过 `steer()`、`followUp()` 或运行中的排队请求启动阶段。
49
- 运行中的显式阶段命令会被拒绝并报告 `abel-stage-requires-idle`,等待当前请求结束后重新提交即可;原有阶段不会因此被退出或丢弃。
36
+ 没有自定义路由时,Worker 默认继承当前父模型。
50
37
 
51
- 启动失败有明确错误码:`abel-stage-provenance-invalid`(包来源不匹配)、`abel-stage-unverified-input`(缺少可验证的原始调用)和 `abel-stage-tools-unavailable`(工具未暴露或 Design 工具边界设置失败)。
52
- 扩展会阻止失败请求的工具执行;不能改用 bash、subagent 或 terminal 工具绕过。
53
- 空闲时正常启动会在首次模型请求前启用 `abel_dispatch` 并限制 Design 工具集合,显式退出后恢复进入前的工具集合。
54
- 恢复会话或重载不会从历史提示自动激活阶段。
38
+ 需要自定义模型时,复制 [`config/routes.example.json`](config/routes.example.json) 到项目的 `.pi/cadence/routes.json` 或用户目录 `~/.pi/agent/cadence/routes.json`。
55
39
 
56
- 如果扩展根本没有加载,扩展自身无法执行检查;提示中的缺失工具说明只是模型侧兜底,不是宿主级拦截。
57
- Web UI 必须展示资源加载器的 `getExtensions().errors`,核实当前会话已绑定扩展,并在发送阶段提示前检查 `session.getAllTools()` 中的 `abel_dispatch`;不存在时直接报告配置错误,不发送阶段正文。
58
- 请检查包资源过滤是否禁用了 extensions、实际运行的 Node / Pi 版本,以及是否恢复了旧的工具清单。
59
- 诊断时只记录工具名、命令来源和脱敏错误,不记录密钥或完整需求。
40
+ 研究服务配置使用项目级 `.pi/cadence/.env` 或用户级 `~/.pi/agent/cadence/.env`。
60
41
 
61
- ### 先检查环境,不先花模型调用
42
+ 可参考 [`config/.env.example`](config/.env.example)。
62
43
 
63
- 在 Cadence 开发仓库中可用:
44
+ 密钥只保存在本地,不要提交 Git。
64
45
 
65
- ```sh
66
- bun run doctor /absolute/path/to/consumer
67
- bun run runs /absolute/path/to/consumer
68
- ```
46
+ ## 加载方式
69
47
 
70
- 安装包也包含预构建的纯 JavaScript 命令,无需在 node_modules 下加载 TypeScript:
48
+ 包可以从以下路径加载:
71
49
 
72
- ```sh
73
- node /absolute/path/to/cadence/src/operator-cli.mjs doctor /path/to/consumer
74
- node /absolute/path/to/cadence/src/operator-cli.mjs runs /path/to/consumer
75
- ```
50
+ - **npm 包(npm package)**:`pi install npm:@abelxiaoxing/cadence`
51
+ - **本地包目录(local package directory)**:将 Pi 指向仓库的绝对或相对路径(例如 `./cadence`)
52
+ - **已安装 tarball 目录(installed tarball directory)**:用 `bun pm pack --destination <tmp>` 生成 `.tgz`,安装或解压后指向该目录
53
+
54
+ Pi 相关 peer 依赖使用 `*`,不限制宿主 Pi 的版本。
76
55
 
77
- `doctor` 检查 Git、Node、OpenSpec 入口、实际 Bubblewrap 启动、请求预算和常用脚本静态能力;不调用模型、不执行产品测试、不保证所有集成服务均可用。
78
- 包管理器优先采用 `package.json.packageManager`,其次推断唯一锁文件所属的管理器;没有声明和锁文件时明确标为 npm 默认值。
79
- 输出包含 `selectedPackageManager`、`selectionSource`、`lockfiles` 和 `ambiguousLockfiles`;多个管理器锁文件且无明确声明时阻塞脚本探测,不静默选择 Bun。
80
- Doctor 不读取私有计划,计划中的显式 runner 仍由正式预检检查;请让项目声明与计划保持一致。
81
- `runs` 只读列出该项目最多 1,000 个 run 和有界存储占用;不会创建、迁移或删除数据库,不自动清理暂停任务。
56
+ ## 开发
82
57
 
83
- ### 可信本地项目:显式复用宿主环境
58
+ ```sh
59
+ bun install
60
+ bun run check # 语法、构建产物和类型检查
61
+ bun run lint # 格式与 Markdown 检查
62
+ bun run test # 测试
63
+ bun run verify # 发布前完整检查
64
+ ```
84
65
 
85
- 默认 `isolated` 不变。
86
- 对于自己信任的 Linux 项目,可在启动 Pi **之前**选择:
66
+ 其他只读检查:
87
67
 
88
68
  ```sh
89
- export ABEL_EXECUTION_MODE=local-trusted
90
- export ABEL_VERIFICATION_ENV=DATABASE_URL,NODE_ENV
91
- export ABEL_VERIFICATION_TIMEOUT_MS=900000
69
+ bun run doctor /path/to/project
70
+ bun run runs /path/to/project
71
+ bun run pack:check
72
+ bun run traceability:check
92
73
  ```
93
74
 
94
- 可信模式仍在独立候选目录执行,并复制依赖以避免普通缓存写入修改 consumer 的依赖,但**不是沙箱**:测试可访问宿主文件、网络及显式继承的环境变量,产生的外部副作用不能回滚。
95
- HOME、临时目录和报告仍独立;PATH 复用宿主,仓库内 workspace 链接映射到候选代码。
96
- 该模式仍要求 Linux Bubblewrap 的 PID namespace 管理后代进程(包括 detached 后代),但不隔离宿主文件和网络;缺少该能力时暂停,不回退到普通进程组。
97
- `local-trusted` 仅用于 Linux。
98
- Windows x64 使用独立的 `host-trusted` 后端,见 [配置、构建与验收说明](docs/windows-host-trusted.md);macOS 暂不支持。
99
- 包含原生 helper 的 Windows x64 安装包在 [GitHub Release](https://github.com/abelxiaoxing/cadence/releases/tag/v1.8.0) 下载;npm 通用包可显式构建 helper 后配置使用。
100
- 依赖副本准备、替换与清理在 I/O Worker 中执行,复制支持取消并等待线程退出;大型依赖复制仍有额外成本;需要安装新依赖、宿主浏览器缓存或服务启动编排时仍需配置/准备,不会自动下载。
101
-
102
- 可选宿主参数还包括 `ABEL_BWRAP_PATH`、`ABEL_FIRST_PROGRESS_MS` 和 `ABEL_STREAM_IDLE_MS`。
103
- 后两者单位为毫秒,默认 90,000 / 180,000,允许 1..1,200,000;验证超时默认 600,000,允许 1..86,400,000。
104
- 执行配置和显式环境值的摘要参与验证环境身份,改变配置后会重新验证,不把旧证据当作新环境下的成功。
105
-
106
- ### 小任务、失败排查与真实评估
107
-
108
- - 单任务可采用 [精简作者示例](config/plan-draft.quick.example.json):只填写一个 `singleTask`,代码生成重复的任务和验证结构,仍经过完整编译。
109
- 明确的验收、影响证据、AGENTS 影响、Red 写入及失败标记仍由作者提供;不代替 Gate A,不支持用简写偷偷增加依赖、删除文件或多任务产物。
110
- - 验证失败返回分离的 stdout/stderr、断言摘要和下一步提示;当前操作的后续 Worker 直接收到这些有界诊断,避免仅凭哈希猜测修复。
111
- 摘要是待解释证据,不是指令或授权;不持久化全文,进程重启后由复验重新采集。
112
- - 非 Vitest 通用命令没有可靠断言级报告时,不再仅凭日志相同认定为旧失败;已有失败基线的归因不明会暂停,不误报通过或自动改无关代码。
113
- - 认证失败暂停修复配置,上下文超限要求拆分,429 保留限流分类;上下文在请求前按模型窗口保守预留输出空间,不静默截断证据。
114
- - `bun run benchmark:verification 10000` 测量依赖扫描;只合并 I/O 尚未开始的同批扫描,验证后的检查不会加入更早的在途扫描;已完成证据不作为下一次 currentness 缓存。
115
- - `bun run eval:matrix` 只做预检;`--live --repeats 3 --model provider/model --output report.json` 才显式调用模型,报告真实完成率、耗时、token、费用及重复修订。
116
- 默认门禁只运行三个具有产品 oracle 的场景;`--include-observations` 可额外收集缺能力场景,该场景不改变门禁结果,也不被宣称为恢复验收成功。
117
- CI 将缺能力观察放入独立的非门禁 job。
118
- 发布前可手动触发 `Live workflow evaluation`,需要带 `cadence-evaluation` 标签、已配置模型和依赖的 Linux 自托管 runner;普通 CI 不隐式消费模型额度。
119
-
120
- ## 工作流与执行合同
121
-
122
- **Cadence** 是一个面向 Pi 的规范驱动四阶段工作流扩展包,内置可恢复的私有代理编排:
123
-
124
- - `/abel-init [project-path]` — 本地、固定顺序且幂等地初始化或安全修复 OpenSpec 与 AGENTS 托管索引,不派发子代理。
125
- - `/abel-design <requirement> | --change <change_name>` — 使用有界只读证据包解决行为与技术决策,生成绑定 Gate A 用户授权与 Gate B 系统计划证明的 canonical delivery;不启动实现 Worker,不运行产品测试,也不修改产品代码。
126
- - `/abel-implement <change_name>` — 在私有不可变 revision 中执行已批准的 Red-Green-Refactor DAG,累计验证全部任务后才通过一次可恢复事务写入主工作区。
127
- - `/abel-diagnose <problem-description>` — 独立执行“复现 → 证伪 → 失败回归 → 最小修复”,不充当 Implement 的失败路由。
128
-
129
- 包是独立的:单一仓库、单一清单、单一 lockfile,无 workspace、无参考仓库检出、不依赖任何外部 Subagent 包。
130
- 加载本包会注册一个私有扩展与三个包内专业 Agent;`abel_dispatch` 工具注册但保持未激活,只有用户显式调用且包来源验证通过的 Design、Implement 或 Diagnose prompt 才会激活它。
131
- 仓库中存在 Abel 文件、OpenSpec change、AGENTS 索引或普通文本都不会启动工作流;Init 也不会激活派发工具。
132
-
133
- 四个命令各自包含本阶段需要的操作指引,不再依赖共享工作流 Skill;普通任务不会从技能列表中自动选用 Abel 工作流。
134
- Gate、交付校验和执行状态转换由控制面代码保证。
135
- 只有用户通过交互输入或 RPC 显式提交对应斜杠命令才允许激活;扩展生成的命令不会展开工作流。
136
- 当前任务的 Gate 回答与续轮保持阶段有效;用户结束工作流或转向无关任务时,父模型先调用 `{"action":"finish"}`,扩展等待活动操作停止并恢复原工具,保留可恢复进度。
137
- 此退出同样适用于 Implement,不表示完成或丢弃。
138
- 显式调用 Init 也会先退出已有阶段。
139
- Design 同任务续轮重新收紧允许的工具集合,预检失败或暂停不自动退出;会话重载/恢复不继承阶段激活权限,需重新显式调用对应命令,已保存的 run 不会因此完成或丢弃。
140
-
141
- Implement 只暴露 `start`、`status`、`resume`、`rebind`、`cancel` 和 `discard` 控制命令。
142
- `status` 完全本地可用;相同 operation id 幂等重放,进程、会话或 Worker 更换后仍从 durable checkpoint 继续。
143
- Design 从第一步起统一使用 `action: "design"`:新需求通过 `start(requirement)` 进入,已有 change 通过 `start(change)` 进入,后续只携带返回的 `runId`。
144
-
145
- ### 升级后的私有状态重置
146
-
147
- 包服务首次打开当前工作区时,比较数据库记录的包版本与当前 `package.json.version`。
148
- 升级或旧库没有包版本标记时,自动将该工作区整个私有状态目录(SQLite/WAL、`run-data/` 下的候选工作区、产物和事务记录)移入同工作区专属备份目录,然后创建新库。
149
- 控制库损坏导致版本不可读、版本标记无效,或控制库缺失但仍有旧资源时,也整体备份并重新初始化,不尝试修复或解释旧运行。
150
- 可读有效版本标记与当前版本一致时保留状态;同版本号下替换代码不会触发重置,也不自动诊断其他表的损坏。
151
- 能读取有效旧版本时,降级拒绝打开,不自动清库;旧版本不可读时不声称能够判断升降级。
152
- 当前包版本仅接受当前发布使用的 `major.minor.patch` 格式。
153
- 安装包时不扫描用户目录,其他工作区各自在首次打开时处理;只读 `doctor` / `runs` 不触发重置。
154
-
155
- **升级意味着旧运行不再可续用:运行、审批证明、进度、检查点和预算不继承到新库。**
156
- 仓库代码、未提交改动及 OpenSpec 文件不变,但旧交付缺少原私有证明,不能直接视为有效交付;需要重新建立可信交付。
157
- 备份不自动恢复或删除。
158
- 服务响应的 `packageStateReset` 显示原因、前后版本及备份路径(不可读旧版本为 `null`),并明确 `oldRunsAbandoned: true`、`workspaceRestored: false` 和风险提示,不输出数据库内容、环境变量值或凭据。
159
- 备份位于 `<roots>/<workspace-hash>.package-state/backup-<uuid>`,该目录中的 `lock.sqlite3` 和 `reset.json` 是协调与中断恢复记录,不应手工修改。
160
-
161
- **重置前必须退出所有旧宿主及其执行进程;数据库记录为 running 或租约未过期,不等于进程仍存活,也不再作为结算门槛。**
162
- 新包使用工作区专属 SQLite 写锁,在整个服务生命周期内互斥;并发宿主或版本读取实际遇到 SQLite 锁时返回 `package-state-in-use`。
163
- 该锁不能约束不认识它的旧版本或自行脱离的后代进程,重置不代表已经终止这些进程。
164
- 旧任务、操作、租约以及缺失/损坏/未结算的事务记录一律随旧目录备份,不再要求先恢复或结算,也不由新库管理。
165
- **重置不会回滚主工作区:此前 apply 中断可能留下部分改动,请先检查 Git diff,再开始新工作。**
166
- 真实权限、I/O 或备份发布失败仍报错;不能因想清库就绕过文件系统安全边界。
167
- 状态根、控制库路径及协调路径的符号链接仍拒绝;嵌套资源链接随目录重命名保留,不跟随其目标或删除目标内容。
168
- 备份不依赖读取旧的每运行事务数据库,包括 `run-data/<runId>/transactions/apply.sqlite3`。
169
- 可识别的降级返回 `package-state-downgrade-blocked`。
170
- 中断后同版本重试按持久化意图继续,不重复备份;未完成重置时不允许换另一个目标版本。
171
- 目录刷新沿用下文 Windows 能力边界,不声称 Windows 断电场景具备 POSIX 目录持久化保证。
172
-
173
- 底层 `RunStore` 仍保留经结构校验的旧 `schema_meta` v2/v4 原子迁移,供原版本恢复和独立存储调用使用;包服务的上述重置策略优先执行。
174
- v2 迁移只补齐可空凭证字段且保持 `NULL`,不伪造审批;损坏或部分升级仍拒绝打开,迁移失败整体回滚。
175
- 需求、决策合同与 Gate A 合同由控制面规范化并计算哈希,调用方无需 SHA-256 工具;Gate B 自动绑定当前已编译 canonical plan,原始瞬时文本不会写入 durable journal。
176
- `validate-plan-draft` 可在 `compile-plan` 前只读运行同一套编译检查,并以结构化 `taskId` / phase / field / verification 诊断定位问题;Design finalization 的安全诊断码也会进入错误详情与可展开 TUI,而不再只显示统一失败标题。
177
- 随包提供的 [单任务计划示例](config/plan-draft.example.json) 展示精简 PlanDraft 和结构化 Gate A 合同;按实际仓库替换示例中的路径、证据与验证命令。
178
- 草稿可省略 `tracking`、阶段 `verificationInputs` 和现有测试的 `disposition`,编译器按任务、验证契约和已声明产物生成这些机械字段;已批准的 `changeContract` 由控制面继承,无需重复填写。
179
- 原子验证命令可放在 `verificationDefinitions` 中,用 `{ "use": "name" }` 在各验证义务引用;Red 的 `expectedFailure` 仍需明确填写。
180
- 内联原子验证也可省略 `id` / `classification`;任务公共 `read` 与阶段读取合并,固定 baseline/repair 保护字段由编译器补齐,恢复次数和 AGENTS 影响仍需作者明确选择。
181
- [多任务示例](config/plan-draft.multiple-tasks.example.json) 保留显式依赖和产物 producer;ordered steps 仍使用完整内联合同。
182
- `validate-plan-draft` 返回有界的最终权限、验证用途、恢复次数和实际派生来源摘要;摘要不充当批准或封存证明。
183
- 编译结果的 `checks` 分开报告 `structure`、`verificationCapability`、`contractCoverage` 和 `sealing`;静态 `closure.executable: true` 不代表产品测试已运行或 `READY_TO_IMPLEMENT`。
184
- 独立 `compileImplementPlan` 未传合同则 `contractCoverage: "not-checked"`;传入合同也不证明该合同已获批准。
185
- 正式预检从私有 journal 注入当前 Gate A 合同并报告 `gateA: "current"`,但仍是 `sealing: "not-performed"`;只有正式控制面可以批准和封存交付。
186
- 验收缺失诊断列出 acceptance ID;仅当验证 ID 唯一对应一个不同义务时返回字段差异,不猜测最接近的验证器,也不回显命令或参数。
187
- `changedSurfaces` 仅接受 `none`、`route-authorization`、`page-state`、`api-response`、`public-html`;公共影响不得改标为 `none` 来绕过闭包。
188
- `verification.change.affected` 是固定标记 `"task-affected-contracts"`,不能使用 `{ "use": "..." }`;`affectedSuite` 中公共影响测试必须在 `relatedTests` 声明证据和实际 owner。
189
- 推导有歧义时拒绝编译,显式错误仍会报错;代码不会据此扩大路径、依赖或产物权限,封存计划保持完整、严格的结构。
190
- 预检集中返回不同任务的独立结构错误,并提供字段位置、期望/实际路径和修正提示;工具反馈与 TUI 共用有界脱敏投影。
191
- Design status 将可调用的 `legalOperations` 与顶层 `packetActions` 分开;显式退出只能发送 `{"action":"finish"}`,不能伪装成 `operation: "finish"`。
192
-
193
- 普通 artifact、错误 Red、transport、environment、stale、conflict、baseline 与验证失败都留在同一 Implement run 中恢复。
194
- 累计验证发现 introduced failure 时会自动重开责任任务做有界修复。
195
- artifact、stale candidate 与 verification 纠错会将具体失败码、修复策略和可用失败身份传给下一次 Worker。
196
- 自动恢复预算以验证义务和阶段为依据,使用独立 SQLite 事实保存;普通 `resume`、重启、回滚、换路由、任务重命名和合同改写都不能重置额度。
197
- 执行前持久化预留工作额度;内部修复也计入同一 run 的有限资源预算。
198
- 系统保留 baseline 和 phase facts,并明确区分缺少能力、缺少决定与恢复额度耗尽。
199
- 任务 `baselineVerification` 只读取 run 的原始不可变快照;只有 affected 输入均为原始安全普通文件时,编译器才允许省略并推导它。
200
- 新增 Red 测试仍完整参与阶段、affected、累计和最终验收。
201
- 独立任务共享四个执行槽位,单个任务结算后立即补位;其他 run 释放容量也会唤醒排队工作。
202
- 局部 baseline 或能力缺失只阻塞相关任务及依赖者,完整验收和事务 apply 保留全局屏障。
203
- Design 的 `summary.parallelism` 展示最多四项互不冲突的初始任务组、明确标为后续兼容关系的任务对、producer 等待、串行原因和全局验证屏障。
204
- 初始组假设共享槽位可用;实际运行仍检查容量、能力和 currentness。
205
- `summary.implementation` 同时展示已接受的验收/限制 ID、技术修订可用的写入范围、依赖与验证模式,让 Design 能检查后续修复是否有足够权限;摘要本身不授予权限,也不宣称运行环境已就绪。
206
- Design 集中解决用户决策和已知的外部前提,按受影响模块及必要集成修复确定政策范围,按精确文件划分初始任务。
207
- Implement 以已接受目标为持续执行目标:父代理负责范围内的推荐决策、拆分、修复、重新编译和继续执行;调度器持续填充四个共享槽位。
208
- 父代理在仍有可执行后续动作时提前结束回合,宿主会重新读取同一 change 的本地状态,并接续同阶段工作,不需要用户再次发送“继续”。
209
- 取消、退出、模型中断、待处理用户消息和无进展保护会阻止自动接续;接续不扩大授权、不重置恢复额度,也不将缺少凭据或服务的外部阻塞伪报为完成。
210
- 进程中断后的 run 在用户再次显式调用 Implement 时提供同一 run 的恢复动作;已有 apply journal 的结算不消耗 Worker 额度,仍由引擎控制。
211
- Worker 可读取同一任务各阶段已批准路径的并集,并按需申请 sealed roots 内的普通文件读取;新增读取会绑定合并与最终应用的 currentness,写入和删除仍限于当前阶段;超大补丁先自动尝试紧凑的完整提交,不能完整提交时保留进度,绝不接受部分补丁。
212
- Design 对明确需求尽量只进行一轮集中决策:先调查仓库约定,再一起呈现目标、关键技术取舍、推荐默认值及编译授权;编译器在记录有效计划时原子生成 Gate B 证明,无需第二次用户确认。
213
- 相同计划重编译和仅修改决策引用不会重开 Gate。
214
- 已完成 change 的新修订从同一 root/change 的最新私有 finalized delivery 继承未变化的决策与授权;仅技术变化保留 Gate A,行为契约变化仍重新生成相应证明。
215
- Design 证据包必须绑定 durable `runId`;接受后的有界证据、决策版本、Gate 证明与 canonical plan 身份写入 owner-private journal。
216
- Design 激活期间,父模型只保留进入前已启用的 `read`、`grep`、`find`、`ls` 与 `abel_dispatch`;原工具集合会在 finalize、finish、切换阶段或 session 结束时精确恢复。
217
- Implementation Worker 不再手写 unified-diff header、hunk range、分段或哈希;它一次提交有序的 `replace`、`rewrite`、`create`、`delete` 操作。
218
- 可信控制面在隔离 workspace 中校验精确文本、批准路径和 symlink 安全,生成并内部分块 sealed candidate;超限时保留可恢复状态而不接受截断 patch。
219
- OpenSpec change 制品只能通过私有 `write-artifact` / `delete-artifact` 原子操作变更;产品文件、AGENTS、`gate-a.yaml`、`ready.yaml` 和 `implement-plan.json` 对该通道不可达。
220
- Gate A/B 收据只有一套 canonical 结构,并在 Implement admission 时同时对照同一 root/change 的私有批准事实与 finalization revision/hash 事实验证。
221
-
222
- 只有继续工作确实需要新增行为、架构/策略、依赖、路径、资源、验证或 AGENTS 权限时才进入 `approval-needed`。
223
- Design 完成主要决策后,Implement 中的新实施选择默认由父模型采用推荐方案,记录后继续执行;不再默认向用户追问。
224
- 状态一次返回完整 `blockers`、稳定的 `decisionBatch`,并明确由父模型负责执行自动 `continuation`。
225
- 父模型通过当前 Implement 内的 `action: "amend"` 修订同一 change、自动生成计划证明,再由普通 resume 发现并验证新交付;无需切换命令、重新确认或手动传递收据。
226
- 父控制面从原始快照证明的 baseline 输入缺陷和任务过大可以进入该修订通道,不必伪装成用户决策。
227
- 单独的错误码、hash/receipt 异常、不安全路径和未知错误不授予修订权限。
228
- 相同 baseline 合同、输入和环境下的失败会持久保留,重复 resume 不再执行相同失败检查或启动 Worker;可观测前提变化后才在原预算内恢复。
229
- baseline 专属修订保留兼容的已提交阶段、任务成果与原 run。
230
- 修订有独立的持久化预算:每个 run 最多 64 次变更尝试,失败也计数,成功操作重放和只读检查不计数。
231
- 自动修订保留 Design 目标、明确限制与验收标准;Worker 仍必须等待新计划通过完整校验才能使用新权限。
232
- 新证明尚未就绪时,`resume` 只列为条件命令;证明就绪后可直接恢复,由控制层读取版本和哈希。
233
- 增量修订或用户主动选择的 Design 完成后,新的 Implement 上下文都能本地发现并校验交付,继续同一 run。
234
-
235
- 交互式 TUI、print、JSON 和 RPC 都保留 durable semantic state;父模型有自动继续动作时,TUI 显示 recovering,不把内部待编译状态显示成用户待确认,也不提示用户手动 resume。
236
- queued、preparing、waiting-first-response、running、validating、retrying、verifying、paused、approval-needed、applying 和 recovering 都不是完成;operation-cancelled 表示本次操作取消但 run 仍可恢复,discarded 与 rejected 是非成功终态。
237
- 只有最终 apply 与 post-apply verification 提交后的 `completed` 才显示成功。
238
- Design finalization、Implement 终态、Diagnose/显式 `finish` 或 session shutdown 会清除 active stage 与私有子执行状态;Design 还会恢复进入前的精确父工具集合,其他阶段只撤下 `abel_dispatch`。
239
- Gate 等待和可恢复暂停保持激活以接收直接后续操作。
240
-
241
- 私有 journal、artifact 与 change workspace 位于 consumer repository 之外的 owner-private state root。
242
- 暂停会保留最小结构化恢复事实;完成或显式 discard 后安全清理。
243
- 不会持久化凭据、环境值、原始 prompt、隐藏推理、完整子会话或原始模型输出。
75
+ ## 附录
244
76
 
245
77
  ### 公共 UI 的 impactClosure 作者格式
246
78
 
247
79
  `page-state` 与 `public-html` 可以同时声明。
248
- 以下是 **PlanDraft 任务片段**,合并到现有 `tasks[i]`,不是完整计划;其余 Gate A、阶段、产物和验证合同仍按单任务示例填写。
249
- 路径和证据仅用于说明,必须替换为仓库真实调查结果。
80
+ 以下是 **PlanDraft 任务片段**,合并到现有 `tasks[i]`;路径和证据必须替换为仓库真实调查结果。
250
81
  假设 Red 修改 `test/page-state.mjs`,已有 `test/public-html.mjs` 只读保留:
251
82
 
252
83
  ```json
@@ -272,321 +103,24 @@ Gate 等待和可恢复暂停保持激活以接收直接后续操作。
272
103
  }
273
104
  ```
274
105
 
275
- 完整规则:
276
-
277
- - `impactClosure` 恰好包含 `changedSurfaces`、`searchEvidence`、`relatedTests`、`affectedSuite` 四个字段,不接受任意扩展字段。
278
- - `changedSurfaces` 是非空、无重复的合法枚举数组;`none` 不能与其他值混用。
279
- 不得为了通过校验将公共影响改为 `none`。
280
- - 存在公共影响时,后三个数组均不得为空;`searchEvidence` 每项为非空字符串,记录实际检索及结论,不是路径对象,也不是可省略的推导字段。
281
- - `relatedTests` 每项包含 `path` 和非空字符串 `evidence`;路径无重复,必须是 `test/` 或 `tests/` 下的仓库相对文件路径,并位于本任务各阶段合并后的 read/write 范围。
282
- `src/foo.test.ts` 不满足当前测试路径规则。
283
- - PlanDraft 可省略 `disposition`:本任务写入则推导为 `current-task`,只有另一任务写入则为 `regression-task` 并推导 `regressionTaskId`,没有任务写入则为 `unaffected`;多个其他写入者时必须消除歧义。
284
- `unaffected` 表示不修改该测试,不表示不运行该测试。
285
- - 显式作者格式为 `{ "path": "test/page-state.mjs", "disposition": "current-task", "evidence": "实际证据" }`;只读保留用 `unaffected`。
286
- 跨任务格式为 `{ "path": "test/page-state.mjs", "disposition": "regression-task", "evidence": "实际证据", "regressionTaskId": "ui-regression" }`。
287
- 只有 `regression-task` 携带 `regressionTaskId`;依赖、产物和阶段权限仍需按实际计划声明,不会由闭包新增。
288
- - `affectedSuite` 是无重复的测试路径数组,每项必须有对应的 `relatedTests` 条目;具备快照的运行时校验还要求其中至少一个是已有普通测试文件,不能全靠未来新增测试充当已有证据。
289
- - `affectedSuite` 是影响清单,不是验证器。
290
- 显式 `affectedVerification` 应实际运行这些测试,例如 Vitest 的 `testFiles` 列出二者,或使用仓库真实的测试脚本。
291
- 仍需声明验证输入并遵守 Gate A,不能只补清单就宣称测试已运行。
292
-
293
- `validate-plan-draft` 对三个空数组分别返回字段级 category:`search-evidence-required`、`related-tests-required`、`affected-suite-required`,并提供代码维护的 `hint`。
294
- 测试漏列仍返回 `impactClosure.affectedSuite.<index>` / `related-test-missing` 和具体 `path`。
295
- 空数组不足以确定应选哪些测试,因此不会虚构 `expectedPaths`;按实际证据补齐后,在同一个 Design run 重试预检。
296
-
297
- ## 内部边界与运行验证
298
-
299
- 扩展入口负责宿主生命周期与服务装配,交付加载和验证适配器分别由独立模块负责。
300
- 工作流入口保留原有导出,状态机仍是唯一状态转换权威;执行服务通过类型化接口返回事实。
301
- 状态机读取运行与预算事实,独立的 `workflow-status.ts` 纯函数生成状态、阻塞批次及继续动作,不访问存储或启动执行。
302
- 普通阶段和修复阶段共用 `candidate-artifact.ts` 校验、封存候选;恢复旧候选仍按当前批准路径检查,调用方分别处理普通越界和修复权限扩展。
303
- 测试检查模块依赖无环,以及子会话无法导入主工作区应用和 run 状态权限。
304
-
305
- Implement 父模型属于受信任的宿主编排层,保留原有工具以调查和修复已授权的环境问题;产品修改应通过控制面完成。
306
- 子 Worker 和控制面执行路径有代码边界;父模型直接使用宿主工具不经过这些路径,阶段指令约束其行为。
307
- 只有 Design 会收紧父工具。
308
- 结构化验收固定验证义务,目标是否被充分覆盖仍取决于验收测试的质量。
309
-
310
- 新身份统一采用 UTF-16 码元排序,不依赖宿主语言环境。
311
- 旧 workspace manifest 按已保存的条目顺序验证原身份;已绑定批准证明的历史交付可保留原有集合顺序,仍需验证原始字节哈希和私有批准事实。
312
- 普通交付解析保持严格规范化。
313
-
314
- 私有 SQLite 表结构集中声明,打开时检查必需列、类型、空值约束、主键、唯一键、外键和 STRICT 属性;已支持的补列在同一事务中执行。
315
- 结构不符会在业务操作前拒绝,不自动重建或清空已有状态。
316
-
317
- 原生 I/O 线程以预构建的纯 JavaScript 随包发布,安装到 node_modules 后无需运行时 TypeScript 加载器。
318
- `bun run check` 会检查线程构建产物是否与源码一致;修改相关源码后运行 `bun run build:workspace-io` 更新。
319
- Git 快照与工作区物化由可信本地 I/O 线程执行,不占用宿主事件循环;Git 枚举默认限制为 30 秒,支持取消,线程退出后才返回。
320
- 物化优先使用写时复制,始终使用独立 inode 并验证复制内容。
321
- 元数据查询只校验 manifest,实际使用产物时再校验字节;未变更文件继续由保留的祖先 revision 持有,整个 run 的私有数据仍在终态统一清理。
322
-
323
- Linux CI 单独安装并要求 Bubblewrap,验证实际隔离边界、后代进程取消,以及 Red → 状态重开 → Green → 累计验证 → Apply → Post-apply。
324
- 可在已配置 Bubblewrap 的 Linux 主机本地运行:
325
-
326
- ```sh
327
- CADENCE_REAL_ISOLATION=1 bun run test:target test/isolation-real.integration.test.ts
328
- node --experimental-strip-types scripts/benchmark-workspace.mjs 1000
329
- ```
330
-
331
- 基准输出快照、物化耗时、文件数、字节数及父事件循环延迟;耗时取决于文件系统和仓库大小。
332
- 真实隔离测试显式启用后,缺少可用后端会失败,不会跳过。
333
-
334
- ## 安装(Install)
335
-
336
- ### 在 pi 中快速安装(推荐)
337
-
338
- ```sh
339
- $ pi install npm:@abelxiaoxing/cadence
340
- Installed npm:@abelxiaoxing/cadence
341
- ```
342
-
343
- 也可以使用 npm 或 bun:
344
-
345
- ```sh
346
- npm install -g @abelxiaoxing/cadence
347
- # 或使用 bun:bun add -g @abelxiaoxing/cadence
348
- ```
349
-
350
- 已验证的加载路径:
351
-
352
- - **npm 包(npm package)** — 从 npm registry 以用户级或项目级 scope 安装 `@abelxiaoxing/cadence`;Pi 发现四个 prompts、四个 skills、私有扩展与包内 Agents。
353
- - **本地包目录(local package directory)** — 将 Pi 指向本仓库的绝对路径或相对路径(absolute or relative path,例如 `./cadence`),Pi 发现同样的资源。
354
- - **已安装 tarball 目录(installed tarball directory)** — 运行 `bun pm pack --destination <tmp>` 生成真实 tarball(.tgz),安装或解压到隔离目录后指向该目录;tarball 文件本身永远不会被当作本地包传给 Pi。
355
-
356
- 本包要求 Node.js `>=22.13.0`,以使用稳定可用的内置 `node:sqlite`;不从参考仓库源安装。
357
- Pi 相关 peer 依赖使用 `*`,不限制宿主 Pi 的版本;开发依赖的固定版本仅用于仓库构建与测试。
358
-
359
- ## OpenSpec 启动与平台范围
360
-
361
- Design finalization 和 Implement delivery 加载共用无 shell 的 OpenSpec 适配层:读取已安装 `@fission-ai/openspec` 的 `package.json` 中 `bin` 声明,再以 Node 执行 JS 入口;不直接执行 Windows npm 的 `.cmd`,也不调用 `npx`、自动下载或切换 CLI 版本。
362
-
363
- 默认按宿主 `PATH` 定位 OpenSpec,支持 npm 全局默认/自定义 prefix,以及 Unix npm/Bun 的入口符号链接。
364
- 不搜索当前目录,不自动信任 consumer repository 内的 CLI;第一个已发现安装损坏时明确失败,不偷偷选用后续版本。
365
- 版本管理器的任意包装脚本、原生 exe 和 PowerShell 脚本不作为可执行回退。
366
-
367
- 特殊安装可在**启动宿主之前**配置以下环境变量(不属于 Worker 请求参数):
368
-
369
- | 变量 | 含义 |
370
- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
371
- | `ABEL_OPENSPEC_PACKAGE_ROOT` | 已安装 `@fission-ai/openspec` 的绝对包目录,包含 `package.json`;不是 `.cmd` 或 JS 文件路径。显式配置代表操作者信任该安装。 |
372
- | `ABEL_OPENSPEC_NODE` | Node 原生可执行文件的绝对路径,例如 `C:\Program Files\nodejs\node.exe`;默认复用 Node 宿主。非 Node 宿主必须显式配置。 |
373
-
374
- 配置无效不会退回 PATH。
375
- Windows 环境变量名按不区分大小写读取。
376
- 更换全局安装或 PATH 后应重启宿主,确保它继承新环境。
377
-
378
- 两个 CLI 子进程各有 30 秒超时、每个输出流 4 MiB 上限,关闭 stdin、禁用 OpenSpec telemetry,并在返回检查结果前等待两者结束。
379
- 校验报告的 exit 1 与 `valid: false` 被识别为 strict-invalid;无法启动、协议异常、超时、取消、输出超限分别给出安全诊断。
380
- 诊断只暴露 command、phase、reason、允许列表中的 systemCode 和 exitCode,不返回原始 stderr、绝对路径或环境变量。
381
- inspection 不可用时不再级联误报 traceability 输入缺失,且绝不生成成功的 ready 收据。
382
-
383
- 平台契约 CI 使用 Linux、Windows、macOS × Node 22.13.0/24.13.0,显式安装 OpenSpec 1.5.0,验证真实 npm 全局入口、严格校验、Design finalization、失败重试和 proof-bound delivery 加载。
384
- 状态协议要求布尔字段 `isComplete`,用于判断 1.5.0 的规划产物是否齐全;若另有 `isPlanningComplete`,该字段也必须为布尔值,且两者均为 `true` 才视为规划完成。
385
- CLI 的其他版本必须满足相同 JSON 协议;新增支持版本应加入契约测试。
386
-
387
- **此矩阵不代表原生 Implement 隔离已全平台可用。**
388
- 默认隔离后端仍为 Linux Bubblewrap。
389
- Windows x64 的显式 `host-trusted` 使用 Job Object 管理验证进程,不提供文件或网络安全隔离;真实原生支持以 Windows CI 验收结果为准。
390
- 缺少所选后端时保持暂停。
391
-
392
- 目录持久化在 Windows 上单独处理:仅当已打开的目录句柄执行 `fsync` 返回 `EPERM` 时,标记为不支持目录刷新屏障。
393
- 普通文件仍须在发布前成功 `fsync`;目录打开/关闭、权限、其他 I/O 及 POSIX 目录刷新错误不会被忽略。
394
- 内容哈希校验、原子发布、SQLite 事务意图、CAS 与回滚记录继续生效;Windows 的进程中断恢复不等于 POSIX 目录屏障提供的断电持久性保证。
395
-
396
- 以下是底层同版本恢复语义,不是跨包版本保留运行的承诺;跨版本以“升级后的私有状态重置”策略为准,旧运行会被放弃而非恢复。
397
- 若同版本运行在存储异常后停留于 `running / phase-running`,请先停止旧宿主,完整备份 owner-private state root(含 SQLite、WAL 及 artifacts/workspaces),再加载同版本修复。
398
- 用原工作区和原 state root 查询同一 change;重新打开时会在确认无有效执行租约后将遗留运行转为 `paused / operation-interrupted`,apply 中断则进入 `recovering`。
399
- 按本地 `status` 提供的 `resume` 继续原运行,不需要重新 Design、重新 start、discard 或手动修改数据库。
400
- 恢复保留交付绑定、阶段检查点、验证证据和已消耗预算,不返还预算、不伪造 Red/Green 结果;下一次执行仍须满足原有环境和隔离要求。
401
- 不要为绕过 Windows 隔离限制而直接移动状态目录或更改工作区身份。
402
-
403
- 可信 Linux 项目可以显式选择上面的 `local-trusted` 候选目录执行模式。
404
-
405
- 本地可用 `CADENCE_REAL_OPENSPEC=1` 启用真实 CLI 测试(Windows 可用 PowerShell 设置 `$env:CADENCE_REAL_OPENSPEC = "1"`),然后运行:
406
-
407
- ```sh
408
- bun run test:target test/openspec-cli.test.ts test/design-delivery.integration.test.ts
409
- ```
410
-
411
- 未启用时,真实 CLI 用例明确跳过,其他适配层回归测试照常执行。
412
- `bun run check` 的 JS 语法扫描使用 Node 遍历,不依赖 Unix `find`/`xargs`。
413
-
414
- ## Worker 路由(Worker routes)
415
-
416
- 路由配置是可选的:没有项目级或用户级文件时,三个包内 Agent 默认继承当前父模型,因此首次 Design、Implement 或 Diagnose 不需要预先配置 endpoint。
417
- 只有需要自定义模型、显式顺序或 failover 时,才复制 [`config/routes.example.json`](config/routes.example.json) 到项目级 `.pi/cadence/routes.json` 或用户级 `~/.pi/agent/cadence/routes.json`。
418
- 项目文件按整文件优先;route 必须显式列入对应角色,custom route 只引用 `apiKeyEnv` 的变量名,不能把凭据值写进 JSON。
419
- 一旦显式文件存在,它就是完整策略;损坏、缺字段或角色引用不一致会 fail closed,不会悄悄退回默认父模型。
420
- 旧配置的顶层数字标记 `2` 会被安全迁移为当前 canonical 结构;其他编号会以专用诊断码明确拒绝。
421
- inherited route 声明的能力会与当前父模型真实能力取交集,不能通过夸大的配置绕过 admission。
422
- Implement 保留 16,000 context / 8,000 output 的最低容量要求;任务复杂度估算只影响自动选择的优先级,满足最低要求的 route 仍可作为 fallback 或显式 rebind。
423
- transport 与 malformed structural result 都只在声明的 route 集合内做有界 failover;优先选择达到容量估算的 route,同一优先级保持声明顺序,只有一个 route 时会原地重试一次。
424
-
425
- 子任务由 Cadence 自己维护模型/工具循环,通过 `pi-ai` 公开接口请求完整响应,不创建 Pi `AgentSession`、覆盖 Agent 钩子或扫描宿主事件历史决定终止。
426
- 模型流事件只用于进度与完整响应适配;只有正常完整响应的工具调用可以执行,错误、截断或取消不得提交产物。
427
- 继承路由快照当前有效 Provider、模型及每次 attempt 新鲜解析的认证,不修改父 Provider 注册表,也不要求父请求预热。
428
- Provider 自身的流式实现和模型配置仍然生效;宿主 session 的 `before_provider_request`/`onPayload` 不会自动移植到子任务。
429
- 需要通用请求定制时,应使用明确配置的 Provider 实现或 custom route;子请求使用自己的 `low` reasoning 请求,最终由模型映射解释。
430
- 输出上限沿用声明的模型/Provider 合同,不再隐式删除 Responses 的 `max_output_tokens`。
431
-
432
- 子 Agent 的 evidence 提交使用精简草稿:工具绑定省略的身份,补齐未提供的提示性字段,然后按严格内部结果合同校验。
433
- 引用、约束、风险和未决问题仍须显式提供;省略提示不等于已验证的“没有影响”,也不增加授权。
434
- 一次被拒绝的提交可在原会话纠正一次;只有正常以文字结束且从未提交时,才额外提示补交一次。
435
- 补交沿用原工具权限、总时限、取消和用量统计,不重新调查,不把文字直接当作交付;传输错误、截断和取消不触发补交。
436
- 合法提交可附带简短文字,但接受后不得重复提交或覆盖结果。
437
-
438
- 相同 pause 的安全指纹与重复计数通过 `status` 暴露,凭据、URL 和原始输出仍保持私有。
439
- `rebind` 只能选择已获 policy 授权且能力匹配的 route,不会扩大任务边界。
440
-
441
- 验证归因使用完整失败集合;大基线以哈希校验的私有 artifact 持久化,Worker 和状态只接收最多 256 条失败摘要。
442
- 非 Vitest 失败身份由执行入口、参数和失败证据决定,不受合同显示 ID 影响;身份用于诊断聚类,但不单独证明两个失败属于同一断言。
443
-
444
- ## 跨项目验证合同(Cross-project verification)
445
-
446
- Cadence 不要求 consumer repository 提供 `check` 或 `test:target` 脚本。
447
- Gate B 使用 Implement Runtime 同一套 capability validator,只批准 consumer 当前确实能够执行的结构化合同:
448
-
449
- - `vitest`:显式 package script、本地 binary 或 `npx`(必须 `noInstall: true`),安全相对测试路径和 `minTests`。
450
- 只有这个 kind 会注入 JSON reporter 并校验 Red assertion identity。
451
- - `package-script`:固定 `bun | npm | pnpm | yarn`、script 名、完整 script
452
- command 和参数;可用于 typecheck、build 与仓库已有测试脚本。
453
- - `static-check`:本地 binary、禁止下载的 `npx` 或安全相对 Node script;可用于
454
- schema/Prisma/AGENTS 等静态检查,不接收 Vitest 参数。
455
- - `steps`:显式有序 precheck/target;不使用 `&&` 拼接复合命令。
456
-
457
- 例如 npm-only consumer 的 Vitest target:
458
-
459
- ```json
460
- {
461
- "kind": "vitest",
462
- "id": "npm-vitest-target",
463
- "runner": {
464
- "kind": "package-script",
465
- "packageManager": "npm",
466
- "script": "test:run",
467
- "command": "vitest run"
468
- },
469
- "testFiles": ["tests/utils/upstreamFetch.test.js"],
470
- "args": [],
471
- "classification": "expected-green",
472
- "minTests": 1
473
- }
474
- ```
475
-
476
- Prisma 检查使用本地已安装 executable,不会隐式联网:
106
+ `impactClosure` 恰好包含 `changedSurfaces`、`searchEvidence`、`relatedTests` 和 `affectedSuite` 四个字段。
107
+ `changedSurfaces` 是合法枚举数组,`none` 不能与其他值混用。
108
+ `searchEvidence` 记录实际检索与结论。
109
+ `relatedTests` 每项位于 `test/` 或 `tests/` 下,`disposition` 可省略由编译器推导。
110
+ `affectedSuite` 是影响清单而非验证器,每项必须有对应的 `relatedTests` 条目。
477
111
 
478
- ```json
479
- {
480
- "kind": "static-check",
481
- "id": "prisma-schema",
482
- "runner": { "kind": "npx", "executable": "prisma", "noInstall": true },
483
- "args": ["validate"],
484
- "classification": "expected-green"
485
- }
486
- ```
112
+ ## 项目结构
487
113
 
488
- 迁移时,将新的 Gate B argv 命令改为上述 kind;需要 `typecheck` 再测试时用 `steps`,并把 typecheck 建模为 expected-green precheck。
489
- Cadence 仍接受旧版 `bun run test:target <paths>` 和 `bun run check` 合同并立即规范化,但 Design 不再生成 argv-only 合同。
490
- 脚本缺失会在 readiness 以 `verification-adapter/script-missing` 明确关闭,而不是在 Red 阶段误报为 Bubblewrap 或依赖环境故障。
114
+ - `src/`:扩展和工作流实现
115
+ - `prompts/`:四个用户入口
116
+ - `agents/`、`skills/`:随包资源
117
+ - `config/`:示例配置
118
+ - `openspec/specs/`:当前规范
119
+ - `docs/`:仅保留必要的平台说明
120
+ - `README.md` 附录:公共 UI 计划的 impactClosure 作者格式
491
121
 
492
- ## 开发(Development)
122
+ 历史设计、评估报告和已完成变更不放在主仓库中。
493
123
 
494
- ```sh
495
- bun install
496
- bun run check # 语法 + 类型检查
497
- bun run lint # biome + rumdl
498
- bun run test # 完整测试套件
499
- bun run test:target <files> # 定向测试
500
- bun run check:agents # AGENTS 索引校验
501
- ```
502
-
503
- ## 验证(Verification)
504
-
505
- ```sh
506
- bun run verify # check && lint && test && pack:check(发布前全套校验)
507
- bun run pack:check # 真实 tarball 56 成员清单校验
508
- bun run traceability:check # 162 条 active Requirement/Scenario 引用精确解析且唯一归属
509
- ```
510
-
511
- ## 许可(License)
512
-
513
- MIT — 详见 [LICENSE](LICENSE) 与 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。
514
-
515
- ## 验证执行环境与明确恢复
516
-
517
- 验证使用独立 HOME、Vite 缓存和报告目录;隔离模式挂载只读 consumer 依赖,可信模式使用候选依赖副本。
518
- Vitest 的 JSON 报告与普通 stdout/stderr 分离,日志超过捕获预算只截取头尾,不终止正常测试。
519
- 报告缺失、损坏或超限属于验证不可用,不作为产品失败基线或自动改代码的理由。
520
- 已封存候选在环境故障后可重新验证,并在存储重开后复用;即使自动生成次数已耗尽,普通 resume 仍可只复验该候选,不启动新的补丁生成。
521
- 非 Vitest 的 Red 证据通过有界流式匹配保留,不受日志头尾截取影响。
522
- 完整的已批准 package-script 可包含组合命令、引号和嵌套脚本;包管理器在隔离环境中解释,manifest、lockfile 和项目配置绑定 currentness。
523
- 配置注释和普通值不触发禁用词检查;隔离模式中的有效凭据或宿主执行配置仍被拒绝;可信模式允许操作者显式配置。
524
- 计划已授权的 manifest/配置写入可在隔离候选中验证;未授权路径仍需匹配设计时哈希,实际入口脚本仍必须与批准命令相同,执行期间的输入漂移仍会使验证失效。
525
- 专门的 Vitest 合同仍拥有 JSON reporter、测试数量及 Red 身份检查,复合脚本不会自动获得断言级语义。
526
-
527
- 自动纠错耗尽后,普通 resume、rebind 和重启不充值。
528
- 父代理可使用 status 返回的 `recovery.additionalAttempt`,作为 resume 的 `recovery` 字段明确追加一次尝试;失败后再次暂停,历史消耗保持。
529
- `continuation.kind: "inspect-recovery"` 将已知故障交给父代理调查并选择具体修复策略;它是指导信息,不是新的 dispatch action。
530
- 纠错耗尽时,`conditionalCommands` 明确给出需要原样携带恢复凭据的 resume 条件;有证据支持的计划调整仍需经过同一 change 的编译和验证。
531
- 累计工作额度按成功接纳过的最大阶段数增长,任务重命名、重复编译及缩小后恢复原规模不增加额度。
532
- 宿主可在启动前设置 `ABEL_WORK_MAX_UNITS`(默认 512)和 `ABEL_VERIFICATION_MAX_REPORT_BYTES`(默认 67108864);Worker 不能调整这些资源设置。
533
- 前者在 run 中固定,后者用于每次独立报告的有界读取。
534
-
535
- ## 结构化授权与验证模式
536
-
537
- 新 Design 的 Gate A 使用 `ChangeContract`:目标、稳定验收 ID 与验证义务、明确限制,以及允许的写入范围、依赖和验证模式。
538
- 控制面保存规范化的非敏感权威值并注入计划;重排任务不能删除验收或扩大政策。
539
- 自动 amendment 保留 Gate A,不能改写已接受的 proposal/spec 或行为决定。
540
- 旧文本授权继续可读,其修订保留原有验证义务与保守范围。
541
-
542
- 任务默认 `verificationMode: "behavior"`,继续执行 Red/Green。
543
- 明确授权的 `mechanical` 和 `refactor` 模式采用基线与后置验证,从 Green 开始,不生成 Red 候选。
544
- 机械修改限于文档、数据与配置文件;重构不能改写已接受的验证入口;声明公共行为变化时仍需 Red。
545
- 全部模式保留累计验证与事务应用。
546
-
547
- 验证证据现在绑定安装后的依赖内容、runner 和适配器政策。
548
- 依赖身份采集在可取消 I/O 线程中执行;工具缓存不参与身份。
549
- 环境漂移会暂停验证,恢复后重建基线并重验保留阶段。
550
-
551
- ## 真实模型工作流评估
552
-
553
- 开发仓库提供独立评估入口,消费项目和 Git 历史均在临时目录创建,结束后清理。
554
- 默认只验证真实 Pi 的包来源与命令激活,不调用模型:
555
-
556
- ```sh
557
- bun run eval:workflow
558
- bun run eval:workflow --live --scenario small-fix --output /tmp/cadence-evaluation.json --progress-output /tmp/cadence-progress.json
559
- bun run eval:workflow --live --scenario multiple-tasks
560
- bun run eval:workflow --live --scenario restart-recovery
561
- bun run eval:workflow --live --scenario missing-capability
562
- ```
124
+ ## 许可
563
125
 
564
- `--live` 使用 Pi 当前配置的模型,也可传 `--model provider/model`;需要可用的 Provider、OpenSpec 和 Linux Bubblewrap。
565
- 报告记录完成状态、用户介入、重复修订、耗时及宿主报告的 token/成本;最终行为另由隔离 oracle 检查。
566
- `trace` 提供有界的工具/操作计数、安全错误分类、阶段里程碑、重复提交、工具活动区间并集和消息 usage;截止时冻结快照,未到达的里程碑为 null。
567
- 非工具时间不是纯模型计算时间。
568
- `configurations` 记录实际模型、reasoning 和非秘密路由指纹,`sourceSha256` / `sourceUnchanged` 标识工作树版本和运行期间是否变化。
569
- 可选 `--progress-output` 每 15 秒写一份有界进度快照;无原始参数、提示或响应正文。
570
- 源码读取统计只覆盖明确的成功 read,未分类访问不能当作零。
571
- `modelFailureDiagnostics` 最多保留 16 条脱敏错误分类及可从 SDK 错误文字识别的 HTTP 状态;无法识别时明确记录 `unclassified` / `null`。
572
- `autoRetries` 与 `retryDelayMs` 单独记录宿主自动重试次数和计划退避时间,避免把同一请求的多次失败误读为独立故障。
573
- 模型服务不可用、阶段停滞、取消与 Design 完成都不会被计为 Implement 成功。
574
- 缺少能力的场景用于观察保留状态,不能把任意停滞当作正确恢复。
575
- 无原始对话落盘。
576
-
577
- ## 内部架构与请求预算
578
-
579
- `PlanDraft` 只表示作者输入,`ImplementPlan` 独立定义完整执行合同;命名引用和默认值仅在编译入口展开,旧封存计划不被重写。
580
- PlanDraft 的命名或内联 package-script 可以省略 `command`,编译器从 manifest 绑定脚本原文后生成身份;显式不匹配仍拒绝,Gate A 的完整验证合同不被替换。
581
- 作者在 `tasks.md` 保留任务 checkbox、目标和精确 Scenario 归属;`compile-plan` 生成独立的验证 ID 绑定区域,保留作者正文,并在两份文件安装成功后记录编译。
582
- 旧封存交付仍可读取;缺失作者证据或篡改绑定不能通过追溯检查。
583
- `workflow-state-machine` 继续独占 run/task 状态转换与预算事务;调度、恢复策略和交付差异比较使用只接受事实的内部函数。
584
- `durable-workflow` 管理资源生命周期和交付重放,`phase-execution` 执行候选阶段,`change-verification` 管理基线及变更验证;阶段服务没有主工作区 apply 能力。
585
- Pi 入口负责激活、工具交互、模型能力投影和展示;`package-workflow` 组合控制服务,`package-candidate` 执行受限候选请求,核心不接收 Pi 会话事件或完整宿主上下文。
586
-
587
- 每次模型请求独立计时,默认 90 秒内没有非空文本、思考或工具参数增量时返回 `first-progress-timeout`;已有进展后空闲 180 秒返回 `stream-idle-timeout`。
588
- HTTP 响应头用于观察,不刷新进展预算;完整终态可直接结束请求,本地工具执行间隙不计入流空闲,下一轮重新计时。
589
- Broker 保留每 attempt 20 分钟总上限和原有有限重试;该上限不代表跨重试的 workflow 总时限。
590
- 新请求不再发出 `connect-timeout`,也不声称观测到了 TCP/TLS 建连;旧超时事实和 `connecting` 展示仍可读取。
591
- 子执行器限制为 64 轮,序列化上下文取 4 MiB 与模型窗口保守预算中的较小值,不自动压缩或静默截断证据;达到限制返回执行限制失败,候选任务暂停并要求拆分,不作为端点故障重试。
592
- 取消后的用量结算最多等待 250 ms,迟到结果不能进入候选提交或主工作区应用。
126
+ MIT,详见 [LICENSE](LICENSE) 和 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abelxiaoxing/cadence",
3
- "version": "1.8.2",
3
+ "version": "1.8.3",
4
4
  "description": "Four explicit Abel workflow prompts with stage-isolated design and diagnosis, durable resumable implementation, and three package-owned professional Agents.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -26,22 +26,19 @@ export function startupCardLines(options: {
26
26
  home: string;
27
27
  projectTrusted: boolean;
28
28
  }): string[] {
29
- const lines = ["Cadence · 研究能力(仅本地配置检查,未联网验证)"];
29
+ const lines: string[] = [];
30
30
  if (!options.projectTrusted) {
31
- return [
32
- ...lines,
33
- "尚未信任当前项目:未读取研究配置;信任项目后重新加载可查看状态。",
34
- "不自动启动 Abel 工作流;请勿在聊天中发送 API Key。",
35
- ];
31
+ return ["Cadence:当前项目未信任,未读取研究配置。"];
36
32
  }
37
33
 
38
34
  let selectedPath: string | null = null;
39
35
  try {
40
36
  selectedPath = selectConfigPath(options);
41
37
  const { values } = loadConfig({ ...options, allowMissing: true });
42
- const context7 = !validUrl(
38
+ const context7UrlValid = validUrl(
43
39
  values.CONTEXT7_API_URL || "https://context7.com/api/v2",
44
- )
40
+ );
41
+ const context7 = !context7UrlValid
45
42
  ? "CONTEXT7_API_URL 格式无效"
46
43
  : values.CONTEXT7_API_KEY
47
44
  ? "已配置密钥"
@@ -49,36 +46,33 @@ export function startupCardLines(options: {
49
46
  const missing = ["GROK_API_URL", "GROK_API_KEY"].filter(
50
47
  (name) => !values[name],
51
48
  );
49
+ const grokUrlValid = !missing.length && validUrl(values.GROK_API_URL);
52
50
  const grok = missing.length
53
51
  ? `待配置 ${missing.join("、")}`
54
- : !validUrl(values.GROK_API_URL)
52
+ : !grokUrlValid
55
53
  ? "GROK_API_URL 格式无效"
56
54
  : "已配置";
55
+ const tavilyUrlValid = validUrl(
56
+ values.TAVILY_API_URL || "https://api.tavily.com",
57
+ );
57
58
  const tavily =
58
59
  values.TAVILY_ENABLED === "false"
59
60
  ? "已关闭"
60
61
  : !values.TAVILY_API_KEY
61
62
  ? "未配置(可选)"
62
- : !validUrl(values.TAVILY_API_URL || "https://api.tavily.com")
63
+ : !tavilyUrlValid
63
64
  ? "TAVILY_API_URL 格式无效"
64
- : "已配置(Grok Skill 仍需 Grok 配置)";
65
- lines.push(
66
- `文档查询 Context7:${context7}`,
67
- `联网搜索 Grok:${grok};Tavily:${tavily}`,
68
- );
65
+ : "已配置";
66
+ lines.push(`Context7:${context7}|Grok:${grok}|Tavily:${tavily}`);
69
67
  } catch {
70
- lines.push("研究配置无法读取或解析:请检查下方文件;未回退到其他配置。");
68
+ lines.push("研究配置无法读取或解析:请检查配置文件;未回退到其他配置。");
71
69
  }
72
70
 
73
71
  const userPath = path.join(options.home, ".pi", "agent", "cadence", ".env");
74
- const projectPath = path.join(options.cwd, ".pi", "cadence", ".env");
75
- lines.push(
72
+ lines.unshift(
76
73
  selectedPath
77
- ? `生效文件:${displayPath(selectedPath)}${selectedPath === projectPath ? "(项目整文件优先,不合并用户配置)" : "(用户级,跨项目复用)"}`
78
- : `配置位置:${displayPath(userPath)}(用户级,跨项目复用)`,
79
- "在本地编辑该文件:GROK_API_URL=<服务地址>、GROK_API_KEY=<密钥>,每项一行;可选 TAVILY_API_KEY。",
80
- "研究 Skills 不读取 shell API 变量;保存后下次调用生效。不要把密钥发到聊天或提交到 Git。",
81
- "可选服务未配置不阻塞普通任务,也不自动启动 Abel 工作流。",
74
+ ? `Cadence配置文件:${displayPath(selectedPath)}`
75
+ : `Cadence配置文件:${displayPath(userPath)}(未创建)`,
82
76
  );
83
77
  return lines;
84
78
  }