release-skill 0.5.1 → 0.6.0
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.kimi-plugin/plugin.json +1 -1
- package/CHANGELOG.md +13 -0
- package/INSTALL.md +2 -2
- package/INSTALL.zh-CN.md +2 -2
- package/README.md +14 -14
- package/README.zh-CN.md +15 -15
- package/adapters/claude/.claude-plugin/marketplace.json +1 -1
- package/adapters/claude/.claude-plugin/plugin.json +1 -1
- package/adapters/claude/bin/release-skill.bundle.mjs +3226 -565
- package/adapters/claude/schemas/.render-manifest.json +6 -6
- package/adapters/claude/schemas/release-plan.schema.json +401 -2
- package/adapters/claude/schemas/release-project.schema.json +291 -0
- package/adapters/claude/schemas/release-run.schema.json +59 -6
- package/adapters/claude/skills/release-config/SKILL.md +140 -0
- package/adapters/claude/skills/release-docs/SKILL.md +106 -0
- package/adapters/claude/skills/release-help/SKILL.md +39 -0
- package/adapters/claude/skills/release-marketplace/SKILL.md +147 -0
- package/adapters/claude/skills/release-publish/SKILL.md +25 -6
- package/adapters/claude/skills/release-verify/SKILL.md +10 -0
- package/adapters/codex/.codex-plugin/plugin.json +2 -2
- package/adapters/codex/bin/release-skill.bundle.mjs +3226 -565
- package/adapters/codex/schemas/.render-manifest.json +6 -6
- package/adapters/codex/schemas/release-plan.schema.json +401 -2
- package/adapters/codex/schemas/release-project.schema.json +291 -0
- package/adapters/codex/schemas/release-run.schema.json +59 -6
- package/adapters/codex/skills/release-config/SKILL.md +147 -0
- package/adapters/codex/skills/release-docs/SKILL.md +113 -0
- package/adapters/codex/skills/release-help/SKILL.md +39 -0
- package/adapters/codex/skills/release-marketplace/SKILL.md +154 -0
- package/adapters/codex/skills/release-publish/SKILL.md +25 -6
- package/adapters/codex/skills/release-verify/SKILL.md +10 -0
- package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
- package/adapters/kimi/bin/release-skill.bundle.mjs +3226 -565
- package/adapters/kimi/schemas/.render-manifest.json +6 -6
- package/adapters/kimi/schemas/release-plan.schema.json +401 -2
- package/adapters/kimi/schemas/release-project.schema.json +291 -0
- package/adapters/kimi/schemas/release-run.schema.json +59 -6
- package/adapters/kimi/skills/release-config/SKILL.md +147 -0
- package/adapters/kimi/skills/release-docs/SKILL.md +113 -0
- package/adapters/kimi/skills/release-help/SKILL.md +39 -0
- package/adapters/kimi/skills/release-marketplace/SKILL.md +154 -0
- package/adapters/kimi/skills/release-publish/SKILL.md +25 -6
- package/adapters/kimi/skills/release-verify/SKILL.md +10 -0
- package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
- package/adapters/workbuddy/bin/release-skill.bundle.mjs +3226 -565
- package/adapters/workbuddy/schemas/.render-manifest.json +6 -6
- package/adapters/workbuddy/schemas/release-plan.schema.json +401 -2
- package/adapters/workbuddy/schemas/release-project.schema.json +291 -0
- package/adapters/workbuddy/schemas/release-run.schema.json +59 -6
- package/adapters/workbuddy/skills/release-config/SKILL.md +140 -0
- package/adapters/workbuddy/skills/release-docs/SKILL.md +106 -0
- package/adapters/workbuddy/skills/release-help/SKILL.md +39 -0
- package/adapters/workbuddy/skills/release-marketplace/SKILL.md +147 -0
- package/adapters/workbuddy/skills/release-publish/SKILL.md +25 -6
- package/adapters/workbuddy/skills/release-verify/SKILL.md +10 -0
- package/bin/release-skill-cli.mjs +235 -7
- package/bin/release-skill.bundle.mjs +3226 -565
- package/package.json +3 -2
- package/platform-manifest.json +359 -0
- package/references/.render-manifest.json +9 -9
- package/references/02-project-config.md +35 -0
- package/references/05-evidence-and-errors.md +44 -0
- package/references/06-adapter-contract.md +13 -0
- package/schemas/.render-manifest.json +6 -6
- package/schemas/release-plan.schema.json +401 -2
- package/schemas/release-project.schema.json +291 -0
- package/schemas/release-run.schema.json +59 -6
- package/skills/release-config/SKILL.md +140 -0
- package/skills/release-docs/SKILL.md +106 -0
- package/skills/release-help/SKILL.md +39 -0
- package/skills/release-marketplace/SKILL.md +147 -0
- package/skills/release-publish/SKILL.md +25 -6
- package/skills/release-verify/SKILL.md +10 -0
- package/skills-src/release-config/SKILL.md +140 -0
- package/skills-src/release-docs/SKILL.md +106 -0
- package/skills-src/release-help/SKILL.md +39 -0
- package/skills-src/release-marketplace/SKILL.md +147 -0
- package/skills-src/release-publish/SKILL.md +25 -6
- package/skills-src/release-verify/SKILL.md +10 -0
- package/src/adapters/contract.mjs +5 -0
- package/src/adapters/distribute-git.mjs +625 -0
- package/src/commands/distribute.mjs +1078 -0
- package/src/commands/lineage.mjs +616 -0
- package/src/commands/prepare.mjs +335 -76
- package/src/commands/route.mjs +686 -0
- package/src/commands/ship.mjs +45 -1
- package/src/commands/verify.mjs +176 -0
- package/src/core/baseline-advance.mjs +185 -0
- package/src/core/checkpoints.mjs +25 -0
- package/src/core/postpublish.mjs +315 -0
|
@@ -78,6 +78,45 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" docs refresh --unit <id> \
|
|
|
78
78
|
| 请求生产发布 | 已有公开版本先调用 `release-prepare --online --production` 观察 bound 基线;人工审阅后再路由 `release-publish` |
|
|
79
79
|
| RELEASE_DOCS_INVALID | 配置或说明源语义非法(重复键、alias、未知字段、版本漂移等);修正配置或说明源后重新演练 |
|
|
80
80
|
| RELEASE_DOCS_TRANSLATION_MISSING | 配置语种缺失或多余;补齐说明源语种,与 `releaseDocuments.locales` 完全一致,不得回退 |
|
|
81
|
+
|
|
82
|
+
## Routing Suggestions (§4.3 Quickstart Routing)
|
|
83
|
+
|
|
84
|
+
对于不清楚如何开始的用户,推荐使用 `release-skill route` 命令进行自动化工作流选择:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# 快速分类变更并推荐工作流
|
|
88
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" route --root <path> --json
|
|
89
|
+
|
|
90
|
+
# JSON 输出包含 classification 和 recommendation 字段
|
|
91
|
+
{
|
|
92
|
+
"classification": {
|
|
93
|
+
"code": [],
|
|
94
|
+
"docs": ["README.md"],
|
|
95
|
+
"config": [],
|
|
96
|
+
"marketplace": [],
|
|
97
|
+
"mixed": false
|
|
98
|
+
},
|
|
99
|
+
"recommendation": {
|
|
100
|
+
"workflowKind": "docs-only",
|
|
101
|
+
"reason": "Pure documentation changes detected...",
|
|
102
|
+
"firstCommand": "release-docs"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**可用工作流**:
|
|
108
|
+
- `docs-only`: 纯文档变更(跳过代码类门限)
|
|
109
|
+
- `config-only`: 纯配置变更(schema 验证 + 决策分支)
|
|
110
|
+
- `marketplace-only`: 纯 marketplace 索引变更(条目更新 + snapshot 同步)
|
|
111
|
+
- `full-happy-end`: 混合变更或无法确定(fail-closed 到最安全路径)
|
|
112
|
+
- `reconcile`: 存在 PARTIAL 运行时需先恢复
|
|
113
|
+
- `help`: 无变更且未指定目标版本
|
|
114
|
+
|
|
115
|
+
参考文档:
|
|
116
|
+
- [`release-docs`](../release-docs/SKILL.md) - 文档工作流详解
|
|
117
|
+
- [`release-config`](../release-config/SKILL.md) - 配置工作流详解
|
|
118
|
+
- [`release-marketplace`](../release-marketplace/SKILL.md) - Marketplace 工作流详解
|
|
119
|
+
|
|
81
120
|
| RELEASE_DOCS_CONFLICT | 目标含非受管同版本条目、受管标记损坏或人工冲突;人工修复目标并保留人工修改后重新演练 |
|
|
82
121
|
| RELEASE_DOCS_REFRESH_STALE | 确认绑定后候选已变化;重新演练取得新 `refreshDigest` 再确认写入 |
|
|
83
122
|
| RELEASE_DOCS_STALE | prepare 检测到文档未刷新;按 `docs refresh` → 审阅 → 提交 → 重新 prepare 恢复 |
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-marketplace
|
|
3
|
+
description: "Marketplace-only workflow profile: route confirms marketplace-only diff (plugins.mjs/public-snapshot), update plugins.mjs entry (manual review), regenerate public-snapshot via workspace generator, prepare --workflow marketplace (code-class gates trimmed), then delegate publish to the target workspace's own marketplace release skill"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# release-marketplace
|
|
7
|
+
|
|
8
|
+
## 触发
|
|
9
|
+
|
|
10
|
+
用户询问或执行纯 marketplace 变更的发布流程。包含 `plugins.mjs` 入口文件、`public-snapshot/` 制品目录的修改,且无代码、文档或配置变更。
|
|
11
|
+
|
|
12
|
+
## 当前状态
|
|
13
|
+
|
|
14
|
+
`release-marketplace` 是工作流配置文件 (§4) 定义的独立工作流之一,专门处理仅 marketplace 索引变更的场景。
|
|
15
|
+
|
|
16
|
+
**机械实现**: `prepare --workflow marketplace` 确定性地裁剪代码类门禁(H5),plan
|
|
17
|
+
记录 `workflowKind: 'marketplace'` 与 `workflowDecision`。**本工作流不执行发布**:
|
|
18
|
+
发布委托给目标 workspace 的**专属发布技能**(各 marketplace workspace 有独立的
|
|
19
|
+
`publish-marketplace` 流程,如 artifact-skill-set-workspace、glaf4-skill-set-workspace
|
|
20
|
+
等)。release-skill 的 CLI 没有 `sync` 命令,也没有 `exclusive-release.mjs`——
|
|
21
|
+
这些接口不存在,不得调用。
|
|
22
|
+
|
|
23
|
+
**边界**: plugin source unmodified(不修改 plugin 源码)。市场索引一致性、snapshot
|
|
24
|
+
byte、platform manifest 是核心 gate,由 workspace 自己的生成器与
|
|
25
|
+
`generate-platform-manifest.mjs --check` 机械保证。
|
|
26
|
+
|
|
27
|
+
## 职责与边界
|
|
28
|
+
|
|
29
|
+
- **步骤① diff 确认 marketplace-only**: 调用 `release-skill route` command 确认仅有 marketplace 变更(`plugins.mjs` / `public-snapshot/` 归 marketplace 类)
|
|
30
|
+
- **步骤② workspace plugins.mjs 更新**: 手动审查更新入口文件(entry 是唯一 truth source,`plugins.mjs` 属 marketplace 类而非 code 类)
|
|
31
|
+
- **步骤③ 再生成 public-snapshot**: 调用 workspace 自己的快照生成器
|
|
32
|
+
- **步骤④ 一致性验证**: 快照字节 + `generate-platform-manifest.mjs --check`(平台清单漂移检测)
|
|
33
|
+
- **步骤⑤ prepare --workflow marketplace**: 冻结计划,记录 workflow 裁剪决策
|
|
34
|
+
- **步骤⑥ 委托发布**: 调用目标 workspace 的专属 `publish-marketplace` 技能执行发布
|
|
35
|
+
|
|
36
|
+
**授权边界**:
|
|
37
|
+
- Step②需要人工确认(entry 是唯一 truth source)
|
|
38
|
+
- Step③–④自动验证,不允许不一致状态通过
|
|
39
|
+
- Step⑥依赖外部 workspace 的发布技能,不直接控制其执行
|
|
40
|
+
|
|
41
|
+
**阶段通过规则**:
|
|
42
|
+
- Steps①–⑤完成且一致:plan `workflowKind === 'marketplace'` 冻结
|
|
43
|
+
- Step⑥成功:以目标 workspace 的发布技能验收标准为准(通常 `status === 'VERIFIED'`)
|
|
44
|
+
|
|
45
|
+
## 正向执行路径
|
|
46
|
+
|
|
47
|
+
1. 运行 `release-skill route --root <path> --json` 获取 diff 分类
|
|
48
|
+
2. 若推荐 `workflowKind === 'marketplace-only'`,则使用本技能
|
|
49
|
+
3. 执行步骤②:手动审查并更新 `plugins.mjs`(唯一 truth source)
|
|
50
|
+
4. 执行步骤③:调用 workspace 自己的生成器再生成 `public-snapshot/`
|
|
51
|
+
5. 执行步骤④:运行 `generate-platform-manifest.mjs --check` 验证平台清单与快照字节无漂移
|
|
52
|
+
6. 执行步骤⑤:运行 `release-skill prepare --offline --workflow marketplace --target-version <ver>` 冻结计划
|
|
53
|
+
7. 执行步骤⑥:调用目标 workspace 的专属发布技能(如 `publish-marketplace`)执行发布
|
|
54
|
+
8. (Step⑥续) 汇总目标 workspace 流程的最终状态
|
|
55
|
+
|
|
56
|
+
## 确定性脚本调用
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Step 1: Diff classification confirmation (marketplace-only)
|
|
60
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" route \
|
|
61
|
+
--root <workspace-root> --json
|
|
62
|
+
|
|
63
|
+
# Step 2: Manual review and update plugins.mjs
|
|
64
|
+
# Human-in-the-loop: entry is the sole truth source
|
|
65
|
+
# Edit: <workspace>/plugins.mjs (add/remove/update plugin entries)
|
|
66
|
+
|
|
67
|
+
# Step 3: Regenerate public-snapshot (workspace's own generator)
|
|
68
|
+
cd <workspace-root>
|
|
69
|
+
node <workspace-root>/scripts/regenerate-public-snapshot.mjs
|
|
70
|
+
|
|
71
|
+
# Step 4: Consistency check (snapshot bytes + platform manifest drift)
|
|
72
|
+
node <workspace-root>/scripts/generate-platform-manifest.mjs --check
|
|
73
|
+
|
|
74
|
+
# Step 5: Freeze the marketplace workflow plan
|
|
75
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" prepare --offline \
|
|
76
|
+
--workflow marketplace --target-version <version> --json
|
|
77
|
+
|
|
78
|
+
# Step 6: Delegate publish to the target workspace's own marketplace release
|
|
79
|
+
# skill (each marketplace workspace ships its own publish-marketplace flow;
|
|
80
|
+
# release-skill does NOT publish marketplace indexes itself)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 故障路由
|
|
84
|
+
|
|
85
|
+
| 场景 | 状态 | 处理 |
|
|
86
|
+
|------|------|------|
|
|
87
|
+
| 非纯 marketplace 变更 | full-happy-end | 路由到 `release-skill ship` 完整工作流 |
|
|
88
|
+
| plugins.mjs 语法错误 | MARKETPLACE_INDEX_INVALID | 修正语法后重试 step② |
|
|
89
|
+
| plugins.mjs 重复 entry | MARKETPLACE_DUPLICATE_ENTRY | 删除重复项后重试 step② |
|
|
90
|
+
| plugins.mjs entry 缺少必需字段 | MARKETPLACE_ENTRY_INVALID | 补充 required fields(id/name/version)后重试 step② |
|
|
91
|
+
| snapshot byte 不一致 | SNAPSHOT_BYTE_MISMATCH | 重新执行 step③ 再生成快照 |
|
|
92
|
+
| platform manifest 漂移 | PLATFORM_MANIFEST_DRIFT | 重新生成 platform manifest 后重试 step④ |
|
|
93
|
+
| snapshot ≠ manifest | SNAPSHOT_MANIFEST_CONFLICT | 人工决策:以哪个为准后继续 |
|
|
94
|
+
| workspace 发布技能不可用 | WORKSPACE_SKILL_NOT_FOUND | 检查 workspace 发布流程路径,不绕过其安全门禁 |
|
|
95
|
+
|
|
96
|
+
## 一致性验证 (Step 4)
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
┌──────────────────────────────────────┐
|
|
100
|
+
│ regenerate public-snapshot completed │
|
|
101
|
+
└──────────────┬───────────────────────┘
|
|
102
|
+
│
|
|
103
|
+
┌───────┴────────┐
|
|
104
|
+
│ │
|
|
105
|
+
▼ ▼
|
|
106
|
+
┌──────────────┐ ┌──────────────────┐
|
|
107
|
+
│ snapshot │ │ platform │
|
|
108
|
+
│ byte hash │ │ manifest digest │
|
|
109
|
+
└──────┬───────┘ └────────┬─────────┘
|
|
110
|
+
│ │
|
|
111
|
+
└────────┬───────────┘
|
|
112
|
+
│
|
|
113
|
+
┌───────┴────────┐
|
|
114
|
+
│ │
|
|
115
|
+
▼ ▼
|
|
116
|
+
══ CONSISTENT ══ ══ MISMATCH ══
|
|
117
|
+
│ │
|
|
118
|
+
▼ ▼
|
|
119
|
+
Continue → Step 5 Retry Step 3 or
|
|
120
|
+
human decision
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 与其他工作流的关系
|
|
124
|
+
|
|
125
|
+
- **docs-only**: 若 marketplace 更新伴随文档变更,使用 `marketplace-docs` 组合推荐
|
|
126
|
+
- **config-only**: 若同时修改 project.yaml,使用 `marketplace-config` 组合推荐
|
|
127
|
+
- **full-happy-end**: 多类型混合变更(code+marketplace)时降级到此路径
|
|
128
|
+
|
|
129
|
+
## 关联技能
|
|
130
|
+
|
|
131
|
+
- `release-skill route`: 快速入门决策路由(§4.3)
|
|
132
|
+
- `release-prepare`: 冻结计划(`--workflow marketplace`)
|
|
133
|
+
- 各 workspace 的专属发布技能(`publish-marketplace`,如 artifact-skill-set-workspace、
|
|
134
|
+
glaf4-skill-set-workspace、skill-family-hub-workspace 等)
|
|
135
|
+
- `generate-platform-manifest.mjs`: 平台清单漂移检测(--check)
|
|
136
|
+
|
|
137
|
+
## Workspace Coordination Notes
|
|
138
|
+
|
|
139
|
+
每个 workspace 管理自己的 marketplace 入口和制品,并通过其专属发布技能发布:
|
|
140
|
+
- `artifact-skill-set-workspace`: `plugins.mjs` 是条目唯一事实源,`publish-marketplace`
|
|
141
|
+
技能执行发布
|
|
142
|
+
- `glaf4-skill-set-workspace`: 同上,项目专属 `publish-marketplace` 技能
|
|
143
|
+
- `skill-family-hub-workspace`: `plugins.mjs` 只记录已满足公开收录条件的插件
|
|
144
|
+
|
|
145
|
+
本技能作为协调器,确认 route 分类并冻结 marketplace 工作流计划,但发布动作必须
|
|
146
|
+
委托给目标 workspace 自己的发布技能执行,release-skill 不直接操作其他 workspace
|
|
147
|
+
的代码库。
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: release-publish
|
|
3
|
-
description: 从已批准的生产计划发布冻结 Git branch/tag、npm tarball 与 GitHub Release,并执行已配置的 Claude/Codex marketplace 隔离消费者安装检查以达到 PUBLISHED;随后必须路由 release-verify 才可能达到 VERIFIED;遇到冲突或不确定远端状态时失败关闭并要求人工介入
|
|
3
|
+
description: "从已批准的生产计划发布冻结 Git branch/tag、npm tarball 与 GitHub Release,并执行已配置的 Claude/Codex marketplace 隔离消费者安装检查以达到 PUBLISHED;随后必须路由 release-verify 才可能达到 VERIFIED;遇到冲突或不确定远端状态时失败关闭并要求人工介入"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# release-publish
|
|
7
7
|
|
|
8
|
-
##
|
|
9
|
-
|
|
10
|
-
用户明确要求执行已经人工审阅的 GitHub+npm 生产计划。
|
|
11
|
-
|
|
12
|
-
## 成熟度与边界
|
|
8
|
+
## 生产边界
|
|
13
9
|
|
|
14
10
|
冻结 Git branch/tag、GitHub Release、npm tarball 路径已通过本地生产等价沙箱(协议级 fake),
|
|
15
11
|
测试没有提供 OS 级网络隔离。
|
|
@@ -23,6 +19,29 @@ description: 从已批准的生产计划发布冻结 Git branch/tag、npm tarbal
|
|
|
23
19
|
认证失败或摘要漂移时,在全局预检阶段停止并交给人工。禁止覆盖、删除和自动回滚;
|
|
24
20
|
新建 ref 的 create-only CAS(`--force-with-lease=<ref>:`)只断言目标不存在,不授权覆盖。
|
|
25
21
|
|
|
22
|
+
## 前置条件:工作流选择
|
|
23
|
+
|
|
24
|
+
在运行 `release-publish` 之前,必须先完成快速入门决策路由(§4.3 Workflow Profile Support):
|
|
25
|
+
|
|
26
|
+
1. 使用 `release-skill route --root <path> --json` 确定变更类型
|
|
27
|
+
2. 根据推荐的 `workflowKind` 选择对应路径:
|
|
28
|
+
- `docs-only` → 先执行 `release-docs` 完整流程
|
|
29
|
+
- `config-only` → 先执行 `release-config`,仅在 public surface 变化时进入 publish
|
|
30
|
+
- `marketplace-only` → 先执行 `release-marketplace`,然后由 workspace exclusive skill 接管
|
|
31
|
+
- `full-happy-end` → 直接进入标准完整流程:`prepare → approve → publish → verify`
|
|
32
|
+
- `reconcile` → 先执行 `release-reconcile` 恢复 PARTIAL 状态
|
|
33
|
+
- `help` → 无变更,无需 publish
|
|
34
|
+
|
|
35
|
+
**注意**: `release-publish` 是标准工作流中的第⑦步,必须在以下步骤之后:
|
|
36
|
+
- 步骤⑤: `release-prepare` (或轻量级 prepare)
|
|
37
|
+
- 步骤⑥: `release-approve` (非过期 approval record)
|
|
38
|
+
|
|
39
|
+
决策表链接:参见 [`release-help`](../release-help/SKILL.md) 的 Routing Suggestions 章节。
|
|
40
|
+
|
|
41
|
+
## 触发
|
|
42
|
+
|
|
43
|
+
用户明确要求执行已经人工审阅的 GitHub+npm 生产计划。
|
|
44
|
+
|
|
26
45
|
## 授权门
|
|
27
46
|
|
|
28
47
|
1. 展示可读的 `approvalSummary`:版本、仓库/包名、branch/tag、全部 actions 和例外。
|
|
@@ -15,6 +15,16 @@ verify 是发布流程的最终验证阶段,是唯一能将状态提升到 `VE
|
|
|
15
15
|
它执行远端状态重检、精确 npm 安装烟雾测试和消费者插件安装验证。
|
|
16
16
|
verify 只接受 `PUBLISHED` 状态的源 run;`VERIFIED` 是终态,不会再次派生运行。
|
|
17
17
|
|
|
18
|
+
**注意**: distribute gate (W1) 已经实现并集成在标准 verify 流程中。verify 现在会检查 postPublish 分发状态(git mirror + marketplace index),只有当所有外部动作都完成并通过验证时才达到 VERIFIED。
|
|
19
|
+
|
|
20
|
+
**工作流兼容性**:
|
|
21
|
+
- `docs-only`: consumer-verify preserved (步骤⑧)
|
|
22
|
+
- `config-only`: scene B completes full chain including verify
|
|
23
|
+
- `marketplace-only`: delegates to workspace's exclusive skill for final verification
|
|
24
|
+
- `full-happy-end`: standard complete path with all gates
|
|
25
|
+
|
|
26
|
+
所有工作流 profile 最终都路由到此 verify 命令作为终态验证门。
|
|
27
|
+
|
|
18
28
|
## 职责与边界
|
|
19
29
|
|
|
20
30
|
验证远端所有自动化 action 的实际状态与冻结计划一致。执行精确 `<package>@<version>` npm 安装到隔离目录,验证包名、版本、静态入口闭包,并在配置时验证 bin 路径安全和 CLI 烟雾输出。对 Claude/Codex marketplace distribution 执行全新隔离消费者安装验证。新计划中的 Kimi/CodeBuddy 安装只返回 `manualFollowUps`,明确标记 `verifiedBySystem: false`,不阻塞 `VERIFIED`;缺少该策略字段的旧冻结计划继续走历史 attestation 兼容路径。
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-config
|
|
3
|
+
description: "Config-only workflow profile: route confirms config-only diff, assess with schema validation, prepare --workflow config (code-class gates trimmed), workflowDecision records publish path (public bytes unchanged → no publish path; changed → lightchain prepare→approve→publish→verify)"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# release-config
|
|
7
|
+
|
|
8
|
+
## 触发
|
|
9
|
+
|
|
10
|
+
用户询问或执行纯配置变更的发布流程。包含 `.release-skill/project.yaml`、配置 schema 等配置文件的修改,且无代码、文档或 marketplace 变更。
|
|
11
|
+
|
|
12
|
+
## 当前状态
|
|
13
|
+
|
|
14
|
+
`release-config` 是工作流配置文件 (§4) 定义的独立工作流之一,专门处理仅配置变更的场景。它遵循简化生命周期,专注于配置验证和发布路径决策分支。
|
|
15
|
+
|
|
16
|
+
**机械实现**: `prepare --workflow config` 确定性地裁剪代码类门禁(H5),并比较当前
|
|
17
|
+
per-unit `snapshotDigest` 与最新冻结 plan——公开字节未变 → `publishPath:
|
|
18
|
+
'no-publish-needed'`(externalActions 被移除,无 publish 路径);字节变化或无对比
|
|
19
|
+
plan → `publishPath: 'publish-needed'`(fail-safe)。决策以 `workflowDecision` 绑定
|
|
20
|
+
进 plan digest,不可篡改。**不存在** `NO_PUBLISH_NEEDED`/`REPORTED` 虚构状态:
|
|
21
|
+
prepare 的真实输出是 plan 内的 `workflowDecision`。
|
|
22
|
+
|
|
23
|
+
**边界**: 跳过代码类 gates(declared hooks、snapshot-verify gates、source-authority
|
|
24
|
+
closure、skill-resource-closure)。保留 baseline/snapshots/plan freeze/docs
|
|
25
|
+
freshness。consumer-verify 仅在触发生效发布时参与。
|
|
26
|
+
|
|
27
|
+
## 职责与边界
|
|
28
|
+
|
|
29
|
+
- **步骤① diff 确认 config-only**: 调用 `release-skill route` command 确认仅有配置变更
|
|
30
|
+
- **步骤② assess with schema validation**: 执行配置结构验证、schema 检查、contract 一致性
|
|
31
|
+
- **步骤③ prepare --workflow config**: 本地 freeze 检查,生成只读计划;输出 `workflowDecision`
|
|
32
|
+
- **步骤④ decision branch**(来自 plan.workflowDecision):
|
|
33
|
+
- 场景 A:`publishPath === 'no-publish-needed'`(公开字节未变化)→ 记录决策并结束,
|
|
34
|
+
无 publish 路径,不运行 approve/publish/verify
|
|
35
|
+
- 场景 B:`publishPath === 'publish-needed'`(公开 surface 变化或不可判定)→ 运行
|
|
36
|
+
轻链 (approve→publish→verify)
|
|
37
|
+
|
|
38
|
+
**授权边界**: 命令调用本身即授权执行配置的 hooks/gates。config-only 工作流的远程写操作受标准 approval 机制约束,不 bypass 安全 gate。
|
|
39
|
+
|
|
40
|
+
**阶段通过规则**:
|
|
41
|
+
- 场景 A: prepare 输出 `workflowDecision.decision === 'public-bytes-unchanged'`(无 publish 路径)
|
|
42
|
+
- 场景 B: `status === 'VERIFIED'` + CLI exit code 0
|
|
43
|
+
|
|
44
|
+
## 正向执行路径
|
|
45
|
+
|
|
46
|
+
1. 运行 `release-skill route --root <path> --json` 获取 diff 分类
|
|
47
|
+
2. 若推荐 `workflowKind === 'config-only'`,则使用本技能
|
|
48
|
+
3. 执行步骤②:运行 `release-skill assess --root <path> --offline --json` 进行 schema validation
|
|
49
|
+
4. 执行步骤③:运行 `release-skill prepare --offline --workflow config --target-version <ver> --json`
|
|
50
|
+
5. 读取输出中的 `workflowDecision`:
|
|
51
|
+
- **A**: `publishPath === 'no-publish-needed'` → 记录决策(plan 已冻结,无
|
|
52
|
+
externalActions),结束。无需 approve/publish/verify
|
|
53
|
+
- **B**: `publishPath === 'publish-needed'` → 继续 approve → publish → verify 链条
|
|
54
|
+
6. (场景 B 续) 执行步骤⑥:运行 `release-skill approve --plan <path> --actor <name>`
|
|
55
|
+
7. (场景 B 续) 执行步骤⑦:运行 `release-skill publish --plan <path> --approval <path>`
|
|
56
|
+
8. (场景 B 续) 执行步骤⑧:运行 `release-skill verify --plan <path> --run <path>`
|
|
57
|
+
|
|
58
|
+
## 确定性脚本调用
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Step 1: Diff classification confirmation (config-only)
|
|
62
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" route --root <path> --json
|
|
63
|
+
|
|
64
|
+
# Step 2: Assess with schema validation
|
|
65
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" assess --root <path> --offline --json
|
|
66
|
+
|
|
67
|
+
# Step 3: Prepare --workflow config (local freeze + publish-path decision)
|
|
68
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" prepare --offline \
|
|
69
|
+
--workflow config --target-version <version> --json
|
|
70
|
+
# Output (JSON): { workflowKind: 'config',
|
|
71
|
+
# workflowDecision: { decision: 'public-bytes-unchanged'|'public-bytes-changed'|'indeterminable',
|
|
72
|
+
# publishPath: 'no-publish-needed'|'publish-needed', comparedPlan: '<digest>.json' } }
|
|
73
|
+
|
|
74
|
+
# Decision Branch A (no-publish-needed): plan frozen with zero externalActions;
|
|
75
|
+
# the decision is bound into the plan digest. No publish commands run.
|
|
76
|
+
|
|
77
|
+
# Decision Branch B (publish-needed): light chain execution
|
|
78
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" approve \
|
|
79
|
+
--plan <path> --actor <person-name>
|
|
80
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" publish \
|
|
81
|
+
--plan <path> --approval <path>
|
|
82
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" verify \
|
|
83
|
+
--plan <path> --run <path> --json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## 故障路由
|
|
87
|
+
|
|
88
|
+
| 场景 | 状态 | 处理 |
|
|
89
|
+
|------|------|------|
|
|
90
|
+
| 非纯配置变更(mixed=true) | full-happy-end | 路由到 `release-skill ship` 完整工作流 |
|
|
91
|
+
| schema validation 失败 | CONFIG_SCHEMA_INVALID | 修正 project.yaml 或 schemas 结构错误后重试 step② |
|
|
92
|
+
| contract verification 失败 | CONFIG_CONFLICT | 解决配置冲突后重试 step② |
|
|
93
|
+
| prepare 检测到基线漂移 | BASELINE_DRIFT_DETECTED | 人工审查 drift 后决定是否继续或回滚 |
|
|
94
|
+
| workflowDecision 不可判定(无对比 plan) | indeterminable | fail-safe 到 publish-needed,走场景 B |
|
|
95
|
+
| approval expired | APPROVAL_EXPIRED | 重新执行 approve,digest 必须匹配 |
|
|
96
|
+
| remote conflict at publish | REMOTE_CONFLICT | 人工决策:force override 或 cancel |
|
|
97
|
+
|
|
98
|
+
## 决策树 (Step 4)
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
┌─────────────────────────────────────────┐
|
|
102
|
+
│ prepare --workflow config completed │
|
|
103
|
+
└──────────────────┬──────────────────────┘
|
|
104
|
+
│
|
|
105
|
+
┌──────────┴──────────┐
|
|
106
|
+
│ │
|
|
107
|
+
▼ ▼
|
|
108
|
+
┌───────────────┐ ┌───────────────────┐
|
|
109
|
+
│ public bytes │ │ public bytes │
|
|
110
|
+
│ unchanged │ │ changed / │
|
|
111
|
+
│ (or no plan │ │ indeterminable │
|
|
112
|
+
│ → fail-safe │ │ │
|
|
113
|
+
│ → publish │ │ │
|
|
114
|
+
│ needed) │ │ │
|
|
115
|
+
└───────┬───────┘ └────────┬──────────┘
|
|
116
|
+
│ │
|
|
117
|
+
▼ ▼
|
|
118
|
+
┌───────────────┐ ┌───────────────────┐
|
|
119
|
+
│ no-publish │ │ light chain │
|
|
120
|
+
│ needed: │ │ approve→publish │
|
|
121
|
+
│ decision │ │ →verify │
|
|
122
|
+
│ recorded in │ │ │
|
|
123
|
+
│ plan digest │ │ │
|
|
124
|
+
└───────────────┘ └───────────────────┘
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 与其他工作流的关系
|
|
128
|
+
|
|
129
|
+
- **docs-only**: 纯文档变更时使用 `release-docs`
|
|
130
|
+
- **marketplace-only**: 仅 marketplace 变更时使用独立工作流
|
|
131
|
+
- **full-happy-end**: 混合变更(code+config+docs)时降级到此完整路径
|
|
132
|
+
|
|
133
|
+
## 关联技能
|
|
134
|
+
|
|
135
|
+
- `release-skill route`: 快速入门决策路由(§4.3)
|
|
136
|
+
- `release-assess`: 配置 schema/contract 验证入口
|
|
137
|
+
- `release-prepare`: 离线冻结检查(`--workflow config` 输出 publish-path 决策)
|
|
138
|
+
- `release-approve`: Plan approval(仅场景 B)
|
|
139
|
+
- `release-publish`: 制品发布(仅在 public surface 变化时执行)
|
|
140
|
+
- `release-verify`: 消费者验证(场景 B 的最终验证门)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-docs
|
|
3
|
+
description: "Docs-only workflow profile: route confirms docs-only diff, style-guard gates (check-style.mjs file paths), render-public-site --check drift scan, docs refresh rehearsal → binder write, prepare --workflow docs (code-class gates trimmed), approve/publish/verify with consumer-verify preserved"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# release-docs
|
|
7
|
+
|
|
8
|
+
## 触发
|
|
9
|
+
|
|
10
|
+
用户询问或执行纯文档变更的发布流程。包含 `docs/public/site/`, `README*`, `CHANGELOG`, `release-notes/` 等文件的修改,且无代码、配置或 marketplace 变更。
|
|
11
|
+
|
|
12
|
+
## 当前状态
|
|
13
|
+
|
|
14
|
+
`release-docs` 是工作流配置文件 (§4) 定义的独立工作流之一,专门处理仅文档变更的场景。它遵循标准发布生命周期,但跳过代码类检查门(声明式 hooks、snapshot-verify gates、source-authority closure、skill-resource-closure),专注于文档质量 gate。
|
|
15
|
+
|
|
16
|
+
**机械实现**: `prepare --workflow docs` 在 prepare 内确定性地裁剪代码类门禁(H5),
|
|
17
|
+
plan 记录 `workflowKind: 'docs'` 与 `workflowDecision`(绑定进 plan digest)。
|
|
18
|
+
**边界**: NOT merging repos;不对代码类 gates(如 schema validation、contract verification)负责。
|
|
19
|
+
|
|
20
|
+
## 职责与边界
|
|
21
|
+
|
|
22
|
+
- **步骤① diff 分类确认**: 调用 `release-skill route` command 对工作树 diff 分类,确认仅有文档变更
|
|
23
|
+
- **步骤② style-guard 三道门**: 调用 `check-style.mjs`(只接受文件路径参数,exit 0/1/2)执行事实性/可读性/风格检查
|
|
24
|
+
- **步骤③ render-public-site --check**: 调用 `render-public-site.mjs --check [--repo <name>]` 做渲染漂移扫描(内存泄漏扫描 + 树基线对比)
|
|
25
|
+
- **步骤④ docs refresh**: 执行 rehearsal → binder 写入(本地文档更新,不 commit/push)
|
|
26
|
+
- **步骤⑤ prepare --workflow docs**: 轻量 freeze(裁剪代码类 gates,保留 docs freshness/public-surface/baseline/snapshots/plan freeze)
|
|
27
|
+
- **步骤⑥–⑧**: approve → publish → verify(consumer-verify 保留)
|
|
28
|
+
|
|
29
|
+
**授权边界**: 命令调用本身即授权执行配置的 hooks/gates。本地文档写入授权只覆盖声明的本地文档目标,不是 Git commit/push/publish 或安装的授权。
|
|
30
|
+
|
|
31
|
+
**阶段通过规则**: `status === 'VERIFIED'` 且 CLI exit code 为 0。`PARTIAL` 状态允许安全重试已完成的 checkpoint。
|
|
32
|
+
|
|
33
|
+
## 正向执行路径
|
|
34
|
+
|
|
35
|
+
1. 运行 `release-skill route --root <path> [--target-version <ver>] --json` 获取 diff 分类和工作流推荐
|
|
36
|
+
2. 若推荐 `workflowKind === 'docs-only'`,则使用本技能
|
|
37
|
+
3. 执行步骤②:调用 `check-style.mjs <doc-path>...` 执行事实/可读性/风格检查
|
|
38
|
+
4. 执行步骤③:调用 `render-public-site.mjs --check [--repo <name>]` 验证渲染无漂移
|
|
39
|
+
5. 执行步骤④:运行 `release-skill docs refresh --unit <id> --write --confirm-refresh <digest> --ack-local-document-write`
|
|
40
|
+
6. 执行步骤⑤:运行 `release-skill prepare --offline --workflow docs --target-version <ver>`
|
|
41
|
+
7. 执行步骤⑥:人工审阅后运行 `release-skill approve --plan <path> --actor <name>`
|
|
42
|
+
8. 执行步骤⑦:运行 `release-skill publish --plan <path> --approval <path>`
|
|
43
|
+
9. 执行步骤⑧:运行 `release-skill verify --plan <path> --run <path>`
|
|
44
|
+
|
|
45
|
+
## 确定性脚本调用
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Step 1: Diff classification (from release-skill route)
|
|
49
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" route --root <path> --json
|
|
50
|
+
|
|
51
|
+
# Step 2: Style-guard three gates (check-style.mjs takes file paths only)
|
|
52
|
+
node "${WORKBUDDY_ROOT}/adapters/workbuddy/skills/skill-family-docs-style-guard/scripts/check-style.mjs" \
|
|
53
|
+
<doc-path-1> <doc-path-2>
|
|
54
|
+
|
|
55
|
+
# Step 3: Render site check (drift + leak scan against committed baseline)
|
|
56
|
+
node "${DOC_RENDER_ROOT}/packages/skill-family-doc-render/scripts/render-public-site.mjs" --check [--repo <repo-name>] # source-only
|
|
57
|
+
|
|
58
|
+
# Step 4: Docs refresh with rehearsal
|
|
59
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" docs refresh --unit <id> --json
|
|
60
|
+
# Then confirm and write:
|
|
61
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" docs refresh --unit <id> \
|
|
62
|
+
--write --confirm-refresh <refreshDigest> --ack-local-document-write --json
|
|
63
|
+
|
|
64
|
+
# Step 5: Lightweight prepare --workflow docs
|
|
65
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" prepare --offline \
|
|
66
|
+
--workflow docs --target-version <version> --json
|
|
67
|
+
|
|
68
|
+
# Step 6: Approval
|
|
69
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" approve \
|
|
70
|
+
--plan <path> --actor <person-name>
|
|
71
|
+
|
|
72
|
+
# Step 7: Publish
|
|
73
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" publish \
|
|
74
|
+
--plan <path> --approval <path>
|
|
75
|
+
|
|
76
|
+
# Step 8: Verify (consumer-verify preserved)
|
|
77
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" verify \
|
|
78
|
+
--plan <path> --run <path> --json
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 故障路由
|
|
82
|
+
|
|
83
|
+
| 场景 | 状态 | 处理 |
|
|
84
|
+
|------|------|------|
|
|
85
|
+
| 非纯文档变更(mixed=true) | full-happy-end | 路由到 `release-skill ship` 完整工作流 |
|
|
86
|
+
| style-guard 检查失败 | exit 1(check-style.mjs) | 修正文档问题后重试 step② |
|
|
87
|
+
| check-style.mjs 运行错误 | exit 2 | 检查参数(只接受文件路径)与文件存在性 |
|
|
88
|
+
| render-site 漂移 | RENDER_SITE_DRIFT | 重新渲染并提交基线后重试 step③ |
|
|
89
|
+
| prepare 检测到未刷新文档 | PREPARE_STALE_DOCS | 重新执行 step④ → 提交 → 重新 prepare |
|
|
90
|
+
| 非 VERIFIED 终态 | NEEDS_INPUT / BLOCKED | 根据错误码诊断具体问题 |
|
|
91
|
+
|
|
92
|
+
## 与其他工作流的关系
|
|
93
|
+
|
|
94
|
+
- **config-only**: 仅配置变更时使用 `release-config`
|
|
95
|
+
- **marketplace-only**: 仅 marketplace 变更时使用独立工作流
|
|
96
|
+
- **full-happy-end**: 混合变更(code+docs)时降级到此完整路径
|
|
97
|
+
|
|
98
|
+
## 关联技能
|
|
99
|
+
|
|
100
|
+
- `release-skill route`: 快速入门决策路由(§4.3)
|
|
101
|
+
- `release-assess`: 项目发布就绪度评估
|
|
102
|
+
- `release-prepare`: 冻结发布计划(`--workflow docs` 裁剪代码类门禁)
|
|
103
|
+
- `release-publish`: 发布 GitHub/npm 制品
|
|
104
|
+
- `release-verify`: 消费者验证和远程状态重检
|
|
105
|
+
- `skill-family-docs-style-guard`(skill-family-docs adapter): `check-style.mjs` 文档质量三道门
|
|
106
|
+
- `render-public-site`(skill-family-doc-render): 站点渲染漂移与泄漏扫描
|
|
@@ -78,6 +78,45 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" docs refresh --unit <id> \
|
|
|
78
78
|
| 请求生产发布 | 已有公开版本先调用 `release-prepare --online --production` 观察 bound 基线;人工审阅后再路由 `release-publish` |
|
|
79
79
|
| RELEASE_DOCS_INVALID | 配置或说明源语义非法(重复键、alias、未知字段、版本漂移等);修正配置或说明源后重新演练 |
|
|
80
80
|
| RELEASE_DOCS_TRANSLATION_MISSING | 配置语种缺失或多余;补齐说明源语种,与 `releaseDocuments.locales` 完全一致,不得回退 |
|
|
81
|
+
|
|
82
|
+
## Routing Suggestions (§4.3 Quickstart Routing)
|
|
83
|
+
|
|
84
|
+
对于不清楚如何开始的用户,推荐使用 `release-skill route` 命令进行自动化工作流选择:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# 快速分类变更并推荐工作流
|
|
88
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/release-skill.mjs" route --root <path> --json
|
|
89
|
+
|
|
90
|
+
# JSON 输出包含 classification 和 recommendation 字段
|
|
91
|
+
{
|
|
92
|
+
"classification": {
|
|
93
|
+
"code": [],
|
|
94
|
+
"docs": ["README.md"],
|
|
95
|
+
"config": [],
|
|
96
|
+
"marketplace": [],
|
|
97
|
+
"mixed": false
|
|
98
|
+
},
|
|
99
|
+
"recommendation": {
|
|
100
|
+
"workflowKind": "docs-only",
|
|
101
|
+
"reason": "Pure documentation changes detected...",
|
|
102
|
+
"firstCommand": "release-docs"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**可用工作流**:
|
|
108
|
+
- `docs-only`: 纯文档变更(跳过代码类门限)
|
|
109
|
+
- `config-only`: 纯配置变更(schema 验证 + 决策分支)
|
|
110
|
+
- `marketplace-only`: 纯 marketplace 索引变更(条目更新 + snapshot 同步)
|
|
111
|
+
- `full-happy-end`: 混合变更或无法确定(fail-closed 到最安全路径)
|
|
112
|
+
- `reconcile`: 存在 PARTIAL 运行时需先恢复
|
|
113
|
+
- `help`: 无变更且未指定目标版本
|
|
114
|
+
|
|
115
|
+
参考文档:
|
|
116
|
+
- [`release-docs`](../release-docs/SKILL.md) - 文档工作流详解
|
|
117
|
+
- [`release-config`](../release-config/SKILL.md) - 配置工作流详解
|
|
118
|
+
- [`release-marketplace`](../release-marketplace/SKILL.md) - Marketplace 工作流详解
|
|
119
|
+
|
|
81
120
|
| RELEASE_DOCS_CONFLICT | 目标含非受管同版本条目、受管标记损坏或人工冲突;人工修复目标并保留人工修改后重新演练 |
|
|
82
121
|
| RELEASE_DOCS_REFRESH_STALE | 确认绑定后候选已变化;重新演练取得新 `refreshDigest` 再确认写入 |
|
|
83
122
|
| RELEASE_DOCS_STALE | prepare 检测到文档未刷新;按 `docs refresh` → 审阅 → 提交 → 重新 prepare 恢复 |
|