@accelerator-mzq/forge 3.0.0 → 4.0.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/README.md +12 -12
- package/dist/cli/commands/ack.d.ts.map +1 -1
- package/dist/cli/commands/ack.js +87 -12
- package/dist/cli/commands/ack.js.map +1 -1
- package/dist/cli/commands/archive.d.ts +32 -33
- package/dist/cli/commands/archive.d.ts.map +1 -1
- package/dist/cli/commands/archive.js +339 -667
- package/dist/cli/commands/archive.js.map +1 -1
- package/dist/cli/commands/legacy-bridge.js +1 -1
- package/dist/cli/commands/legacy-bridge.js.map +1 -1
- package/dist/cli/commands/upgrade.d.ts.map +1 -1
- package/dist/cli/commands/upgrade.js +2 -51
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +4 -25
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/index.js +0 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/core/ack/marker-ack.d.ts +28 -0
- package/dist/core/ack/marker-ack.d.ts.map +1 -0
- package/dist/core/ack/marker-ack.js +155 -0
- package/dist/core/ack/marker-ack.js.map +1 -0
- package/dist/core/ack-log.d.ts.map +1 -1
- package/dist/core/ack-log.js +10 -7
- package/dist/core/ack-log.js.map +1 -1
- package/dist/core/archive/index.d.ts +2 -3
- package/dist/core/archive/index.d.ts.map +1 -1
- package/dist/core/archive/index.js +7 -5
- package/dist/core/archive/index.js.map +1 -1
- package/dist/core/archive/pause-decisions-fence.js +12 -12
- package/dist/core/archive/pause-decisions-fence.js.map +1 -1
- package/dist/core/archive/summary-builder.d.ts +26 -21
- package/dist/core/archive/summary-builder.d.ts.map +1 -1
- package/dist/core/archive/summary-builder.js +115 -223
- package/dist/core/archive/summary-builder.js.map +1 -1
- package/dist/core/archive/summary-render.d.ts +5 -3
- package/dist/core/archive/summary-render.d.ts.map +1 -1
- package/dist/core/archive/summary-render.js +38 -44
- package/dist/core/archive/summary-render.js.map +1 -1
- package/dist/core/lock.d.ts +46 -0
- package/dist/core/lock.d.ts.map +1 -0
- package/dist/core/lock.js +98 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/markers/types.d.ts +27 -134
- package/dist/core/markers/types.d.ts.map +1 -1
- package/dist/core/markers/types.js +10 -1
- package/dist/core/markers/types.js.map +1 -1
- package/dist/core/migrate/index.js +1 -1
- package/dist/core/migrate/index.js.map +1 -1
- package/dist/core/monitor/artifact-observer.d.ts.map +1 -1
- package/dist/core/monitor/artifact-observer.js +28 -78
- package/dist/core/monitor/artifact-observer.js.map +1 -1
- package/dist/core/monitor/divergence-map.d.ts.map +1 -1
- package/dist/core/monitor/divergence-map.js +9 -7
- package/dist/core/monitor/divergence-map.js.map +1 -1
- package/dist/core/monitor/health-verdict.d.ts.map +1 -1
- package/dist/core/monitor/health-verdict.js +2 -1
- package/dist/core/monitor/health-verdict.js.map +1 -1
- package/dist/core/monitor/trace-store.d.ts +1 -1
- package/dist/core/monitor/trace-store.js +2 -2
- package/dist/core/monitor/trace-store.js.map +1 -1
- package/dist/core/monitor/types.d.ts +1 -1
- package/dist/core/monitor/types.d.ts.map +1 -1
- package/dist/core/monitor/types.js +0 -1
- package/dist/core/monitor/types.js.map +1 -1
- package/dist/core/schemas/archive-summary.d.ts +39 -109
- package/dist/core/schemas/archive-summary.d.ts.map +1 -1
- package/dist/core/schemas/archive-summary.js +15 -23
- package/dist/core/schemas/archive-summary.js.map +1 -1
- package/dist/core/templates/commands/ack-confirm.md +1 -1
- package/dist/core/templates/commands/apply.md +51 -114
- package/dist/core/templates/commands/archive.md +43 -160
- package/dist/core/templates/commands/review.md +49 -74
- package/dist/core/templates/commands/upgrade.md +21 -40
- package/dist/core/templates/commands/verify.md +43 -146
- package/dist/core/templates/skills/_shared/tier23-command-bridge.md +34 -0
- package/dist/core/templates/skills/exploring.md +3 -3
- package/dist/core/templates/skills/finishing-a-development-branch.md +6 -21
- package/dist/core/templates/skills/receiving-code-review.md +14 -45
- package/dist/core/templates/skills/requesting-code-review.md +11 -0
- package/dist/core/templates/skills/subagent-driven-development.md +33 -29
- package/dist/core/templates/skills/subagent-driven-discipline.md +28 -28
- package/dist/core/templates/skills/using-forge.md +25 -24
- package/dist/core/templates/skills/verification-before-completion.md +7 -18
- package/dist/core/templates/skills/verifying-three-dimensions.md +93 -169
- package/dist/core/templates/skills/writing-plans.md +6 -17
- package/dist/core/validate/archive-summary-schema.d.ts +1 -1
- package/dist/core/validate/archive-summary-schema.d.ts.map +1 -1
- package/dist/core/validate/archive-summary-schema.js +101 -125
- package/dist/core/validate/archive-summary-schema.js.map +1 -1
- package/dist/core/validate/index.d.ts +0 -1
- package/dist/core/validate/index.d.ts.map +1 -1
- package/dist/core/validate/index.js +2 -1
- package/dist/core/validate/index.js.map +1 -1
- package/dist/core/validate/marker-schema.d.ts +12 -4
- package/dist/core/validate/marker-schema.d.ts.map +1 -1
- package/dist/core/validate/marker-schema.js +98 -605
- package/dist/core/validate/marker-schema.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
- package/scripts/codex-review-helper.mjs +337 -0
- package/src/core/codex-review/prompts/adversarial-default.md +105 -0
|
@@ -8,44 +8,44 @@ You are about to handle `/forge:apply $ARGUMENTS`.
|
|
|
8
8
|
解析:
|
|
9
9
|
|
|
10
10
|
- 默认:顺序模式(主工作区直接跑)
|
|
11
|
-
- `--parallel`:并行模式(每个独立 task 一个 worktree;遵循 forge:dispatching-parallel-agents 的 cherry-pick 串行协议)
|
|
11
|
+
- `--parallel`:并行模式(每个独立 task 一个 worktree;遵循 `forge:dispatching-parallel-agents` 的 cherry-pick 串行协议)
|
|
12
12
|
- `--change-id <id>`:指定 change(默认为 `forge/changes/` 下唯一未归档的 change;若 >1,**报错并停止**列出选项)
|
|
13
13
|
|
|
14
14
|
## 步骤
|
|
15
15
|
|
|
16
|
-
0. **前置 branch-check**(
|
|
16
|
+
0. **前置 branch-check**(沿 §2.8.3 C):调 `forge preflight branch-check <change-id>`
|
|
17
17
|
- exit 0 → 继续步骤 1
|
|
18
|
-
- exit 2 → **必须停下**,按 stderr 建议切 feature branch(`git checkout -b feature/<change-id>`)或显式传 `--allow-protected-branch`(
|
|
19
|
-
- 非 git 项目:helper 自动跳过 exit 0
|
|
18
|
+
- exit 2 → **必须停下**,按 stderr 建议切 feature branch(`git checkout -b feature/<change-id>`)或显式传 `--allow-protected-branch`(后者需用户确认风险)
|
|
19
|
+
- 非 git 项目:helper 自动跳过 exit 0
|
|
20
20
|
1. **必须调用 `forge:subagent-driven-development` skill**(无 inline 模式)。
|
|
21
21
|
2. **必须调用 `forge:test-driven-development` skill** 作为每个 subagent 的实施纲领。
|
|
22
22
|
3. 若 `--parallel`,**追加调用 `forge:dispatching-parallel-agents` 和 `forge:using-git-worktrees`**。
|
|
23
23
|
|
|
24
|
-
3.5. **Critical Plan Review**(主代理 dispatch subagent
|
|
24
|
+
3.5. **Critical Plan Review**(主代理 dispatch subagent 前必做):
|
|
25
25
|
|
|
26
|
-
主代理读 `forge/changes/<id>/{proposal, design, tasks, specs/*}.md` 全套,**按 4
|
|
26
|
+
主代理读 `forge/changes/<id>/{proposal, design, tasks, specs/*}.md` 全套,**按 4 类维度逐条检查**:
|
|
27
27
|
|
|
28
28
|
| 维度 | 检查问题 |
|
|
29
29
|
| ------ | ------------------------------------------------------------------- |
|
|
30
30
|
| 完整性 | tasks 是否覆盖 specs 所有 requirement?(对照 specs requirement 计数) |
|
|
31
31
|
| 顺序 | tasks 依赖关系是否合理?(标 dependency 的 task 是否先于被依赖) |
|
|
32
32
|
| 清晰度 | 是否有 tasks 描述 vague(如"处理边界情况" / "加测试")? |
|
|
33
|
-
| scope | 是否有 tasks 应该是
|
|
33
|
+
| scope | 是否有 tasks 应该是 out-of-scope 而非本 change? |
|
|
34
34
|
|
|
35
35
|
- **若有 concerns** → AskUserQuestion 列 concerns,等用户决策:
|
|
36
36
|
- 改 plan(回 propose 修)
|
|
37
37
|
- 接受当前 plan(继续 dispatch)
|
|
38
|
-
- 走
|
|
38
|
+
- 走 explore 重新评估
|
|
39
39
|
- **无 concerns** → 主代理**必须显式输出 4 类维度的结论**(可以是"无问题"但按维度逐条说),然后进步骤 4 dispatch
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
**Critical Plan Review 不允许 vague pass-through** — 必须显式输出 4 类检查结果,不允许跳过整段 review。
|
|
42
42
|
|
|
43
43
|
4. 读 `forge/changes/<id>/tasks.md`,识别未勾选 tasks。
|
|
44
44
|
5. **顺序模式**:
|
|
45
45
|
- for each task:派 fresh subagent(主工作区),subagent 拿 [task + 相关 specs/<sub-area>.md + design.md] 启动
|
|
46
46
|
- subagent 跑 TDD:red → green → refactor + git commit
|
|
47
47
|
- 主代理 review subagent 的 commit + test 日志,通过则在主工作区 tasks.md 把 `[ ]` 改 `[x]`
|
|
48
|
-
6. **--parallel 模式**:严格遵守 cherry-pick 串行协议(详 forge:dispatching-parallel-agents skill 的"forge --parallel 模式 cherry-pick 串行协议"段)
|
|
48
|
+
6. **--parallel 模式**:严格遵守 cherry-pick 串行协议(详 `forge:dispatching-parallel-agents` skill 的"forge --parallel 模式 cherry-pick 串行协议"段)
|
|
49
49
|
7. 全部 task 完成后,在 tasks.md 末尾追加(parallel 多 commit 用列表):
|
|
50
50
|
```yaml
|
|
51
51
|
applied_commits:
|
|
@@ -54,40 +54,39 @@ You are about to handle `/forge:apply $ARGUMENTS`.
|
|
|
54
54
|
final_head: <git rev-parse HEAD>
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
## Fluid Pause Decision Point
|
|
57
|
+
## Fluid Pause Decision Point
|
|
58
58
|
|
|
59
|
-
> **与 `/forge:explore`
|
|
59
|
+
> **与 `/forge:explore` 边界**:Fluid Pause 是**被动**触发(subagent 报告阻塞型 issue 时主代理进入);若是**开放思考**(非阻塞 issue,如"实施途中想重新评估某个 design 决策"),应主动触发 `/forge:explore --change <id>` 而非 Fluid Pause。两者边界详见 `forge:exploring` skill。
|
|
60
60
|
|
|
61
61
|
### 触发条件
|
|
62
62
|
|
|
63
63
|
subagent 在 apply 中段报告以下三档之一时,主代理**不直接处理**,改进 Fluid Pause:
|
|
64
64
|
|
|
65
|
-
| Subagent 报告
|
|
66
|
-
|
|
|
67
|
-
| `DONE_WITH_CONCERNS`,concerns 类型 = "correctness or scope"
|
|
68
|
-
| `BLOCKED` 第 4 项 = "plan itself is wrong"
|
|
69
|
-
| `DESIGN_ISSUE_FOUND`
|
|
70
|
-
| **任一 CRITICAL 级问题**(测试 fail /
|
|
65
|
+
| Subagent 报告 | 主代理行为 |
|
|
66
|
+
| ---------------------------------------------------------------------------- | ------------------------------------- |
|
|
67
|
+
| `DONE_WITH_CONCERNS`,concerns 类型 = "correctness or scope" | 进 Fluid Pause |
|
|
68
|
+
| `BLOCKED` 第 4 项 = "plan itself is wrong" | 进 Fluid Pause |
|
|
69
|
+
| `DESIGN_ISSUE_FOUND` — subagent 实施中发现属于本 change 但 spec 未覆盖的需求 | 进 Fluid Pause |
|
|
70
|
+
| **任一 CRITICAL 级问题**(测试 fail / 显式错误) | **不进 Fluid Pause** — abort 让用户修 |
|
|
71
71
|
|
|
72
72
|
### 协议流程
|
|
73
73
|
|
|
74
74
|
```
|
|
75
|
-
subagent 报告 →
|
|
75
|
+
subagent 报告 → 主代理判定问题性质
|
|
76
76
|
↓
|
|
77
|
-
CRITICAL? → yes →
|
|
78
|
-
→ no →
|
|
79
|
-
(捕获 pause 时刻 tasks.md 状态进 ack-log hash-chain;记下 stdout 返回的 capture_id)
|
|
80
|
-
↓
|
|
81
|
-
AskUserQuestion 四选项
|
|
77
|
+
CRITICAL? → yes → abort,让用户修代码 / 重派 subagent
|
|
78
|
+
→ no → AskUserQuestion 四选项
|
|
82
79
|
↓
|
|
83
80
|
用户选择
|
|
84
81
|
↓
|
|
85
|
-
1=扩本 change scope → 更新 proposal `## What
|
|
82
|
+
1=扩本 change scope → 更新 proposal `## What` + subagent 重派
|
|
86
83
|
2=加 task 进本轮 → 主代理 append 新 task 到 tasks.md + subagent 重派
|
|
87
|
-
3=转 out-of-scope → 写到 proposal `## Out of Scope` / design `## Future Work` YAML 块
|
|
88
|
-
4=Other → 用户自由文本描述
|
|
84
|
+
3=转 out-of-scope → 写到 proposal `## Out of Scope` / design `## Future Work` YAML 块 + subagent 跳过 issue 继续
|
|
85
|
+
4=Other → 用户自由文本描述
|
|
86
|
+
↓
|
|
87
|
+
主代理在 session context 累积 PauseDecisionSimple
|
|
89
88
|
↓
|
|
90
|
-
|
|
89
|
+
verify / review 阶段写 marker 时一并填 pause_decisions[]
|
|
91
90
|
```
|
|
92
91
|
|
|
93
92
|
### AskUserQuestion 模板
|
|
@@ -104,106 +103,54 @@ subagent 报告 → 主代理判定 severity(CRITICAL / WARNING / SUGGESTION,沿
|
|
|
104
103
|
### Issue Encountered
|
|
105
104
|
<subagent 报告的 issue 描述,从 DONE_WITH_CONCERNS / BLOCKED concerns 字段或 DESIGN_ISSUE_FOUND payload 提取>
|
|
106
105
|
|
|
107
|
-
**Severity:** WARNING | SUGGESTION(主代理初判,沿 design §2.3 分级;CRITICAL 不进本流程)
|
|
108
|
-
|
|
109
106
|
**Options:**
|
|
110
|
-
1. **扩本 change scope** — 把这个 issue 纳入本 change。更新 proposal `## What
|
|
111
|
-
2. **加 task 进本轮 tasks.md** — 当成新发现的本 change 必做项。主代理 append 新 task 到 tasks.md,subagent
|
|
112
|
-
3. **转 out-of-scope**(仅限 issue 不阻断本 task 时可用) — 不在本 change 做,写到 proposal `## Out of Scope` 或 design `## Future Work` 段(YAML
|
|
113
|
-
4. **Other** —
|
|
107
|
+
1. **扩本 change scope** — 把这个 issue 纳入本 change。更新 proposal `## What` 段,重新派 subagent 实施。代价:本 change scope 增大,需要重 review
|
|
108
|
+
2. **加 task 进本轮 tasks.md** — 当成新发现的本 change 必做项。主代理 append 新 task 到 tasks.md,subagent 重派实施
|
|
109
|
+
3. **转 out-of-scope**(仅限 issue 不阻断本 task 时可用) — 不在本 change 做,写到 proposal `## Out of Scope` 或 design `## Future Work` 段(YAML 结构化字段)。subagent 跳过该 issue 继续当前 task。**v1.1+ backlog registry 会从这里读**
|
|
110
|
+
4. **Other** — 自由文本描述,主代理 notes 字段留底
|
|
114
111
|
|
|
115
112
|
What would you like to do?
|
|
116
113
|
```
|
|
117
114
|
|
|
118
|
-
### Marker 持久化(
|
|
115
|
+
### Marker 持久化(v4 简版)
|
|
119
116
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
主代理在 verify / review 写 marker 时,**必须**把本 change apply 阶段累积的所有 pause 决策按下面 schema 写入 `pause_decisions` 数组:
|
|
117
|
+
apply **中段** marker 尚不存在,AI 主代理把每次 pause 决策**累积记录在本 change session context** 中,等到 verify / review 时一并迁移到对应 marker 的 `pause_decisions[]` 数组(`PauseDecisionSimple` schema,沿 `src/core/markers/types.ts`):
|
|
123
118
|
|
|
124
119
|
```yaml
|
|
125
120
|
pause_decisions:
|
|
126
|
-
-
|
|
127
|
-
|
|
128
|
-
task_ref: tasks.md#task-3 # 关联 task
|
|
121
|
+
- paused_at: 2026-05-21T14:30:00Z # ISO 8601 UTC,允许 ms 精度
|
|
122
|
+
task_ref: tasks.md#task-3
|
|
129
123
|
issue_summary: 'subagent 发现 specs 没覆盖 OAuth refresh token 过期处理'
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
severity_acked_at: 2026-05-12T14:32:00Z
|
|
133
|
-
chosen_option: 3 # 1=扩 scope / 2=加 task / 3=转 out-of-scope / 4=Other
|
|
134
|
-
added_task_ref: tasks.md#task-7 # option=2 必填:Fluid Pause 新增的 task(与 task_ref=触发 task 区分)
|
|
135
|
-
capture_id: <forge pause-capture 返回的 capture_id> # option=2 必填:关联 pause-capture entry
|
|
136
|
-
target_artifact: proposal.md # option=1=proposal.md;option=2=tasks.md;option=3=proposal.md|design.md
|
|
137
|
-
target_anchor: '## Out of Scope' # 记录写到哪个段(option=2 降为仅人类可读,fence 不据此校验)
|
|
138
|
-
non_blocking_rationale: 'subagent 可跳过该 issue 完成本 task 主体功能' # option=3 必填
|
|
139
|
-
other_rationale: null # option=4 必填
|
|
140
|
-
other_acked_by: null # option=4 必填
|
|
124
|
+
chosen_option: 3 # 1=扩scope/2=加task/3=转out-of-scope/4=Other
|
|
125
|
+
notes: 'subagent 可跳过该 issue 完成本 task 主体功能'
|
|
141
126
|
```
|
|
142
127
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
`forge archive` 跑 `validatePauseDecisionsFence`(沿 design §2.1.5)— 任一违反拒签 exit 1:
|
|
146
|
-
|
|
147
|
-
- CRITICAL severity → 拒签(CRITICAL 应走 forge 强 fence,不应进 pause)
|
|
148
|
-
- WARNING + (severity_acked_by 空 ∨ severity_acked_at 空)→ 拒签
|
|
149
|
-
- option=1:`target_artifact='proposal.md'` + `target_anchor` 含 `What Changes`
|
|
150
|
-
- option=2:`added_task_ref` 指向的 task ∉ capture 快照、∈ 当前 tasks.md 且勾选 `[x]`;`capture_id` 匹配 ack-log pause-capture entry;链完整
|
|
151
|
-
- option=3:proposal/design YAML 块含对应 entry.id + `non_blocking_rationale` 非空
|
|
152
|
-
- option=4:`other_rationale` + `other_acked_by` 非空
|
|
153
|
-
|
|
154
|
-
### option=2 capture 的已知边界(capture-input gap,design §9.2/§9.3)
|
|
155
|
-
|
|
156
|
-
`forge pause-capture` 是轻量锚点,**不能**密码学证明 "task 是 pause 真新增的"。它能挡:无 capture 流程的 option=2、capture entry 事后被篡改、同 marker 内 capture 复用。它**挡不住**:capture 当下喂假输入(删旧 task → capture → 恢复)、AI 预先攒多条 capture 后选择性认领、AI 完全不记录 pause_decision。轻量 capture 对 "诚实但偷懒" 的 AI 有效,对蓄意构造假输入的攻击者无效 —— 此 gap 是当前 forge 架构下的已知限制。
|
|
157
|
-
|
|
158
|
-
## 与其他 sub-plan 合并点
|
|
159
|
-
|
|
160
|
-
本 §"Fluid Pause Decision Point" 段(plan-9c)与后续 sub-plan 在 apply.md 有合并点(参考 master plan §3.3 line 272):
|
|
161
|
-
|
|
162
|
-
- **9h(SDD 实施前置纪律加固)**:将在步骤 0 加 `forge preflight branch-check` 调用 + 步骤 3.5 加 §"Critical Plan Review";9c 不动这些位置
|
|
163
|
-
- **9g(process_evidence)**:将在每个 subagent task 完成后加 `forge evidence record-tdd` helper 调用;9c 不动这些位置
|
|
164
|
-
- **推荐 merge 顺序**:9h → 9c → 9g
|
|
128
|
+
**v4 BREAKING**:`PauseDecisionSimple` 只 5 个字段(`paused_at` / `task_ref` / `issue_summary` / `chosen_option` / `notes?`)。已删字段:`severity` / `severity_acked_by` / `severity_acked_at` / `added_task_ref` / `capture_id` / `target_artifact` / `target_anchor` / `non_blocking_rationale` / `other_rationale` / `other_acked_by`(v3 反加固 fence 字段全消亡)。**archive 阶段无 `validatePauseDecisionsFence` 校验**(v4 删 fence,marker 仅作 audit)。
|
|
165
129
|
|
|
166
130
|
## 禁止行为
|
|
167
131
|
|
|
168
132
|
- 不允许主代理直接写代码 — 所有 task 实施必须通过 subagent
|
|
169
133
|
- 不允许 subagent 改 tasks.md(写入是主代理单点串行职责)
|
|
170
|
-
- 不允许跳过 TDD 的 red 步骤(verify
|
|
134
|
+
- 不允许跳过 TDD 的 red 步骤(verify 阶段三维度 prose check 会发现)
|
|
171
135
|
|
|
172
|
-
## 禁止行为(
|
|
136
|
+
## 禁止行为(主代理 STOP 协议)
|
|
173
137
|
|
|
174
|
-
主代理 dispatch 阶段必须停下问用户的场景(不允许自动绕过 / 不允许重试,沿 `
|
|
138
|
+
主代理 dispatch 阶段必须停下问用户的场景(不允许自动绕过 / 不允许重试,沿 `forge:subagent-driven-development` skill 的"Main Agent STOP Triggers"):
|
|
175
139
|
|
|
176
140
|
- ✗ **不允许"绕过失败 task 跑下一个"**(同 task BLOCKED 后必须 STOP)
|
|
177
|
-
- ✗ **不允许"修改 task 描述让它能过"**(改 task 描述需经
|
|
178
|
-
- ✗ **不允许"重试同一 task ≥ 3 次不停下"**(verify 命令重试 ≥ 3 次仍失败 / subagent BLOCKED ≥ 2 次 → STOP
|
|
179
|
-
|
|
180
|
-
## 禁止行为(plan-9g §2.7 process_evidence 协议)
|
|
181
|
-
|
|
182
|
-
✗ **不允许绕过 forge evidence helper 直接写 process_evidence 字段**:
|
|
183
|
-
|
|
184
|
-
- 不允许 `fs.writeFile .verify-passed` 或 `.review-passed` 含 process_evidence 字段
|
|
185
|
-
- 不允许拼接 YAML 字面塞 process_evidence 到 marker
|
|
186
|
-
- 不允许直接编辑 `.evidence/process-evidence.staging.yaml`
|
|
187
|
-
|
|
188
|
-
✓ **必须**通过 helper 写入:
|
|
189
|
-
|
|
190
|
-
- `forge evidence record-tdd <changeId> --task ... --red-commit ... --green-commit ... ...`(20 options)
|
|
191
|
-
- `forge evidence record-verify <changeId> --task-refs ... --scope ... --report ...`
|
|
192
|
-
- `forge evidence record-review <changeId> --task ... --implementer-commit ...`
|
|
193
|
-
- `forge evidence freeze <changeId> --kind verify|review`(在 marker YAML 写完后调,统一凝固)
|
|
194
|
-
|
|
195
|
-
详细 process_evidence 协议见 `skills/process-evidence/SKILL.md`。
|
|
141
|
+
- ✗ **不允许"修改 task 描述让它能过"**(改 task 描述需经 Fluid Pause 走选项 1/2)
|
|
142
|
+
- ✗ **不允许"重试同一 task ≥ 3 次不停下"**(verify 命令重试 ≥ 3 次仍失败 / subagent BLOCKED ≥ 2 次 → STOP 问用户)
|
|
196
143
|
|
|
197
144
|
## (可选)Stage extensions hook — Tier 1 Claude Code only
|
|
198
145
|
|
|
199
146
|
> codex review 集成。AI 主代理在本 stage(`apply_critical_plan_review`)跑多轮收敛协议。
|
|
200
147
|
> Tier 2/3(Codex/OpenCode)见 [`docs/stage-extensions.md §未来 Tier 2/3 集成`](../docs/stage-extensions.md#未来-tier-23-集成)。
|
|
201
148
|
|
|
202
|
-
**Step A — 检查是否启用**:读 `forge/config.yaml#stage_extensions.apply_critical_plan_review`。无该字段 / 数组为空 / 全部 entry `enabled: false` →
|
|
149
|
+
**Step A — 检查是否启用**:读 `forge/config.yaml#stage_extensions.apply_critical_plan_review`。无该字段 / 数组为空 / 全部 entry `enabled: false` → **跳过本段**。
|
|
203
150
|
|
|
204
151
|
**Step B — 对每个 `enabled` entry 跑多轮收敛 loop**:
|
|
205
152
|
|
|
206
|
-
初始化 `round = 1`、`threadId = ''`、`roundHistory = []`、`roundLimit = null
|
|
153
|
+
初始化 `round = 1`、`threadId = ''`、`roundHistory = []`、`roundLimit = null`。循环:
|
|
207
154
|
|
|
208
155
|
1. **跑单轮 runner**:
|
|
209
156
|
```bash
|
|
@@ -211,19 +158,9 @@ pause_decisions:
|
|
|
211
158
|
--stage apply_critical_plan_review --change-id <change-id> --extension <entry-name> \
|
|
212
159
|
--round <round>${threadId:+ --thread-id $threadId}
|
|
213
160
|
```
|
|
214
|
-
2. **解析 stdout JSON 的 `kind
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
- 首轮:`roundLimit = <JSON.effectiveConvergence.max_rounds>`(后续轮 `roundLimit` 已设,不覆盖 —— 选项①的 `roundLimit += N` 增量须保留)
|
|
221
|
-
4. **若 `round >= roundLimit`**(F2-v7 fix:用可增长的 `roundLimit`):
|
|
222
|
-
- 若 `<JSON.effectiveConvergence.max_rounds_on_exceed>` 为 `force_end` → 把 blockFindings 写 `forge/changes/<id>/.evidence/codex-pending-findings.yaml`(backlog),**break loop**
|
|
223
|
-
- 否则跑 `node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" stage-extensions analyze-trend --history '<roundHistory JSON>'` 拿 TrendAdvice,再 `AskUserQuestion` 三选项(默认推 `TrendAdvice.recommended_option`):**①再跑 N 轮**(F2-v7 fix:读用户输入的 `N`,执行 `roundLimit += N`,然后 `round++` 继续 loop —— 后续 `round >= roundLimit` 判定按新上限走,不会立刻又进 Step 4)/ **②放弃 codex**(break loop)/ **③接受当前**(blockFindings 写 backlog,break loop)
|
|
224
|
-
5. **否则(`round < roundLimit`)**:`AskUserQuestion` 三选项(默认推 `<JSON.userInteraction.block_unconverged>`):
|
|
225
|
-
- **①auto_fix** → 用 `Task` 工具 dispatch fresh fix subagent 修 blockFindings → `round++`,继续 loop
|
|
226
|
-
- **②manual_fix** → 等用户改完 → `round++`,继续 loop
|
|
227
|
-
- **③give_up** → break loop
|
|
228
|
-
|
|
229
|
-
**Step C — loose**:本段任何步骤(runner 调用 / AskUserQuestion / fix dispatch)失败都**不阻塞主流程 fence**。runner 永远 exit 0;AskUserQuestion harness 不支持时降级终端 prompt。
|
|
161
|
+
2. **解析 stdout JSON 的 `kind`**:`converged` / `failed` / `config_error` / `no_extension` → break loop(loose);`unconverged` → 继续 3
|
|
162
|
+
3. **从 unconverged JSON 取状态**:`roundHistory.push(...)`;`threadId = <JSON.threadId>`;首轮 `roundLimit = <JSON.effectiveConvergence.max_rounds>`
|
|
163
|
+
4. **若 `round >= roundLimit`**:`force_end` → 写 backlog,break;否则 `analyze-trend` + AskUserQuestion 三选项(再跑 N 轮 / 放弃 / 接受当前)
|
|
164
|
+
5. **否则**:AskUserQuestion 三选项(auto_fix dispatch fix subagent / manual_fix 等用户改 / give_up)
|
|
165
|
+
|
|
166
|
+
**Step C — loose**:本段任何步骤失败都**不阻塞主流程**。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: 调 forge archive CLI 把 change 移到 archive
|
|
3
|
-
argument-hint: '
|
|
2
|
+
description: 调 forge archive CLI 把 change 移到 archive/、应用 spec deltas、写 archive_summary
|
|
3
|
+
argument-hint: '[change-id] [--force] [--yes] [--skip-specs] [--api]'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
You are about to handle `/forge:archive $ARGUMENTS`.
|
|
@@ -13,181 +13,64 @@ You are about to handle `/forge:archive $ARGUMENTS`.
|
|
|
13
13
|
node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" archive $ARGUMENTS
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
(plugin helper 内部 spawn npx 拉 forge CLI,避开 v0.2 P1 全局 PATH 问题。OpenCode/Codex
|
|
16
|
+
(plugin helper 内部 spawn npx 拉 forge CLI,避开 v0.2 P1 全局 PATH 问题。OpenCode/Codex 路径走 skill 内嵌 fenced bash 调本地 `npx forge archive`,见 `skills/using-forge/SKILL.md`。)
|
|
17
17
|
|
|
18
|
-
##
|
|
18
|
+
## flag 说明
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
| flag | 行为 |
|
|
21
|
+
| -------------- | --------------------------------------------------------------------- |
|
|
22
|
+
| `[change-id]` | 默认交互式列 active change(>1 时必选);唯一 active 时可省 |
|
|
23
|
+
| `--force` | 接受 `verified_by='human-override'` 或 `reviewed_by='human-override'` |
|
|
24
|
+
| `--yes` | CI 模式:跳过 incomplete-tasks confirm + spec deltas apply confirm |
|
|
25
|
+
| `--skip-specs` | 跳过 `forge/specs/` deltas 应用步 |
|
|
26
|
+
| `--api` | legacy-bridge sync-check 直连 Anthropic API(否则走 agent emit) |
|
|
21
27
|
|
|
22
|
-
|
|
23
|
-
| ---------------------------------------------------------------- | ------------------------------------------------------------ |
|
|
24
|
-
| 全 resolved=true | 通过 |
|
|
25
|
-
| CRITICAL resolved=false | **拒签**(无 ack 出口,exit 1) |
|
|
26
|
-
| WARNING resolved=false + `severity_acked_by` 非空 + ack-log 匹配 | 通过(标 acked-warning archive,handoff 列入 `acked_warnings`) |
|
|
27
|
-
| WARNING resolved=false + `severity_acked_by` 空 | **拒签**(exit 1) |
|
|
28
|
-
| SUGGESTION resolved=false(无论 ack 与否) | **通过**(标 pending-suggestion archive,handoff to backlog) |
|
|
28
|
+
## CLI 行为(给 AI 理解,不要重复实现)
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
1. **legacy-bridge preflight**(若 `legacy_bridge.enforce_sync=true` 且 anchors 就绪)
|
|
31
|
+
- agent 模式 emit sync-check manifest 后 exit 2 暂停
|
|
32
|
+
- `--api` 模式直连跑 sync-check,有 critical pending 时 exit 2
|
|
33
|
+
- graceful skip 路径:config 缺 / anchors 缺 / allow_llm_calls=false / enforce_sync=false / 无受影响 anchor
|
|
34
|
+
2. **Spec validate**(永远跑,blocking — sanity check 非 fence)
|
|
35
|
+
3. **marker 存在性 + schema 校验**:`.verify-passed` schema=`forge-verify/v2`,`.review-passed` schema=`forge-review/v2`;human-override 需 `--force`
|
|
36
|
+
4. **未完成 task confirm**(`- [ ] ` 计数 > 0 且非 `--yes`):dangerous-by-default 回车 = NO
|
|
37
|
+
5. **Spec deltas 应用**(非 `--skip-specs`):`readDeltas` 列 create/replace/delete 操作 → 渲染 → 非 `--yes` 时 safe-by-default confirm 回车 = YES → `applyDeltas` 写 `forge/specs/`
|
|
38
|
+
6. **mv `forge/changes/<id>/` → `forge/changes/archive/<YYYY-MM-DD>-<id>/`**(`getArchiveDate` 算一次,跨午夜防偏)
|
|
39
|
+
7. **写 `archive_summary.yaml`** 到 archive 目录(schema `forge-archive-summary/v2`)
|
|
40
|
+
8. **legacy-bridge posthook**(`enforce_sync=false` 时跑;`--api` 直接写报告,否则 emit manifest 非阻塞)
|
|
41
|
+
9. **自动重生成 backlog**(`forge backlog active.md`;失败仅 warn,不回滚 archive)
|
|
42
|
+
10. **emit monitor trace event**(`change_archived` 给 `forge monitor`)
|
|
31
43
|
|
|
32
|
-
|
|
44
|
+
## archive_summary v2 输出
|
|
33
45
|
|
|
34
|
-
|
|
35
|
-
| ------------------ | --------------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
36
|
-
| `S`(critical) | `CRITICAL` 直接映射 | `S + resolved=false` 拒签;`S + resolved=true` 通过 |
|
|
37
|
-
| `L`(low) | `SUGGESTION` 直接映射 | `L + resolved=false` 通过(进 pending_suggestions);`L + resolved=true` 通过 |
|
|
38
|
-
| `C`(clarification) | **不自动映射** | **任何状态**(resolved/accepted/rationale)**全拒签**;必须等 plan-9j 完成跑 `forge upgrade --resign-markers` 迁移 |
|
|
46
|
+
`forge/changes/archive/<archive-name>/archive_summary.yaml` 顶层字段(沿 `src/core/schemas/archive-summary.ts`):
|
|
39
47
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
## archive_summary 输出(plan-9e1 落地)
|
|
43
|
-
|
|
44
|
-
archive 成功后,**新增产物**:`forge/changes/archive/YYYY-MM-DD-<id>/archive_summary.yaml`(给 v1.1 backlog index 入参)。
|
|
45
|
-
|
|
46
|
-
完整 schema 见 [`src/core/schemas/archive-summary.ts`](../src/core/schemas/archive-summary.ts);9 顶级字段:
|
|
47
|
-
|
|
48
|
-
- `schema` literal `forge-archive-summary/v1`
|
|
49
|
-
- `version` semver
|
|
48
|
+
- `schema: forge-archive-summary/v2`
|
|
49
|
+
- `version`(`2.0.0`)
|
|
50
50
|
- `archived_at` ISO 8601 UTC
|
|
51
|
-
- `change_id`
|
|
52
|
-
- `
|
|
53
|
-
- `
|
|
54
|
-
|
|
55
|
-
- `invariants_passed: number`(经 mapper 优先级筛选后仍为 status='pass' 的 invariant 数)
|
|
56
|
-
- `invariants_with_warning: number`(WARNING 经 fail/legacy-skip 优先级筛选后仍保留为 status='warning' 的数;legacy 路径下被豁免 invariant 的 WARNING 不计入,沿 master §3.4.4.1 精度损失)
|
|
57
|
-
- `invariants_failed: number`(v1.0 永远 = 0;fence.ok=false 时 archive 直接 exit 1,summary 不写入)
|
|
58
|
-
- `legacy_exempt: number`(`process_evidence_unavailable_legacy: true` 路径下被豁免的 invariant 数;legacy 路径恒 = 10,非 legacy 恒 = 0;flag 取自 verify || review 任一为 true)
|
|
59
|
-
- 不变式:`invariants_passed + invariants_with_warning + invariants_failed + legacy_exempt === 14`(沿 plan-9g FENCE_INVARIANT_NAMES.length)
|
|
60
|
-
- `handoff_to_backlog` 三类聚合(SUGGESTION 持挂 + pause_decisions chosen_option=3 + scope-entries active)
|
|
61
|
-
- `acked_warnings`(WARNING + ack 的引用,给用户回顾)
|
|
62
|
-
- `pending_suggestions`(SUGGESTION + resolved=false 引用,handoff 子集)
|
|
63
|
-
|
|
64
|
-
archive 成功后 stdout 渲染段(沿 design §2.4.4 模板):
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
## Archive Complete
|
|
68
|
-
|
|
69
|
-
**Change:** <change-id>
|
|
70
|
-
**Archived to:** forge/changes/archive/<archive-id>/
|
|
71
|
-
**Specs:** ✓ Synced
|
|
72
|
-
**Security:** [process_evidence:passed=3/warning=1/failed=0/legacy=10]
|
|
73
|
-
|
|
74
|
-
### Acknowledged Warnings (N)
|
|
75
|
-
- [WARNING] verify_findings#<id> (<dimension>/<check_type>)
|
|
76
|
-
Evidence: ...
|
|
77
|
-
Acked by: <user> at <iso>
|
|
78
|
-
Rationale: ...
|
|
79
|
-
|
|
80
|
-
### Pending Suggestions (M) — recorded in archive_summary
|
|
81
|
-
- [SUGGESTION] verify_findings#<id> (<dimension>/<check_type>)
|
|
82
|
-
Source: ...
|
|
83
|
-
Recommendation: ...
|
|
84
|
-
|
|
85
|
-
Review handoff details: cat forge/changes/archive/<archive-id>/archive_summary.yaml
|
|
86
|
-
Cross-change backlog: run `forge backlog list` (see forge/backlog/)
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## --resume-summary 用法(plan-9e1 落地,罕见状态)
|
|
90
|
-
|
|
91
|
-
设计语义:archive 流程"Move 完成 + 在 archive 目录把 `.tmp` rename 为正式名时失败"是极罕见状态(同目录 rename 几乎不会失败)。若发生:
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
forge archive --resume-summary 2026-05-12-add-x
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
行为:
|
|
98
|
-
|
|
99
|
-
- archive 目录有 `.tmp` 无正式 `.yaml` → rename(exit 0)
|
|
100
|
-
- 两者都存在(冲突,无法判断 ground truth)→ 拒签 exit 1(用户手动检查后删一个再重跑)
|
|
101
|
-
- 两者都不存在 → 报错 exit 1(状态损坏 / 该 archive 从未生成 summary)
|
|
102
|
-
|
|
103
|
-
`forge validate <change-id>` 会扫描 active change 目录是否残留孤立 `archive_summary.tmp.yaml`,残留时给 WARNING 提示走 `--resume-summary` 或手动 `rm`。
|
|
104
|
-
|
|
105
|
-
## CLI 行为说明(给 AI 理解,不要重复实现)
|
|
106
|
-
|
|
107
|
-
1. **加进程锁** `forge/.cache/archive.lock`(防止并发)
|
|
108
|
-
2. **校验 verify-passed + review-passed 标记存在且合法**:
|
|
109
|
-
- YAML 解析成功 + `schema` 字段值 = `forge-verify/v1` 或 `forge-review/v1`
|
|
110
|
-
- 重算 `tasks_hash` / `content_hash` 必须等于 marker 字段值
|
|
111
|
-
- 重算 git.head + git.diff_hash 必须等于(`is_git_repo: true` 时)
|
|
112
|
-
- `verified_by`/`reviewed_by` 取值 ∈ `{ai-agent, human-override}`
|
|
113
|
-
3. **`--force` 接受这两类降级**:
|
|
114
|
-
- `verified_by`/`reviewed_by` = `human-override`
|
|
115
|
-
- `is_git_repo: false`(非 git 项目)跳过 git 字段
|
|
116
|
-
4. **`--force` 不覆盖**(任一不一致 archive 拒绝):
|
|
117
|
-
- tasks_hash/content_hash 不一致(标记过期或被篡改)
|
|
118
|
-
- evidence log 文件缺失 / log_hash 不匹配 / pass ≠ true
|
|
119
|
-
- review_outcomes 中 accepted=true 但 resolved=false
|
|
120
|
-
- **CRITICAL finding 未 resolve**(三级 fence 强不变量,无 ack 出口;沿 plan-9e1 §三级行为表)
|
|
121
|
-
- **WARNING finding 未 resolve 且缺 ack**(用户必须显式 ack `severity_acked_by`)
|
|
122
|
-
5. **archive 顺序原子化**(沿 design §2.4.5 + spec §3.5):
|
|
123
|
-
- Move 前先写 `archive_summary.tmp.yaml` 到 source 目录
|
|
124
|
-
- Move(rename change → archive)
|
|
125
|
-
- rename `.tmp` → 正式 `archive_summary.yaml`
|
|
126
|
-
- Backup specs/
|
|
127
|
-
- Sync specs/
|
|
128
|
-
- 任一阶段失败按 §2.4.5 表回滚
|
|
129
|
-
6. **`--recover` 子模式**:扫描半归档状态(case A/B/C)并修复(沿 v0.4)
|
|
130
|
-
7. **`--resume-summary <archive-id>` 子模式**(plan-9e1):处理 archive 目录半完成 `.tmp` rename(rename ok / 双份冲突拒签 / 状态损坏报错)
|
|
131
|
-
|
|
132
|
-
## AI 编排步
|
|
133
|
-
|
|
134
|
-
### 步骤 1:sync-check manifest fulfillment(若有)
|
|
135
|
-
|
|
136
|
-
跑 `forge archive` 后,若输出提示 emit 了 sync-check manifest
|
|
137
|
-
(`forge/.cache/legacy-bridge-task-sync-check.json` 存在):
|
|
138
|
-
|
|
139
|
-
1. 按 `legacy-bridge-fulfillment` skill fulfill 该 manifest。
|
|
140
|
-
2. 跑 `forge legacy-bridge sync-check --apply`。
|
|
141
|
-
3. 跑 `forge archive --resume`:
|
|
142
|
-
- exit 2 → archive 被 critical 差异阻塞,先 `forge legacy-bridge resolve <change-id>`。
|
|
143
|
-
- exit 0 → archive 续跑完成。
|
|
144
|
-
|
|
145
|
-
`enforce_sync=false` 时此步非阻塞;`enforce_sync=true` 时是硬 gate。
|
|
51
|
+
- `change_id` / `archive_name` / `verified_by` / `reviewed_by`
|
|
52
|
+
- `applied_commits?`(可选 — user/AI 自填)
|
|
53
|
+
- `spec_updates_applied[]`:`{ capability, operation: create|replace|delete }`
|
|
54
|
+
- `handoff_to_backlog[]`:两类来源(`scope_entries` 与 `pause_decisions` chosen_option=3)
|
|
146
55
|
|
|
147
56
|
## 禁止行为
|
|
148
57
|
|
|
149
|
-
-
|
|
150
|
-
-
|
|
151
|
-
- 不允许在
|
|
58
|
+
- 不允许在 archive 失败时绕过 marker 校验直接 mv 文件
|
|
59
|
+
- 不允许伪造 `.verify-passed` / `.review-passed`(主代理必须真跑 `/forge:verify` + `/forge:review`)
|
|
60
|
+
- 不允许在 schema 不是 v2 时手动改 schema 字段(用 `/forge:verify` 或 `/forge:review` 重写)
|
|
152
61
|
|
|
153
62
|
## AI 后续行为
|
|
154
63
|
|
|
155
64
|
archive 成功后,**调用 `forge:finishing-a-development-branch` skill** 提示用户做 git 层面的合并/PR/清理决策。
|
|
156
65
|
|
|
157
|
-
##
|
|
158
|
-
|
|
159
|
-
本文件由多个 sub-plan 共同维护:
|
|
160
|
-
|
|
161
|
-
- **9e1**(本文件落地):三级分级行为表 + archive_summary 输出格式 + --resume-summary 用法
|
|
162
|
-
- **9e2(已完成,plan-9e2)**:`process_evidence_summary` 字段从 placeholder 接 plan-9g 实施的 14 不变量真实统计(4 字段计数:passed / with_warning / failed / legacy_exempt;sum 不变式 = 14)
|
|
163
|
-
- **9g**(process_evidence):在"archive 顺序原子化"步骤中加入 worktree 重跑 + 结构化 reporter parsing(注:9g 实施时 **不动** 9e1 的 .tmp / rename / 三级 fence 步骤,只在 verify markers 阶段之前插入 worktree 阶段)
|
|
164
|
-
|
|
165
|
-
merge 顺序推荐:**9e1 → 9g → 9e2(已完成全链)** — 14 不变量真实统计已接入,placeholder 路径仅 plan-9e1 backward-compat 兼容保留
|
|
166
|
-
|
|
167
|
-
## C 简码迁移协议(plan-9e1 v4 BLOCKER 1 落地 + plan-9j v2 解锁)
|
|
168
|
-
|
|
169
|
-
`review_outcomes[i].severity = 'C'`(v0.4 clarification 简码)在 v1.0 三级体系中**不直接对应**;archive 阶段会**硬拒签**。
|
|
170
|
-
|
|
171
|
-
**plan-9j 落地完成后**:用户工作流解锁路径:
|
|
172
|
-
|
|
173
|
-
1. 跑 `forge upgrade --resign-markers <change-id>` — 若含 C 简码,exit 1 + 写 pending file
|
|
174
|
-
2. 跑 `forge ack confirm <change-id> <findingId> --target-severity <WARNING|SUGGESTION>` — user 判定目标 severity
|
|
175
|
-
3. 重跑 `forge upgrade --resign-markers <change-id>` — confirm 后 marker `severity` 字段改回全名,archive 通过
|
|
176
|
-
|
|
177
|
-
**plan-9j 未完成时**(本 plan 实施期间):archive 含 C 简码 marker 仍是阻塞性硬墙(无 manual edit 出口,沿 v4 BLOCKER 1 三道墙)。
|
|
178
|
-
|
|
179
|
-
## exit code 遗留声明(plan-9e1 v3 MAJOR 1 / v5 MINOR 3 修订:口径统一)
|
|
180
|
-
|
|
181
|
-
`forge archive` 各路径 LockHeldError 的 exit code:
|
|
66
|
+
## v3 → v4 marker 升级
|
|
182
67
|
|
|
183
|
-
|
|
184
|
-
| ------------------------------------------------------------ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
185
|
-
| `forge archive <id>`(主路径) | 5 | v0.4 遗留 — **master §3.12.3 将由 plan-9e1 Task 6 Step 4-pre 加 known limitation 注脚**(实施时落地;plan v7 阶段 master 仍是 freeze 表无注脚);由后续 sub-plan(候选:9z release / 单独 cleanup plan)统一全路径 exit 2 |
|
|
186
|
-
| `forge archive --recover` | 5 | 同上 v0.4 遗留 |
|
|
187
|
-
| `forge archive --resume-summary <archive-id>`(plan-9e1 新增) | **2** | 对齐 master §3.12.3 freeze |
|
|
68
|
+
v3 marker(`forge-verify/v1` / `forge-review/v1`)在 v4 archive 时会被 schema 校验拒。唯一升级路径:**重跑 `/forge:verify` + `/forge:review` 写 v2 marker**(沿 `docs/migration/v3-to-v4.md`)。`forge upgrade --resign-markers` flag 已在 v4 移除。
|
|
188
69
|
|
|
189
|
-
|
|
70
|
+
## sync-check manifest fulfillment
|
|
190
71
|
|
|
191
|
-
|
|
72
|
+
archive 输出提示 emit 了 sync-check manifest(`forge/.cache/archive-pause-<id>.json` 存在):
|
|
192
73
|
|
|
193
|
-
|
|
74
|
+
1. 按 `legacy-bridge-fulfillment` skill fulfill 该 manifest
|
|
75
|
+
2. 跑 `forge legacy-bridge sync-check --apply`
|
|
76
|
+
3. 重跑 `forge archive`(从头跑;v4 删了 `--resume` flag,直接重跑即可。preflight 看到 sync-state 已就绪不会重新暂停)
|