@llman-sdd/core 0.3.1 → 0.5.1
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/package.json +2 -1
- package/src/archive/freeze.ts +86 -18
- package/src/archive/frozenCard.ts +105 -0
- package/src/archive/sevenzip.ts +15 -13
- package/src/change/closeOutHarness.ts +29 -0
- package/src/change/collect.ts +140 -0
- package/src/change/frontmatter.ts +48 -6
- package/src/change/id.ts +2 -6
- package/src/change/lifecycle.ts +285 -86
- package/src/change/nextId.ts +63 -2
- package/src/change/resolve.ts +2 -2
- package/src/change/tasks.ts +59 -0
- package/src/config/changeId.ts +14 -12
- package/src/config/load.ts +14 -0
- package/src/config/schema.ts +4 -41
- package/src/config/surface.ts +6 -36
- package/src/context/indexStore.ts +7 -3
- package/src/context/retrieve.ts +8 -10
- package/src/context/tree.ts +28 -24
- package/src/git/spawnGit.ts +90 -2
- package/src/index.ts +81 -54
- package/src/init/defaultConfig.ts +1 -5
- package/src/init/init.ts +19 -4
- package/src/ports.ts +1 -7
- package/src/project/migrateNotes.ts +104 -0
- package/src/render/machine.ts +30 -0
- package/src/report/collect.ts +11 -127
- package/src/report/graph/analysis.ts +152 -0
- package/src/report/graph/deps.ts +30 -0
- package/src/report/graph/graphData.ts +53 -0
- package/src/report/graph/nodes.ts +130 -0
- package/src/report/graph/render.ts +83 -0
- package/src/report/graph/types.ts +47 -0
- package/src/report/graph.ts +9 -381
- package/src/report/show.ts +20 -22
- package/src/report/specHelpers.ts +45 -22
- package/src/report/specs.ts +23 -25
- package/src/review/review.ts +45 -30
- package/src/spec/authoring.ts +147 -71
- package/src/spec/ir.ts +43 -15
- package/src/spec/keywords.ts +147 -0
- package/src/spec/migrateNative.ts +201 -0
- package/src/spec/parser.ts +95 -83
- package/src/spec/reqRegistry.ts +31 -15
- package/src/templates/embedded.ts +10 -16
- package/src/templates/engine.ts +10 -5
- package/src/templates/locale.ts +1 -1
- package/src/templates/skills.ts +4 -5
- package/src/validation/changeCheck.ts +128 -105
- package/src/validation/harness.ts +161 -0
- package/src/validation/staleness.ts +9 -5
- package/src/validation/validate.ts +60 -88
- package/templates/en/skills/llman-sdd-apply-cycle.md +20 -28
- package/templates/en/skills/llman-sdd-apply.md +58 -76
- package/templates/en/skills/llman-sdd-arch-review.md +12 -19
- package/templates/en/skills/llman-sdd-archive.md +27 -42
- package/templates/en/skills/llman-sdd-continue.md +17 -24
- package/templates/en/skills/llman-sdd-draft.md +17 -28
- package/templates/en/skills/llman-sdd-explore.md +29 -43
- package/templates/en/skills/llman-sdd-ff.md +12 -17
- package/templates/en/skills/llman-sdd-graph.md +14 -32
- package/templates/en/skills/llman-sdd-propose.md +48 -63
- package/templates/en/skills/llman-sdd-quick.md +12 -27
- package/templates/en/skills/llman-sdd-research.md +13 -24
- package/templates/en/skills/llman-sdd-specs-compact.md +14 -39
- package/templates/en/skills/llman-sdd-validate.md +11 -15
- package/templates/en/skills/llman-sdd-verify.md +23 -44
- package/templates/en/skills/llman-sdd-wayfinder.md +18 -22
- package/templates/en/units/skills/cli-footer.md +2 -0
- package/templates/en/units/skills/git-native-flow-brief.md +7 -6
- package/templates/en/units/skills/git-native-flow.md +21 -11
- package/templates/en/units/skills/human-readable-summary.md +2 -3
- package/templates/en/units/skills/stage-guard.md +7 -7
- package/templates/en/units/skills/structured-protocol.md +5 -8
- package/templates/en/units/skills/validation-hints.md +10 -14
- package/templates/en/units/spec/feature-contract.md +27 -16
- package/templates/en/units/workflow/archive-freeze-guidance.md +6 -3
- package/templates/zh-Hans/skills/llman-sdd-apply-cycle.md +23 -31
- package/templates/zh-Hans/skills/llman-sdd-apply.md +63 -81
- package/templates/zh-Hans/skills/llman-sdd-arch-review.md +21 -28
- package/templates/zh-Hans/skills/llman-sdd-archive.md +29 -44
- package/templates/zh-Hans/skills/llman-sdd-continue.md +17 -24
- package/templates/zh-Hans/skills/llman-sdd-draft.md +18 -29
- package/templates/zh-Hans/skills/llman-sdd-explore.md +34 -48
- package/templates/zh-Hans/skills/llman-sdd-ff.md +13 -18
- package/templates/zh-Hans/skills/llman-sdd-graph.md +16 -34
- package/templates/zh-Hans/skills/llman-sdd-propose.md +51 -65
- package/templates/zh-Hans/skills/llman-sdd-quick.md +15 -30
- package/templates/zh-Hans/skills/llman-sdd-research.md +17 -28
- package/templates/zh-Hans/skills/llman-sdd-specs-compact.md +15 -40
- package/templates/zh-Hans/skills/llman-sdd-validate.md +11 -15
- package/templates/zh-Hans/skills/llman-sdd-verify.md +26 -47
- package/templates/zh-Hans/skills/llman-sdd-wayfinder.md +25 -29
- package/templates/zh-Hans/units/skills/cli-footer.md +2 -0
- package/templates/zh-Hans/units/skills/git-native-flow-brief.md +7 -6
- package/templates/zh-Hans/units/skills/git-native-flow.md +22 -12
- package/templates/zh-Hans/units/skills/human-readable-summary.md +4 -5
- package/templates/zh-Hans/units/skills/stage-guard.md +9 -9
- package/templates/zh-Hans/units/skills/structured-protocol.md +5 -8
- package/templates/zh-Hans/units/skills/validation-hints.md +10 -14
- package/templates/zh-Hans/units/spec/feature-contract.md +25 -16
- package/templates/zh-Hans/units/workflow/archive-freeze-guidance.md +6 -2
- package/templates/en/skills/llman-sdd-onboard.md +0 -34
- package/templates/en/skills/llman-sdd-show.md +0 -24
- package/templates/en/units/migrate-prompt.md +0 -28
- package/templates/zh-Hans/skills/llman-sdd-onboard.md +0 -34
- package/templates/zh-Hans/skills/llman-sdd-show.md +0 -24
- package/templates/zh-Hans/units/migrate-prompt.md +0 -28
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
## Archive Cold Backup Guidance
|
|
2
|
-
-
|
|
2
|
+
- When archived directories grow too large, use cold backup maintenance (freeze moves bodies into the 7z cold backup and replaces the dir with a flat `<YYYY-MM-DD>-<id>.yaml` index card carrying only `title` and `depends_on`):
|
|
3
3
|
- Preview freeze candidates: `llman-sdd archive freeze --dry-run`
|
|
4
4
|
- Freeze old archives: `llman-sdd archive freeze --before <YYYY-MM-DD> --keep-recent <N>`
|
|
5
|
-
-
|
|
6
|
-
-
|
|
5
|
+
- List frozen entries: `llman-sdd archive freeze --list`
|
|
6
|
+
- Restore when needed: `llman-sdd archive thaw --change <YYYY-MM-DD-id>` (extracts bodies back and removes the card)
|
|
7
|
+
- Apply freeze/thaw only to dated archive directories (`YYYY-MM-DD-*`); keep a small recent window unfrozen.
|
|
8
|
+
- The flat index card stays on disk: `title` (from the proposal H1) and `depends_on` (seed for graph dependency edges) are grep-able and traceable; the id and date are implied by the file name — the purpose and dependencies of a frozen change are inspectable without thawing, while bodies live in the 7z cold backup and are fetched on demand.
|
|
9
|
+
- Running outside the main checkout (a worktree not holding the default branch) prints a warning (never blocks) — continue there only intentionally.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "llman-sdd-apply-cycle"
|
|
3
|
-
description: "
|
|
3
|
+
description: "单 change 端到端闭环:实施→测试→校验→verify→归档提交。仅手动触发,agent 禁止自动调用。"
|
|
4
4
|
metadata:
|
|
5
5
|
version: "{{ llman_version }}"
|
|
6
6
|
disable-model-invocation: true
|
|
@@ -8,7 +8,7 @@ disable-model-invocation: true
|
|
|
8
8
|
|
|
9
9
|
# LLMAN SDD Apply Cycle
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
单 change 端到端闭环(手动)。须已绑定分支且 specs-landed 门通过(`specsLanded ∨ needsSpecsChange=false`);`readyToImplement=true`(完成信号)收拢闭环。
|
|
12
12
|
|
|
13
13
|
**仅手动触发**:`/skill:llman-sdd-apply-cycle <change-id>`
|
|
14
14
|
|
|
@@ -16,60 +16,52 @@ disable-model-invocation: true
|
|
|
16
16
|
|
|
17
17
|
### 0) 门禁 + 状态
|
|
18
18
|
```bash
|
|
19
|
-
llman-sdd show <change-id> --json --type change
|
|
19
|
+
llman-sdd show <change-id> --output json --type change
|
|
20
20
|
```
|
|
21
|
-
>
|
|
21
|
+
> 阶段判定用 `stage` / `readyToImplement` 字段;完整判定表见 llman-sdd-apply。
|
|
22
22
|
|
|
23
23
|
- 须在绑定的非默认分支上。
|
|
24
|
-
-
|
|
25
|
-
- 进度以 `tasks.md` checkbox 为准(或 `llman-sdd list`
|
|
24
|
+
- specs-landed 门未过 → STOP(先落地 specs 或 `needs_specs_change: false`)。已绿但 `readyToImplement=false` → 正常:tasks 待完成,继续实施;**仅当 `readyToImplement=true` 才 finalize**。
|
|
25
|
+
- 进度以 `tasks.md` checkbox 为准(或 `llman-sdd list` 任务计数);实现时仍须读 `tasks.md`、proposal/design 与绑定分支上的 `llmanspec/specs/**`(唯一事实来源)。
|
|
26
26
|
|
|
27
27
|
### 1) 循环:实施 → 测试
|
|
28
28
|
对每个未完成 task:
|
|
29
|
-
1. 按 task +
|
|
30
|
-
2.
|
|
31
|
-
3.
|
|
29
|
+
1. 按 task + specs 实现(最小改动)
|
|
30
|
+
2. task 文本写明验证命令时运行之
|
|
31
|
+
3. 失败修复重试(自修复预算同 `llman-sdd-apply`:上限 8 轮)
|
|
32
32
|
4. 勾选 `tasks.md` 为 `[x]`
|
|
33
33
|
|
|
34
34
|
### 2) 校验
|
|
35
35
|
```bash
|
|
36
|
-
llman-sdd validate <change-id> --strict
|
|
36
|
+
llman-sdd validate <change-id> --strict
|
|
37
37
|
```
|
|
38
|
-
|
|
38
|
+
失败修复重试(上限 8 轮)。
|
|
39
39
|
|
|
40
40
|
### 3) Verify(推荐)
|
|
41
41
|
优先跑 `llman-sdd-verify`(或等效双轴自检)。有 CRITICAL → STOP,勿归档。
|
|
42
42
|
|
|
43
|
-
### 4) 归档
|
|
43
|
+
### 4) 归档 + 提交
|
|
44
44
|
```bash
|
|
45
45
|
llman-sdd change finalize <change-id>
|
|
46
46
|
```
|
|
47
|
-
|
|
47
|
+
工作区可脏;自动合并(默认 squash)+ 改名 + **自动提交** `archive(sdd): <change-id>` 单进程完成。`--no-commit` 跳过自动提交(手动/CI 历史)——此时自行 `git add -A && git commit -m "archive(sdd): <change-id>"`。普通 `change archive` 保留为 fallback。
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
### 5) 提交(见步骤 4)
|
|
52
|
-
finalize 已自动提交,除非传了 `--no-commit`。
|
|
53
|
-
|
|
54
|
-
### 6) 可选清理
|
|
49
|
+
### 5) 可选清理
|
|
55
50
|
```bash
|
|
56
|
-
git branch -D <feature-branch> # squash 后分支不再是 main 祖先,-d
|
|
51
|
+
git branch -D <feature-branch> # squash 后分支不再是 main 祖先,-d 会被拒
|
|
57
52
|
```
|
|
58
|
-
push /
|
|
53
|
+
push / PR 仅当用户明确要求。
|
|
59
54
|
|
|
60
55
|
## 硬约束
|
|
61
|
-
-
|
|
62
|
-
- **禁止切换**其他 change,直到本 change
|
|
63
|
-
-
|
|
64
|
-
- **禁止**写 `changes/<id>/specs/` 或 `change delta`。
|
|
65
|
-
- **禁止默认 push/PR**。
|
|
56
|
+
- **禁止问**「要不要继续」——除非 blocker,一路到底。
|
|
57
|
+
- **禁止切换**其他 change,直到本 change 归档并提交。
|
|
58
|
+
- **禁止**写 `changes/<id>/specs/`;**禁止默认 push/PR**。
|
|
66
59
|
|
|
67
60
|
## Ethics Governance
|
|
68
61
|
- `ethics.risk_level`: medium
|
|
69
|
-
- `ethics.prohibited_actions`:
|
|
62
|
+
- `ethics.prohibited_actions`: 未绑定分支 / specs-landed 门未过就实施、未 `readyToImplement=true` 就归档、中途切换 change、写 `changes/<id>/specs/`、未校验就提交、默认 push/PR
|
|
70
63
|
- `ethics.required_evidence`: `readyToImplement=true`、validate --strict 通过、tasks 全勾、finalize/archive 成功
|
|
71
|
-
- `ethics.refusal_contract`:
|
|
72
|
-
- `ethics.escalation_policy`:
|
|
64
|
+
- `ethics.refusal_contract`: 自修复 8 轮仍失败 → 报告 blocker,禁止强行归档
|
|
65
|
+
- `ethics.escalation_policy`: 改动 SDD 工作流 spec/模板时,归档前暂停请用户确认
|
|
73
66
|
|
|
74
|
-
|
|
75
|
-
> 文中「规约」= 本项目 `llmanspec/specs/` 下的 `.feature` 文件;用 `llman-sdd list --specs` / `llman-sdd show <capability>` 查全文。
|
|
67
|
+
{{ unit("skills/cli-footer") }}
|
|
@@ -1,125 +1,107 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "llman-sdd-apply"
|
|
3
|
-
description: "
|
|
3
|
+
description: "闭环实施已提案 change 的 tasks:写码→测试→失败自修复→门禁全绿。propose 完成、specs 落地后进入。"
|
|
4
4
|
metadata:
|
|
5
5
|
version: "{{ llman_version }}"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# LLMAN SDD Apply
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
实现代码 → 补测试/验收 → 跑门禁 → 失败自修复并重跑 → 全部通过后报告结果。
|
|
12
|
-
除非遇到明确 blocker,否则**不要中途停下来问「要不要继续」**。
|
|
10
|
+
在**一个闭环内**按顺序完成 `llmanspec/changes/<id>/tasks.md` 的所有任务:实现 → 补测试/验收 → 跑门禁 → 失败自修复重跑 → 全过后报告。除非明确 blocker,**不要中途问「要不要继续」**。
|
|
13
11
|
|
|
14
12
|
## Pipeline 位置
|
|
15
13
|
|
|
16
14
|
{{ unit("skills/git-native-flow-brief") }}
|
|
17
15
|
|
|
18
|
-
### Skill 导航(非生命周期;仅指示当前 skill)
|
|
19
|
-
|
|
20
16
|
```mermaid
|
|
21
17
|
flowchart LR
|
|
22
|
-
propose["llman-sdd-propose
|
|
23
|
-
apply["
|
|
24
|
-
|
|
25
|
-
verify --> archive["llman-sdd-archive<br/>归档"]
|
|
18
|
+
propose["llman-sdd-propose"] --> apply["★ llman-sdd-apply"]
|
|
19
|
+
apply --> verify["llman-sdd-verify"]
|
|
20
|
+
verify --> archive["llman-sdd-archive"]
|
|
26
21
|
|
|
27
22
|
style apply fill:#fff3cd,stroke:#ffc107,stroke-width:3px
|
|
28
23
|
```
|
|
29
24
|
|
|
30
|
-
> 📍
|
|
25
|
+
> 📍 进入前须 specs-landed 门通过(或 `needs_specs_change: false`);`readyToImplement=true`(全门绿)是本闭环的完成信号 → 下一步 `llman-sdd-verify`。
|
|
31
26
|
|
|
32
27
|
## 硬约束
|
|
33
28
|
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
- **不要问「要不要继续」**:除非遇到无法自动解决的 blocker,否则一路执行到闭环结束。
|
|
40
|
-
- **收尾**:本 skill 闭环以建议 `llman-sdd-verify` 结束;finalize/archive 由 `llman-sdd-archive` 负责(勿在自修复循环里 finalize)。
|
|
29
|
+
- **唯一事实来源驱动**:`proposal.md` / `design.md` / `tasks.md` 与分支上的 `llmanspec/specs/**`;specs 的 MUST/SHALL 逐条落实。
|
|
30
|
+
- **范围锁定**:只做当前 change 范围,禁止顺手修无关问题;改动保持最小。
|
|
31
|
+
- **禁止猜测**:需求不明或 specs 与现实矛盾 → STOP 报告,不自行假定。
|
|
32
|
+
- **不留旧兼容层**:change 要求改行为就全量升级到新写法,除非 tasks/proposal 明确要兼容。
|
|
33
|
+
- **收尾**:闭环以建议 `llman-sdd-verify` 结束;finalize/archive 归 `llman-sdd-archive`(勿在自修复循环里 finalize)。
|
|
41
34
|
|
|
42
35
|
## Commit 策略
|
|
43
36
|
|
|
44
|
-
- **change
|
|
45
|
-
- **默认收尾**:全部 task 过门禁且 verify 全绿后,`llman-sdd change finalize <id>` 自动提交 `archive(sdd): <change-id
|
|
46
|
-
- **blocker
|
|
37
|
+
- **change 分支上提交自由**(`change finalize` 不要求干净树):按 task/里程碑分段提交,或留脏交给 finalize 一次收尾——均为一等公民。
|
|
38
|
+
- **默认收尾**:全部 task 过门禁且 verify 全绿后,`llman-sdd change finalize <id>` 自动提交 `archive(sdd): <change-id>`(未提交 diff + frontmatter + 改名一笔)。不要在 apply 循环内 finalize。`--no-commit` 跳过自动提交(手动/CI 历史、pre-commit hook 冲突)。
|
|
39
|
+
- **blocker 中断**:因 blocker STOP 前先做**一次** WIP commit(如 `wip(sdd): <change-id> <摘要>`)保全现场再报告。
|
|
47
40
|
|
|
48
41
|
## 步骤
|
|
49
42
|
|
|
50
|
-
### 0) Preflight
|
|
51
|
-
-
|
|
52
|
-
- `git status --porcelain
|
|
53
|
-
|
|
54
|
-
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
- 若已提供 change id,直接使用。
|
|
60
|
-
- 否则从上下文推断;若不明确,运行 `llman-sdd list --json` 并让用户选择。
|
|
61
|
-
- 始终说明:"使用变更:<id>",并告知如何覆盖。
|
|
62
|
-
- 确认已在经 `llman-sdd change start <id>` 或 `change attach <id>` 绑定的非默认 feature 分支上(仅在需要重绑时用 `--force`)。分支上的 specs/features 即 SSOT——不要在 `changes/<id>/specs/` 下编写。
|
|
43
|
+
### 0) Preflight(必须)
|
|
44
|
+
- 读取并遵守 `llmanspec/config.yaml`、`AGENTS.md`(若存在)。
|
|
45
|
+
- `git status --porcelain`:工作区不干净且改动不属于本 change → 先 `git stash push -u -m "llman-sdd-apply autopilot backup"`。
|
|
46
|
+
- `llman-sdd validate --all --strict`:失败且与本 change 无关 → 停下报告(工件不一致则无法以事实来源驱动实现)。
|
|
47
|
+
- **检查 spec valid_scope 完整性**:`llman-sdd list --specs --json` 列出所有 spec,逐个核对 `valid_scope` 路径存在于磁盘;有缺失 → 停下并建议更新 spec(移除已删路径)。
|
|
48
|
+
|
|
49
|
+
### 1) 选定 change id 并查前置
|
|
50
|
+
- 已提供则直接用;否则从上下文推断,不明确就跑 `llman-sdd list --json` 让用户选。始终说明「使用变更:<id>」并告知如何覆盖。
|
|
51
|
+
- 确认在经 `llman-sdd change start <id>` 或 `change attach <id>` 绑定的非默认分支上(仅重绑用 `--force`)。分支上的 specs 即唯一事实来源——不要在 `changes/<id>/specs/` 下编写。
|
|
63
52
|
{{ unit("skills/stage-guard") }}
|
|
64
|
-
-
|
|
65
|
-
-
|
|
53
|
+
- 用 `llman-sdd context --task "<proposal 目标>" --paths "<specs scope>"` 获取相关 specs。
|
|
54
|
+
- context 不可用 → 先 `llman-sdd index check`:stale/缺失则 `llman-sdd index rebuild` 后重试;fresh 仍不可用(`LLMAN_SDD_INDEX_CHAT_MODEL` 未设)→ 改用 `llman-sdd list --specs` + 直读 `.feature`——勿循环 rebuild。
|
|
66
55
|
|
|
67
|
-
### 2)
|
|
68
|
-
|
|
69
|
-
- `llmanspec/
|
|
70
|
-
- `llmanspec/changes/<id>/design.md`(如存在)
|
|
71
|
-
- `llmanspec/changes/<id>/tasks.md`
|
|
72
|
-
- feature 分支上的 live specs:`llmanspec/specs/**`(`<capability>.feature`)——这是 SSOT
|
|
56
|
+
### 2) 通读事实来源工件
|
|
57
|
+
- `llmanspec/changes/<id>/proposal.md`、`design.md`(如有)、`tasks.md`
|
|
58
|
+
- 分支上的 `llmanspec/specs/**`(`<capability>.feature`)
|
|
73
59
|
|
|
74
|
-
|
|
60
|
+
把 proposal/design 的决策整理为不可违反的硬约束清单;把 tasks.md 转成最小可执行步骤序列(保持原顺序)。
|
|
75
61
|
|
|
76
62
|
### 3) 展示状态
|
|
77
|
-
-
|
|
78
|
-
- 接下来 1–3 个未完成任务(简短概览)
|
|
63
|
+
- 进度「N/M tasks complete」+ 接下来 1–3 个未完成任务的简短概览。
|
|
79
64
|
|
|
80
|
-
### 4)
|
|
65
|
+
### 4) 逐任务实施(闭环)
|
|
81
66
|
对每个未完成 task:
|
|
82
|
-
1. **实现**:严格按 task 描述 + specs
|
|
83
|
-
2.
|
|
84
|
-
3.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
67
|
+
1. **实现**:严格按 task 描述 + specs 要求,改动最小。
|
|
68
|
+
2. **完成后立刻勾 checkbox**:`- [ ]` → `- [x]`。**收口不是 task**:`change finalize` / `change archive` 是流水线步骤,MUST NOT 出现在 tasks.md——若已列(如「收口——finalize」),删掉(收口的任务门要求全部任务已勾)。
|
|
69
|
+
3. **编辑与验证串行**:验证 MUST 在编辑落盘后执行;MUST NOT 把编辑与测试/校验放进同一批并行工具调用(可能读到旧文件,产生假失败/假通过)。
|
|
70
|
+
4. task 不明、遇 blocker、或 specs/design 与现实不一致 → STOP 报告,不自行假定。
|
|
71
|
+
|
|
72
|
+
### 5) 验证与自修复循环(每个 task 或每批 task 后跑一次)
|
|
73
|
+
按项目实际跑门禁:
|
|
74
|
+
- 测试集:`just test` 或 `cargo test --all`;格式/lint:`just check` 或 `just lint` + `just fmt`
|
|
75
|
+
- 分支上按需编辑 `llmanspec/specs/<capability>.feature`(扁平或目录主文件;统一原生分层:`@req:<id>` 挂 `规则:` 块头、嵌套 `场景:` 为可执行示例),spec 改动后跑 `llman-sdd validate --specs`;分支上可自由提交。
|
|
76
|
+
- SDD 校验:`llman-sdd validate <id> --strict`
|
|
77
|
+
|
|
78
|
+
**门禁证据**:
|
|
79
|
+
- 收口会执行已配置的 `bdd.run_command`,收口前不必再跑一遍;`--no-check` 打出的跳过说明不是通过。
|
|
80
|
+
- 门禁结论 MUST 来自真实 harness:MUST NOT 以 `--no-check` 取得「通过」;harness 失败 MUST 先查根因(环境变量泄漏、嵌套调用守卫、工作目录错误等),MUST NOT 以「固有/自指属性」定性后绕过。
|
|
81
|
+
- 前后对比类判据(计数、基线)MUST 在 change 分支上测量(相对现算 merge-base);默认分支测得的值通常恒为基线,不构成证据。
|
|
82
|
+
- 重构或批量替换类 task:MUST 对比改动前后测试用例数;门禁全绿但用例数下降视为失败。
|
|
83
|
+
|
|
84
|
+
**失败 → 自修复(不要问要不要继续):**
|
|
85
|
+
1. 解析失败原因(测试 / lint / 格式 / 校验)。
|
|
86
|
+
2. 判定是否难定位 bug(原因不明 / 间歇 flake / 回归看不穿):
|
|
87
|
+
- **不是**(明确的 lint/格式/编译/校验错误):最小修复(不扩范围),先重跑最小失败复现命令,再重跑全部门禁。
|
|
88
|
+
- **是 → 升级诊断子流程**:
|
|
89
|
+
1. **先建一个能复现失败的命令**(快、确定、agent 可跑、能在此 bug 上变红)——驱动真实 bug 路径并断言用户症状。**MUST NOT 在没有它之前猜原因**(盯着代码空想正是要防止的失败)。
|
|
90
|
+
2. 运行确认变红 → 最小化复现(逐个剔除输入/调用/配置/数据,只留关键部分)。
|
|
91
|
+
3. 生成 **3–5 个排序假设**,每个可证伪(「若 X 是因,改 Y 会让 bug 消失」)。
|
|
103
92
|
4. 单变量验证(一次只改一个),找到根因后修复。
|
|
104
|
-
5.
|
|
105
|
-
3.
|
|
106
|
-
4.
|
|
93
|
+
5. 没有合适 seam 写回归测试时,记录该架构缺口(交 `llman-sdd-arch-review`;未启用时写入本 change 的 `proposal.md` Further Notes 段或 `design.md`,MUST NOT 因此中断闭环)。
|
|
94
|
+
3. 先重跑最小失败复现命令,再重跑全部门禁。
|
|
95
|
+
4. 记为一轮自修复:`Round N:失败点 → 修复 → 重跑 → 通过/失败`。
|
|
107
96
|
|
|
108
|
-
**自修复上限 8
|
|
97
|
+
**自修复上限 8 轮**;超过仍不过视为 blocker:停止并输出 blocker 报告(最后一次失败命令与输出摘要、已尝试的修复)。
|
|
109
98
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
- 退出码为零 → 继续。
|
|
113
|
-
- 非零退出 = 存在 CRITICAL 发现:STOP,修复后重跑 review;MUST NOT 带着 CRITICAL 进入下一批次或输出完成报告。
|
|
99
|
+
**人审关卡(每批 task 门禁通过后)**:进入下一批次或输出完成报告前跑 `llman-sdd review`:退出码零 → 继续;非零 = CRITICAL → STOP 修复后重跑;MUST NOT 带 CRITICAL 进入下一批次或输出完成报告。
|
|
114
100
|
|
|
115
101
|
### 6) 完成报告
|
|
116
|
-
所有 task 完成 +
|
|
117
|
-
然后建议运行 `llman-sdd-verify` 进入验证阶段。
|
|
118
|
-
|
|
119
|
-
> 💡 实施完成 → 下一步 `llman-sdd-verify`(验证)
|
|
102
|
+
所有 task 完成 + 全部门禁通过后输出结构化报告(见 Output Contract),然后建议 `llman-sdd-verify`。
|
|
120
103
|
|
|
121
|
-
|
|
122
|
-
> 文中「规约」= 本项目 `llmanspec/specs/` 下的 `.feature` 文件;用 `llman-sdd list --specs` / `llman-sdd show <capability>` 查全文。
|
|
104
|
+
{{ unit("skills/cli-footer") }}
|
|
123
105
|
|
|
124
106
|
{{ unit("skills/validation-hints") }}
|
|
125
107
|
|
|
@@ -1,65 +1,58 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "llman-sdd-arch-review"
|
|
3
|
-
description: "
|
|
3
|
+
description: "架构审查:扫描薄模块(接口≈实现),给出加深候选,改善可测性与 AI 可导航性。"
|
|
4
4
|
metadata:
|
|
5
5
|
version: "{{ llman_version }}"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# LLMAN SDD Architecture Review
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
## Pipeline 位置
|
|
13
|
-
|
|
14
|
-
辅助工具,不属于主实现 pipeline(explore→propose→apply→verify→archive)。任意阶段可用,常在 explore 阶段触发以发现改进候选。
|
|
15
|
-
|
|
16
|
-
> 📍 这是独立可选 skill,不替代任何 pipeline 阶段。
|
|
10
|
+
扫描代码库的架构摩擦,找出**可以加深的模块**——把薄模块(接口≈实现)改造成厚模块(小接口后藏大量行为)。目标是可测性与 AI 可导航性。辅助工具,不属于主 pipeline,任意阶段可用,常在 explore 阶段触发。
|
|
17
11
|
|
|
18
12
|
## 设计词汇
|
|
19
13
|
|
|
20
|
-
|
|
14
|
+
描述模块形状的词;MUST NOT 替换为「component」「service」「API」「boundary」(含义更宽、不够精确):
|
|
21
15
|
|
|
22
16
|
- **Module(模块)** — 有接口和实现的东西(函数/类/包/跨层切片都算)。
|
|
23
|
-
- **Interface(接口)** —
|
|
24
|
-
- **Depth(厚度)** — 接口背后的行为量。**厚** = 小接口后藏大量行为;**薄** = 接口几乎和实现一样复杂(调用者要懂的 ≈ 写代码要写的)。本 skill
|
|
25
|
-
- **Seam(接缝)** —
|
|
17
|
+
- **Interface(接口)** — 调用者正确使用所须知道的一切:类型签名 + 不变量、顺序约束、错误模式、性能特征。
|
|
18
|
+
- **Depth(厚度)** — 接口背后的行为量。**厚** = 小接口后藏大量行为;**薄** = 接口几乎和实现一样复杂(调用者要懂的 ≈ 写代码要写的)。本 skill 把薄的变厚。
|
|
19
|
+
- **Seam(接缝)** — 不改调用处就能换实现的位置(接口栖身处)。llman 里接缝 = `*.feature` GWT 步骤驱动的公共边界。
|
|
26
20
|
- **Leverage(杠杆)** — 调用者从厚度获得的好处:学一点接口就能驱动很多行为。
|
|
27
|
-
- **Locality(局部性)** — 维护者从厚度获得的好处:变更/bug
|
|
21
|
+
- **Locality(局部性)** — 维护者从厚度获得的好处:变更/bug/知识/验证集中一处,改一次到处生效。
|
|
28
22
|
|
|
29
23
|
## 步骤
|
|
30
24
|
|
|
31
25
|
### 1. 探索(先定范围,YAGNI)
|
|
32
|
-
-
|
|
26
|
+
- 用户指定方向(模块/子系统/痛点)则直接采信,跳过推断。
|
|
33
27
|
- 否则回看 `git log --oneline` 找热点(反复出现的文件/区域)。
|
|
34
|
-
- 优先读
|
|
35
|
-
- 用 Agent 工具(subagent_type=Explore
|
|
28
|
+
- 优先读 `<capability>.feature`(唯一事实来源)与 `design.md`(已有 ADR);MUST NOT 另建 `CONTEXT.md`。
|
|
29
|
+
- 用 Agent 工具(subagent_type=Explore)走查代码库,记录摩擦点:
|
|
36
30
|
- 理解一个概念是否要在多个小模块间跳来跳去?
|
|
37
|
-
-
|
|
31
|
+
- 哪里模块**薄**(接口≈实现复杂度,调用者没省事)?
|
|
38
32
|
- 哪里纯函数仅为可测性抽取,但真实 bug 藏在调用方式里(缺局部性)?
|
|
39
33
|
- 哪些部分没测或难以通过当前接口测试?
|
|
40
34
|
|
|
41
35
|
### 2. 提出候选
|
|
42
|
-
|
|
43
|
-
- **Files** —
|
|
44
|
-
- **Problem** —
|
|
36
|
+
每个候选给出:
|
|
37
|
+
- **Files** — 涉及的文件/模块。
|
|
38
|
+
- **Problem** — 当前架构为何造成摩擦(用厚度/杠杆/局部性说清)。
|
|
45
39
|
- **Solution** — 会改变什么的平实描述。
|
|
46
40
|
- **Benefits** — 局部性与杠杆的改善,测试如何变好。
|
|
47
41
|
- **Recommendation strength** — `Strong` / `Worth exploring` / `Speculative`。
|
|
48
42
|
|
|
49
|
-
|
|
43
|
+
**删除验证**:对疑似薄的模块想象删除它——复杂度直接消失(只是透传,没价值)还是在 N 个调用点重新冒出来(其实在扛事)?「重新冒出来」才是值得保留/加厚的信号。
|
|
50
44
|
|
|
51
|
-
**ADR
|
|
45
|
+
**ADR 冲突**:候选与既有 `design.md` 决策矛盾时,仅在摩擦真实到值得重开才浮现,并在候选中标注(「与 design.md 的 X 决策冲突——但因…值得重开」)。
|
|
52
46
|
|
|
53
47
|
### 3. 逐问深挖(用户选定候选后)
|
|
54
|
-
|
|
48
|
+
运行 `llman-sdd-explore` 的**逐问深挖分支**(触发词「深挖」)走清决策——约束、依赖、加深后的模块形状、接缝后放什么、哪些测试存活。
|
|
55
49
|
|
|
56
|
-
-
|
|
57
|
-
- 用户以关键理由拒绝候选?→ 仅当「难逆转 + 无上下文会困惑 +
|
|
50
|
+
- 加深后用到了 `.feature` 里没有的概念?→ 仅在 change 已绑定分支且当前在绑定分支上时更新 `.feature`;否则 STOP,先走 `llman-sdd-propose` / `change start`,**禁止**在默认分支改 specs。
|
|
51
|
+
- 用户以关键理由拒绝候选?→ 仅当「难逆转 + 无上下文会困惑 + 真实权衡」皆满足时,建议记入 `design.md`。
|
|
58
52
|
|
|
59
53
|
## 输出
|
|
60
|
-
候选清单(文本;可选 HTML 报告写 OS temp dir 不落 repo)+ 用户选定后的逐问深挖决策记录(回写 proposal
|
|
54
|
+
候选清单(文本;可选 HTML 报告写 OS temp dir 不落 repo)+ 用户选定后的逐问深挖决策记录(回写 proposal;合约变更须在绑定分支落地后才回写 `.feature`)。
|
|
61
55
|
|
|
62
|
-
|
|
63
|
-
> 文中「规约」= 本项目 `llmanspec/specs/` 下的 `.feature` 文件;用 `llman-sdd list --specs` / `llman-sdd show <capability>` 查全文。
|
|
56
|
+
{{ unit("skills/cli-footer") }}
|
|
64
57
|
|
|
65
58
|
{{ unit("skills/structured-protocol") }}
|
|
@@ -1,84 +1,69 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "llman-sdd-archive"
|
|
3
|
-
description: "
|
|
3
|
+
description: "归档已完成 change:合并回基准分支(默认 squash)、文档改名入 archive/、自动收口提交。verify 全绿后运行。"
|
|
4
4
|
metadata:
|
|
5
5
|
version: "{{ llman_version }}"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# LLMAN SDD 归档
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
归档已完成的变更。前置:verify 全绿,且 change 已绑定分支、specs 已落地(或 `needs_specs_change: false`)。`change finalize` **自动合并**到基准分支(目标:`--into` > 绑定 `base_branch` > 默认分支;方式:`--method` > 配置 `sdd.merge_method`,默认 squash——feature diff + 改名收敛为目标分支单个 commit)、**改名** change 文档到 `changes/archive/`、**自动提交** `archive(sdd): <change-id>`(`--no-commit` 跳过)。`git push` / PR 仅可选。
|
|
11
11
|
|
|
12
12
|
## Pipeline 位置
|
|
13
13
|
|
|
14
14
|
```mermaid
|
|
15
15
|
flowchart LR
|
|
16
|
-
verify["llman-sdd-verify
|
|
17
|
-
archive["★ llman-sdd-archive ★<br/>归档(你现在在这里)"]
|
|
16
|
+
verify["llman-sdd-verify"] --> archive["★ llman-sdd-archive"]
|
|
18
17
|
|
|
19
18
|
style archive fill:#fff3cd,stroke:#ffc107,stroke-width:3px
|
|
20
19
|
```
|
|
21
20
|
|
|
22
|
-
> 📍
|
|
23
|
-
> 📎 若 specs 逐渐膨胀,可运行 `llman-sdd-specs-compact` 压缩。
|
|
21
|
+
> 📍 你在归档阶段:分支生命周期最后一站。specs 膨胀时可跑 `llman-sdd-specs-compact`。
|
|
24
22
|
|
|
25
23
|
## 硬约束
|
|
26
24
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
- **收尾不默认导向 PR/push**:archive/finalize 后由 CLI 处理本地合并(squash 缺省),再一次性 `git commit` 提交收口。`git push` / Hosting PR 仅为可选——仅当用户或项目明确要求远程审查时才做。**Agent MUST NOT** 因本 skill 默认执行 push 或创建 PR。
|
|
25
|
+
- **必须先 verify 全绿**;**须已绑定分支**(`change start` / `attach`),无绑定 STOP。
|
|
26
|
+
- 每个 change 归档前必须通过 `llman-sdd validate <id> --strict`。
|
|
27
|
+
- **不要问「要不要继续」**:批量归档一路执行到底,除非遇到无法自动解决的错误。
|
|
28
|
+
- **收尾不默认导向 PR/push**:CLI 本地合并(默认 squash)+ 一次性收口提交。push / PR 仅在用户或项目明确要求远程审查时做——**Agent MUST NOT** 默认 push 或建 PR。
|
|
32
29
|
|
|
33
30
|
## 步骤
|
|
34
31
|
|
|
35
32
|
### 0) Preflight
|
|
36
|
-
- `git status --porcelain`:确认工作区改动属于已完成的 change
|
|
37
|
-
- 若有未预期改动,先处理(stash 或报告)。
|
|
33
|
+
- `git status --porcelain`:确认工作区改动属于已完成的 change;有未预期改动先处理(stash 或报告)。
|
|
38
34
|
|
|
39
|
-
### 1)
|
|
40
|
-
-
|
|
41
|
-
- 始终说明:"归档 IDs:<id1>, <id2>, ..."。
|
|
42
|
-
- 确认每个 change 都已通过 verify 阶段的全绿验证。
|
|
35
|
+
### 1) 确认目标
|
|
36
|
+
- 确定 ID(单个或批量,来自用户输入或 `llman-sdd list --json`),始终说明「归档 IDs:<id1>, <id2>, ...」,并确认每个 change 都已 verify 全绿。
|
|
43
37
|
|
|
44
38
|
### 2) 逐个归档
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
- 校验失败 → STOP 并报告;不要跳过校验强行归档。
|
|
39
|
+
- **人审关卡(每个 id 归档前,含批量)**:跑 `llman-sdd review`(无旗标;`--capability` 只接受 spec id)。退出码零 → 继续;非零 = CRITICAL → STOP 修复后重跑;MUST NOT 带 CRITICAL 归档。
|
|
40
|
+
- 先校验:`llman-sdd validate <id> --strict`;失败 → STOP 报告,禁止跳过强行归档。
|
|
48
41
|
- 可选预览:`llman-sdd change archive <id> --dry-run`。
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
- 前置:已 Branch binding(`change start` / `attach`);仍在绑定分支上(或合并后已在目标分支)。
|
|
55
|
-
- `change archive` / `change finalize` **先自动合并**(目标 `--into` > 绑定 `base_branch` > 默认分支;方式 squash 缺省或 `ff`;目标被其他 worktree 持有时跳过并打印手动命令),**再**将 change 文档改名到 `changes/archive/`——合并失败也不会回滚改名,降级提示显式可见。
|
|
56
|
-
- specs 下遗留 `*.feature.delta.toon` 或 `spec.toon` 均为迁移阻断项——跑 `llman-sdd project migrate --kind toon2features`。
|
|
57
|
-
- **默认:`change finalize`(单命令收口)**——门禁 → 自动合并 → 文档改名 → **自动提交** `archive(sdd): <change-id>`(squash 缺省:实现 diff + 改名收敛为目标分支**单个**提交;无需手动 `git commit`;锁定规则改动为报告制 WARNING——只警告不阻断):
|
|
42
|
+
- 执行:`llman-sdd change archive <id>`;**任一失败立即停止**,报告剩余 ID。
|
|
43
|
+
- **分支收尾**:
|
|
44
|
+
- 前置:已绑定分支;仍在绑定分支上(或合并后已在目标分支)。
|
|
45
|
+
- `change archive` / `change finalize` **先自动合并**(目标 `--into` > `base_branch` > 默认分支;方式默认 squash 或 `ff`;目标被其他 worktree 持有时在该 worktree 内原地执行,输出标注 `executed in target worktree <path>`;该 worktree 脏时中止报错并列出处置选项,零写入),**再**改名到 `changes/archive/`——合并失败不回滚改名,降级提示显式可见。
|
|
46
|
+
- **默认 `change finalize`(单命令收口)**——门禁 → 合并 → 改名 → **自动提交** `archive(sdd): <change-id>`(无需手动 `git commit`;锁定规则改动为报告制 WARNING,只警告不阻断):
|
|
58
47
|
```text
|
|
59
|
-
1. 实现
|
|
60
|
-
2. llman-sdd change finalize <id> # 门禁 +
|
|
61
|
-
3. 可选:git commit --amend
|
|
48
|
+
1. 实现 specs + 代码(工作区可保持脏;分支上提交自由)
|
|
49
|
+
2. llman-sdd change finalize <id> # 门禁 + 合并(默认 squash)+ 改名 + 自动提交
|
|
50
|
+
3. 可选:git commit --amend 调整说明;git branch -D <feature> # squash 后分支不再是祖先,-d 会被拒
|
|
62
51
|
```
|
|
63
|
-
`--no-commit` 跳过自动提交(CI / pre-commit hook 冲突):finalize
|
|
64
|
-
- **Fallback
|
|
52
|
+
`--no-commit` 跳过自动提交(CI / pre-commit hook 冲突):finalize 留脏工作区并打印手动提交命令。幂等重试:自动提交失败后重跑会识别已归档改名并补提交。
|
|
53
|
+
- **Fallback:`change archive <id>`**——与 finalize 同样的自动合并 + 改名 + 收口提交(此路无 `--no-commit`);门禁:task 全勾 + 干净树 + 在绑定非默认分支(`--force` 跳过)。快照审查用 `change diff`。
|
|
65
54
|
|
|
66
55
|
### 3) 全量校验
|
|
67
|
-
-
|
|
68
|
-
- 确认归档后的 specs 工件一致。
|
|
56
|
+
- 全部归档后 `llman-sdd validate --all --strict`,确认 specs 工件一致。
|
|
69
57
|
|
|
70
58
|
### 4) Commit 引导
|
|
71
|
-
- finalize
|
|
72
|
-
- 可选:合并后 `git branch -D <feature
|
|
73
|
-
- **破坏性合约变更**(移除/重命名 frontmatter 字段、命令、tag 或 stage 值域)MUST 提供 `migrations/v<from>-v<to>/` 升级路径(README
|
|
74
|
-
- **archived `depends_on`**:archive
|
|
75
|
-
|
|
76
|
-
> 💡 上一阶段 `llman-sdd-verify`(验证通过)→ 本阶段归档后闭环结束。若 specs 逐渐膨胀,可运行 `llman-sdd-specs-compact` 压缩。
|
|
59
|
+
- finalize 已自动提交;`--no-commit` 时手动:`git add -A && git commit -m "archive(sdd): <id1>, <id2>"`。
|
|
60
|
+
- 可选:合并后 `git branch -D <feature>`。push / PR 仅在明确要求时做。
|
|
61
|
+
- **破坏性合约变更**(移除/重命名 frontmatter 字段、命令、tag 或 stage 值域)MUST 提供 `migrations/v<from>-v<to>/` 升级路径(README + 一次性脚本随仓库发布)——收口前确认存在。
|
|
62
|
+
- **archived `depends_on`**:archive 把 change 目录改名为 `archive/YYYY-MM-DD-<id>`;validate 把指向 archived/frozen id 的 `depends_on` 识别为 INFO(非 ERROR),**无需**手动更新其它 change 的 frontmatter。
|
|
77
63
|
|
|
78
64
|
{{ unit("workflow/archive-freeze-guidance") }}
|
|
79
65
|
|
|
80
|
-
|
|
81
|
-
> 文中「规约」= 本项目 `llmanspec/specs/` 下的 `.feature` 文件;用 `llman-sdd list --specs` / `llman-sdd show <capability>` 查全文。
|
|
66
|
+
{{ unit("skills/cli-footer") }}
|
|
82
67
|
|
|
83
68
|
{{ unit("skills/validation-hints") }}
|
|
84
69
|
|
|
@@ -1,41 +1,34 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "llman-sdd-continue"
|
|
3
|
-
description: "继续已有
|
|
3
|
+
description: "继续已有 change:补建下一个缺失工件。"
|
|
4
4
|
metadata:
|
|
5
5
|
version: "{{ llman_version }}"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# LLMAN SDD Continue
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
继续已有 change,创建下一个缺失工件。
|
|
11
11
|
|
|
12
12
|
## 步骤
|
|
13
|
-
1. 确定 change id
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
2. 阅读变更目录:`llmanspec/changes/<id>/`。
|
|
18
|
-
> 阶段判定:用 `llman-sdd show <id> --json --type change` 的 `stage` / `readyToImplement` 字段;完整判定表见 llman-sdd-apply。
|
|
19
|
-
3. 确定下一个要创建的 artifact(按顺序):
|
|
13
|
+
1. 确定 change id:用户给了就用;否则跑 `llman-sdd list --json` 让用户选。始终说明「使用变更:<id>」。
|
|
14
|
+
2. 读 `llmanspec/changes/<id>/`。
|
|
15
|
+
> 阶段判定:用 `llman-sdd show <id> --output json --type change` 的 `stage` / `readyToImplement`;完整判定表见 llman-sdd-apply。
|
|
16
|
+
3. 按顺序确定下一个缺失工件:
|
|
20
17
|
1) `proposal.md`
|
|
21
|
-
2) `design.md
|
|
18
|
+
2) `design.md`(仅有设计权衡时)
|
|
22
19
|
3) `tasks.md`
|
|
23
|
-
4) `llman-sdd change start <id
|
|
24
|
-
5)
|
|
25
|
-
4.
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
- verify 之后 → 归档:`llman-sdd-archive`
|
|
33
|
-
- 校验:`llman-sdd validate <id> --strict --no-interactive`
|
|
34
|
-
- 审查:`llman-sdd change diff <id>`(只读)
|
|
20
|
+
4) `llman-sdd change start <id>`(分支已存在用 `change attach <id>`)——绑定分支
|
|
21
|
+
5) 在**绑定分支**编辑 `llmanspec/specs/<capability>.feature`(扁平,或目录主文件)并 commit——落地 specs(无合约变更设 `needs_specs_change: false`)
|
|
22
|
+
4. 只创建**一个**缺失工件(或一次绑定分支上的 spec 编辑)。
|
|
23
|
+
- 不写应用代码;**不要**建 `changes/<id>/specs/`;**不要**在 start/attach 前改 `llmanspec/specs/**`。
|
|
24
|
+
5. 工件已齐全时,按 `llman-sdd show <id> --output json` 建议下一步:
|
|
25
|
+
- specs-landed 门未过 → 先落地 specs(或 `needs_specs_change: false`);**不要**建议 apply
|
|
26
|
+
- specs-landed 门已绿(即使实施中期 `readyToImplement=false`、tasks 未完)→ `llman-sdd-apply`
|
|
27
|
+
- verify 之后 → `llman-sdd-archive`
|
|
28
|
+
- 校验:`llman-sdd validate <id> --strict`;审查:`llman-sdd change diff <id>`(只读)
|
|
35
29
|
|
|
36
30
|
{{ unit("skills/git-native-flow") }}
|
|
37
|
-
|
|
38
|
-
> 文中「规约」= 本项目 `llmanspec/specs/` 下的 `.feature` 文件;用 `llman-sdd list --specs` / `llman-sdd show <capability>` 查全文。
|
|
31
|
+
{{ unit("skills/cli-footer") }}
|
|
39
32
|
{{ unit("skills/validation-hints") }}
|
|
40
33
|
|
|
41
34
|
{{ unit("skills/structured-protocol") }}
|