kld-sdd 2.6.12 → 2.6.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -7
- package/kld-sdd-guide.html +428 -159
- package/lib/init.js +37 -7
- package/package.json +5 -2
- package/skywalk-sdd/index.cjs +2668 -415
- package/skywalk-sdd/metrics-v3.cjs +1153 -0
- package/skywalk-sdd/ontology/archive-package.cjs +120 -3
- package/skywalk-sdd/ontology/identity-index.cjs +9 -2
- package/skywalk-sdd/ontology/ontology-paths.cjs +73 -0
- package/skywalk-sdd/ontology/resolve-spec-root.cjs +20 -80
- package/skywalk-sdd/ontology/runtime.cjs +32 -22
- package/skywalk-sdd/ontology/structural-identity.cjs +11 -2
- package/skywalk-sdd/ontology/traceability-validator.cjs +16 -8
- package/skywalk-sdd/ontology/working-artifacts.cjs +4 -2
- package/skywalk-sdd/reporting/change-report-model.cjs +309 -0
- package/skywalk-sdd/reporting/change-report-renderer.cjs +425 -0
- package/skywalk-sdd/runtime-metadata.cjs +21 -0
- package/templates/hooks/claude/hooks/sdd-apply-test-gate.cjs +39 -9
- package/templates/hooks/claude/hooks/sdd-post-tool.cjs +87 -8
- package/templates/hooks/claude/hooks/sdd-prompt.cjs +3 -1
- package/templates/hooks/codebuddy/hooks/sdd-apply-test-gate.cjs +39 -9
- package/templates/hooks/codebuddy/hooks/sdd-post-tool.cjs +87 -9
- package/templates/hooks/codebuddy/hooks/sdd-prompt.cjs +3 -1
- package/templates/skills/kld-sdd/opsx-apply/SKILL.md +14 -13
- package/templates/skills/kld-sdd/opsx-apply/checklist.md +20 -20
- package/templates/skills/kld-sdd/opsx-apply/implementer-prompt.md +12 -12
- package/templates/skills/kld-sdd/opsx-apply/reference.md +32 -31
- package/templates/skills/kld-sdd/opsx-archive/SKILL.md +44 -6
- package/templates/skills/kld-sdd/opsx-archive/checklist.md +5 -2
- package/templates/skills/kld-sdd/opsx-check/SKILL.md +21 -13
- package/templates/skills/kld-sdd/opsx-check/checklist.md +8 -7
- package/templates/skills/kld-sdd/opsx-design/SKILL.md +1 -1
- package/templates/skills/kld-sdd/opsx-design/checklist.md +1 -1
- package/templates/skills/kld-sdd/opsx-kb-ingest/SKILL.md +14 -0
- package/templates/skills/kld-sdd/opsx-ontology-query/SKILL.md +31 -0
- package/templates/skills/kld-sdd/opsx-propose/SKILL.md +12 -4
- package/templates/skills/kld-sdd/opsx-propose/reference.md +29 -3
- package/templates/skills/kld-sdd/opsx-rules/reference.md +3 -1
- package/templates/skills/kld-sdd/opsx-spec/SKILL.md +2 -2
- package/templates/skills/kld-sdd/opsx-spec/checklist.md +1 -1
- package/templates/skills/kld-sdd/opsx-task/SKILL.md +10 -10
- package/templates/skills/kld-sdd/opsx-task/checklist.md +3 -3
- package/templates/skills/kld-sdd/opsx-task/reference.md +3 -3
- package/templates/skills/kld-sdd/opsx-test/SKILL.md +7 -5
- package/templates/skills/kld-sdd/{opsx-tdd-anti-patterns → tdd-anti-patterns}/SKILL.md +4 -4
- package/templates/skills/kld-sdd/{opsx-tdd-anti-patterns → tdd-anti-patterns}/reference.md +4 -4
- package/templates/skills/kld-sdd/{opsx-tdd-core → tdd-core}/SKILL.md +13 -13
- package/templates/skills/kld-sdd/{opsx-tdd-core → tdd-core}/checklist.md +5 -5
- package/templates/skills/kld-sdd/{opsx-tdd-core → tdd-core}/reference.md +12 -12
- package/templates/skills/kld-sdd/{opsx-tdd-metrics → tdd-metrics}/SKILL.md +3 -3
- package/templates/skills/kld-sdd/{opsx-tdd-metrics → tdd-metrics}/checklist.md +2 -2
- package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/SKILL.md +2 -2
- package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/parameterized-testing.md +1 -1
- package/templates/skills/kld-sdd/{opsx-tdd-review → tdd-review}/SKILL.md +5 -5
- package/templates/skills/kld-sdd/{opsx-tdd-review → tdd-review}/checklist.md +5 -5
- package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/SKILL.md +3 -3
- package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/non-tdd-modules.md +1 -1
- package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/refactor-checklist.md +1 -1
- package/templates/skills/kld-sdd/tdd-rules/rules/test-skeleton-telemetry.md +19 -0
- package/templates/skills/kld-sdd/opsx-tdd-rules/rules/test-skeleton-telemetry.md +0 -19
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/cause-effect-clarity.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/clean-test-data.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/existing-test-awareness.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/given-when-then.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/good-test-qualities.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/mock-boundary.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/naming-conventions.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/no-logic-in-tests.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/one-test-one-scenario.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/prefer-public-apis.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/general/test-behaviors-not-methods.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/argument-matching.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/controller-test-rules.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/domain-service-rules.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/java-test-template.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/json-serialization.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/java/logging-rules.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/post-generation/compilation-verification.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/post-generation/execution-verification.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/python/py-test-template.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-quality → tdd-quality}/rules/typescript/ts-test-template.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/controller-strategy.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/dag-generation-rules.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/des-step-annotation.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/exception-path-coverage.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/green-scope-declaration.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/green-yagni-fence.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/multi-validation-split.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/task-type-definitions.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/tdd-strategy-selection.md +0 -0
- /package/templates/skills/kld-sdd/{opsx-tdd-rules → tdd-rules}/rules/test-execution-gate.md +0 -0
|
@@ -17,14 +17,20 @@ description: opsx-apply 的详细模板:telemetry 命令、worktree 全套策
|
|
|
17
17
|
### task_update(每完成一个任务记录)
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json="{\"
|
|
20
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --strict --type=task_update --command=apply --project=. --change=<变更名称> --capability=<capability-name> --task-id=<TASK-ID> --run-id=<本次任务更新稳定ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --status=completed --result=success --summary="<TASK-ID> 完成" --details-json="{\"task_update\":{\"test_event_id\":\"<同一change内成功test_result的event_id>\",\"tdd_required\":<true|false>},\"files_changed\":[]}"
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
**⚠️ 注意**:`--task-id=<TASK-ID>` 必须替换为实际任务 ID
|
|
23
|
+
**⚠️ 注意**:`--task-id=<TASK-ID>` 必须替换为实际任务 ID。完成任务必须引用同一 change 内、`tdd_phase` 为 green/refactor/regression、退出码为 0、`failure_type=none` 的 `test_result.event_id`,并明确填写 `tdd_required=true/false`;禁止把测试计数复制进 `task_update`。
|
|
24
|
+
|
|
25
|
+
只有文档、纯配置说明等确实不适用测试的任务,才能显式声明:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{"task_update":{"verification_not_applicable":true,"verification_not_applicable_reason":"<为什么本任务无需测试的具体原因>"}}
|
|
29
|
+
```
|
|
24
30
|
|
|
25
31
|
**🧪 TDD 测试骨架任务(`test-strategy: tdd`)**:当任务是"测试骨架"时,`task_update` 必须在 `--details-json` 中带 `"task_kind":"test-skeleton"`。
|
|
26
32
|
|
|
27
|
-
> 完整 test-skeleton telemetry 模板见
|
|
33
|
+
> 完整 test-skeleton telemetry 模板见 tdd-rules/rules/test-skeleton-telemetry.md
|
|
28
34
|
|
|
29
35
|
**📄 通过文件传递大 payload**:若 `details-json` 内容过长,可先写入 `"$(cat .sdd-spec-root)/skywalk-sdd/state/<变更名称>-task-update.json`,再使用 `--details-file` 指定该文件:
|
|
30
36
|
|
|
@@ -38,47 +44,42 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=task_update --com
|
|
|
38
44
|
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" check-task --project=. --change=<变更名称> --task-id=<TASK-ID>
|
|
39
45
|
```
|
|
40
46
|
|
|
41
|
-
|
|
42
|
-
- `test_results`: `{ command, passed, failed, skipped, coverage, duration_ms }`
|
|
43
|
-
- `build_results`: `{ command, success, duration_ms, error_count }`
|
|
44
|
-
- 若 agent 只记 `--status=completed` 不带 build/test(tools 兼容),index.cjs 会 fallback 用 status=completed 作为 success=true(Q3 修复)
|
|
45
|
-
|
|
46
|
-
**【L6 test_count 口径】**:`test_results.passed + failed + skipped` 含全部用例(含 cases 数组外的单独用例)。不要只计 cases 数组内数量而漏计独立用例。
|
|
47
|
+
**【严格证据口径】**:测试执行事实只存在于 `test_result`;`task_update` 只表达任务状态与证据引用。旧事件仍可读取,但新事件必须使用 `--strict`。
|
|
47
48
|
|
|
48
|
-
### process_note
|
|
49
|
+
### process_note(阶段内过程事件:决策/范围变化/故障与恢复)
|
|
49
50
|
|
|
50
|
-
记录阶段内过程信息,供 execution-log
|
|
51
|
+
记录阶段内过程信息,供 execution-log 叙事与报告“过程记录”板块统计。新事件使用 `--strict`,`details.kind` 必填,枚举:
|
|
51
52
|
|
|
52
53
|
| kind | 场景 | 示例 |
|
|
53
54
|
|------|------|------|
|
|
54
|
-
| `
|
|
55
|
-
| `
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
55
|
+
| `user_decision` | 用户确认关键选择 | 范围、执行模式、测试策略、方案 A/B |
|
|
56
|
+
| `scope_change` | 已确认范围发生变化 | 新增或移除交付项 |
|
|
57
|
+
| `api_error` | API 或外部服务故障 | 连接中断、限流 |
|
|
58
|
+
| `model_error` | 模型执行故障 | 输出中断、工具调用异常 |
|
|
59
|
+
| `recovery` | 对故障或失败的恢复动作 | 修复配置后重试 |
|
|
60
|
+
| `test_exception` | 测试执行异常 | 环境缺依赖、超时 |
|
|
60
61
|
|
|
61
62
|
```bash
|
|
62
|
-
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=process_note --command=<stage> --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --summary="<人读摘要>" --details-json="{\"kind\":\"<
|
|
63
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --strict --type=process_note --command=<stage> --project=. --change=<变更名称> --capability=<capability-name> --run-id=<本次过程事件稳定ID> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --summary="<人读摘要>" --details-json="{\"kind\":\"<user_decision|scope_change|api_error|model_error|recovery|test_exception>\",\"decision_type\":\"<user_decision时可填scope|mode|test_strategy|other>\",\"target\":\"<可选关联对象>\"}"
|
|
63
64
|
```
|
|
64
65
|
|
|
65
66
|
**使用时机**:
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
- **API
|
|
69
|
-
-
|
|
67
|
+
- **用户确认范围/模式/测试策略** → `kind=user_decision`,并用 `decision_type` 说明是哪类选择
|
|
68
|
+
- **范围后来改变** → `kind=scope_change`
|
|
69
|
+
- **API/模型/测试环境故障** → 分别记录 `api_error` / `model_error` / `test_exception`
|
|
70
|
+
- **修复后恢复执行** → `kind=recovery`
|
|
70
71
|
|
|
71
72
|
**必记节点清单**(遗漏即视为过程记录缺失,`sdd-apply-test-gate` 会记 `telemetry_warning(process_note_missing)`):
|
|
72
73
|
|
|
73
74
|
| 节点 | kind | target |
|
|
74
75
|
|------|------|--------|
|
|
75
|
-
|
|
|
76
|
-
| frontmatter
|
|
77
|
-
|
|
|
78
|
-
|
|
|
79
|
-
|
|
|
80
|
-
|
|
|
81
|
-
|
|
|
76
|
+
| 门禁拦截后的处理选择 | `user_decision` | stage |
|
|
77
|
+
| frontmatter/文档补齐后恢复 | `recovery` | 文件:行 |
|
|
78
|
+
| 编辑失败并重试 | `recovery` | 文件 |
|
|
79
|
+
| 用户交互决策点(范围/模式/测试策略) | `user_decision` | - |
|
|
80
|
+
| API 故障 | `api_error` | - |
|
|
81
|
+
| 模型故障 | `model_error` | - |
|
|
82
|
+
| 测试环境异常 | `test_exception` | - |
|
|
82
83
|
|
|
83
84
|
### ai_adoption_review(AI 产出快照)
|
|
84
85
|
|
|
@@ -349,7 +350,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=ai_adoption_revie
|
|
|
349
350
|
|
|
350
351
|
## §6.0 单元测试真实执行(`test-strategy` 非 `none`)
|
|
351
352
|
|
|
352
|
-
> 单元测试真实执行见
|
|
353
|
+
> 单元测试真实执行见 tdd-core/reference.md §9
|
|
353
354
|
|
|
354
355
|
当 `test-strategy` 为 `tdd` 或 `impl-first` 时,必须真实运行单元测试并留 telemetry 证据。`sdd-apply-test-gate.cjs` 会在 `log.cjs end`、`apply-worktree-finish`、会话 Stop 时自动校验。
|
|
355
356
|
|
|
@@ -357,7 +358,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=ai_adoption_revie
|
|
|
357
358
|
|
|
358
359
|
## §6.0a 测试反模式检查(TDD 模式下)
|
|
359
360
|
|
|
360
|
-
> 完整 9 种反模式检测见
|
|
361
|
+
> 完整 9 种反模式检测见 tdd-anti-patterns/SKILL.md §3-§4 + reference.md
|
|
361
362
|
|
|
362
363
|
⛔ RED 阶段就必须检查,不要等到 GREEN 之后才发现测试是假的。
|
|
363
364
|
|
|
@@ -35,7 +35,7 @@ allowed-tools:
|
|
|
35
35
|
| 维度 | 内容 |
|
|
36
36
|
|---|---|
|
|
37
37
|
| 核心问题 | 变更生命周期结束与度量收口 |
|
|
38
|
-
| 关键输出 | `openspec/changes/archive/<日期>-<change>/`、`openspec/specs/`、`openspec/changes/archive/<日期>-<change>/reports/<change>-report.md`、`openspec/changes/archive/<日期>-<change>/reports/<change>-report.html`、`openspec/changes/archive/<日期>-<change>/logs/execution-log.md` |
|
|
38
|
+
| 关键输出 | `openspec/changes/archive/<日期>-<change>/`、`openspec/specs/`、`openspec/changes/archive/<日期>-<change>/reports/<change>-report.md`、`openspec/changes/archive/<日期>-<change>/reports/<change>-report.html`、`openspec/changes/archive/<日期>-<change>/reports/<change>-report.json`、`openspec/changes/archive/<日期>-<change>/logs/execution-log.md` |
|
|
39
39
|
| 触发时机 | 任务完成、变更取消、变更搁置、或用户要求归档 |
|
|
40
40
|
|
|
41
41
|
---
|
|
@@ -96,9 +96,45 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" tasks-status --project=. --chan
|
|
|
96
96
|
|
|
97
97
|
即使用户选择“变更已完成实施”,未勾选项也不阻断归档。它可能代表任务真实未完成,也可能代表代码已完成但文档未同步;不要猜测,也不要静默忽略。最终必须让 `archive-docs` 将其写入 `archive_result.task_completion` 和报告。
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
归档结果必须分别输出:
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
- `task_completion.primary_tasks`:真正的交付任务,决定“完成/部分完成”结论。
|
|
102
|
+
- `task_completion.acceptance_evidence`:测试、评审、手工验收等证据的确认情况,只提示证据缺口,不冒充任务进度。
|
|
103
|
+
|
|
104
|
+
仅当 `primary_tasks.has_incomplete=true` 时,归档原因才改写为“部分完成(N 个主任务未完成)”。主任务已完成但验收证据待确认时,允许归档,但最终报告必须在“需要处理”中明确提示。
|
|
105
|
+
|
|
106
|
+
> **📊 归档前 process_note(U3)**:归档前对 tasks.md checkbox 的勾选、文档补齐等修补动作,**必须**记 `process_note` 事件(`kind=recovery`,`target=tasks.md:行号`),让"check 时待确认 N 项 → archive 结案 N 项"的对照可追溯。若归档前存在拦截/失败但无 `process_note`,`sdd-apply-test-gate` 会记 `telemetry_warning(process_note_missing)`。模板见 `opsx-apply/reference.md`「process_note」。
|
|
107
|
+
|
|
108
|
+
### 4.5 可选记录成熟度证据(仅有可审计证据时)
|
|
109
|
+
|
|
110
|
+
如需评估 L3/L4,必须在 `archive-docs` 生成最终报告前记录标准 `maturity_evidence`。先将以下 JSON 写入 `skywalk-sdd/state/<变更名称>-maturity-evidence.json`:
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"maturity_evidence": {
|
|
115
|
+
"change_type": "config|document|report|composite|other",
|
|
116
|
+
"e1_actual_ms": 500,
|
|
117
|
+
"e1_target_ms": 600,
|
|
118
|
+
"e1_type_target_met": true,
|
|
119
|
+
"code_fully_spec_generated": true,
|
|
120
|
+
"generated_files": ["src/generated.js"],
|
|
121
|
+
"manual_code_lines": 0,
|
|
122
|
+
"evidence_summary": "规约生成范围与独立复核结论",
|
|
123
|
+
"reviewer": "独立评审者标识",
|
|
124
|
+
"reviewer_independence": "independent-review",
|
|
125
|
+
"review_session_id": "review-session-id",
|
|
126
|
+
"author_session_id": "author-session-id"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
然后执行:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
node skywalk-sdd/log.cjs record --type=maturity_evidence --command=archive --project=. --change=<变更名称> --agent=<Agent类型> --source=manual --session-id=<会话ID> --result=success --summary="成熟度证据" --details-file=skywalk-sdd/state/<变更名称>-maturity-evidence.json
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
`e1_type_target_met` 必须等于 `e1_actual_ms <= e1_target_ms` 的计算结果。仅当 `code_fully_spec_generated=true` 时,`generated_files`、`manual_code_lines=0`、证据摘要和独立评审字段才可授予 L4;`review_session_id` 必须与 `author_session_id` 不同。CLI 会硬校验这些字段,只有两个布尔断言的事件不会被报告采信。
|
|
102
138
|
|
|
103
139
|
### 5. 一步执行真实归档
|
|
104
140
|
|
|
@@ -117,7 +153,8 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" archive-docs --project=. --chan
|
|
|
117
153
|
- Full Spec 的 `specs/<capability>/spec.md` 同步到 `openspec/specs/<capability>/spec.md`。
|
|
118
154
|
- archive 阶段写入 `stage_end`。
|
|
119
155
|
- 未勾选 tasks 被写入 `archive_result.task_completion`。
|
|
120
|
-
- 最终中文报告生成到 `openspec/changes/archive/<日期>-<name>/reports/<name>-report.md
|
|
156
|
+
- 最终中文报告生成到 `openspec/changes/archive/<日期>-<name>/reports/<name>-report.md`、`<name>-report.html` 与 `<name>-report.json`(三份同源报告,默认归档后 archive 目录,可用 --report-output 自定义)。
|
|
157
|
+
- `archive_result` 含 `report_path`、`report_html_path`、`report_json_path`;任一 companion 写入失败须记录 telemetry 警告,主 Markdown 失败仍按现有失败策略处理。
|
|
121
158
|
- 执行日志 `openspec/changes/archive/<日期>-<name>/logs/execution-log.md` 随归档整目录迁移(人读审计层)。
|
|
122
159
|
|
|
123
160
|
### 5.4 隐式注销活动变更
|
|
@@ -152,7 +189,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" end --event-id=<event_id> --com
|
|
|
152
189
|
|
|
153
190
|
> 变更 `<name>` 已真实归档。
|
|
154
191
|
> - 归档目录:`openspec/changes/archive/<日期>-<name>/`
|
|
155
|
-
> -
|
|
192
|
+
> - 最终报告(Markdown + HTML + JSON 三产物):`openspec/changes/archive/<日期>-<name>/reports/<name>-report.md`、`<name>-report.html`、`<name>-report.json`
|
|
156
193
|
> - 执行日志:`openspec/changes/archive/<日期>-<name>/logs/execution-log.md`
|
|
157
194
|
> - 知识库归档包:`openspec/changes/archive/<日期>-<name>.zip`
|
|
158
195
|
> - 本体消费入口:`openspec/changes/archive/<日期>-<name>/canonical-facts.json`
|
|
@@ -199,7 +236,8 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=baseline_record -
|
|
|
199
236
|
- 归档操作执行前必须让用户确认归档原因。
|
|
200
237
|
- 不要调用 OpenSpec 自带归档命令;统一由 `archive-docs` 负责真实归档、阶段结束和报告生成。
|
|
201
238
|
- “完成实施”归档允许 tasks 未全部勾选;未勾选项必须进入 archive details 和最终报告。
|
|
202
|
-
- 最终报告由 `archive-docs` 自动生成(
|
|
239
|
+
- 最终报告由 `archive-docs` 自动生成(Markdown + HTML + JSON 三产物,默认落归档后 archive 目录的 reports/ 子目录,可用 --report-output 自定义路径)。
|
|
240
|
+
- 双周/月度周期跟踪为**归档后或项目级独立入口**,不阻塞单变更归档;示例:`node skywalk-sdd/log.cjs report --project=. --period=biweekly --date-from=YYYY-MM-DD --date-to=YYYY-MM-DD`
|
|
203
241
|
- 已归档变更不要重复移动;展示已有 archive 目录和 report 路径。
|
|
204
242
|
|
|
205
243
|
---
|
|
@@ -14,17 +14,20 @@ description: "opsx-archive 前后日志/总结自检清单 — 仅在 archive
|
|
|
14
14
|
- [ ] `openspec/changes/<变更名称>/logs/execution-log.md` 各阶段条目齐全:propose/spec/design/task/check/apply/test/archive 的 `stage_start`/`stage_end` 闭环
|
|
15
15
|
- [ ] execution-log 状态标记规范:成功 `✅OK`、部分 `🟡WARN`、失败 `❌FAIL`;未闭环阶段已修复或标记 partial
|
|
16
16
|
- [ ] 无残留 Apply worktree(`git worktree list` 仅主工作区,或 telemetry 存在 `worktree_finish`+success 事件)
|
|
17
|
+
- [ ] 如需评估 L3/L4,已在归档报告生成前记录标准 `maturity_evidence`;不得只提交 `e1_type_target_met` / `code_fully_spec_generated` 两个布尔断言
|
|
18
|
+
- [ ] `maturity_evidence` 的 E1 实测/目标可复算;声称完整规约生成时,`generated_files` 非空、`manual_code_lines=0`,且 `review_session_id` 与 `author_session_id` 不同
|
|
17
19
|
|
|
18
20
|
## B. 归档后自检
|
|
19
21
|
|
|
20
22
|
- [ ] 归档目录 `openspec/changes/archive/<日期>-<变更名称>/` 存在
|
|
21
23
|
- [ ] `openspec/changes/archive/<日期>-<变更名称>/` 下 `archive-ontology.json`、`canonical-facts.json`、`conversion-report.json` 和 `archive-manifest.json` 均存在
|
|
22
|
-
- [ ] 活动 change 目录下的 `artifacts/*.ontology.json` 与 `artifact-index.json` 已随归档目录一并迁移
|
|
24
|
+
- [ ] 活动 change 目录下的 `artifacts/*.ontology.json` 与 `ontology/artifact-index.json` 已随归档目录一并迁移
|
|
23
25
|
- [ ] `archive-manifest.json` 为 `kld-sdd-archive-manifest/v2`,且 `files` 精确覆盖 ZIP 内除 manifest 自身外的全部文件
|
|
24
26
|
- [ ] `openspec/changes/archive/<日期>-<变更名称>.zip` 存在并可由知识库 `ArchivePackageReader` 读取
|
|
25
27
|
- [ ] canonical facts 中每个实体/关系均能通过 `source.file`、`source.anchor_id`、`source.content_hash` 定向展开到包内原文
|
|
26
28
|
- [ ] 最终报告 `openspec/changes/archive/<日期>-<变更名称>/reports/<变更名称>-report.md` 存在且含「归档结果」段
|
|
27
|
-
- [ ] `reports/<变更名称>-report.md` 与
|
|
29
|
+
- [ ] `reports/<变更名称>-report.md`、`<变更名称>-report.html` 与 `<变更名称>-report.json` 均已生成(Markdown + HTML + JSON 三产物同源)
|
|
30
|
+
- [ ] `archive_result` 或报告「归档结果」段含 `report_path`、`report_html_path`、`report_json_path`
|
|
28
31
|
- [ ] html 报告含 `SDD 效果度量报告` 标题与各度量章节(执行摘要/效率/质量/过程/归档结果/说明)
|
|
29
32
|
- [ ] 执行日志 `openspec/changes/archive/<日期>-<变更名称>/logs/execution-log.md` 随 change 整目录迁移到 archive(含 archive 阶段 stage_start+stage_end+✅OK)
|
|
30
33
|
- [ ] 正式 specs 同步到 `openspec/specs/<capability>/spec.md`
|
|
@@ -40,7 +40,7 @@ allowed-tools:
|
|
|
40
40
|
> - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
|
|
41
41
|
> **📊 Telemetry(必做,不得跳过)**
|
|
42
42
|
> - 阶段开始:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" start --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`(保存 event_id)
|
|
43
|
-
> - 检查报告生成后,必须先记录结构化检查结果:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"warning_items\":[],\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0},\"tdd_compliance\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
|
|
43
|
+
> - 检查报告生成后,必须先记录结构化检查结果:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"warning_items\":[],\"warning_dispositions\":[{\"warning\":\"<稳定编号>\",\"disposition\":\"fixed|accepted|waived|needs_input|open\",\"reason\":\"<处置依据>\"}],\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"reviewer\":\"<reviewer-identifier>\",\"review_session_id\":\"<当前check会话ID>\",\"author_session_id\":\"<文档作者/apply会话ID或unknown>\",\"reviewer_independence\":\"independent-review|self-review|unknown\",\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0},\"tdd_compliance\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"`
|
|
44
44
|
> - `check_result` 记录成功后,才允许阶段结束:`node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" end --event-id=<event_id> --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="摘要"`
|
|
45
45
|
> - **【B1 摘要数字校验】** `stage_end --summary` 中的数字(如「N 个场景」「N 层 DAG」「N 个任务」)必须与 `spec.md`/`tasks.md`/`test-scenarios.md` 的实统计交叉校验一致后再填写,不得凭记忆自填。典型失真:summary 写「11 个场景」实际 spec 含 13 条断言、「5 层 DAG」实际 tasks 修复后为 6 层。check 阶段发现不一致时,修正 summary 或补齐文档,使三者数字自洽。
|
|
46
46
|
|
|
@@ -171,7 +171,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" diagnose-naming --proj
|
|
|
171
171
|
- [ ] 跨文档引用路径正确
|
|
172
172
|
- [ ] ⛔ **CON 覆盖一致性**:spec.md 中每个 CON 在 tasks.md 中有对应验证任务或显式声明间接覆盖;tasks.md 声明"100% 覆盖 CON"时必须可追溯
|
|
173
173
|
- [ ] ⛔ **安全/审计要求覆盖一致性**:spec.md §5.x 中的安全与审计要求在 tasks.md 中有对应任务或显式声明推迟
|
|
174
|
-
- [ ] ⛔ **AC 变体覆盖一致性**:spec.md 中含"或"条件的 AC 场景,其 RED 任务验收标准须列出所有变体的测试方法(规则见 `
|
|
174
|
+
- [ ] ⛔ **AC 变体覆盖一致性**:spec.md 中含"或"条件的 AC 场景,其 RED 任务验收标准须列出所有变体的测试方法(规则见 `tdd-rules/rules/multi-validation-split.md` §AC 内"或"条件变体覆盖)
|
|
175
175
|
- [ ] ⛔ **tasks.md §4.x 验证方式表内部一致性**:§4.x 验证方式表中的测试注解/配置与任务实现步骤中的声明一致
|
|
176
176
|
|
|
177
177
|
#### 4.3 算法正确性检查
|
|
@@ -189,17 +189,17 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" diagnose-naming --proj
|
|
|
189
189
|
|
|
190
190
|
#### 4.4a TDD 合规性检查(仅 test-strategy=tdd 时执行)
|
|
191
191
|
|
|
192
|
-
⛔ 执行 `
|
|
192
|
+
⛔ 执行 `tdd-core/checklist.md` §B(15 项)逐项检查。
|
|
193
193
|
|
|
194
|
-
> 不在此内联复制,以
|
|
195
|
-
> 额外补充:还需检查 `
|
|
194
|
+
> 不在此内联复制,以 tdd-core/checklist.md §B 为唯一真相源。
|
|
195
|
+
> 额外补充:还需检查 `tdd-rules/rules/exception-path-coverage.md`(异常路径覆盖门禁)。
|
|
196
196
|
|
|
197
197
|
**检查项适用阶段**:§B 中部分检查项在 apply 前后均可验证(文档级),部分仅在 apply 后可验证(代码级):
|
|
198
198
|
- **apply 前可验证**(文档级):RED 验收标准包含"测试运行失败"、无"断言为空"、GREEN 为行为级粒度、DAG 存在 RED→GREEN 循环对、非 TDD 模块未拆红绿、GREEN 验收标准为"让对应 RED 通过"、已声明 Controller 策略、Controller 两种策略都生成测试任务、每个 RED 含测试方法名、每个 GREEN 含 YAGNI 围栏、每个 REFACTOR 列出重构点
|
|
199
199
|
- **apply 后可验证**(代码级):GREEN 任务输出不含未测试的 Controller/Filter/Config
|
|
200
200
|
|
|
201
201
|
⛔ BEFORE 完成 TDD 合规性检查,如需深度审查测试质量,必须读取:
|
|
202
|
-
-
|
|
202
|
+
- tdd-review/SKILL.md(测试质量审查清单 8 项 + 缺失测试检测)
|
|
203
203
|
读取后确认:"已读取测试质量审查清单"。
|
|
204
204
|
|
|
205
205
|
#### 4.5 任务完成状态检查(实现后 / 归档前)
|
|
@@ -244,16 +244,20 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" tasks-status --project=. --chan
|
|
|
244
244
|
- `warning_items`: 警告明细数组,每项 `{category, description, target}`(如 `{"category":"task_completion","description":"4.3 手动验证清单未勾选","target":"tasks.md:595"}`),用于报告已知风险区渲染具体待确认项;无明细时省略(向后兼容,旧事件仅 `warnings` 数量,报告降级显示数量)。
|
|
245
245
|
- `suggestions`: 可选优化建议数。
|
|
246
246
|
- `fixed_before_apply`: 进入 apply 前已通过或已确认满足质量门禁的检查项数。**【Q2 口径】**:apply 前第一次 check 全过则 = total(全部通过);apply 前有 check 但 fixed_before_apply=0 不触发 P4 警示(P4 主指标已改为"apply 前是否 check",与 fixed_before_apply 解耦)。
|
|
247
|
-
- `consistency_score`:
|
|
247
|
+
- `consistency_score`: **legacy 兼容字段**(保留一个发布版本);跨文档一致性评分 0-1,无法评分时填 `null`。
|
|
248
|
+
- `reviewer`: 执行本次 check 的代理或会话标识。
|
|
249
|
+
- `review_session_id`: 当前 check 会话 ID(与 `--session-id` 一致)。
|
|
250
|
+
- `author_session_id`: 文档作者或 apply 阶段会话 ID;无法确定时填 `unknown`。
|
|
251
|
+
- `reviewer_independence`: `independent-review`(独立 evaluator 且会话与作者不同)| `self-review` | `unknown`。优先使用独立 evaluator;不可用时继续检查但标 `self-review` 或 `unknown`,报告中 Q3 为 `provisional`。
|
|
248
252
|
- `categories`: 至少包含 `completeness`、`consistency`、`executability`。
|
|
249
253
|
- `task_completion`: 从 `tasks-status` 输出整理而来;未进入 apply 时 `checked_for_archive_readiness=false`。
|
|
250
254
|
|
|
251
255
|
在终端执行(必须成功):
|
|
252
256
|
```bash
|
|
253
|
-
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"warning_items\":[],\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0},\"tdd_compliance\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"
|
|
257
|
+
node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=check_result --command=check --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="检查结果摘要" --details-json="{\"check_results\":{\"total\":0,\"errors\":0,\"warnings\":0,\"warning_items\":[],\"suggestions\":0,\"fixed_before_apply\":0,\"consistency_score\":null,\"reviewer\":\"<reviewer-identifier>\",\"review_session_id\":\"<当前check会话ID>\",\"author_session_id\":\"<文档作者/apply会话ID或unknown>\",\"reviewer_independence\":\"independent-review|self-review|unknown\",\"categories\":{\"completeness\":{\"passed\":0,\"total\":0},\"consistency\":{\"passed\":0,\"total\":0},\"executability\":{\"passed\":0,\"total\":0},\"tdd_compliance\":{\"passed\":0,\"total\":0}},\"task_completion\":{\"completed\":0,\"incomplete\":0,\"total\":0,\"has_incomplete\":false,\"checked_for_archive_readiness\":false}}}"
|
|
254
258
|
```
|
|
255
259
|
|
|
256
|
-
> **⚠️ P1-1 check_result details 不得为空**:`--details-json` 必须含 `
|
|
260
|
+
> **⚠️ P1-1 check_result details 不得为空**:`--details-json` 必须含 `categories` / `task_completion` / reviewer 独立性字段等,**禁止传空对象 `{}`**。空 details 导致 Q3 不可计算(工具侧虽有 state fallback 兜底,但事件 details 是主数据源)。
|
|
257
261
|
|
|
258
262
|
> **⚠️ P2-3 check 纳入 task_completion 判定**:执行 `tasks-status` 后,若 `has_incomplete=true`,`check_result` 的 `--result` 应标 `partial` 并在 `warning_items` 记录未勾选项(`{category:"task_completion", description:"N 项验收未勾选", target:"tasks.md:行号"}`)。不阻断 apply(P4 已与 fixRate 解耦),但反映真实完成度。
|
|
259
263
|
|
|
@@ -270,7 +274,11 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=conformance_revie
|
|
|
270
274
|
> - `assertions[].judge_status` 枚举:`matched` / `partial` / `missed`
|
|
271
275
|
> - `assertions[].human_status` 枚举:`matched` / `partial` / `missed` / 省略(默认跟随 judge_status)
|
|
272
276
|
|
|
273
|
-
> **reviewer 与 reviewer_independence
|
|
277
|
+
> **reviewer 与 reviewer_independence 说明(check_result)**:执行 check 前先读取文档作者/阶段会话信息;**能使用独立 evaluator 时必须使用**。`reviewer_independence=independent-review` 且 `review_session_id` 与 `author_session_id` 不同时,Q3 为 `verified`;自评或无法确认时为 `self-review` 或 `unknown`,Q3 标 `provisional` 但仍可计算分数。
|
|
278
|
+
|
|
279
|
+
> **报告用语**:`verified` 展示为“已验证”,表示有独立复核;`provisional` 展示为“临时”,表示已有数值但仍需独立复核。不得仅用颜色区分,也不得把临时结果写成最终可信结论。
|
|
280
|
+
|
|
281
|
+
> **reviewer 与 reviewer_independence 说明(conformance_review)**:`reviewer` 用于标识实际执行本次符合度评审的代理或会话(例如 agent 名称、会话 ID)。渲染报告时会比较 `reviewer` 与 apply 阶段记录的 `apply_agent`:若两者相同,则 `reviewer_independence` 显示为 `self-review`;否则显示为 `independent-review`。建议尽可能由独立评审方执行 check,以提升结果可信度。
|
|
274
282
|
|
|
275
283
|
### 6. 【交互引导】根据结果引导下一步
|
|
276
284
|
|
|
@@ -288,7 +296,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=conformance_revie
|
|
|
288
296
|
> - A. 逐个修复(引导到对应命令)
|
|
289
297
|
> - B. 忽略警告继续"
|
|
290
298
|
|
|
291
|
-
> **📊 过程记录(U3)**:若用户选择 A 逐个修复,或在 check 后、归档前补充修复(补 README/CHANGELOG、勾 checkbox 等),每个修复动作**必须**记 `process_note` 事件(`kind=
|
|
299
|
+
> **📊 过程记录(U3)**:若用户选择 A 逐个修复,或在 check 后、归档前补充修复(补 README/CHANGELOG、勾 checkbox 等),每个修复动作**必须**记 `process_note` 事件(`kind=recovery`,`command=check`),归档前修补不再黑箱。**若本阶段存在失败/门禁拦截但无对应 `process_note`,`sdd-apply-test-gate` 会记 `telemetry_warning(process_note_missing)`(不阻断,但报告过程质量信号会标红)。** 必记节点清单见 `opsx-apply/reference.md`「process_note」。
|
|
292
300
|
|
|
293
301
|
---
|
|
294
302
|
|
|
@@ -297,7 +305,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" record --type=conformance_revie
|
|
|
297
305
|
`opsx-check` **不联网提问**。Agent 应在 propose/spec 已问完;本阶段只验证并入既有 apply 前门禁:
|
|
298
306
|
|
|
299
307
|
- Continuity=`iteration` 时每个 CAP 具备 KB 回传 `entity-id` / `version-id`
|
|
300
|
-
- 已写 spec 的 Capability:场景 `external-ref` 与 `continuity-resolution.json` 决议一致;同 key+同锚点未偷偷换 entity_id
|
|
308
|
+
- 已写 spec 的 Capability:场景 `external-ref` 与 `ontology/continuity-resolution.json` 决议一致;同 key+同锚点未偷偷换 entity_id
|
|
301
309
|
- 用户选「原对象」却仍用新 id、或选「新对象」却仍共用旧锚点 → 失败(`CONTINUITY_IDENTITY_MISMATCH` / `EXTERNAL_REF_CONFLICT`)
|
|
302
310
|
- 决议缺失 / pending / 与产物不一致 → `CONTINUITY_DECISION_REQUIRED`
|
|
303
311
|
- **编号诊断码**(并入五维报告与 apply gate):
|
|
@@ -325,7 +333,7 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/log.cjs" semantic-check --project=. --ch
|
|
|
325
333
|
- `added` 必须使用全新实体/版本 UUID;`modified/removed` 必须复用实体 UUID并指向直接前序版本;`unchanged` 必须复用历史实体和版本 UUID且不得复制历史正文。
|
|
326
334
|
- 文件观察结果只能作为快速上下文,check 必须重新全量 semantic-reconcile。
|
|
327
335
|
- propose/spec/design/task 对应工作态 JSON 应已在各作者阶段生成;check 不负责首次生成业务事实,只重新解析 Markdown、核对各 JSON 与同一 revision,并在全部通过时把派生 revision 更新为 `review_status=pending`。
|
|
328
|
-
- Check 只读是指不修改 proposal/spec/design/tasks 原文;允许原子刷新 `openspec/changes/<变更名称>/` 下可再生的 `working-ontology.json`、`artifact-index.json` 与 `artifacts/*.ontology.json`。
|
|
336
|
+
- Check 只读是指不修改 proposal/spec/design/tasks 原文;允许原子刷新 `openspec/changes/<变更名称>/` 下可再生的 `ontology/working-ontology.json`、`ontology/artifact-index.json` 与 `artifacts/*.ontology.json`。
|
|
329
337
|
|
|
330
338
|
## Guardrails
|
|
331
339
|
|
|
@@ -20,10 +20,11 @@ description: "opsx-check 阶段日志自检清单 — 仅在 check 自检时读
|
|
|
20
20
|
- [ ] `warnings`: 建议修复的问题数
|
|
21
21
|
- [ ] `suggestions`: 可选优化建议数
|
|
22
22
|
- [ ] `fixed_before_apply`: 进入 apply 前已通过/已确认满足门禁的检查项数
|
|
23
|
-
- [ ] `consistency_score`:
|
|
23
|
+
- [ ] `consistency_score`: legacy 兼容字段;跨文档一致性评分 0-1,无法评分填 `null`
|
|
24
|
+
- [ ] `reviewer` / `review_session_id` / `author_session_id` / `reviewer_independence`: Q3 独立性元数据已填写;优先独立 evaluator,不可用时标 `self-review` 或 `unknown`(Q3 provisional)
|
|
24
25
|
- [ ] `categories`: 至少含 `completeness` / `consistency` / `executability`
|
|
25
26
|
- [ ] `task_completion`: 从 `tasks-status` 整理;未进入 apply 时 `checked_for_archive_readiness=false`
|
|
26
|
-
- [ ] **P1-1**:`check_result` 事件 `details` 非空且含 `
|
|
27
|
+
- [ ] **P1-1**:`check_result` 事件 `details` 非空且含 `categories` 等必填键(禁止空 `{}`,否则 Q3 不可计算)
|
|
27
28
|
- [ ] **P2-3**:`has_incomplete=true` 时 `check_result.result=partial` 且 `warning_items` 含 task_completion 项
|
|
28
29
|
|
|
29
30
|
## C. execution-log 状态标记
|
|
@@ -40,15 +41,15 @@ description: "opsx-check 阶段日志自检清单 — 仅在 check 自检时读
|
|
|
40
41
|
|
|
41
42
|
- [ ] **CON 覆盖**:spec.md 中每个 CON 在 tasks.md 中有对应验证任务或显式声明间接覆盖
|
|
42
43
|
- [ ] **安全/审计要求覆盖**:spec.md §5.x 中的安全与审计要求在 tasks.md 中有对应任务或显式声明推迟
|
|
43
|
-
- [ ] **AC 变体覆盖**:spec.md 中含"或"条件的 AC 场景,其 RED 任务验收标准列出所有变体的测试方法(引用 `
|
|
44
|
+
- [ ] **AC 变体覆盖**:spec.md 中含"或"条件的 AC 场景,其 RED 任务验收标准列出所有变体的测试方法(引用 `tdd-rules/rules/multi-validation-split.md`)
|
|
44
45
|
- [ ] **§4.x 验证方式表内部一致性**:tasks.md §4.x 验证方式表中的测试注解/配置与任务实现步骤中的声明一致
|
|
45
46
|
|
|
46
47
|
## E. TDD 合规性检查(仅 test-strategy=tdd 时)
|
|
47
48
|
|
|
48
|
-
⛔ 执行 `
|
|
49
|
+
⛔ 执行 `tdd-core/checklist.md` §B(11 项)逐项检查。
|
|
49
50
|
|
|
50
|
-
> 不在此内联复制,以
|
|
51
|
-
> 额外补充:还需检查 `
|
|
51
|
+
> 不在此内联复制,以 tdd-core/checklist.md §B 为唯一真相源。
|
|
52
|
+
> 额外补充:还需检查 `tdd-rules/rules/exception-path-coverage.md`(异常路径覆盖门禁)。
|
|
52
53
|
|
|
53
54
|
**检查项适用阶段**:
|
|
54
55
|
- **apply 前可验证**(文档级):§B 中除"GREEN 任务输出不含未测试的 Controller/Filter/Config"外的所有检查项(含 Controller 策略声明和测试任务生成)
|
|
@@ -56,5 +57,5 @@ description: "opsx-check 阶段日志自检清单 — 仅在 check 自检时读
|
|
|
56
57
|
|
|
57
58
|
## F. 语义门禁与工作态
|
|
58
59
|
|
|
59
|
-
- [ ] `openspec/changes/<变更名称>/artifact-index.json` 已覆盖当前全部 proposal/spec/design/tasks,且每份 `artifacts/*.ontology.json` 与 `working-ontology.json` revision 一致
|
|
60
|
+
- [ ] `openspec/changes/<变更名称>/ontology/artifact-index.json` 已覆盖当前全部 proposal/spec/design/tasks,且每份 `artifacts/*.ontology.json` 与 `ontology/working-ontology.json` revision 一致
|
|
60
61
|
- [ ] 全部语义门禁通过时工作态 JSON 已从 draft 刷新为 pending;check 未修改任何 Markdown 原文
|
|
@@ -141,7 +141,7 @@ openspec list
|
|
|
141
141
|
|
|
142
142
|
**输出路径**:`changes/<name>/specs/<capability>/design.md`
|
|
143
143
|
|
|
144
|
-
**⛔ DES 步骤级标注(TDD 模式强制)**:当 `test-strategy=tdd` 时,被多个 RED/GREEN 对映射的 DES 元素必须标注步骤级任务归属。规则详见 `
|
|
144
|
+
**⛔ DES 步骤级标注(TDD 模式强制)**:当 `test-strategy=tdd` 时,被多个 RED/GREEN 对映射的 DES 元素必须标注步骤级任务归属。规则详见 `tdd-rules/rules/des-step-annotation.md`
|
|
145
145
|
|
|
146
146
|
### 6.5 【version 正则注释】允许前导零
|
|
147
147
|
|
|
@@ -29,7 +29,7 @@ description: opsx-design 的阶段强制检查点与自检清单。仅在执行
|
|
|
29
29
|
- [ ] 外部依赖已列出
|
|
30
30
|
- [ ] 异常处理策略已定义
|
|
31
31
|
- [ ] 文档末尾包含质量红线检查清单
|
|
32
|
-
- [ ] ⛔ **DES 步骤级标注(TDD 模式)**:当 test-strategy=tdd 时,被多个 RED/GREEN 对映射的 DES 元素已标注步骤级 `[GREEN-N]` 归属(规则见 `
|
|
32
|
+
- [ ] ⛔ **DES 步骤级标注(TDD 模式)**:当 test-strategy=tdd 时,被多个 RED/GREEN 对映射的 DES 元素已标注步骤级 `[GREEN-N]` 归属(规则见 `tdd-rules/rules/des-step-annotation.md`)
|
|
33
33
|
|
|
34
34
|
**如有任意一项未满足,重新生成对应章节,直至全部通过。**
|
|
35
35
|
|
|
@@ -49,6 +49,20 @@ Task Progress:
|
|
|
49
49
|
|
|
50
50
|
入库时:用户指定目标 KB(从 `targets` 中选择),仅对选中的 KB 执行上传。
|
|
51
51
|
|
|
52
|
+
### 3.5 兜底:确保 project-identity.json 存在(上传前必做)
|
|
53
|
+
|
|
54
|
+
> 正常情况下 `project-identity.json` 已在 `opsx-ontology-query` 首次配置 KB 时创建。
|
|
55
|
+
> 本步是兜底:如果用户跳过了 ontology-query(如选择 archive 降级路径),直接来做入库,需要确保文件存在且 `project_id` 正确。
|
|
56
|
+
|
|
57
|
+
1. 读取 spec 包裹包路径:
|
|
58
|
+
```bash
|
|
59
|
+
SPEC_ROOT=$(node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root)
|
|
60
|
+
```
|
|
61
|
+
2. 检查 `$SPEC_ROOT/skywalk-sdd/project-identity.json`:
|
|
62
|
+
- **不存在** → 从 `targets[0].spaceKey` 创建(格式同 `opsx-ontology-query` Step 3.5)
|
|
63
|
+
- **已存在但 `project_id !== targets[0].spaceKey`** → 提示用户:`⚠️ project_id 与 Space spaceKey 不一致,入库将报 PROJECT_SPACE_MISMATCH。是否更新?`
|
|
64
|
+
- **已存在且一致** → 跳过
|
|
65
|
+
|
|
52
66
|
### 4. 入库操作
|
|
53
67
|
|
|
54
68
|
路径前缀:`/api/v1/spaces/{spaceId}/knowledge-bases/{kbId}/ingestions`
|
|
@@ -56,6 +56,37 @@ Task Progress:
|
|
|
56
56
|
|
|
57
57
|
**选择空间/KB**:`GET $API/v1/spaces?tenantKey=…` → 对每个 space `GET …/knowledge-bases` → 展示清单**允许多选** → 写入共享 `../.shared/kb-state.json` 的 `targets`。
|
|
58
58
|
|
|
59
|
+
### 3.5 写入项目身份文件(首次配置 Space 后)
|
|
60
|
+
|
|
61
|
+
> `project-identity.json` 是 spec 仓 Git 中的**团队共享**文件,记录 `project_id`(= KB Space 的 `spaceKey`)。Archive 阶段 `archive-docs` 读取此文件生成 `archive-manifest.json`,kb-ingest 上传时 KB 校验 `project_id === spaceKey`。
|
|
62
|
+
|
|
63
|
+
选择 Space 完成后(Step 3 写入 `targets` 后),执行以下逻辑:
|
|
64
|
+
|
|
65
|
+
1. 读取 spec 包裹包路径:
|
|
66
|
+
```bash
|
|
67
|
+
SPEC_ROOT=$(node "$(cat .sdd-spec-root)/skywalk-sdd/ontology/cli.cjs" spec-root)
|
|
68
|
+
```
|
|
69
|
+
2. 检查 `$SPEC_ROOT/skywalk-sdd/project-identity.json` 是否已存在
|
|
70
|
+
3. **不存在** → 创建(取 `targets[0].spaceKey` 作为 `project_id`):
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"schema_version": "kld-sdd-project-identity/v1",
|
|
74
|
+
"project_id": "<targets[0].spaceKey>",
|
|
75
|
+
"created_at": "<ISO timestamp>",
|
|
76
|
+
"kb_space_id": "<targets[0].spaceId>",
|
|
77
|
+
"kb_space_name": "<targets[0].spaceName>"
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
输出:`✓ 已创建 skywalk-sdd/project-identity.json(project_id: <spaceKey>),请提交到 spec 仓 Git 以便团队共享`
|
|
81
|
+
4. **已存在但 `project_id` 与 `targets[0].spaceKey` 不一致** → 用 AskUserQuestion 询问:
|
|
82
|
+
> "project-identity.json 中的 project_id 与当前选择的 KB Space spaceKey 不一致:
|
|
83
|
+
> - 文件中:`<existing project_id>`
|
|
84
|
+
> - 当前 Space:`<spaceKey>`
|
|
85
|
+
> 是否更新?"
|
|
86
|
+
- 用户确认 → 更新 `project_id` + `kb_space_id` + `kb_space_name`
|
|
87
|
+
- 用户拒绝 → 保留原值(可能入库时报 `PROJECT_SPACE_MISMATCH`)
|
|
88
|
+
5. **已存在且一致** → 跳过,不输出
|
|
89
|
+
|
|
59
90
|
> state.json 字段 schema、鉴权细节、列表接口 → [reference.md](reference.md)。
|
|
60
91
|
|
|
61
92
|
## 查询
|
|
@@ -41,6 +41,7 @@ allowed-tools:
|
|
|
41
41
|
> - ${SHELL_GUIDANCE}
|
|
42
42
|
> - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
|
|
43
43
|
> **📊 Telemetry(必做,不得跳过)** — 阶段开始 / 阶段结束**命令模板**见 `./reference.md`「📊 Telemetry 命令模板」。
|
|
44
|
+
> - 用户确认变更范围、`mode`、`test-strategy` 或方案 A/B/C 时,记录严格 `process_note`:`kind=user_decision`,并分别填写 `decision_type=scope|mode|test_strategy|other`。同一决定只记录一次,后续改变范围时改用 `kind=scope_change`。
|
|
44
45
|
|
|
45
46
|
---
|
|
46
47
|
|
|
@@ -228,9 +229,9 @@ node "$(cat .sdd-spec-root)/skywalk-sdd/context-client.cjs" --mode=resolve \
|
|
|
228
229
|
5. 若申报了 feature-id:额外 `objectType=feature` resolve 一次,展示「该功能下已有能力 n 个(存活 m / 失效 k)」辅助勾选 CAP 范围;不改变 Continuity 判定优先级。
|
|
229
230
|
6. 按 KB 结果确认 Continuity:`iteration` / `similar-reference` / `new`;勾选本次涉及的 CAP。
|
|
230
231
|
7. 写入 proposal frontmatter:`requirement-refs`(含 `feature-id`)/ `numbering-waiver` + `continuity`。**禁止**写本地 archive 文件夹名作为 `base-archive`。
|
|
231
|
-
8. CAP 级「同 key + 同锚点、不同 entity_id」当场问 A/B/C;决议写入 `continuity-resolution.json` 的 `capabilities[]`。
|
|
232
|
+
8. CAP 级「同 key + 同锚点、不同 entity_id」当场问 A/B/C;决议写入 `ontology/continuity-resolution.json` 的 `capabilities[]`。
|
|
232
233
|
9. KB 不可用 → `degraded` 继续,**禁止**扫本地 `archive/` 抄 UUID。KB degraded(用户选择跳过)时走路径 B(archive 降级):
|
|
233
|
-
- 扫描 `openspec/changes/archive/*/ontology-identities.json` 匹配 canonicalKey
|
|
234
|
+
- 扫描 `openspec/changes/archive/*/ontology/ontology-identities.json` 匹配 canonicalKey
|
|
234
235
|
- path B 的所有 entity-id 来源在 sdd-output.md 知识库使用表中必须标注 `source: archive(degraded)`,与 `source: KB current` 明确区分。
|
|
235
236
|
- ⚠️ **降级风险**:archive 中的 version-id 可能已过时(如果该 capability 在 archive 之后又有新版本入库到 KB)。path B 的 predecessor-version 不保证是 KB current。入库时可能触发 `VERSION_CONFLICT`。
|
|
236
237
|
10. **不得**在本阶段生成 STMT/AC/场景或裁决场景身份;**不得**铸/改 REQ/FEAT 号。
|
|
@@ -253,7 +254,7 @@ resolve(canonicalKey=CAP-USER-REGISTRATION) → CREATE_NEW
|
|
|
253
254
|
```
|
|
254
255
|
# 扫描归档(仅 KB degraded 时)
|
|
255
256
|
Read openspec/changes/archive/*/proposal.md 的能力分解章节
|
|
256
|
-
Read openspec/changes/archive/*/ontology-identities.json
|
|
257
|
+
Read openspec/changes/archive/*/ontology/ontology-identities.json
|
|
257
258
|
|
|
258
259
|
# 匹配结果示例:
|
|
259
260
|
# "账号锁定从内存迁到DB" → 匹配归档 CAP-ACCOUNT-LOCKOUT (entity-id: 3d18c60e, version: 29e7f242)
|
|
@@ -267,6 +268,12 @@ Read openspec/changes/archive/*/ontology-identities.json
|
|
|
267
268
|
|
|
268
269
|
**❗ 必须主动询问用户,不得默认选择**。Full / Simple / Auto 三种模式的目录结构、适用场景与 AskUserQuestion 文案见 `./reference.md`「§7 文档拆分模式选择」。根据用户选择设置 `mode: full | simple`(Auto 按能力域数量判断),记录到 proposal.md 的 YAML frontmatter。
|
|
269
270
|
|
|
271
|
+
### 7.5 【交互引导】变更类型确认
|
|
272
|
+
|
|
273
|
+
**❗ 必须主动询问用户,不得默认选择**。在模式与测试策略选择附近,基于需求给出 `change-type` **推荐**并让用户确认;Auto 只能推荐,**禁止无提示静默写入**。
|
|
274
|
+
|
|
275
|
+
允许值固定为:`config | document | report | composite | other`(写入 proposal.md YAML frontmatter 的 `change-type` 字段)。AskUserQuestion 文案与类型说明见 `./reference.md`「§7.5 变更类型选择」。
|
|
276
|
+
|
|
270
277
|
### 8. 【交互引导】测试策略选择
|
|
271
278
|
|
|
272
279
|
**❗ 必须主动询问用户,不得默认选择**。TDD / Impl-First / None 三种策略的 DAG 结构、适用场景与 AskUserQuestion 文案见 `./reference.md`「§8 测试策略选择」。根据用户选择设置 `test-strategy: tdd | impl-first | none`,记录到 proposal.md 的 YAML frontmatter。
|
|
@@ -333,10 +340,11 @@ Read openspec/changes/archive/*/ontology-identities.json
|
|
|
333
340
|
- **⛔ 阶段边界**:本阶段禁止执行任何代码创建/修改操作。若用户要求处理代码,回复:「当前处于 Propose 阶段,代码操作请在完成文档后使用 `/opsx-apply` 执行。」
|
|
334
341
|
- **⛔ 单阶段原则**:完成 proposal.md 后必须立即停止。仅提示用户下一步可运行 `/opsx-spec`,绝对禁止自动执行 spec/design/task 等后续阶段。每个阶段必须由用户主动触发。
|
|
335
342
|
- **⛔ Frontmatter 规范(L7)**:YAML frontmatter 中禁止写 `#` 注释(YAML 注释在 frontmatter 中可能导致解析问题)。如需说明,在 frontmatter 之前或之后用正文描述。
|
|
343
|
+
- **⛔ change-type 必采**:frontmatter 必须含 `change-type`,取值仅限 `config | document | report | composite | other`;Agent 可推荐但须经用户确认后写入,禁止静默默认。
|
|
336
344
|
|
|
337
345
|
---
|
|
338
346
|
|
|
339
347
|
## 渐进披露
|
|
340
348
|
|
|
341
349
|
- Read `checklist.md` 仅在执行 propose 需要校验时 — 含阶段边界⛔(Propose 阶段约束)、§6 需求完整性检查、Guardrails ⛔ 强制项勾选表。
|
|
342
|
-
- Read `reference.md` 仅在需要参考详细模板时 — 含 📊 Telemetry 命令模板(start/end)、§7 文档拆分模式(Full/Simple/Auto)、§8 测试策略(TDD/Impl-First/None)、§10 质量红线自检清单(8 项)。
|
|
350
|
+
- Read `reference.md` 仅在需要参考详细模板时 — 含 📊 Telemetry 命令模板(start/end)、§7 文档拆分模式(Full/Simple/Auto)、§7.5 变更类型(config/document/report/composite/other)、§8 测试策略(TDD/Impl-First/None)、§10 质量红线自检清单(8 项)。
|
|
@@ -4,7 +4,7 @@ description: opsx-propose 的详细模板:telemetry 命令、文档拆分模
|
|
|
4
4
|
|
|
5
5
|
# opsx-propose — 详细参考(reference)
|
|
6
6
|
|
|
7
|
-
> 本文件承载 opsx-propose 的重细节模板:telemetry 命令、§7 文档拆分模式说明、§8 测试策略说明、§10 质量红线自检清单。
|
|
7
|
+
> 本文件承载 opsx-propose 的重细节模板:telemetry 命令、§7 文档拆分模式说明、§7.5 变更类型说明、§8 测试策略说明、§10 质量红线自检清单。
|
|
8
8
|
> SKILL.md 保留入口骨架与指针;本文件为详细模板来源。
|
|
9
9
|
|
|
10
10
|
---
|
|
@@ -48,6 +48,31 @@ description: opsx-propose 的详细模板:telemetry 命令、文档拆分模
|
|
|
48
48
|
|
|
49
49
|
---
|
|
50
50
|
|
|
51
|
+
## §7.5 变更类型选择
|
|
52
|
+
|
|
53
|
+
**❗ 必须主动询问用户,不得默认选择;Auto 仅给推荐,禁止无提示写入**
|
|
54
|
+
|
|
55
|
+
分析需求后,Agent 先给出推荐类型,再使用 **AskUserQuestion** 让用户确认:
|
|
56
|
+
|
|
57
|
+
> "📊 **变更类型(用于 V3 指标分层统计)**
|
|
58
|
+
>
|
|
59
|
+
> 根据本次需求,推荐类型:**[config | document | report | composite | other]** — [一句话理由]
|
|
60
|
+
>
|
|
61
|
+
> 请选择或确认:
|
|
62
|
+
> - **config** — 配置/开关/环境/依赖调整,几乎不改业务逻辑
|
|
63
|
+
> - **document** — 文档、规范、模板、注释类变更
|
|
64
|
+
> - **report** — 报告、度量、仪表盘、采集契约类变更
|
|
65
|
+
> - **composite** — 跨多类能力的组合变更
|
|
66
|
+
> - **other** — 以上均不合适时使用
|
|
67
|
+
>
|
|
68
|
+
> A) 采用推荐 B) 手动选择其他类型"
|
|
69
|
+
|
|
70
|
+
根据用户确认,在 proposal.md YAML frontmatter 写入 `change-type: <值>`。允许值固定:`config | document | report | composite | other`。
|
|
71
|
+
|
|
72
|
+
> 历史 proposal 缺该字段时,报告侧归为 `unknown`;本阶段不得替用户猜测补写。
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
51
76
|
## §8 测试策略选择
|
|
52
77
|
|
|
53
78
|
**❗ 必须主动询问用户,不得默认选择**
|
|
@@ -66,8 +91,8 @@ description: opsx-propose 的详细模板:telemetry 命令、文档拆分模
|
|
|
66
91
|
|
|
67
92
|
**将用户选择记录到 proposal.md 的 YAML frontmatter 中。**
|
|
68
93
|
|
|
69
|
-
> 完整策略定义见
|
|
70
|
-
> 交互引导文案见
|
|
94
|
+
> 完整策略定义见 tdd-core/SKILL.md §5
|
|
95
|
+
> 交互引导文案见 tdd-rules/rules/tdd-strategy-selection.md
|
|
71
96
|
|
|
72
97
|
---
|
|
73
98
|
|
|
@@ -82,5 +107,6 @@ description: opsx-propose 的详细模板:telemetry 命令、文档拆分模
|
|
|
82
107
|
- [ ] 前置依赖使用 checkbox 格式
|
|
83
108
|
- [ ] 文档末尾包含质量红线检查清单
|
|
84
109
|
- [ ] 能力分解章节已明确(决定后续 specs 文件夹结构)
|
|
110
|
+
- [ ] frontmatter 含 `change-type`,取值为 `config | document | report | composite | other` 之一且经用户确认
|
|
85
111
|
|
|
86
112
|
**如有任意一项未满足,重新生成对应章节,直至全部通过。**
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# opsx-rules 参考 — 落位矩阵与格式模板
|
|
2
2
|
|
|
3
3
|
> **权威源说明**:本文件是 skill **运行时**的落位矩阵真相源(部署到目标项目后无法 `require` kld-sdd 的 `lib/`)。`lib/tool-profiles.js` 中的 `rulesDir` / `rulesFormat` / `rulesWiring` 为 **init 契约与测试断言**;变更时须与本表同步,以本表为准写入规则文件。
|
|
4
|
+
>
|
|
5
|
+
> **边界**:SkyWalk Telemetry 的事件 schema、`run_id`、`test_event_id` 等属于 SDD 工具协议,不属于业务项目规则。生成或 review 五类项目规则时,不把 telemetry 命令或事件字段写入规则正文。
|
|
4
6
|
|
|
5
7
|
## 落位矩阵
|
|
6
8
|
|
|
@@ -80,7 +82,7 @@ trigger: always_on
|
|
|
80
82
|
|------|--------|----------|----------|
|
|
81
83
|
| 架构规范 | `architecture` | 目录分层、模块边界、入口 | 分层约定、禁止循环依赖、新代码落位 |
|
|
82
84
|
| 编码规范 | `coding-style` | 语言、lint、缩进 | 命名、缩进、注释语言、CommonJS/ESM |
|
|
83
|
-
| 测试约定 | `testing` | test 目录、框架 | 测试命令、命名、TDD 期望(见
|
|
85
|
+
| 测试约定 | `testing` | test 目录、框架 | 测试命令、命名、TDD 期望(见 tdd-core/SKILL.md §5) |
|
|
84
86
|
| 数据安全 | `database-safety` | ORM/迁移目录 | 无 DB 时降级为「禁止危险文件操作/敏感数据提交」 |
|
|
85
87
|
| Git 提交 | `git-commit` | git log 风格、CI | 提交前确认、message 风格、禁止 force push |
|
|
86
88
|
|