@llman-sdd/core 0.3.0 → 0.5.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/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 +67 -59
- 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 +42 -21
- package/src/report/specs.ts +23 -25
- package/src/review/review.ts +45 -30
- package/src/spec/authoring.ts +91 -63
- package/src/spec/ir.ts +43 -15
- package/src/spec/migrateNative.ts +167 -0
- package/src/spec/parser.ts +73 -77
- package/src/spec/reqRegistry.ts +8 -9
- 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,65 +1,40 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "llman-sdd-specs-compact"
|
|
3
|
-
description: "
|
|
3
|
+
description: "压缩去重 specs:合并冗余 requirement/scenario,规范行为不变。仅用户明确要求时手动运行。"
|
|
4
4
|
metadata:
|
|
5
5
|
version: "{{ llman_version }}"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# LLMAN SDD Specs Compact
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
## Pipeline 位置
|
|
13
|
-
|
|
14
|
-
```mermaid
|
|
15
|
-
flowchart LR
|
|
16
|
-
archive["llman-sdd-archive<br/>归档完成后"] --> compact
|
|
17
|
-
compact["📎 llman-sdd-specs-compact<br/>压缩重构 specs(维护工具)"]
|
|
18
|
-
|
|
19
|
-
style compact fill:#e8f4e8,stroke:#28a745,stroke-width:2px
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
> 📎 维护工具,通常在归档积累较多后执行。日常开发 → `llman-sdd-propose`(含 Branch binding + Specs landing)/ `llman-sdd-apply`(须 `readyToImplement`)。
|
|
10
|
+
在不改变规范行为的前提下压缩 specs。维护工具,不属于日常 pipeline,通常在归档积累较多后执行。
|
|
23
11
|
|
|
24
12
|
## Context
|
|
25
|
-
- specs
|
|
26
|
-
-
|
|
27
|
-
- 当 archive 历史过大时,会干扰压缩评审与定位。
|
|
13
|
+
- specs 随变更积累膨胀,出现重复 requirement/scenario;压缩必须可验证、可回归。
|
|
14
|
+
- archive 历史过大时会干扰压缩评审与定位。
|
|
28
15
|
|
|
29
16
|
## Goal
|
|
30
|
-
-
|
|
31
|
-
- 形成更紧凑且可维护的规范结构。
|
|
17
|
+
- 合并冗余 requirement/scenario,形成更紧凑可维护的规范结构。
|
|
32
18
|
|
|
33
19
|
## Constraints
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
- 每个保留 requirement 至少保留一个有效 scenario。
|
|
37
|
-
- **编辑 live `llmanspec/specs/**` 须走 change**:先 Branch binding(`change start` / `attach`),在绑定分支上做 Specs landing 式提交;**禁止**在默认分支直接压缩改写 live specs。
|
|
20
|
+
- 未经明确替代不得删除规范性行为;尽量保持 requirement 标题稳定;每个保留 requirement 至少一个有效 scenario。
|
|
21
|
+
- **改 `llmanspec/specs/**` 须走 change**:先绑定分支(`change start` / `attach`),在绑定分支上编辑提交;**禁止**在默认分支直接压缩改写。
|
|
38
22
|
|
|
39
23
|
## Workflow
|
|
40
|
-
1.
|
|
41
|
-
2.
|
|
42
|
-
|
|
43
|
-
- 执行:`llman-sdd archive freeze --before <YYYY-MM-DD> --keep-recent <N>`
|
|
44
|
-
3. 识别跨 capability 的重叠项。
|
|
24
|
+
1. 盘点 specs(`llman-sdd list --specs`)。
|
|
25
|
+
2. 归档历史较大时先 freeze:预览 `llman-sdd archive freeze --dry-run`;执行 `llman-sdd archive freeze --before <YYYY-MM-DD> --keep-recent <N>`。
|
|
26
|
+
3. 识别跨 capability 重叠(跨 specs 重复 req id:`llman-sdd project dedupe-req-ids --dry-run` 报告重映射计划)。
|
|
45
27
|
4. 产出压缩计划(canonical requirements + keep/merge/remove 决策 + 迁移说明)。
|
|
46
|
-
5. 执行并验证(`llman-sdd validate --specs --strict
|
|
28
|
+
5. 执行并验证(`llman-sdd validate --specs --strict`)。
|
|
47
29
|
|
|
48
30
|
## Decision Policy
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
- archive 目录噪声较大时,优先建议先 freeze 再压缩。
|
|
52
|
-
- 若压缩会改变外部行为,必须先暂停并询问用户。
|
|
31
|
+
- 语义等价优先合并;仅引用关系清晰时提取共享文本;archive 噪声大时先 freeze 再压缩。
|
|
32
|
+
- 若压缩会改变外部行为,先暂停并询问用户。
|
|
53
33
|
|
|
54
34
|
## Output Contract
|
|
55
|
-
-
|
|
56
|
-
- 包含:keep/merge/remove 决策及理由。
|
|
57
|
-
- 包含验证命令与预期结果。
|
|
58
|
-
|
|
59
|
-
> 💡 维护完成后,新需求走正常 pipeline:`llman-sdd-propose`(含 Branch binding + Specs landing)→ `llman-sdd-apply`(须 `readyToImplement`)→ `llman-sdd-verify` → `llman-sdd-archive`。
|
|
35
|
+
- 按 capability 分组的压缩方案:keep/merge/remove 决策及理由 + 验证命令与预期结果。
|
|
60
36
|
|
|
61
|
-
|
|
62
|
-
> 文中「规约」= 本项目 `llmanspec/specs/` 下的 `.feature` 文件;用 `llman-sdd list --specs` / `llman-sdd show <capability>` 查全文。
|
|
37
|
+
{{ unit("skills/cli-footer") }}
|
|
63
38
|
|
|
64
39
|
{{ unit("skills/validation-hints") }}
|
|
65
40
|
|
|
@@ -1,31 +1,27 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "llman-sdd-validate"
|
|
3
|
-
description: "校验
|
|
3
|
+
description: "校验 change 与 specs,给出修复提示。"
|
|
4
4
|
metadata:
|
|
5
5
|
version: "{{ llman_version }}"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# LLMAN SDD 校验
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
校验 change/spec 格式与过期状态。
|
|
11
11
|
|
|
12
12
|
## 步骤
|
|
13
|
-
1.
|
|
14
|
-
2.
|
|
15
|
-
3. 在 CI 或自动化场景中使用 `--strict` 与 `--no-interactive`。
|
|
16
|
-
4. 若校验失败,汇总错误并给出最小、可执行的修复建议。
|
|
13
|
+
1. 单个:`llman-sdd validate <id>`;批量:`llman-sdd validate --all`(或 `--changes` / `--specs`);CI/自动化用 `--strict`。
|
|
14
|
+
2. 校验失败时汇总错误,给出最小可执行的修复建议。
|
|
17
15
|
{% if bdd_enabled %}
|
|
18
|
-
|
|
19
|
-
- 在**绑定分支**上验证
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
- `
|
|
23
|
-
-
|
|
24
|
-
- Change JSON 状态字段:`stage`(draft/designed/planned/full)/ `specsLanded` / `needsSpecsChange` / `readyToImplement`(`show --json`)。
|
|
16
|
+
3. **BDD 校验**:
|
|
17
|
+
- 在**绑定分支**上验证 `.feature` Gherkin 与 `@req` / 双写门禁;`.feature` 是 harness 权威——可执行 GWT 只在其中维护。
|
|
18
|
+
- 生命周期门禁:`change start` / `attach`(绑定分支)、`finalize`(收口;自动提交 `archive(sdd): <id>`,`--no-commit` 跳过)/ `diff`(只读)。
|
|
19
|
+
- `llman-sdd validate --specs` 做结构与合约门禁;配置 `bdd.run_command` 时缺省执行该 harness(`--no-check` 跳过,`--check` 为兼容别名),无占位符的命令每次调用至多执行一次。
|
|
20
|
+
- `list --specs --json` 查看 `morphology`(ruleCount / ruleEnforcedCount / rulePendingCount / acceptanceCount / featureScenarioCount)。
|
|
21
|
+
- change JSON 状态字段:`stage`(draft/designed/planned/full)/ `specsLanded` / `needsSpecsChange` / `readyToImplement`(`show --output json`)。
|
|
25
22
|
{% endif %}
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
> 文中「规约」= 本项目 `llmanspec/specs/` 下的 `.feature` 文件;用 `llman-sdd list --specs` / `llman-sdd show <capability>` 查全文。
|
|
24
|
+
{{ unit("skills/cli-footer") }}
|
|
29
25
|
|
|
30
26
|
{{ unit("skills/validation-hints") }}
|
|
31
27
|
|
|
@@ -1,56 +1,44 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "llman-sdd-verify"
|
|
3
|
-
description: "
|
|
3
|
+
description: "验证已实施 change 与 specs/design/tasks 是否一致,产出 CRITICAL/WARNING/SUGGESTION 分级报告。apply 后运行,全绿可归档。"
|
|
4
4
|
metadata:
|
|
5
5
|
version: "{{ llman_version }}"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# LLMAN SDD Verify
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
验证实现是否与该 change 的工件一致。
|
|
11
11
|
|
|
12
12
|
## Pipeline 位置
|
|
13
13
|
|
|
14
|
-
### Skill 导航(非生命周期;仅指示当前 skill)
|
|
15
|
-
|
|
16
14
|
```mermaid
|
|
17
15
|
flowchart LR
|
|
18
|
-
apply["llman-sdd-apply
|
|
19
|
-
verify["
|
|
20
|
-
verify --> archive["llman-sdd-archive<br/>归档"]
|
|
16
|
+
apply["llman-sdd-apply"] --> verify["★ llman-sdd-verify"]
|
|
17
|
+
verify --> archive["llman-sdd-archive"]
|
|
21
18
|
|
|
22
19
|
style verify fill:#fff3cd,stroke:#ffc107,stroke-width:3px
|
|
23
20
|
```
|
|
24
21
|
|
|
25
|
-
> 📍
|
|
26
|
-
> 🗺️ Skill 导航 ≠ Git-native 生命周期;完整生命周期见底部 brief 单元。
|
|
22
|
+
> 📍 你在验证阶段 → 通过则 `llman-sdd-archive`,失败回 `llman-sdd-apply` 修复。对象应已落地 specs 且 `readyToImplement=true`(全门绿——完成信号)。
|
|
27
23
|
|
|
28
24
|
## 硬约束
|
|
29
25
|
|
|
30
|
-
-
|
|
31
|
-
- **CRITICAL
|
|
32
|
-
-
|
|
26
|
+
- **必须先 apply 全绿**:未完成实现的 change 跳过验证。
|
|
27
|
+
- **CRITICAL 必须修复**:归档前清零。
|
|
28
|
+
- **亲自复跑门禁**:MUST 亲自重跑 `llman-sdd validate <id> --strict`(真实 harness)与项目门禁,MUST NOT 采信实现者报告的门禁结论;复跑结果与报告不符 → CRITICAL。
|
|
29
|
+
- **`--no-check` 不是证据**:以 `--no-check` 取得的门禁证据 → CRITICAL。收口会执行已配置的 `bdd.run_command`,收口前不必再跑一遍;`--no-check` 打出的跳过说明不是通过。
|
|
30
|
+
- **不要问「要不要继续」**:跑完整验证流程,输出完整报告。
|
|
33
31
|
|
|
34
32
|
{{ unit("skills/stage-guard") }}
|
|
35
33
|
|
|
36
34
|
## 步骤
|
|
37
|
-
1. 确定 change id(不明确时让用户从 `llman-sdd list --json`
|
|
38
|
-
2.
|
|
39
|
-
- `
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
-
|
|
43
|
-
- `
|
|
44
|
-
- `tasks.md`(理解实现范围)
|
|
45
|
-
- `llmanspec/changes/<id>/specs/` 若残留旧文档可忽略;SSOT 是 live specs
|
|
46
|
-
4. **双轴审查(标准轴 + 合约轴分离,互不掩盖)**——对比 diff(`git diff <merge-base>...HEAD`,merge-base 用现算 `git merge-base <本地默认分支> HEAD`;存储的 base_sha 仅作审计、MUST NOT 参与范围计算)分两轴:
|
|
47
|
-
- **合约轴(Spec)**:实现是否满足 `@human` 规则的 MUST/SHALL 与 `@executable` 的 GWT。
|
|
48
|
-
- 缺失/部分实现的行为、错误实现、以及 diff 中未被 spec 要求的超范围改动。
|
|
49
|
-
- 给出最小修复建议,或建议更新 artifacts。
|
|
50
|
-
- **标准轴(Standards)**:代码是否符合 `AGENTS.md` 的编码规范 + 常见代码坏味(code smell)清单。
|
|
51
|
-
- **权威优先级**:`AGENTS.md` 文档规范 > 坏味清单(文档说了算);工具已强制的项跳过。
|
|
52
|
-
- 坏味标记为**判断性提示**(「可能是 Feature Envy」),不是硬性违规。
|
|
53
|
-
- 坏味清单(每项「是什么 → 怎么修」):
|
|
35
|
+
1. 确定 change id(不明确时让用户从 `llman-sdd list --json` 选)。
|
|
36
|
+
2. 快速校验门禁:`llman-sdd validate <id> --strict`。
|
|
37
|
+
- 诊断结构问题(Gherkin 解析 / `@req` 链接 / 双写 / req_id 唯一性)先跑结构校验(配置 `bdd.run_command` 时 validate 缺省执行该 harness,`--no-check` 跳过;harness 失败以 ERROR 落在对应 spec 条目)。失败项在缺省 TOON 输出的 `items[].issues[]` 逐条列出(`--output human` 输出 `FAIL <item_type>/<id>` 行,位于 `Totals` 上方)。
|
|
38
|
+
3. 阅读:分支上的 `llmanspec/specs/**`(`<capability>.feature`,唯一事实来源)、`proposal.md` 与 `design.md`(如有)、`tasks.md`;`changes/<id>/specs/` 若有残留旧文档可忽略。
|
|
39
|
+
4. **双轴审查(两轴分离,互不掩盖)**——对比 diff(`git diff <merge-base>...HEAD`,merge-base 现算 `git merge-base <本地默认分支> HEAD`;存储的 base_sha 仅审计、MUST NOT 参与范围计算):
|
|
40
|
+
- **合约轴**:实现是否满足 `规则:` 块的需求表述(描述为自由文本,以其语义为准)与嵌套 `场景:` 的 GWT 步骤?缺失/部分实现、错误实现、spec 未要求的超范围改动 → 给最小修复建议或建议更新工件。前后对比类证据(计数、基线)核对测量位置:MUST 在 change 分支上测量(相对现算 merge-base);默认分支测得的值通常恒为基线,不构成证据。
|
|
41
|
+
- **标准轴**:代码是否符合 `AGENTS.md` 规范 + 常见坏味清单。权威优先级:`AGENTS.md` > 坏味清单;工具已强制的跳过。坏味是**判断性提示**(「可能是 Feature Envy」),不是硬性违规:
|
|
54
42
|
|
|
55
43
|
| 坏味 | 怎么修 |
|
|
56
44
|
|------|--------|
|
|
@@ -64,32 +52,23 @@ flowchart LR
|
|
|
64
52
|
| Divergent Change(一个文件因多个无关原因被改) | 拆分 |
|
|
65
53
|
| Speculative Generality(为未发生的需求加抽象) | 删掉 |
|
|
66
54
|
| Message Chains(长链 a.b().c()) | 隐入一个方法 |
|
|
67
|
-
| Middle Man(只转发) |
|
|
55
|
+
| Middle Man(只转发) | 删掉直连 |
|
|
68
56
|
| Refused Bequest(子类拒绝大部分继承) | 改组合 |
|
|
69
57
|
- 两轴可并行(sub-agent)审查;报告 MUST 分离呈现,MUST NOT 合并或交叉重排(一轴通过不能掩盖另一轴失败)。
|
|
70
|
-
5. **BDD
|
|
71
|
-
- 确认 change
|
|
72
|
-
- `llman-sdd validate --specs`:Gherkin + `@req
|
|
73
|
-
- 可选只读审查:`llman-sdd change diff <id>`(或 `--export-patch <path
|
|
74
|
-
-
|
|
75
|
-
- verify 通过后下一步:`llman-sdd-archive`(勿在此 inline finalize)。
|
|
58
|
+
5. **BDD 验证**——仅当 `config.yaml` 含 `bdd:` 段:
|
|
59
|
+
- 确认 change 已绑定分支且当前在该分支上。
|
|
60
|
+
- `llman-sdd validate --specs`:Gherkin + `@req`/双写门禁;配置 `bdd.run_command` 时缺省执行该 harness(`--no-check` 跳过),失败映射为对应 spec 条目的 ERROR。
|
|
61
|
+
- 可选只读审查:`llman-sdd change diff <id>`(或 `--export-patch <path>`)——仅审查/导出,绝不当作 apply 步骤。
|
|
62
|
+
- verify 通过后下一步 `llman-sdd-archive`(勿在此 inline finalize)。
|
|
76
63
|
{% if bdd_verify_prompt %}
|
|
77
64
|
- 额外要求: {{ bdd_verify_prompt }}
|
|
78
65
|
{% endif %}
|
|
79
|
-
6.
|
|
80
|
-
|
|
81
|
-
- **WARNING**(建议修复)
|
|
82
|
-
- **SUGGESTION**(可选优化)
|
|
83
|
-
7. **人审检查点**:报告无 CRITICAL 后、建议归档前,运行 `llman-sdd review`:
|
|
84
|
-
- 退出码为零 → 建议 `llman-sdd-archive` 进行 finalize/archive。
|
|
85
|
-
- 非零退出 = CRITICAL 发现:用 `llman-sdd-apply` 修复后重跑 review;MUST NOT 带着 CRITICAL 进入 finalize/archive。
|
|
86
|
-
|
|
87
|
-
> 💡 验证通过 → 下一步 `llman-sdd-archive`(归档);有 CRITICAL → 回到 `llman-sdd-apply`(修复)
|
|
66
|
+
6. 输出简短报告:**CRITICAL**(归档前必须修复)/ **WARNING**(建议修复)/ **SUGGESTION**(可选优化)。
|
|
67
|
+
7. **人审关卡**:报告无 CRITICAL 后、建议归档前跑 `llman-sdd review`:退出码零 → 建议 `llman-sdd-archive`;非零 = CRITICAL → 用 `llman-sdd-apply` 修复后重跑 review;MUST NOT 带 CRITICAL 进入 finalize/archive。
|
|
88
68
|
|
|
89
69
|
{{ unit("skills/git-native-flow-brief") }}
|
|
90
70
|
{{ unit("skills/human-readable-summary") }}
|
|
91
|
-
|
|
92
|
-
> 文中「规约」= 本项目 `llmanspec/specs/` 下的 `.feature` 文件;用 `llman-sdd list --specs` / `llman-sdd show <capability>` 查全文。
|
|
71
|
+
{{ unit("skills/cli-footer") }}
|
|
93
72
|
|
|
94
73
|
{{ unit("skills/validation-hints") }}
|
|
95
74
|
|
|
@@ -1,40 +1,37 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "llman-sdd-wayfinder"
|
|
3
|
-
description: "
|
|
3
|
+
description: "把超出单会话的大型模糊工作拆成决策地图,逐个解决直到路径清晰。仅手动触发。"
|
|
4
4
|
metadata:
|
|
5
5
|
version: "{{ llman_version }}"
|
|
6
|
+
disable-model-invocation: true
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
# LLMAN SDD Wayfinder
|
|
9
10
|
|
|
10
|
-
一个又大又乱的工作来了——大到单个 agent
|
|
11
|
-
|
|
12
|
-
它把路径画成 llman SDD 的 **change 依赖图**(`llman-sdd graph`):每个子工作(ticket)解决一个**决策**而非交付一块代码,逐个解决直到路径清晰。
|
|
11
|
+
一个又大又乱的工作来了——大到单个 agent 会话装不下,从现在到**目的地**的路还看不见。这个 skill 不急着动手,先把路找出来:把路径画成 change 依赖图(`llman-sdd graph`),每个子工作(ticket)解决一个**决策**而非交付代码,逐个解决直到路径清晰。
|
|
13
12
|
|
|
14
13
|
## Pipeline 位置
|
|
15
14
|
|
|
16
|
-
辅助工具,用于主 pipeline
|
|
17
|
-
|
|
18
|
-
> 📍 这是独立可选 skill;地图清晰后 → `llman-sdd-propose`(把决策收拢为可建计划)。
|
|
15
|
+
辅助工具,用于主 pipeline 之前的**大型工作预规划**。地图清晰后 → `llman-sdd-propose` 收拢为可实施计划。
|
|
19
16
|
|
|
20
17
|
## 核心原则
|
|
21
18
|
|
|
22
|
-
- **只规划,不动手**:每个 ticket
|
|
23
|
-
-
|
|
24
|
-
- **单会话单 ticket
|
|
19
|
+
- **只规划,不动手**:每个 ticket 解决一个决策;地图完成于「路径清晰、无决策遗留」。想直接开干的冲动,通常是到了地图边界、该交接的信号。
|
|
20
|
+
- **用名字指代**:给人看的叙述里用 ticket 标题指代,MUST NOT 用裸 id/编号。
|
|
21
|
+
- **单会话单 ticket**(查资料 ticket 例外)。
|
|
25
22
|
|
|
26
23
|
## 地图结构
|
|
27
24
|
|
|
28
|
-
地图本身是一个 change(总纲 proposal
|
|
25
|
+
地图本身是一个 change(总纲 proposal),子决策是 `depends_on` 的子 change。用 `llman-sdd graph <map-id> --scope active` 可视化当前**可着手项**。
|
|
29
26
|
|
|
30
27
|
地图的 `proposal.md` 结构:
|
|
31
28
|
|
|
32
29
|
```markdown
|
|
33
30
|
## Destination(目的地)
|
|
34
|
-
|
|
31
|
+
<走到终点是什么样——spec/决策/变更。一两行。>
|
|
35
32
|
|
|
36
33
|
## Notes(备注)
|
|
37
|
-
<领域;每会话应查的 skill
|
|
34
|
+
<领域;每会话应查的 skill;常设偏好>
|
|
38
35
|
|
|
39
36
|
## Decisions so far(已定的决策)
|
|
40
37
|
<!-- 索引:每个已关闭 ticket 一行,结论要点 + 链接 -->
|
|
@@ -48,40 +45,39 @@ metadata:
|
|
|
48
45
|
|
|
49
46
|
## Ticket 类型
|
|
50
47
|
|
|
51
|
-
每个 ticket 是一个子 change,带 `wayfinder:<type>` 标注(写在 proposal
|
|
48
|
+
每个 ticket 是一个子 change,带 `wayfinder:<type>` 标注(写在 proposal 标题或 frontmatter):
|
|
52
49
|
|
|
53
|
-
- **Research(查资料,agent 自跑)**:读文档/API
|
|
50
|
+
- **Research(查资料,agent 自跑)**:读文档/API/本地资源,查出决策在等的事实。委托 `llman-sdd-research` 后台解决。
|
|
54
51
|
- **Prototype(做原型,需人参与)**:用廉价粗糙的可运行物(throwaway 小程序或 UI 变体)把讨论具象化。
|
|
55
52
|
- **逐问深挖(需人参与)**:用 `llman-sdd-explore` 的逐问深挖分支一问一答走清。**默认类型**。
|
|
56
|
-
- **Task
|
|
53
|
+
- **Task(杂活,人或 agent)**:决策前必须先做的手动工作(注册服务、迁数据以看清形状)。
|
|
57
54
|
|
|
58
55
|
## 尚未清晰区
|
|
59
56
|
|
|
60
|
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
57
|
+
地图**故意**不完整。判断一个点该不该现在立 ticket,只看一条:**现在能不能把问题说清楚**(不是能不能回答)。
|
|
58
|
+
- 能说清 → 立 ticket(即使暂时被挡)。
|
|
59
|
+
- 说不清 → 写进**尚未清晰区**(一团模糊日后可能变成多个 ticket,也可能一个都不变)。
|
|
63
60
|
|
|
64
61
|
## 步骤
|
|
65
62
|
|
|
66
63
|
### 画地图
|
|
67
|
-
1.
|
|
68
|
-
2.
|
|
64
|
+
1. **命名目的地**:用逐问深挖钉死这趟地图要通往哪里。
|
|
65
|
+
2. **广度优先扫可着手项**:再次逐问深挖,扇开而非深挖一条,浮出开放决策与现在能迈的第一步。若**没有模糊点浮出**——路径已清晰、一个会话能装下——不需要地图,停下问用户想怎么做。
|
|
69
66
|
3. **创建地图**(总纲 change):`llman-sdd change new <map-id>`,填 Destination/Notes,Decisions-so-far 留空,模糊点写进尚未清晰区。
|
|
70
|
-
4. **创建现在能说清的 ticket
|
|
67
|
+
4. **创建现在能说清的 ticket** 为子 change,再用 `llman-sdd graph` 接依赖边(先有 id 才能互引)。
|
|
71
68
|
5. 为每个查资料 ticket 启动 `llman-sdd-research` 后台 subagent。
|
|
72
69
|
6. 停——画图是单个会话的活,不要顺手解决任何决策。
|
|
73
70
|
|
|
74
71
|
### 推进地图
|
|
75
72
|
1. 加载地图(低分辨率视图,不用读每个 ticket 全文)。
|
|
76
|
-
2. 选 ticket
|
|
77
|
-
3. 解决它——按需深入(读相关 ticket 全文,调用 Notes 指定的 skill
|
|
78
|
-
4.
|
|
79
|
-
5. 新增 ticket
|
|
73
|
+
2. 选 ticket(用户指定或取可着手项第一个),先绑定分支(`change start` 或已有分支 `change attach`)占住它。规划文档可短暂在默认分支;ticket 要改 specs 时须在绑定分支落地。
|
|
74
|
+
3. 解决它——按需深入(读相关 ticket 全文,调用 Notes 指定的 skill);没把握时用逐问深挖。**不要**在未绑定时改 `llmanspec/specs/**`。
|
|
75
|
+
4. 记录解决:答案写入该 ticket 的 proposal 并关闭它,在地图 Decisions-so-far 追加一行要点 + 指针。
|
|
76
|
+
5. 新增 ticket(先建再接线);答案让模糊点变清晰的,升级为 ticket 并移出尚未清晰区;答案揭示某 ticket 越过目的地的,归入范围外而非在路径上解决。
|
|
80
77
|
|
|
81
78
|
## 输出
|
|
82
|
-
地图 change + 子决策 change 的依赖图(`llman-sdd graph
|
|
79
|
+
地图 change + 子决策 change 的依赖图(`llman-sdd graph`)。路径清晰后建议 `llman-sdd-propose` 收拢为可实施计划。
|
|
83
80
|
|
|
84
|
-
|
|
85
|
-
> 文中「规约」= 本项目 `llmanspec/specs/` 下的 `.feature` 文件;用 `llman-sdd list --specs` / `llman-sdd show <capability>` 查全文。
|
|
81
|
+
{{ unit("skills/cli-footer") }}
|
|
86
82
|
|
|
87
83
|
{{ unit("skills/structured-protocol") }}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
## Git
|
|
1
|
+
## Git 分支生命周期(摘要)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Skill 导航** ≠ **分支生命周期**。全图见根 `AGENTS.md` 或 `llman-sdd-propose` 内嵌图。
|
|
4
4
|
|
|
5
5
|
硬规则:
|
|
6
|
-
1.
|
|
7
|
-
2.
|
|
8
|
-
3. 收口用 `change finalize`(自动提交 `archive(sdd): <id>`;`--no-commit`
|
|
9
|
-
4. **禁止**在默认分支 commit
|
|
6
|
+
1. **先**绑定分支(`change start` / `attach`)→ full;**再**落地 specs(绑定分支上编辑并 commit `llmanspec/specs/**`)。
|
|
7
|
+
2. 无合约编辑 → `needs_specs_change: false`。`stage=full` 且 specs-landed 门通过即可进 apply;`readyToImplement=true`(全门绿)是 verify/finalize 前的完成信号。
|
|
8
|
+
3. 收口用 `change finalize`(自动提交 `archive(sdd): <id>`;`--no-commit` 跳过)。
|
|
9
|
+
4. **禁止**在默认分支 commit specs;已 attach 勿重复 `start`。
|
|
10
|
+
5. worktree(可选):`change start --worktree` 在独立 worktree 建分支、不动当前检出(`--base <branch>` 记录分叉源);finalize 目标被其他 worktree 持有时自动在该 worktree 内执行(输出标注位置)。
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
## Git
|
|
1
|
+
## Git 分支生命周期(权威全图)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
两层别混:**分支生命周期**(绑定分支 → 落地 specs → `readyToImplement`)与 **skill 导航**(explore→propose→apply→verify→archive)。落地 specs **不是**独立 skill。
|
|
4
4
|
|
|
5
5
|
```mermaid
|
|
6
6
|
flowchart TB
|
|
7
|
-
subgraph main_ok["
|
|
7
|
+
subgraph main_ok["可短暂在默认分支"]
|
|
8
8
|
A["change new → draft<br/>仅 proposal.md"]
|
|
9
9
|
B1["补 design.md → designed"]
|
|
10
10
|
B2["补 tasks.md → planned"]
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
subgraph
|
|
13
|
+
subgraph bind["绑定分支"]
|
|
14
14
|
C{"工作区干净<br/>且在默认分支?"}
|
|
15
15
|
D["change start<br/>建 sdd/<id> + 写 branch/base_branch/base_sha"]
|
|
16
16
|
E["或手动 checkout -b<br/>再 change attach"]
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
subgraph specs_only["仅在本 change 分支"]
|
|
20
|
-
F["编辑
|
|
21
|
-
G["commit →
|
|
20
|
+
F["编辑 llmanspec/specs/**(.feature)"]
|
|
21
|
+
G["commit → 落地 specs<br/>现算 merge-base...HEAD 含 specs 路径"]
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
subgraph implement["
|
|
24
|
+
subgraph implement["实施与收口"]
|
|
25
25
|
H["apply:按 tasks 改代码<br/>可继续改 specs"]
|
|
26
26
|
I["verify"]
|
|
27
|
-
J["finalize
|
|
27
|
+
J["finalize:合并(默认 squash)→ 改名 → 自动提交 archive(sdd): <id><br/>specs 首次进入目标分支"]
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
A --> B1 --> B2 --> C
|
|
@@ -34,7 +34,17 @@ flowchart TB
|
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
硬规则:
|
|
37
|
-
1. **先** `change start` / `attach
|
|
38
|
-
2.
|
|
39
|
-
3.
|
|
40
|
-
4. **禁止**为过干净树门禁把
|
|
37
|
+
1. **先** `change start` / `attach` 绑定分支(进入 full);**再**在绑定的非默认分支编辑 `llmanspec/specs/**` 并 commit(落地 specs)。
|
|
38
|
+
2. 无合约编辑的 change 设 frontmatter `needs_specs_change: false`。`stage=full` 且 specs-landed 门通过(specsLanded ∨ needs_specs_change=false)即可进 apply;`readyToImplement=true`(gateChecks 全过,含 tasks-done)是 verify/finalize 前的完成信号。diff 范围一律现算 merge-base;存储的 `base_sha` 仅审计。
|
|
39
|
+
3. 收口一律 `llman-sdd change finalize <id>`:自动提交 `archive(sdd): <id>`(实现 diff + 改名一笔);`--no-commit` 跳过自动提交。change 分支上提交自由(分段或 finalize 一次收尾均可)。
|
|
40
|
+
4. **禁止**为过干净树门禁把 specs commit 到默认分支;已 attach 勿重复 `start`。
|
|
41
|
+
|
|
42
|
+
Worktree 决策表:
|
|
43
|
+
|
|
44
|
+
| 工作形态 | 命令 | 判据 |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| 单检出 | `llman-sdd change start <id>` | 在默认分支且树干净;直接切到新分支 |
|
|
47
|
+
| 保留当前检出 / 并行 change | `llman-sdd change start <id> --worktree` | 分支建于独立 worktree(`sdd.worktree_root` / `sdd.worktree_naming` 可调,缺省仓库根兄弟目录),当前检出不动,输出含 worktree 路径;配 `--base <branch>` 记录非默认分叉源 |
|
|
48
|
+
| 已在 feature 分支(含手工 wt/git-worktree) | `llman-sdd change attach <id>` | 分支已存在;`--base <branch>` 显式记录分叉源 |
|
|
49
|
+
|
|
50
|
+
finalize 目标定位:目标分支被其他 worktree 持有时,`llman-sdd change finalize <id>` / `llman-sdd change archive <id>` 自动在该 worktree 内完成合并、改名与提交(输出含 `executed in target worktree <path>`);持有 worktree 脏时中止报错并列出处置选项(零写入)。
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
# 人读摘要(强制)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
先给出一段简短的人读摘要:
|
|
3
|
+
每份报告、交接或门禁输出,MUST 在任何机器细节之前先给人读摘要:
|
|
5
4
|
|
|
6
5
|
- **结论** — 一行(如「门禁全绿」/「发现 2 个 CRITICAL」)。
|
|
7
|
-
- **风险** —
|
|
8
|
-
- **待决策** —
|
|
6
|
+
- **风险** — 最多三条,按影响降序。
|
|
7
|
+
- **待决策** — 明确提问,或「无」。
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
十行以内;细节放折叠线以下。
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
## 阶段守卫(`stage` / `readyToImplement`)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
以权威 JSON 判定(勿凭「工件看着齐了」):
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
llman-sdd show <id> --json --type change
|
|
6
|
+
llman-sdd show <id> --output json --type change
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
读字段:`stage`、`specsLanded`、`needsSpecsChange`、`readyToImplement`、`gateChecks`(逐项 `pass` + 未过时的 `hint`)。
|
|
10
10
|
|
|
11
|
-
|
|
|
11
|
+
| 状态 | 动作 |
|
|
12
12
|
|------|------|
|
|
13
|
-
| `stage=draft`(仅 proposal.md) | STOP
|
|
14
|
-
| `stage=designed`(proposal + design) |
|
|
15
|
-
| `stage=planned`(proposal + design + tasks) | STOP
|
|
16
|
-
| `stage=full` 且 `readyToImplement=false` |
|
|
17
|
-
| `readyToImplement=true` |
|
|
13
|
+
| `stage=draft`(仅 proposal.md) | STOP。补 design.md → designed,补 tasks.md → planned,再绑定分支、落地 specs。draft 不能 apply/verify。若已有 proposal+tasks 而仍是 `draft`(缺 design.md——它是 stage 门槛):先补 design.md。**不要**建 `changes/<id>/specs/`,**不要**在默认分支改 specs。 |
|
|
14
|
+
| `stage=designed`(proposal + design) | 补 tasks.md → `planned`;规划文档齐全后再 `change start` / `attach`(绑定分支)。 |
|
|
15
|
+
| `stage=planned`(proposal + design + tasks) | STOP 直到绑定:`change start` / `attach` → `full`。 |
|
|
16
|
+
| `stage=full` 且 `readyToImplement=false` | 读未过的 `gateChecks` 分项。specs-landed 门未过 → 在**绑定分支**落地 specs(编辑 `llmanspec/specs/**` 并 commit),或设 `needs_specs_change: false`;**不要**重跑 `change start`(绑定分支上的 specs 丢失 → checkout/重建 + 必要时 `attach --force`)。specs-landed 门已绿而 tasks-done/validate/clean-tree 未过 → 实施中期的正常状态:继续 apply 勾 tasks,勿当落地失败。 |
|
|
17
|
+
| `readyToImplement=true` | 完成信号:gateChecks 全绿(tasks 全勾 + validate 通过)——verify/finalize 前置已满足。`changes/<id>/specs/` 预期**不存在**,勿当缺失。 |
|
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
## Context
|
|
2
|
-
- 先查状态再动手:change/spec 状态以 `llman-sdd show/list/validate`
|
|
3
|
-
- 读 spec 全文前先用 `llman-sdd context --task --paths` 定位相关 specs。
|
|
2
|
+
- 先查状态再动手:change/spec 状态以 `llman-sdd show/list/validate` 输出为准;读 spec 全文前先用 `llman-sdd context --task --paths` 定位。
|
|
4
3
|
|
|
5
4
|
## Goal
|
|
6
|
-
-
|
|
5
|
+
- 达成一个可验证结果;报告附结果路径与校验状态。
|
|
7
6
|
|
|
8
7
|
## Constraints
|
|
9
|
-
-
|
|
10
|
-
- 改动保持最小;已知校验错误禁止强行继续。
|
|
8
|
+
- 遵守正文硬约束(不复读)。先判断规模选路径:合约变更走完整 SDD,实现层走 quick;不确定选完整 SDD。改动最小;已知校验错误禁止强行继续。
|
|
11
9
|
|
|
12
10
|
## Workflow
|
|
13
|
-
- 每步以 `llman-sdd` 命令结果为事实来源;改动工件后必跑 `llman-sdd validate`。
|
|
14
|
-
- 命令细节见下方生成式命令参考或 `llman-sdd <cmd> --help`。
|
|
11
|
+
- 每步以 `llman-sdd` 命令结果为事实来源;改动工件后必跑 `llman-sdd validate`;命令细节见 `llman-sdd <cmd> --help`。
|
|
15
12
|
|
|
16
13
|
## Decision Policy
|
|
17
14
|
- 高影响歧义先澄清再继续;事实自己查证,只有决策问用户。
|
|
18
15
|
|
|
19
16
|
## Output Contract
|
|
20
|
-
-
|
|
17
|
+
- 先给人读摘要(结论 / 风险 / 待决策),机器细节随后。
|
|
21
18
|
|
|
22
19
|
## Ethics Governance
|
|
23
20
|
- `ethics.risk_level`:low——仅读写本仓库与 `llmanspec/`,无外发动作;正文另有声明时从其声明。
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
校验修复(单轨 feature-as-spec):
|
|
2
2
|
|
|
3
|
-
1
|
|
4
|
-
每个 capability `.feature`(`llmanspec/specs/<capability>.feature` 或 `llmanspec/specs/<capability>/<capability>.feature`)必须以以下注释开头:
|
|
3
|
+
1)缺头注释(`missing # capability: header comment`):每个 capability `.feature`(`llmanspec/specs/<capability>.feature` 或目录内同名主文件)必须以下列注释开头:
|
|
5
4
|
```
|
|
6
5
|
# language: zh-CN
|
|
7
6
|
# capability: <capability>
|
|
@@ -9,16 +8,13 @@
|
|
|
9
8
|
# scope: src/
|
|
10
9
|
```
|
|
11
10
|
|
|
12
|
-
2
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
11
|
+
2)原生分层格式(`rule must carry an @req:<req_id> tag on the rule header`):
|
|
12
|
+
- 规范样式只有一种:`@req:<id>` 挂在 `规则:` 块头标签,块内嵌套 `场景:`(假如/当/那么)是可执行示例——默认首选。
|
|
13
|
+
- 仅当需求无法程序化表达或暂不转写时才保留无嵌套场景的 `规则:`(裸规则):描述自由文本,无 MUST/SHALL 强制;validate 以聚合计数提示,review `pending` 信号计量,specs-compact 负责压降。
|
|
14
|
+
- 历史标签 `@executable`/`@rule`/`@human`/`@manual` 不再使用、解析惰性;旧文件报结构问题时运行 `llman-sdd spec migrate-native` 迁移。
|
|
15
|
+
- 不在任何 `规则:` 内的顶层 `场景:` 是功能级示例:无规则句柄、不告警、不参与规则统计(Gherkin 原生语义)。
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
- **Branch binding** → **Specs landing**:先 `change start` / `attach`,再在绑定的非默认分支编辑 live `.feature` 并 commit。
|
|
22
|
-
- 锁定规则(报告制):改/删既有 `@human` 场景只出 WARNING,不阻断 validate / change finalize / change diff;报告按 `@req:<id>` 指明被改的是哪条规则。控制点:git 分支对比 + `llman-sdd review` / `change diff` 的报告浮现。旧的锁定确认元数据(frontmatter `rules_touched` / `agent_acked`、`@agent` tag、`--yes` 的确认语义)已全部删除,无别名、无兼容层。
|
|
23
|
-
- apply 前须 `readyToImplement=true`(或 `needs_specs_change: false`)。收尾优先 `change finalize`。
|
|
24
|
-
- 勿使用 `change delta` / solidify / `*.feature.delta.toon`。
|
|
17
|
+
分支护栏:
|
|
18
|
+
- 先 `change start` / `attach` 绑定分支,再在绑定的非默认分支编辑 `.feature` 并 commit(落地 specs)。
|
|
19
|
+
- 锁定规则(报告制):改/删既有 `规则:` 块只出 WARNING,不阻断 validate / finalize / `change diff`;报告按 `@req:<id>` 指明被改规则。控制点:git 分支对比 + `llman-sdd review` / `change diff`。旧锁定确认元数据(frontmatter `rules_touched` / `agent_acked`、`@agent` tag、`--yes` 确认语义)已全部删除,无别名无兼容层。
|
|
20
|
+
- `stage=full` 且 specs-landed 门通过(specsLanded ∨ `needs_specs_change: false`)即可进 apply;verify/finalize 须 `readyToImplement=true`(完成信号)。收口优先 `change finalize`。
|