@gordon.gan/specflow 1.7.0-beta → 1.8.0-beta
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 +1 -1
- package/dist/core/approval/forbidden-patterns.js +5 -2
- package/dist/integrations/shared/capability-evidence.js +1 -0
- package/dist/integrations/shared/parity-manifest.js +1 -0
- package/package.json +1 -1
- package/prompts/approval/acp-pipeline.md +3 -1
- package/prompts/approval/generate.md +13 -0
- package/prompts/approval/multi-repo-guidance.md +25 -0
- package/prompts/approval/multi-repo-spoke-subagent.md +94 -0
- package/skills/specflow-approval/SKILL.md +119 -4
- package/templates/approval-playbook-talos-scenario-job-compile.yaml +29 -0
package/README.md
CHANGED
|
@@ -282,7 +282,7 @@ specflow init
|
|
|
282
282
|
| **explore** | 读代码、比方案、定边界;产出 `explore.md`,confirmed 后 handoff 到 propose |
|
|
283
283
|
| **propose** | 一次产出 proposal、delta specs、design、tasks(第一轮深度思考,非占位骨架);叙述语言跟 `artifacts.language` |
|
|
284
284
|
| **refine** | 内部多轮循环(≥2 轮,AI 判断收敛);可更新任意 artifact |
|
|
285
|
-
| **approval** | refine 后可选:AI 7 维闭环 + 设计质量 + 可实施性 → `approval.md`;非轻量变更走 **ACP**:分片 `approval/parts/` → Stage 12e AI Review → **`specflow approval finalize
|
|
285
|
+
| **approval** | refine 后可选:AI 7 维闭环 + 设计质量 + 可实施性 → `approval.md`;非轻量变更走 **ACP**:分片 `approval/parts/` → Stage 12e AI Review → **`specflow approval finalize`**。**多仓 mode A**:主仓 `/specflow:approval` 一次发起,Subagent 并行跑子仓 approval,主仓等待后 **`finalize --bundle`** 产出 `approval-unified.md`(各仓 `approval.md` 为 apply 真源) |
|
|
286
286
|
| **apply** | Phase A 重写 tasks.md;Phase B 按语言路由 ECC 审查 + TDD 逐任务执行;可选 `--yes` |
|
|
287
287
|
| **review** | 代码审查,对照 specs 检查回归 |
|
|
288
288
|
| **test** | 单元 + 集成 + E2E + 回归测试 |
|
|
@@ -20,8 +20,11 @@ export const INCONSISTENCY_HINT_PATTERNS = [
|
|
|
20
20
|
/约\s*\d+\s*次/,
|
|
21
21
|
/\b(?:等|etc\.?)\s*[。.)]/,
|
|
22
22
|
/(?:status|状态|enum|枚举)[^.\n]{0,30}(?:等|etc)/i,
|
|
23
|
-
|
|
24
|
-
/(
|
|
23
|
+
/(?:^|[\s,。;])同前(?!缀)/,
|
|
24
|
+
/(?:^|[\s,。;])同上(?!所述)/,
|
|
25
|
+
/(?:^|[\s,。;])见上(?!游)/,
|
|
26
|
+
/\b(?:待定|未定)\b/i,
|
|
27
|
+
/(?<![无未不否])\bTBD\b/i,
|
|
25
28
|
/\d+\s*[或\\/]\s*\d+\s*(?:均可|都行)/,
|
|
26
29
|
];
|
|
27
30
|
export function findForbiddenMatch(content) {
|
|
@@ -14,6 +14,7 @@ const MARKER_RULES = [
|
|
|
14
14
|
{ id: 'sub.approval.design_quality', skill: 'approval', includes: ['Design Quality Assessment', 'Over-Engineering'] },
|
|
15
15
|
{ id: 'sub.approval.acp_finalize', skill: 'approval', includes: ['specflow approval finalize', 'Stage 12f'] },
|
|
16
16
|
{ id: 'sub.approval.ai_review', skill: 'approval', includes: ['12e AI Review', 'part_hashes'] },
|
|
17
|
+
{ id: 'sub.approval.multi_repo_subagent', skill: 'approval', includes: ['Stage 1c', 'multi-repo-spoke-subagent'] },
|
|
17
18
|
{ id: 'sub.apply.phase_a', skill: 'apply', includes: ['## Phase A: Task Rewrite'] },
|
|
18
19
|
{ id: 'sub.apply.phase_b', skill: 'apply', includes: ['## Phase B: Subagent TDD Execution'] },
|
|
19
20
|
{ id: 'sub.apply.gap_detection', skill: 'apply', includes: ['Gap Detection'] },
|
|
@@ -20,6 +20,7 @@ export const CAPABILITY_MANIFEST = [
|
|
|
20
20
|
{ id: 'sub.approval.design_quality', commandId: 'approval', level: 'sub-capability', required: true },
|
|
21
21
|
{ id: 'sub.approval.acp_finalize', commandId: 'approval', level: 'sub-capability', required: true },
|
|
22
22
|
{ id: 'sub.approval.ai_review', commandId: 'approval', level: 'sub-capability', required: true },
|
|
23
|
+
{ id: 'sub.approval.multi_repo_subagent', commandId: 'approval', level: 'sub-capability', required: true },
|
|
23
24
|
{ id: 'sub.apply.phase_a', commandId: 'apply', level: 'sub-capability', required: true },
|
|
24
25
|
{ id: 'sub.apply.phase_b', commandId: 'apply', level: 'sub-capability', required: true },
|
|
25
26
|
{ id: 'sub.apply.gap_detection', commandId: 'apply', level: 'sub-capability', required: true },
|
package/package.json
CHANGED
|
@@ -63,7 +63,9 @@ interfaces:
|
|
|
63
63
|
- **Read-only view**: `approval bundle` from `approval-playbook.yaml`
|
|
64
64
|
- Do **not** LLM-unify three repos into one primary `approval/parts`
|
|
65
65
|
|
|
66
|
-
See `multi-repo-guidance.md` + `templates/approval-playbook.yaml
|
|
66
|
+
See `multi-repo-guidance.md` + `templates/approval-playbook.yaml` (+ example `templates/approval-playbook-talos-scenario-job-compile.yaml`).
|
|
67
|
+
|
|
68
|
+
**Orchestration**: multi-repo mode A uses **Stage 1c** subagent parallel dispatch (`multi-repo-spoke-subagent.md`) — not a single-repo `finalize` across repos.
|
|
67
69
|
|
|
68
70
|
---
|
|
69
71
|
|
|
@@ -1503,6 +1503,19 @@ User natural language, workset, or cross-repo design → `multi_repo.enabled=tru
|
|
|
1503
1503
|
|
|
1504
1504
|
Recommend `repo` on `tables[]` / `interfaces[]` / `pages[]` entries for unified mode traceability.
|
|
1505
1505
|
|
|
1506
|
+
### G.7 主仓一键 · Subagent 并行 (mode A)
|
|
1507
|
+
|
|
1508
|
+
> Router: `prompts/approval/multi-repo-spoke-subagent.md` · Orchestrator: `skills/specflow-approval/SKILL.md` **Stage 1c**
|
|
1509
|
+
|
|
1510
|
+
When user starts `/specflow:approval` from **primary** repo and chose **A (bundle)**:
|
|
1511
|
+
|
|
1512
|
+
1. Primary writes `approval-playbook.yaml`; spoke indexes set `bundle.enabled: false`.
|
|
1513
|
+
2. **Parallel** Task subagents per non-primary repo → full spoke Map + 12e + `finalize` (no `--bundle`).
|
|
1514
|
+
3. Primary **wait gate** — all spokes `finalize_ok`.
|
|
1515
|
+
4. Primary Map + finalize + `finalize --bundle --workspace-root <primary.planning_root>`.
|
|
1516
|
+
|
|
1517
|
+
**Anti-lazy (multi-repo)**: no unified LLM merge when mode A chosen; no stub spoke parts (`见 design.md` rows without decision text); each spoke needs `analysis.json` + `review-result.json` when `acp.review.enabled`.
|
|
1518
|
+
|
|
1506
1519
|
---
|
|
1507
1520
|
|
|
1508
1521
|
## Part H: ACP Pipeline (Approval Compiler Pipeline)
|
|
@@ -236,3 +236,28 @@ interfaces:
|
|
|
236
236
|
## 7. 与单仓关系
|
|
237
237
|
|
|
238
238
|
`multi_repo.enabled=false` 时忽略本章;`change` 字段为当前规划根 change,行为与旧版一致。
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 8. 主仓一键 · Subagent 并行 (mode A/B)
|
|
243
|
+
|
|
244
|
+
> Router: `prompts/approval/multi-repo-spoke-subagent.md` · Orchestrator: `skills/specflow-approval/SKILL.md` **Stage 1c**
|
|
245
|
+
|
|
246
|
+
当用户在 **主仓** 发起 `/specflow:approval` 且已选 **A (bundle)** 或 **B (per_repo)**:
|
|
247
|
+
|
|
248
|
+
| 角色 | 职责 |
|
|
249
|
+
|------|------|
|
|
250
|
+
| **主 Agent(主仓)** | intake、playbook、scope 拆分、闭环 Pass 1–11、主仓 Map、等待子仓、主仓 finalize、bundle |
|
|
251
|
+
| **Subagent × 子仓** | 各子仓独立 `approval/` → Map → 12e → `finalize <spoke.change>`(**禁止** `--bundle`) |
|
|
252
|
+
|
|
253
|
+
**硬顺序**:
|
|
254
|
+
|
|
255
|
+
1. 主仓写好 `approval-playbook.yaml` + `multi_repo.repos[].root_hint`
|
|
256
|
+
2. **并行**派发子仓 subagent(web / worker / …)
|
|
257
|
+
3. **等待**全部 `finalize_ok: true`
|
|
258
|
+
4. 主仓 Map + finalize
|
|
259
|
+
5. 主仓 `finalize --bundle --workspace-root <主仓规划根>`
|
|
260
|
+
|
|
261
|
+
**禁止**: 仅在主仓 unified 合订而不拆仓;子仓未 finalize 就 bundle;让用户手动 cd 子仓跑 CLI(除非 subagent 不可用)。
|
|
262
|
+
|
|
263
|
+
**从 unified 迁移**: 将 `04.6-ui`、Worker L2 接口等 **搬迁** 到对应子仓 parts;主仓留 cross-ref + 平台/L3 正文。示例 playbook: `templates/approval-playbook-talos-scenario-job-compile.yaml`。
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Approval · Multi-Repo Spoke Subagent Brief
|
|
2
|
+
|
|
3
|
+
> **Invoked by** primary `/specflow:approval` orchestrator via **Task** subagent (one per non-primary repo).
|
|
4
|
+
> Primary repo Map/Review/Finalize stays on the **orchestrator** unless user explicitly runs approval from a spoke root.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Mission
|
|
9
|
+
|
|
10
|
+
Run **full ACP approval for ONE spoke repo only** — Index → Map → Stage 12e AI Review → `specflow approval finalize <spoke.change>` — scoped to that repo's four artifacts and **only** entities assigned to this repo in the shared playbook / primary `index.yaml`.
|
|
11
|
+
|
|
12
|
+
**Do NOT** write into the primary repo. **Do NOT** LLM-merge cross-repo content into one file.
|
|
13
|
+
|
|
14
|
+
**Spoke index rule**: only **`primary_repo`** sets `multi_repo.bundle.enabled: true` + hosts `approval-playbook.yaml`. Spoke repos set `bundle.enabled: false` — they **never** run `--bundle`.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Inputs (primary must pass all)
|
|
19
|
+
|
|
20
|
+
| Field | Example |
|
|
21
|
+
|-------|---------|
|
|
22
|
+
| `repo_id` | `talos-web` |
|
|
23
|
+
| `planning_root` | `/Users/gankang/TALOS-WORK/talos-web` |
|
|
24
|
+
| `change` | `web-scenario-cases` |
|
|
25
|
+
| `role` | `web` |
|
|
26
|
+
| `primary_change` | `scenario-job-compile` |
|
|
27
|
+
| `primary_repo_id` | `talos` |
|
|
28
|
+
| `workset_root` | `/Users/gankang/TALOS-WORK` |
|
|
29
|
+
| `scope` | Which parts/capabilities/interfaces/pages belong to this spoke (from playbook or primary index) |
|
|
30
|
+
| `cross_ref_policy` | Cross-repo refs: `见 talos approval §4.5 I8` — never duplicate platform DDL/RPC bodies |
|
|
31
|
+
|
|
32
|
+
Read before writing:
|
|
33
|
+
|
|
34
|
+
1. `specflow/changes/<change>/` four artifacts (phase must be `refined`)
|
|
35
|
+
2. `prompts/approval/generate.md` (Part E/F), `acp-pipeline.md`, `ai-review.md`
|
|
36
|
+
3. Role packs: `frontend-guidance.md` (web), `api-guidance.md` (worker), etc.
|
|
37
|
+
4. Primary `approval/index.yaml` `multi_repo.repos[]` entry for this repo
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Hard scope rules
|
|
42
|
+
|
|
43
|
+
| Role | Own in approval/parts | Cross-ref only (do not copy bodies) |
|
|
44
|
+
|------|----------------------|-------------------------------------|
|
|
45
|
+
| `platform` | compile, scheduler RPC/L4, DDL, gateway, ingest | Worker L2 HTTP, console pages |
|
|
46
|
+
| `web` | §4.6 UI, web APIs (I5/I6), nav/routes | Platform scheduler/result RPC details |
|
|
47
|
+
| `worker` | L2 Worker HTTP (I7/I9), executor logic, Pack | Platform L3 SubmitStepResult, Web UI |
|
|
48
|
+
|
|
49
|
+
Each spoke document is **standalone per repo**: `01-intro` … `10-signoff` with **repo-scoped** §1–§3 and detailed §4 batches for that repo only.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Execution order (spoke)
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
cd <planning_root>
|
|
57
|
+
→ Write approval/index.yaml (multi_repo.enabled=false OR spoke-local block only)
|
|
58
|
+
→ Write approval/analysis.json (Passes scoped to this repo)
|
|
59
|
+
→ 12a skeleton parts
|
|
60
|
+
→ 12b Map batches (repo scope only)
|
|
61
|
+
→ 12e: specflow approval finalize <change> # may pause → review-packet
|
|
62
|
+
→ Fix parts; write review-result.json + part_hashes (specflow approval review-hashes --json)
|
|
63
|
+
→ specflow approval finalize <change> # must exit ok
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Never** run `--bundle` on a spoke. Bundle is **primary only**, after all spokes report success.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Return payload to orchestrator (required)
|
|
71
|
+
|
|
72
|
+
Report in final message:
|
|
73
|
+
|
|
74
|
+
```yaml
|
|
75
|
+
repo_id: talos-web
|
|
76
|
+
change: web-scenario-cases
|
|
77
|
+
finalize_ok: true
|
|
78
|
+
output_path: specflow/changes/web-scenario-cases/approval.md
|
|
79
|
+
review_result: specflow/changes/web-scenario-cases/approval/review-result.json
|
|
80
|
+
lint_errors: []
|
|
81
|
+
blocked: false
|
|
82
|
+
notes: ""
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
If `finalize_ok: false`, set `blocked: true` and paste diagnostics — orchestrator **must not** bundle.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Anti-patterns
|
|
90
|
+
|
|
91
|
+
- Writing `04.6-ui` into platform repo when web spoke exists
|
|
92
|
+
- Running bundle from spoke cwd
|
|
93
|
+
- Skipping finalize and pasting assembled markdown
|
|
94
|
+
- Unified LLM merge (mode C) when mode A was chosen
|
|
@@ -130,6 +130,118 @@ Single-repo → skip (`multi_repo.enabled=false`).
|
|
|
130
130
|
|
|
131
131
|
---
|
|
132
132
|
|
|
133
|
+
## Stage 1c: Multi-Repo Subagent Orchestration (主仓一键 · 子仓并行)
|
|
134
|
+
|
|
135
|
+
**Trigger**: `multi_repo.enabled=true` **and** user chose **A (bundle)** or **B (per_repo only)** **and** session supports **Task** subagents (Cursor Agent / compatible harness).
|
|
136
|
+
|
|
137
|
+
**User-facing promise**: user starts **once** from the **primary** repo (`/specflow:approval <primary.change>`). Orchestrator runs spoke approvals **in parallel**; primary **waits** for all spokes to finish `finalize` successfully, then runs **primary Map + finalize + bundle** (mode A).
|
|
138
|
+
|
|
139
|
+
Read **`prompts/approval/multi-repo-spoke-subagent.md`** before dispatching subagents.
|
|
140
|
+
|
|
141
|
+
### 1c.1 Preconditions (hard)
|
|
142
|
+
|
|
143
|
+
1. User gate **A** answered → `document_mode: per_repo` + `multi_repo.bundle.enabled: true` + `primary_repo` set.
|
|
144
|
+
2. Primary `approval/index.yaml` lists every `multi_repo.repos[]` with `id`, `change`, **`root_hint`** (absolute planning root).
|
|
145
|
+
3. Primary `approval/approval-playbook.yaml` exists (copy from `templates/approval-playbook.yaml` or `templates/approval-playbook-talos-scenario-job-compile.yaml`); every **non-primary** source has explicit `root:` in playbook. **Spoke** `index.yaml` must set `multi_repo.bundle.enabled: false` (only primary enables bundle).
|
|
146
|
+
4. **Scope map** recorded: which `parts` / `interfaces` / `pages` / `capabilities` belong to each repo (from primary index inventory — **split**, do not duplicate bodies across repos).
|
|
147
|
+
5. If migrating from legacy **unified** (mode C): **split parts first** — move `04.6-ui` → web, Worker L2 → worker, platform keeps L3/DDL/compile; add cross-refs. Do not bundle until split is done.
|
|
148
|
+
|
|
149
|
+
### 1c.2 Phase diagram
|
|
150
|
+
|
|
151
|
+
```text
|
|
152
|
+
[Primary orchestrator]
|
|
153
|
+
Stage 1b intake + user gate A + playbook + scope map
|
|
154
|
+
Stage 2–11 (closed-loop) — primary reads ALL repos' four artifacts
|
|
155
|
+
Stage 12a — primary index + playbook + overlay only (optional skeleton on primary)
|
|
156
|
+
|
|
157
|
+
═══ PARALLEL (Task subagent × each non-primary repo) ═══
|
|
158
|
+
For each spoke in multi_repo.repos[] where repo.id != primary_repo:
|
|
159
|
+
Launch Task (generalPurpose) with multi-repo-spoke-subagent.md brief
|
|
160
|
+
Inputs: repo_id, planning_root=root_hint, change, role, scope, workset_root, primary_change
|
|
161
|
+
Spoke runs: 12a → 12b → 12e → finalize <spoke.change> (NO --bundle)
|
|
162
|
+
|
|
163
|
+
═══ WAIT GATE (orchestrator blocks) ═══
|
|
164
|
+
Collect each spoke return payload → all finalize_ok: true
|
|
165
|
+
If any blocked → STOP; report failing repo + diagnostics; do NOT bundle
|
|
166
|
+
|
|
167
|
+
═══ PRIMARY (sequential) ═══
|
|
168
|
+
Stage 12b Map primary-scoped parts only
|
|
169
|
+
Stage 12e AI Review + finalize <primary.change> # no --bundle yet if review pauses
|
|
170
|
+
Re-run finalize until primary ok
|
|
171
|
+
|
|
172
|
+
═══ BUNDLE (primary only) ═══
|
|
173
|
+
specflow approval finalize <primary.change> --bundle --workspace-root <primary.planning_root> [--render]
|
|
174
|
+
Report: each per_repo approval.md path + approval-unified.md (readonly)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**`--workspace-root`**: use the **primary repo planning root** (directory containing `specflow/changes/`), not the workset parent — unless every playbook `sources[]` entry sets explicit `root:` (recommended for web/worker).
|
|
178
|
+
|
|
179
|
+
### 1c.3 Subagent dispatch template
|
|
180
|
+
|
|
181
|
+
For each spoke, launch **one** Task in parallel (same turn when possible):
|
|
182
|
+
|
|
183
|
+
```text
|
|
184
|
+
Task · Spoke approval · <repo_id>
|
|
185
|
+
|
|
186
|
+
Read prompts/approval/multi-repo-spoke-subagent.md and execute spoke approval end-to-end.
|
|
187
|
+
|
|
188
|
+
repo_id: <id>
|
|
189
|
+
planning_root: <root_hint absolute path>
|
|
190
|
+
change: <spoke change name>
|
|
191
|
+
role: platform | web | worker
|
|
192
|
+
primary_repo_id: <primary_repo>
|
|
193
|
+
primary_change: <primary change name>
|
|
194
|
+
workset_root: <parent containing all repos, optional>
|
|
195
|
+
scope:
|
|
196
|
+
parts: [<part ids for this repo only>]
|
|
197
|
+
interfaces: [<I ids>]
|
|
198
|
+
pages: [<page ids>]
|
|
199
|
+
capabilities: [<cap ids>]
|
|
200
|
+
cross_ref_policy: 跨仓细节用「见 <other-repo> approval §x」;禁止复制平台 DDL/Worker OpenAPI 全文到本仓
|
|
201
|
+
|
|
202
|
+
Return the YAML payload from multi-repo-spoke-subagent.md § Return payload.
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Parallelism**: launch all spoke Tasks in **one** assistant message. Do **not** start primary Map §4 batches that belong to a spoke until spoke Tasks are dispatched (orchestrator may prepare primary skeleton while spokes run).
|
|
206
|
+
|
|
207
|
+
### 1c.4 Wait gate & bundle (hard)
|
|
208
|
+
|
|
209
|
+
Before primary `--bundle`:
|
|
210
|
+
|
|
211
|
+
| Check | Action |
|
|
212
|
+
|-------|--------|
|
|
213
|
+
| Each spoke `finalize_ok: true` | else STOP |
|
|
214
|
+
| Each spoke `approval.md` exists | Read path from return payload |
|
|
215
|
+
| Primary `finalize` ok (no lint/review errors) | else fix primary parts first |
|
|
216
|
+
| Playbook sources match actual per-repo parts | `specflow approval bundle <primary.change>` dry path via finalize |
|
|
217
|
+
|
|
218
|
+
On success announce:
|
|
219
|
+
|
|
220
|
+
```text
|
|
221
|
+
Multi-repo approval complete (mode A):
|
|
222
|
+
- talos/.../approval.md (platform)
|
|
223
|
+
- talos-web/.../approval.md (web)
|
|
224
|
+
- talos-worker/.../approval.md (worker)
|
|
225
|
+
- talos/.../approval-unified.md (readonly bundle)
|
|
226
|
+
Apply uses per_repo approval.md only.
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### 1c.5 Fallback (no Task / subagent)
|
|
230
|
+
|
|
231
|
+
If subagents unavailable, run spokes **sequentially** in the same session: `cd <root_hint>` → full spoke flow → return to primary. Same wait gate before bundle. **Never** skip per-repo finalize.
|
|
232
|
+
|
|
233
|
+
### 1c.6 User confirmation
|
|
234
|
+
|
|
235
|
+
After Stage 12a + scope map, ask once:
|
|
236
|
+
|
|
237
|
+
```text
|
|
238
|
+
将并行在 N-1 个子仓生成 approval(<repo list>),主仓完成后合订 bundle。确认继续?
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
On confirm: dispatch subagents + proceed. User does **not** run spoke CLIs manually.
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
133
245
|
## Gate: Tech Stack Intake (0→1 / 四件套缺选型)
|
|
134
246
|
|
|
135
247
|
**Trigger** (any):
|
|
@@ -536,7 +648,9 @@ Low-level subcommands (`lint`, `review-pack`, `assemble`, …) remain for CI hoo
|
|
|
536
648
|
|
|
537
649
|
### 12g Multi-repo bundle
|
|
538
650
|
|
|
539
|
-
When `multi_repo.bundle.enabled`, `finalize --bundle` (
|
|
651
|
+
When `multi_repo.bundle.enabled`, **only the primary orchestrator** runs `finalize --bundle` **after** all spokes (Stage 1c wait gate) and primary finalize succeed. Produces readonly `approval-unified.md` from `approval-playbook.yaml`. **Apply 只用各仓 approval.md 真源。**
|
|
652
|
+
|
|
653
|
+
Spoke subagents **must not** pass `--bundle`. See **Stage 1c**.
|
|
540
654
|
|
|
541
655
|
Optional HTML: `specflow approval render <change>` or `finalize --render` → `approval.html` (browser-readable; mermaid via CDN).
|
|
542
656
|
|
|
@@ -613,14 +727,15 @@ After 12b/12c, run **Stage 12e AI Review** (fix parts, write `review-result.json
|
|
|
613
727
|
|
|
614
728
|
Then ask:
|
|
615
729
|
|
|
616
|
-
> "确认 finalize
|
|
730
|
+
> "确认 finalize 并写入各仓 `approval.md`?(多仓时将并行子仓 approval,完成后主仓合订 bundle)"
|
|
617
731
|
|
|
618
732
|
Do NOT finalize until the user confirms (unless they already confirmed end-to-end generation).
|
|
619
733
|
|
|
620
734
|
On confirmation:
|
|
621
735
|
|
|
622
|
-
1. **
|
|
623
|
-
2. **
|
|
736
|
+
1. **Multi-repo mode A/B**: run **Stage 1c** — dispatch spoke subagents in parallel → wait gate → primary Map/12e/finalize → `finalize --bundle --workspace-root <primary.planning_root>`.
|
|
737
|
+
2. **Segmented (single-repo)**: `specflow approval finalize <change>` — do not paste assembled markdown manually; do not run lint/assemble subcommands separately unless debugging.
|
|
738
|
+
3. **Monolithic**: write `approval.md` directly (or parts + finalize).
|
|
624
739
|
3. Include only optional chapters the user accepted.
|
|
625
740
|
4. Do **not** include「AI 预审建议」in the file.
|
|
626
741
|
5. Do NOT change `phase` — it remains `refined`.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# specflow.approval.playbook/v1 — TALOS scenario-job-compile 三仓合订示例
|
|
2
|
+
# Copy to: specflow/changes/scenario-job-compile/approval/approval-playbook.yaml
|
|
3
|
+
# Used after per_repo split: each repo has its own approval/parts + approval.md
|
|
4
|
+
schema: specflow.approval.playbook/v1
|
|
5
|
+
change: scenario-job-compile
|
|
6
|
+
title: 场景作业编译与逐步上报(三仓合订)
|
|
7
|
+
primary_repo: talos
|
|
8
|
+
|
|
9
|
+
sources:
|
|
10
|
+
- repo: talos
|
|
11
|
+
change: scenario-job-compile
|
|
12
|
+
include_parts: all
|
|
13
|
+
- repo: talos-web
|
|
14
|
+
change: web-scenario-cases
|
|
15
|
+
root: /Users/gankang/TALOS-WORK/talos-web
|
|
16
|
+
include_parts: all
|
|
17
|
+
- repo: talos-worker
|
|
18
|
+
change: scenario-execution
|
|
19
|
+
root: /Users/gankang/TALOS-WORK/talos-worker
|
|
20
|
+
include_parts: all
|
|
21
|
+
|
|
22
|
+
overlay:
|
|
23
|
+
- overlays/01-unified-scope.md
|
|
24
|
+
|
|
25
|
+
assemble:
|
|
26
|
+
inject_headers: true
|
|
27
|
+
dedupe_appendix: true
|
|
28
|
+
output: approval-unified.md
|
|
29
|
+
readonly: true
|