@llman-sdd/core 0.3.1 → 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.
Files changed (107) hide show
  1. package/package.json +2 -1
  2. package/src/archive/freeze.ts +86 -18
  3. package/src/archive/frozenCard.ts +105 -0
  4. package/src/archive/sevenzip.ts +15 -13
  5. package/src/change/closeOutHarness.ts +29 -0
  6. package/src/change/collect.ts +140 -0
  7. package/src/change/frontmatter.ts +48 -6
  8. package/src/change/id.ts +2 -6
  9. package/src/change/lifecycle.ts +285 -86
  10. package/src/change/nextId.ts +63 -2
  11. package/src/change/resolve.ts +2 -2
  12. package/src/change/tasks.ts +59 -0
  13. package/src/config/changeId.ts +14 -12
  14. package/src/config/load.ts +14 -0
  15. package/src/config/schema.ts +4 -41
  16. package/src/config/surface.ts +6 -36
  17. package/src/context/indexStore.ts +7 -3
  18. package/src/context/retrieve.ts +8 -10
  19. package/src/context/tree.ts +28 -24
  20. package/src/git/spawnGit.ts +90 -2
  21. package/src/index.ts +67 -59
  22. package/src/init/defaultConfig.ts +1 -5
  23. package/src/init/init.ts +19 -4
  24. package/src/ports.ts +1 -7
  25. package/src/project/migrateNotes.ts +104 -0
  26. package/src/render/machine.ts +30 -0
  27. package/src/report/collect.ts +11 -127
  28. package/src/report/graph/analysis.ts +152 -0
  29. package/src/report/graph/deps.ts +30 -0
  30. package/src/report/graph/graphData.ts +53 -0
  31. package/src/report/graph/nodes.ts +130 -0
  32. package/src/report/graph/render.ts +83 -0
  33. package/src/report/graph/types.ts +47 -0
  34. package/src/report/graph.ts +9 -381
  35. package/src/report/show.ts +20 -22
  36. package/src/report/specHelpers.ts +42 -21
  37. package/src/report/specs.ts +23 -25
  38. package/src/review/review.ts +45 -30
  39. package/src/spec/authoring.ts +91 -63
  40. package/src/spec/ir.ts +43 -15
  41. package/src/spec/migrateNative.ts +167 -0
  42. package/src/spec/parser.ts +73 -77
  43. package/src/spec/reqRegistry.ts +8 -9
  44. package/src/templates/embedded.ts +10 -16
  45. package/src/templates/engine.ts +10 -5
  46. package/src/templates/locale.ts +1 -1
  47. package/src/templates/skills.ts +4 -5
  48. package/src/validation/changeCheck.ts +128 -105
  49. package/src/validation/harness.ts +161 -0
  50. package/src/validation/staleness.ts +9 -5
  51. package/src/validation/validate.ts +60 -88
  52. package/templates/en/skills/llman-sdd-apply-cycle.md +20 -28
  53. package/templates/en/skills/llman-sdd-apply.md +58 -76
  54. package/templates/en/skills/llman-sdd-arch-review.md +12 -19
  55. package/templates/en/skills/llman-sdd-archive.md +27 -42
  56. package/templates/en/skills/llman-sdd-continue.md +17 -24
  57. package/templates/en/skills/llman-sdd-draft.md +17 -28
  58. package/templates/en/skills/llman-sdd-explore.md +29 -43
  59. package/templates/en/skills/llman-sdd-ff.md +12 -17
  60. package/templates/en/skills/llman-sdd-graph.md +14 -32
  61. package/templates/en/skills/llman-sdd-propose.md +48 -63
  62. package/templates/en/skills/llman-sdd-quick.md +12 -27
  63. package/templates/en/skills/llman-sdd-research.md +13 -24
  64. package/templates/en/skills/llman-sdd-specs-compact.md +14 -39
  65. package/templates/en/skills/llman-sdd-validate.md +11 -15
  66. package/templates/en/skills/llman-sdd-verify.md +23 -44
  67. package/templates/en/skills/llman-sdd-wayfinder.md +18 -22
  68. package/templates/en/units/skills/cli-footer.md +2 -0
  69. package/templates/en/units/skills/git-native-flow-brief.md +7 -6
  70. package/templates/en/units/skills/git-native-flow.md +21 -11
  71. package/templates/en/units/skills/human-readable-summary.md +2 -3
  72. package/templates/en/units/skills/stage-guard.md +7 -7
  73. package/templates/en/units/skills/structured-protocol.md +5 -8
  74. package/templates/en/units/skills/validation-hints.md +10 -14
  75. package/templates/en/units/spec/feature-contract.md +27 -16
  76. package/templates/en/units/workflow/archive-freeze-guidance.md +6 -3
  77. package/templates/zh-Hans/skills/llman-sdd-apply-cycle.md +23 -31
  78. package/templates/zh-Hans/skills/llman-sdd-apply.md +63 -81
  79. package/templates/zh-Hans/skills/llman-sdd-arch-review.md +21 -28
  80. package/templates/zh-Hans/skills/llman-sdd-archive.md +29 -44
  81. package/templates/zh-Hans/skills/llman-sdd-continue.md +17 -24
  82. package/templates/zh-Hans/skills/llman-sdd-draft.md +18 -29
  83. package/templates/zh-Hans/skills/llman-sdd-explore.md +34 -48
  84. package/templates/zh-Hans/skills/llman-sdd-ff.md +13 -18
  85. package/templates/zh-Hans/skills/llman-sdd-graph.md +16 -34
  86. package/templates/zh-Hans/skills/llman-sdd-propose.md +51 -65
  87. package/templates/zh-Hans/skills/llman-sdd-quick.md +15 -30
  88. package/templates/zh-Hans/skills/llman-sdd-research.md +17 -28
  89. package/templates/zh-Hans/skills/llman-sdd-specs-compact.md +15 -40
  90. package/templates/zh-Hans/skills/llman-sdd-validate.md +11 -15
  91. package/templates/zh-Hans/skills/llman-sdd-verify.md +26 -47
  92. package/templates/zh-Hans/skills/llman-sdd-wayfinder.md +25 -29
  93. package/templates/zh-Hans/units/skills/cli-footer.md +2 -0
  94. package/templates/zh-Hans/units/skills/git-native-flow-brief.md +7 -6
  95. package/templates/zh-Hans/units/skills/git-native-flow.md +22 -12
  96. package/templates/zh-Hans/units/skills/human-readable-summary.md +4 -5
  97. package/templates/zh-Hans/units/skills/stage-guard.md +9 -9
  98. package/templates/zh-Hans/units/skills/structured-protocol.md +5 -8
  99. package/templates/zh-Hans/units/skills/validation-hints.md +10 -14
  100. package/templates/zh-Hans/units/spec/feature-contract.md +25 -16
  101. package/templates/zh-Hans/units/workflow/archive-freeze-guidance.md +6 -2
  102. package/templates/en/skills/llman-sdd-onboard.md +0 -34
  103. package/templates/en/skills/llman-sdd-show.md +0 -24
  104. package/templates/en/units/migrate-prompt.md +0 -28
  105. package/templates/zh-Hans/skills/llman-sdd-onboard.md +0 -34
  106. package/templates/zh-Hans/skills/llman-sdd-show.md +0 -24
  107. package/templates/zh-Hans/units/migrate-prompt.md +0 -28
@@ -1,125 +1,107 @@
1
1
  ---
2
2
  name: "llman-sdd-apply"
3
- description: "在一个闭环内实施 llman SDD 变更的 tasks:写代码 → 跑测试 → 失败自修复 → 直到门禁全绿。自动更新 tasks.md 勾选状态并运行校验。用于提案完成后的实现阶段。"
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
- 使用此 skill 在**一个闭环内**按顺序完成 `llmanspec/changes/<id>/tasks.md` 的所有任务:
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<br/>提案"] --> apply
23
- apply["★ llman-sdd-apply ★<br/>实施(须 readyToImplement)"]
24
- apply --> verify["llman-sdd-verify<br/>验证"]
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
- > 📍 你现在在完整 Git-native 生命周期图中的 **H(apply)**:进入前须 Specs-landed(或 `needs_specs_change: false`)且 `readyToImplement=true` → 下一步 `llman-sdd-verify`
25
+ > 📍 进入前须 specs-landed 门通过(或 `needs_specs_change: false`);`readyToImplement=true`(全门绿)是本闭环的完成信号 → 下一步 `llman-sdd-verify`。
31
26
 
32
27
  ## 硬约束
33
28
 
34
- - **SSOT 驱动**:以 `proposal.md` / `design.md` / `tasks.md` 及 feature 分支上的 live `llmanspec/specs/**` 为唯一事实来源;specs 中的 MUST/SHALL 必须逐条落实。
35
- - **范围锁定**:只实现当前 change 的范围;禁止顺手修「无关问题」。
36
- - **最小改动**:改动保持最小并严格围绕当前 tasks。
37
- - **禁止猜测**:需求不明确、specs 与实现矛盾时,先 STOP 并报告,不要自行假定行为。
38
- - **不保留旧兼容层**:若 change 要求改行为,直接全量升级到新写法,除非 tasks/proposal 明确写了要兼容。
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 分支上提交自由**(无存档点概念:`change finalize` 不要求干净树):可按 task/里程碑分段提交(利于 review),也可保持工作区不提交、交给 finalize 一次收尾——两条路都是一等公民。`change checkpoint` 已不存在(调用它以非零退出报错并指向 finalize),因此没有「中途存档点」要维护;`change finalize` 对两种形态都原生支持(不要求干净树)。
45
- - **默认收尾**:全部 task 过门禁且 verify 全绿后,`llman-sdd change finalize <id>` 自动提交 `archive(sdd): <change-id>`(未提交的实现 diff + frontmatter + archive 改名一次提交)。不要在 apply 循环内 finalize。`--no-commit` 可跳过自动提交(手动/CI 历史、pre-commit hook 冲突场景)。
46
- - **blocker 中断**:必须因 blocker STOP 时,先做**一次** WIP commit(如 `wip(sdd): <change-id> <摘要>`)保全现场,再报告。
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
- - 读取并遵守:`llmanspec/config.yaml`、`AGENTS.md`(若存在)。
52
- - `git status --porcelain`:
53
- - 若工作区不干净且改动不属于当前 change:先 `git stash push -u -m "llman-sdd-apply autopilot backup"` 做备份。
54
- - 运行 `llman-sdd validate --all --strict --no-interactive`:
55
- - 若失败且与当前 change 无关,先停下报告(工件不一致会导致实现无法以 SSOT 驱动)。
56
- - **检查 spec valid_scope 完整性**:使用 `llman-sdd list --specs --json` 列出所有 spec,然后对每个 spec 验证其 `valid_scope` 中的每个路径是否存在于磁盘上。若存在缺失的文件/目录,停下并建议更新 spec(从 `valid_scope` 中移除已删除的路径)。
57
-
58
- ### 1) 选择变更 id 并检查前置条件
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
- - 使用 `llman-sdd context --task "<proposal 中的目标>" --paths "<specs 中的 scope>"` 获取相关 specs。
65
- - 若 context 不可用,运行 `llman-sdd index rebuild` 后重试。
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) 阅读 SSOT 工件
68
- 必须通读以下文件:
69
- - `llmanspec/changes/<id>/proposal.md`
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
- 将 `proposal.md` 和 `design.md` 中的决策整理为不可违反的硬约束清单。把 `tasks.md` 转成可执行的最小步骤序列(保持原顺序)。
60
+ 把 proposal/design 的决策整理为不可违反的硬约束清单;把 tasks.md 转成最小可执行步骤序列(保持原顺序)。
75
61
 
76
62
  ### 3) 展示状态
77
- - 进度:"N/M tasks complete"
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. **完成后立刻更新 checkbox**:`- [ ]` → `- [x]`。
84
- 3. 若 task 不明确、遇到 blocker、或发现 specs/design 与现实不一致 → STOP 并报告 blocker,不要自行假定。
85
-
86
- > 💡 上一阶段 `llman-sdd-propose`(已生成 tasks);完成本阶段后 → `llman-sdd-verify`(验证)
87
-
88
- ### 5) 验证与自修复循环(每个 task 或每批 task 完成后执行一次)
89
- 运行项目门禁命令(根据项目实际选择):
90
- - 相关测试集:`just test` 或 `cargo test --all`
91
- - 格式/lint:`just check` 或 `just lint` + `just fmt`
92
- - Git-native:留在绑定 feature 分支;按需编辑 live `llmanspec/specs/<capability>.feature`(扁平,或目录 `llmanspec/specs/<capability>/` 内主文件;规则 `@human`,验收 `@executable`);spec 改动后跑 `llman-sdd validate --specs`;分支上可自由提交(分段,或留脏交给 finalize)。勿使用 `change delta` / solidify / feature_delta;`change checkpoint` 已移除。
93
- - SDD 校验:`llman-sdd validate <id> --strict --no-interactive`
94
-
95
- **若失败 → 进入自修复循环(不要问要不要继续):**
96
- 1. 解析失败原因(测试失败 / lint / 格式 / 校验错误)。
97
- 2. **判定是否难定位的 bug**(测试失败原因不明 / 间歇性 flake / 回归且一眼看不穿):
98
- - **不是难定位的 bug**(明确的 lint/格式/编译错误/校验失败):进行最小修复(不扩大范围),先重跑「最小失败复现命令」再重跑全部门禁。
99
- - **难定位的 bug → 升级诊断子流程**:
100
- 1. **先建一个能复现失败的命令**(快、确定、agent 可运行,且能在这个 bug 上失败)——即一个能驱动真实 bug 路径并断言用户确切症状的命令。**MUST NOT 在没有这种命令前就开始猜原因**(盯着代码空想正是本流程要防止的失败)。
101
- 2. 运行并确认失败 → 最小化复现(逐个剔除输入/调用/配置/数据,只留关键部分)。
102
- 3. 生成 **3–5 个排序假设**,每个须可证伪(「若 X 是因,则改 Y 会让 bug 消失」)。
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. 若没有合适的边界(seam)写回归测试,记录该架构缺口(交 `llman-sdd-arch-review`;该 skill 未在 `extra_skills` 启用时,把缺口写入该 change 的 `proposal.md` Further Notes 段或 `design.md`,MUST NOT 因此中断闭环)。
105
- 3. 先重跑「最小失败复现命令」,再重跑全部门禁。
106
- 4. 记录为一轮自修复:`Round N:失败点 → 修复 → 重跑 → 通过/失败`。
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 轮**;超过仍不通过视为 blocker:停止并输出 blocker 报告(含最后一次失败命令与输出摘要、你已尝试的修复)。
97
+ **自修复上限 8 轮**;超过仍不过视为 blocker:停止并输出 blocker 报告(最后一次失败命令与输出摘要、已尝试的修复)。
109
98
 
110
- **人审检查点(每个 task 批次门禁通过后)**:批次全绿后、进入下一批次或输出完成报告前,运行 `llman-sdd review`:
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 完成 + 全部门禁通过后,输出结构化报告(见下方 Output Contract)。
117
- 然后建议运行 `llman-sdd-verify` 进入验证阶段。
118
-
119
- > 💡 实施完成 → 下一步 `llman-sdd-verify`(验证)
102
+ 所有 task 完成 + 全部门禁通过后输出结构化报告(见 Output Contract),然后建议 `llman-sdd-verify`。
120
103
 
121
- > 命令细节用 `llman-sdd <cmd> --help` 查看;命令参考以 CLI 为准,skill 不内嵌命令表。
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: "扫描 codebase 的薄模块(接口几乎等于实现),找出可以加深(藏更多行为到更小接口后)的候选。当用户想做架构审查、寻找模块加深机会、或想改善代码可测性与 AI 可导航性时使用。"
3
+ description: "架构审查:扫描薄模块(接口≈实现),给出加深候选,改善可测性与 AI 可导航性。"
4
4
  metadata:
5
5
  version: "{{ llman_version }}"
6
6
  ---
7
7
 
8
8
  # LLMAN SDD Architecture Review
9
9
 
10
- 扫描 codebase 的架构摩擦,找出**可以加深的模块**——把薄模块(接口几乎等于实现)改造成厚模块(小接口后藏大量行为)。目标是可测性与 AI 可导航性。
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
- 下面是一组关于模块形状的词,用来说清楚「哪里值得改」。MUST NOT 替换为「component」「service」「API」「boundary」(它们含义更宽、不够精确):
14
+ 描述模块形状的词;MUST NOT 替换为「component」「service」「API」「boundary」(含义更宽、不够精确):
21
15
 
22
16
  - **Module(模块)** — 有接口和实现的东西(函数/类/包/跨层切片都算)。
23
- - **Interface(接口)** — 调用者为正确使用所须知道的一切:类型签名,外加不变量、顺序约束、错误模式、性能特征。
24
- - **Depth(厚度)** — 接口背后的行为量。**厚** = 小接口后藏大量行为;**薄** = 接口几乎和实现一样复杂(调用者要懂的 ≈ 写代码要写的)。本 skill 要把薄的变厚。
25
- - **Seam(接缝)** — 不改调用处就能换实现的位置(接口栖身的地方)。llman 里接缝 = `*.feature` 的 GWT 步骤所驱动的公共边界。
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
- - 优先读 live `<capability>.feature`(单轨 SSOT)与 `design.md`(已有 ADR),MUST NOT 另建 `CONTEXT.md`。
35
- - 用 Agent 工具(subagent_type=Explore)走查 codebase,记录摩擦点:
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
- **删除验证**:对任何疑似薄的模块,想象删除它——复杂度是直接消失(它只是个透传,没价值)还是在 N 个调用点重新冒出来(它其实在扛事)?「重新冒出来」才是值得保留/加厚的信号。
43
+ **删除验证**:对疑似薄的模块想象删除它——复杂度直接消失(只是透传,没价值)还是在 N 个调用点重新冒出来(其实在扛事)?「重新冒出来」才是值得保留/加厚的信号。
50
44
 
51
- **ADR 冲突**:若候选与既有 `design.md` 决策矛盾,仅在摩擦真实到值得重开时才浮现,并在候选中标注(「与 design.md 的 X 决策冲突——但因…值得重开」)。
45
+ **ADR 冲突**:候选与既有 `design.md` 决策矛盾时,仅在摩擦真实到值得重开才浮现,并在候选中标注(「与 design.md 的 X 决策冲突——但因…值得重开」)。
52
46
 
53
47
  ### 3. 逐问深挖(用户选定候选后)
54
- 用户从候选中选一个后,运行 `llman-sdd-explore` 的**逐问深挖分支**(触发词「深挖」)逐个走清决策——约束、依赖、加深后的模块形状、接缝后放什么、哪些测试存活。
48
+ 运行 `llman-sdd-explore` 的**逐问深挖分支**(触发词「深挖」)走清决策——约束、依赖、加深后的模块形状、接缝后放什么、哪些测试存活。
55
49
 
56
- - 加深后的模块用到了 capability `.feature` 里没有的概念?→ 仅在 change 已 Branch binding 且当前在绑定分支上时,更新 live `.feature`(Specs landing);否则 STOP,先走 `llman-sdd-propose` / `change start`,**禁止**在默认分支改 live specs。
57
- - 用户以关键理由拒绝候选?→ 仅当「难逆转 + 无上下文会困惑 + 真实权衡」三者皆满足时,建议记入 `design.md`。
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;合约变更须经 Specs landing 才回写 live `<capability>.feature`)。
54
+ 候选清单(文本;可选 HTML 报告写 OS temp dir 不落 repo)+ 用户选定后的逐问深挖决策记录(回写 proposal;合约变更须在绑定分支落地后才回写 `.feature`)。
61
55
 
62
- > 命令细节用 `llman-sdd <cmd> --help` 查看;命令参考以 CLI 为准,skill 不内嵌命令表。
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: "归档已完成的 llman SDD 变更。自动合并回基准分支(squash 缺省),再将 change 文档改名到 archive/。在 verify 报告全绿后运行。"
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
- 使用此 skill 归档已完成的变更。前置:verify 全绿,且变更已 Branch binding、Specs landing 完成(或 `needs_specs_change: false`;归档时 live specs 已在绑定分支上)。`change finalize` **自动合并**到基准分支(目标:`--into` > 绑定 `base_branch` > 默认分支;方式:`--method` > 配置 `sdd.merge_method`,squash 缺省——feature diff + 改名收敛为目标分支单个 commit)、**将** change 文档改名到 `changes/archive/`,然后**自动提交** `archive(sdd): <change-id>`(实现 diff + 改名一次提交;`--no-commit` 跳过)。`change checkpoint` 已移除(无存档点概念:中途不必存档,`change finalize` 不要求干净树)。`git push` / Hosting PR 仅为可选。
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<br/>验证"] --> archive
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
- > 📍 你现在在归档阶段:Git-native 生命周期的最后一站。
23
- > 📎 若 specs 逐渐膨胀,可运行 `llman-sdd-specs-compact` 压缩。
21
+ > 📍 你在归档阶段:分支生命周期最后一站。specs 膨胀时可跑 `llman-sdd-specs-compact`。
24
22
 
25
23
  ## 硬约束
26
24
 
27
- - **必须先通过 verify 阶段全绿**:未通过验证的 change 禁止归档。
28
- - **须已 Branch binding**:`change start` / `attach` 已完成;无绑定则 STOP。
29
- - **SSOT 校验**:每个 change 归档前必须通过 `llman-sdd validate <id> --strict --no-interactive`。
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
- - 确定目标 ID:单个或批量(来自用户输入或 `llman-sdd list --json`)。
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
- - **人审检查点(每个 id 归档执行前,含批量)**:运行 `llman-sdd review --capability <id>`。退出码为零 → 继续;非零 = CRITICAL 发现:STOP 修复后重跑;MUST NOT 带着 CRITICAL 归档。
46
- - 先逐个校验:`llman-sdd validate <id> --strict --no-interactive`。
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
- - 默认:`llman-sdd change archive <id>`
51
- - 仅工具类变更:`llman-sdd change archive <id> --skip-specs`
52
- - **任一失败立即停止**,报告剩余未处理 ID。
53
- - **Git-native 收尾**:
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. 实现 live specs + 代码(工作区可保持脏;分支上提交自由——分段或完全不提交)
60
- 2. llman-sdd change finalize <id> # 门禁 + 合并(squash 缺省)+ 改名 + 自动提交
61
- 3. 可选:git commit --amend # 调整提交说明;git branch -D <feature> # squash 后分支不再是祖先,-d 会被 git 拒绝
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 此时留脏工作区并打印手动 `git commit` 命令。幂等重试:自动提交失败后重跑会识别已归档改名并补提交。
64
- - **Fallback:普通 `change archive <id>`**——同样的合并 + 改名,无自动提交;要求干净树。`checkpointed`/`checkpoint_sha` 字段已随 checkpoint 一同移除(无存档点概念:`change finalize` 不要求干净树)——无需预写任何存档字段,快照审查用 `change diff`。
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
- - 全部归档完成后执行:`llman-sdd validate --all --strict --no-interactive`。
68
- - 确认归档后的 specs 工件一致。
56
+ - 全部归档后 `llman-sdd validate --all --strict`,确认 specs 工件一致。
69
57
 
70
58
  ### 4) Commit 引导
71
- - finalize 已自动提交(`archive(sdd): <id>`);使用 `--no-commit` 时手动提交:`git add -A && git commit -m "archive(sdd): <id1>, <id2>"`(或本 skill 建议的格式)。
72
- - 可选:合并后 `git branch -D <feature>`(squash 后分支不再是 main 祖先,-d 会被拒绝)。push / Hosting PR 仅在用户或项目明确要求远程审查时才做。
73
- - **破坏性合约变更**(移除/重命名 frontmatter 字段、命令、tag 或 stage 值域)MUST 提供 `migrations/v<from>-v<to>/` 升级路径(README prompt + 一次性脚本,随仓库发布)——收口前确认它存在。
74
- - **archived `depends_on`**:archive 会把 change 目录改名为 `archive/YYYY-MM-DD-<id>`,但 validate 会把指向 archived/frozen id 的 `depends_on` 识别为 INFO(非 ERROR),所以**归档后无需**手动更新其它 change 的 `depends_on` frontmatter。
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
- > 命令细节用 `llman-sdd <cmd> --help` 查看;命令参考以 CLI 为准,skill 不内嵌命令表。
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: "继续已有 llman SDD 变更,创建下一个缺失工件。"
3
+ description: "继续已有 change:补建下一个缺失工件。"
4
4
  metadata:
5
5
  version: "{{ llman_version }}"
6
6
  ---
7
7
 
8
8
  # LLMAN SDD Continue
9
9
 
10
- 使用此 skill 继续已有变更,创建下一个缺失的 artifact。
10
+ 继续已有 change,创建下一个缺失工件。
11
11
 
12
12
  ## 步骤
13
- 1. 确定 change id:
14
- - 若用户已提供,直接使用。
15
- - 否则运行 `llman-sdd list --json` 并询问要继续哪个 change。
16
- - 始终说明:"使用变更:<id>"。
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>`(或分支已存在时用 `change attach <id>`)——Branch binding
24
- 5) 在**绑定分支**上编辑 live `llmanspec/specs/<capability>.feature`(扁平,或目录主文件)并 commit——Specs landing(无合约变更可设 `needs_specs_change: false`)
25
- 4. 只创建**一个**缺失 artifact(或在绑定分支上做一次 live spec/feature 编辑)。
26
- - continue 模式**不要**实现应用代码。
27
- - **不要**创建 `*.feature.delta.toon` 或 `changes/<id>/specs/` 下的文件。
28
- - **不要**在未 start/attach 前改公共 `llmanspec/specs/**`。
29
- 5. 若所有 artifact 已齐全,按 `llman-sdd show <id> --json` 建议下一步:
30
- - `readyToImplement=false` → 先完成 Specs landing(或 `needs_specs_change: false`);**不要**建议 apply
31
- - `readyToImplement=true` → 实施:`llman-sdd-apply`
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
- > 命令细节用 `llman-sdd <cmd> --help` 查看;命令参考以 CLI 为准,skill 不内嵌命令表。
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") }}
@@ -1,64 +1,53 @@
1
1
  ---
2
2
  name: "llman-sdd-draft"
3
- description: "快速把一个 change 想法记成草案提案(仅 proposal.md,经 `change new --from`)。不强制 tasks/design/specs/attach。用于随手记 idea 或未来需求;准备好后用 propose 正式化。"
3
+ description: "把 change 想法记成草案(仅 proposal.md,不问 id)。随手记 idea/未来需求;落实时走 propose。"
4
4
  metadata:
5
5
  version: "{{ llman_version }}"
6
6
  ---
7
7
 
8
8
  # LLMAN SDD 草案(Draft)
9
9
 
10
- 把一个 change 想法记成**草案提案**(仅 `proposal.md` skeleton)。这是「先把 idea / 未来需求记下来」的轻量入口——不做 triage、不写 tasks、不编辑 live specs、不 attach。等想法准备好落实时,用 `llman-sdd-propose` 正式化。
10
+ 把 change 想法记成**草案**(仅 `proposal.md` skeleton)——「先记下来」的轻量入口:不判断规模、不写 tasks、不改 specs、不 attach。落实时用 `llman-sdd-propose` 正式化。
11
11
 
12
12
  ## Pipeline 位置
13
13
 
14
14
  ```mermaid
15
15
  flowchart LR
16
- draft["★ llman-sdd-draft ★<br/>草案(你现在在这里)"] -.->|"正式化"| propose["llman-sdd-propose<br/>提案"]
17
- propose --> apply["llman-sdd-apply<br/>实施"]
18
- apply --> verify["llman-sdd-verify<br/>验证"]
19
- verify --> archive["llman-sdd-archive<br/>归档"]
16
+ draft["★ llman-sdd-draft"] -.->|"正式化"| propose["llman-sdd-propose"]
17
+ propose --> apply["llman-sdd-apply"] --> verify["llman-sdd-verify"] --> archive["llman-sdd-archive"]
20
18
 
21
19
  style draft fill:#fff3cd,stroke:#ffc107,stroke-width:3px
22
20
  ```
23
21
 
24
- > 📍 你现在在草案阶段 → 下一步:完善 `proposal.md`,然后运行 `llman-sdd-propose` 正式化
25
- > 📎 本技能创建**草案** change(仅 proposal.md)。完整提案走 Git-native:tasks → Branch binding → Specs landing(见 propose 的生命周期图)
26
- > 🗺️ Skill 导航 ≠ Git-native 生命周期;Branch binding / Specs landing 不是独立 skill
22
+ > 📍 草案阶段 → 下一步:完善 `proposal.md`,然后 `llman-sdd-propose` 正式化。
27
23
 
28
24
  ## 硬约束
29
25
 
30
- - **MUST NOT 询问用户 change id**:由 `change new --from` 从描述推导并告知用户。
31
- - **MUST NOT 创建 tasks/design/specs/attach**:本技能仅创建 `proposal.md` 草案壳。完整规划工件属于 `llman-sdd-propose`。
32
- - **MUST NOT 做 triage 或判断变更规模**:那是 propose 的职责。若用户想开始实现,建议 `llman-sdd-propose`。
33
- - **适用边界**:若描述明显涉及 MUST/SHALL 行为合约变更或多文件改动,建议用 `llman-sdd-propose` 而非停在草案——但仍先建草案壳以免想法丢失。
34
- - **frontmatter 有固定 schema**:充实 `proposal.md` 时只接受 `llmanspec/AGENTS.md`「Change Proposal Frontmatter SSOT」中的合法字段(含 `depends_on`、`blocks`、`branch`、`base_sha`、`needs_specs_change`)。`status`/`title`/`priority`/`author` 等会被 `llman-sdd validate` 报 ERROR 拒绝。生命周期阶段是推断量——用 `llman-sdd show`/`list` 查看,绝不写进 frontmatter。正文 MUST NOT 复读 frontmatter 字段(不要 `## Status` 段);正文 H1 用人类可读标题,不要复读 change id。
26
+ - **MUST NOT 询问 change id**:由 `change new --from` 从描述推导并告知用户。
27
+ - **MUST NOT 创建 tasks/design/specs/attach**:只建 `proposal.md` 草案;完整规划归 `llman-sdd-propose`。
28
+ - **MUST NOT 判断变更规模**:那是 propose 的职责。用户想开始实现 → 建议 `llman-sdd-propose`。
29
+ - **适用边界**:描述明显涉及 MUST/SHALL 合约变更或多文件改动时,建议 `llman-sdd-propose`——但仍先建草案以免想法丢失。
30
+ - **frontmatter 有固定 schema**:`proposal.md` 只接受 `llmanspec/AGENTS.md`「Change Proposal Frontmatter SSOT」的合法字段(`depends_on`、`blocks`、`branch`、`base_sha`、`needs_specs_change` 等);`status`/`title`/`priority`/`author` 会被 `llman-sdd validate` 报 ERROR。生命周期阶段是推断量(用 `llman-sdd show`/`list` 查),绝不写进 frontmatter。正文 MUST NOT 复读 frontmatter 字段(不要 `## Status` 段);H1 用人类可读标题,不复读 change id。
35
31
 
36
32
  ## 步骤
37
33
 
38
34
  ### 0) Preflight
39
- - 读取 `llmanspec/config.yaml` 了解项目上下文、规则、locale。
40
- - 必须存在 `llmanspec/`;若不存在,提示先运行 `llman-sdd init`,然后 STOP。
35
+ - 读 `llmanspec/config.yaml`;`llmanspec/` 不存在则提示先跑 `llman-sdd init`,然后 STOP。
41
36
 
42
37
  ### 1) 捕获描述
43
- - 直接采用用户的描述(如「draft: 加一个导出 json 的命令」「记一下: sdd change 应该支持 worktree」)。
44
- - **MUST NOT 询问 change id。** 由描述推导。
38
+ - 直接采用用户描述(如「draft: 加一个导出 json 的命令」「记一下: sdd change 应该支持 worktree」)。**MUST NOT 询问 change id。**
45
39
 
46
- ### 2) 创建草案壳
40
+ ### 2) 创建草案
47
41
  ```bash
48
42
  llman-sdd change new --from "<用户描述>"
49
43
  ```
50
- - CLI 会生成合法的 kebab-case id(清洗 + 校验),在 `llmanspec/changes/<生成的 id>/` 下创建 `proposal.md`(含 `## Why` / `## What Changes` TODO 段的 skeleton),并打印最终 id 与路径。
51
- - 若生成的 id 与既有 change 冲突,CLI 以非零退出码失败;建议改写描述或用 `--force` 覆盖(对草案很罕见)。
44
+ - CLI 生成合法 kebab-case id,在 `llmanspec/changes/<id>/` 建 `proposal.md`(含 `## Why` / `## What Changes` TODO 段),并打印 id 与路径。
45
+ - id 冲突时 CLI 非零退出;建议改写描述或 `--force` 覆盖(草案罕见)。
52
46
 
53
47
  ### 3) 告知并交接
54
- - **MUST 告知用户已生成的 id**(例如「已创建草案 change `<id>`,路径 `llmanspec/changes/<id>/proposal.md`」)。
55
- - 建议下一步:
56
- - 现在或稍后完善 `proposal.md`(Why / What Changes / Capabilities / Impact)。
57
- - 准备好落实时,运行 `llman-sdd-propose` 正式化(triage + tasks → `change start`/`attach` → Specs landing)。
48
+ - **MUST 告知生成的 id**(「已创建草案 change `<id>`,路径 `llmanspec/changes/<id>/proposal.md`」)。
49
+ - 建议下一步:完善 `proposal.md`(Why / What Changes / Capabilities / Impact);落实时跑 `llman-sdd-propose`。
58
50
 
59
- > 💡 草案已记 → 下一步:编辑 `proposal.md`,然后 `llman-sdd-propose` 正式化。
60
-
61
- > 命令细节用 `llman-sdd <cmd> --help` 查看;命令参考以 CLI 为准,skill 不内嵌命令表。
62
- > 文中「规约」= 本项目 `llmanspec/specs/` 下的 `.feature` 文件;用 `llman-sdd list --specs` / `llman-sdd show <capability>` 查全文。
51
+ {{ unit("skills/cli-footer") }}
63
52
 
64
53
  {{ unit("skills/ethics-governance") }}