@kunlv/atdc 1.0.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/AGENTS.md +58 -0
- package/GO.md +245 -0
- package/bin/add-command.py +144 -0
- package/bin/atdc.js +460 -0
- package/bin/cls.js +98 -0
- package/central/link.sh +60 -0
- package/central/ticket_center_server/.handoffs/TASK-238389_QYinVipLimit.md +128 -0
- package/central/ticket_center_server/.test_plans/TASK-227254-SupportMembership-self-test-plan.md +566 -0
- package/central/ticket_center_server/.test_plans/task-238389-qyin-vip-limit-self-test-plan.md +210 -0
- package/commands/claude/atd.md +3 -0
- package/commands/claude/atdc/1-spec.md +5 -0
- package/commands/claude/atdc/1-update.md +5 -0
- package/commands/claude/atdc/2-qa.md +3 -0
- package/commands/claude/atdc/3-impl-skip-spec.md +5 -0
- package/commands/claude/atdc/3-impl.md +3 -0
- package/commands/claude/atdc/4-verify.md +3 -0
- package/commands/claude/atdc/5-done.md +3 -0
- package/commands/claude/atdc/add-command.md +4 -0
- package/commands/claude/atdc/add-to-hc.md +3 -0
- package/commands/claude/atdc/analysis-cls-log.md +4 -0
- package/commands/claude/atdc/article.md +6 -0
- package/commands/claude/atdc/bugfix.md +4 -0
- package/commands/claude/atdc/code-simplifier.md +8 -0
- package/commands/claude/atdc/commit.md +4 -0
- package/commands/claude/atdc/compound.md +5 -0
- package/commands/claude/atdc/context.md +3 -0
- package/commands/claude/atdc/diagnose.md +8 -0
- package/commands/claude/atdc/git-guardrails.md +18 -0
- package/commands/claude/atdc/grill-with-docs.md +8 -0
- package/commands/claude/atdc/handoff.md +8 -0
- package/commands/claude/atdc/health.md +3 -0
- package/commands/claude/atdc/learn.md +4 -0
- package/commands/claude/atdc/review.md +10 -0
- package/commands/claude/atdc/search.md +4 -0
- package/commands/claude/atdc/strategy.md +3 -0
- package/commands/claude/atdc/table2xlsx.md +4 -0
- package/commands/claude/atdc/test-plan.md +5 -0
- package/commands/claude/atdc/travel-planner.md +4 -0
- package/commands/claude/atdc/xlsx2sql-insert.md +4 -0
- package/commands/claude/atdc/xlsx2sql-update.md +4 -0
- package/commands/claude/atdc/zoom-out.md +8 -0
- package/commands/codex/atdc/SKILL.md +8 -0
- package/commands/codex/atdc-1-spec/SKILL.md +8 -0
- package/commands/codex/atdc-1-update/SKILL.md +8 -0
- package/commands/codex/atdc-2-qa/SKILL.md +8 -0
- package/commands/codex/atdc-3-impl/SKILL.md +8 -0
- package/commands/codex/atdc-3-impl-skip-spec/SKILL.md +8 -0
- package/commands/codex/atdc-4-verify/SKILL.md +8 -0
- package/commands/codex/atdc-5-done/SKILL.md +8 -0
- package/commands/codex/atdc-add-command/SKILL.md +7 -0
- package/commands/codex/atdc-add-to-hc/SKILL.md +8 -0
- package/commands/codex/atdc-analysis-cls-log/SKILL.md +5 -0
- package/commands/codex/atdc-article/SKILL.md +8 -0
- package/commands/codex/atdc-bugfix/SKILL.md +5 -0
- package/commands/codex/atdc-code-simplifier/SKILL.md +7 -0
- package/commands/codex/atdc-commit/SKILL.md +7 -0
- package/commands/codex/atdc-compound/SKILL.md +8 -0
- package/commands/codex/atdc-context/SKILL.md +8 -0
- package/commands/codex/atdc-diagnose/SKILL.md +9 -0
- package/commands/codex/atdc-git-guardrails/SKILL.md +19 -0
- package/commands/codex/atdc-grill-with-docs/SKILL.md +9 -0
- package/commands/codex/atdc-handoff/SKILL.md +9 -0
- package/commands/codex/atdc-health/SKILL.md +8 -0
- package/commands/codex/atdc-learn/SKILL.md +7 -0
- package/commands/codex/atdc-review/SKILL.md +49 -0
- package/commands/codex/atdc-search/SKILL.md +5 -0
- package/commands/codex/atdc-strategy/SKILL.md +8 -0
- package/commands/codex/atdc-table2xlsx/SKILL.md +8 -0
- package/commands/codex/atdc-test-plan/SKILL.md +13 -0
- package/commands/codex/atdc-travel-planner/SKILL.md +7 -0
- package/commands/codex/atdc-xlsx2sql-insert/SKILL.md +8 -0
- package/commands/codex/atdc-xlsx2sql-update/SKILL.md +8 -0
- package/commands/codex/atdc-zoom-out/SKILL.md +9 -0
- package/commands/cursor/atdc/SKILL.md +8 -0
- package/commands/cursor/atdc-1-spec/SKILL.md +8 -0
- package/commands/cursor/atdc-1-update/SKILL.md +8 -0
- package/commands/cursor/atdc-2-qa/SKILL.md +8 -0
- package/commands/cursor/atdc-3-impl/SKILL.md +8 -0
- package/commands/cursor/atdc-3-impl-skip-spec/SKILL.md +8 -0
- package/commands/cursor/atdc-4-verify/SKILL.md +8 -0
- package/commands/cursor/atdc-5-done/SKILL.md +8 -0
- package/commands/cursor/atdc-add-command/SKILL.md +7 -0
- package/commands/cursor/atdc-add-to-hc/SKILL.md +8 -0
- package/commands/cursor/atdc-analysis-cls-log/SKILL.md +5 -0
- package/commands/cursor/atdc-article/SKILL.md +8 -0
- package/commands/cursor/atdc-bugfix/SKILL.md +5 -0
- package/commands/cursor/atdc-code-simplifier/SKILL.md +7 -0
- package/commands/cursor/atdc-commit/SKILL.md +7 -0
- package/commands/cursor/atdc-compound/SKILL.md +8 -0
- package/commands/cursor/atdc-context/SKILL.md +8 -0
- package/commands/cursor/atdc-diagnose/SKILL.md +8 -0
- package/commands/cursor/atdc-git-guardrails/SKILL.md +18 -0
- package/commands/cursor/atdc-grill-with-docs/SKILL.md +8 -0
- package/commands/cursor/atdc-handoff/SKILL.md +8 -0
- package/commands/cursor/atdc-health/SKILL.md +8 -0
- package/commands/cursor/atdc-learn/SKILL.md +7 -0
- package/commands/cursor/atdc-review/SKILL.md +49 -0
- package/commands/cursor/atdc-search/SKILL.md +5 -0
- package/commands/cursor/atdc-strategy/SKILL.md +8 -0
- package/commands/cursor/atdc-table2xlsx/SKILL.md +8 -0
- package/commands/cursor/atdc-test-plan/SKILL.md +7 -0
- package/commands/cursor/atdc-travel-planner/SKILL.md +7 -0
- package/commands/cursor/atdc-xlsx2sql-insert/SKILL.md +8 -0
- package/commands/cursor/atdc-xlsx2sql-update/SKILL.md +8 -0
- package/commands/cursor/atdc-zoom-out/SKILL.md +8 -0
- package/commands/opencode/atd.md +6 -0
- package/commands/opencode/atdc/1-spec.md +8 -0
- package/commands/opencode/atdc/1-update.md +8 -0
- package/commands/opencode/atdc/2-qa.md +6 -0
- package/commands/opencode/atdc/3-impl-skip-spec.md +8 -0
- package/commands/opencode/atdc/3-impl.md +6 -0
- package/commands/opencode/atdc/4-verify.md +6 -0
- package/commands/opencode/atdc/5-done.md +6 -0
- package/commands/opencode/atdc/add-command.md +6 -0
- package/commands/opencode/atdc/add-to-hc.md +6 -0
- package/commands/opencode/atdc/analysis-cls-log.md +6 -0
- package/commands/opencode/atdc/article.md +6 -0
- package/commands/opencode/atdc/bugfix.md +6 -0
- package/commands/opencode/atdc/code-simplifier.md +8 -0
- package/commands/opencode/atdc/commit.md +6 -0
- package/commands/opencode/atdc/compound.md +8 -0
- package/commands/opencode/atdc/context.md +6 -0
- package/commands/opencode/atdc/diagnose.md +8 -0
- package/commands/opencode/atdc/git-guardrails.md +18 -0
- package/commands/opencode/atdc/grill-with-docs.md +8 -0
- package/commands/opencode/atdc/handoff.md +8 -0
- package/commands/opencode/atdc/health.md +6 -0
- package/commands/opencode/atdc/learn.md +6 -0
- package/commands/opencode/atdc/review.md +7 -0
- package/commands/opencode/atdc/search.md +6 -0
- package/commands/opencode/atdc/strategy.md +6 -0
- package/commands/opencode/atdc/table2xlsx.md +6 -0
- package/commands/opencode/atdc/test-plan.md +6 -0
- package/commands/opencode/atdc/travel-planner.md +6 -0
- package/commands/opencode/atdc/xlsx2sql-insert.md +6 -0
- package/commands/opencode/atdc/xlsx2sql-update.md +6 -0
- package/commands/opencode/atdc/zoom-out.md +8 -0
- package/config/cls-defaults.json +19 -0
- package/hooks/atd-archive.sh +86 -0
- package/hooks/atd-state.sh +165 -0
- package/hooks/evidence-hook.sh +88 -0
- package/hooks/evidence-log.sh +54 -0
- package/hooks/guardrails.sh +65 -0
- package/hooks/handoff-compress.sh +104 -0
- package/hooks/phase-guard.sh +134 -0
- package/hooks/phase-write-guard.sh +96 -0
- package/hooks/ponytail-fix.sh +179 -0
- package/hooks/ponytail-guard.sh +66 -0
- package/hooks/ponytail-scan.sh +62 -0
- package/install.sh +276 -0
- package/package.json +20 -0
- package/packages/cls/bin/cls.js +146 -0
- package/packages/cls/config/defaults.json +17 -0
- package/packages/cls/mcp/server.js +142 -0
- package/packages/cls/package.json +29 -0
- package/packages/cls/scripts/postinstall.js +19 -0
- package/packages/cls/src/client.js +262 -0
- package/prompts/1-spec.md +271 -0
- package/prompts/1-update.md +198 -0
- package/prompts/2-qa.md +164 -0
- package/prompts/3-impl-bugfix.md +271 -0
- package/prompts/3-impl.md +419 -0
- package/prompts/4-verify.md +160 -0
- package/prompts/5-done.md +227 -0
- package/prompts/6-article.md +571 -0
- package/prompts/X-add-command.md +60 -0
- package/prompts/X-add-to-hc.md +178 -0
- package/prompts/X-analysis-cls-log.md +68 -0
- package/prompts/X-bugfix.md +10 -0
- package/prompts/X-code-simplifier.md +38 -0
- package/prompts/X-commit.md +116 -0
- package/prompts/X-compound.md +188 -0
- package/prompts/X-context-scan.md +101 -0
- package/prompts/X-diagnose.md +116 -0
- package/prompts/X-grill-with-docs.md +120 -0
- package/prompts/X-handoff.md +80 -0
- package/prompts/X-health.md +78 -0
- package/prompts/X-learn.md +151 -0
- package/prompts/X-review.md +417 -0
- package/prompts/X-search.md +74 -0
- package/prompts/X-strategy.md +95 -0
- package/prompts/X-table2xlsx.md +46 -0
- package/prompts/X-test-plan.md +436 -0
- package/prompts/X-travel-planner.md +22 -0
- package/prompts/X-xlsx2sql-insert.md +34 -0
- package/prompts/X-xlsx2sql-update.md +40 -0
- package/prompts/X-zoom-out.md +119 -0
- package/reference/diagnose-loop.md +66 -0
- package/reference/gates.md +90 -0
- package/reference/git-guardrails.md +71 -0
- package/reference/guards.md +275 -0
- package/reference/learn.md +100 -0
- package/reference/memory.md +190 -0
- package/reference/risk.md +74 -0
- package/reference/tdd.md +40 -0
- package/scripts/svg2png.js +46 -0
- package/src/cls/client.js +244 -0
- package/src/constants.js +49 -0
- package/src/evidence/ai-draft-metrics.js +157 -0
- package/src/evidence/canvas.js +184 -0
- package/src/evidence/index.js +98 -0
- package/src/evidence/sink-events.js +165 -0
- package/src/evidence/stage-timing.js +112 -0
- package/src/installers/claude.js +79 -0
- package/src/installers/codex.js +62 -0
- package/src/installers/opencode.js +72 -0
- package/src/manifest/ponytail-patterns.json +185 -0
- package/src/mcp/cls-mcp-server.js +142 -0
- package/src/utils.js +79 -0
- package/src/validators/state-validate.js +123 -0
- package/templates/.phase-state.json +13 -0
- package/templates/adr.md +62 -0
- package/templates/changelog.md +21 -0
- package/templates/concepts.md +35 -0
- package/templates/design.md +47 -0
- package/templates/handoff.md +64 -0
- package/templates/learn-skill.md +43 -0
- package/templates/progress.json +17 -0
- package/templates/proposal.md +29 -0
- package/templates/solution.md +36 -0
- package/templates/strategy.md +39 -0
- package/templates/tasks.md +41 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# reference/diagnose-loop · 结构化调试方法论
|
|
2
|
+
|
|
3
|
+
每个 Phase 对应 `/atd:diagnose` 的一个阶段,也由 `3-impl` 的 TDD 失败 / C3 验证失败自动引用。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 6 阶段循环
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
复现(Reproduce) → 最小化(Minimise) → 假设(Hypothesise) → 插桩(Instrument) → 修复(Fix) → 回归测试(Regression-test)
|
|
11
|
+
↑ │
|
|
12
|
+
└────────────────────────── 失败则回退 ─────────────────────────────────────────────────────┘
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 各阶段判定标准
|
|
18
|
+
|
|
19
|
+
| 阶段 | 通过标准 | 不通过则 |
|
|
20
|
+
|------|---------|---------|
|
|
21
|
+
| Reproduce | 有可重复的复现命令/步骤 | 继续收集信息 |
|
|
22
|
+
| Minimise | 最小用例 ≤ 50 行 / ≤ 5 步 | 继续剥离 |
|
|
23
|
+
| Hypothesise | ≥ 2 个有预测的假设 | 重新分析 |
|
|
24
|
+
| Instrument | 插桩输出与某假设的预测一致 | 标记该假设为否定,验证下一个 |
|
|
25
|
+
| Fix | 复现用例通过 + 全量测试通过 | 回到 Hypothesise |
|
|
26
|
+
| Regression-test | 新增回归测试 + 相关测试套件通过 | 补充回归测试 |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 自动切入规则(3-impl 内)
|
|
31
|
+
|
|
32
|
+
触发条件:
|
|
33
|
+
- TDD RED 阶段测试失败 ≥ 2 次(同一任务)
|
|
34
|
+
- C3 验证失败
|
|
35
|
+
|
|
36
|
+
切入后:
|
|
37
|
+
- 从失败的测试命令/错误输出自动提取 Reproduce 信息
|
|
38
|
+
- 不询问用户,直接从已有上下文开始
|
|
39
|
+
- 最多 3 轮循环,3 轮后输出调试报告并暂停等用户决策
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 调试报告格式
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
🔬 调试报告 — <问题描述>
|
|
47
|
+
|
|
48
|
+
已排除假设:
|
|
49
|
+
- <假设1>:<排除原因>
|
|
50
|
+
- <假设2>:<排除原因>
|
|
51
|
+
|
|
52
|
+
剩余假设:
|
|
53
|
+
- <假设3>:<为什么仍有可能>
|
|
54
|
+
|
|
55
|
+
建议下一步:
|
|
56
|
+
- <具体行动>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 原则
|
|
62
|
+
|
|
63
|
+
- 禁止「试试改这里看看」的猜测式修复
|
|
64
|
+
- 每次修改必须有明确的假设支撑
|
|
65
|
+
- 修复后必须跑回归测试(不只是当前测试)
|
|
66
|
+
- 不得引入 `// TODO`、`// FIXME`、`// HACK` 标记(除非用户明确同意)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# reference/gates · 质量门禁
|
|
2
|
+
|
|
3
|
+
4 个门禁在 3-impl.md 的 Step 3/4 和 Step 6 中自动触发。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Gate 1:Spec 质量检查
|
|
8
|
+
|
|
9
|
+
扫描 `openspec/changes/<name>/specs/` 下所有 spec.md。
|
|
10
|
+
|
|
11
|
+
**弱需求检测**:
|
|
12
|
+
- 含 `should`/`could`/`might`/`可能`/`尽量`/`应该`(非 SHALL/MUST 语境)→ 标为弱需求
|
|
13
|
+
- 每条需求必须含 `SHALL` 或 `MUST`
|
|
14
|
+
|
|
15
|
+
**验收标准检查**:
|
|
16
|
+
- 每个 `Scenario:` 必须有 Given/When/Then 或可量化的预期结果
|
|
17
|
+
|
|
18
|
+
**边界场景覆盖**:
|
|
19
|
+
- 空值/null 输入
|
|
20
|
+
- 超限/超大输入
|
|
21
|
+
- 并发/竞态场景
|
|
22
|
+
- 降级/容错场景
|
|
23
|
+
|
|
24
|
+
**错误路径检查**:
|
|
25
|
+
- 每个 happy path 是否有对应 sad path
|
|
26
|
+
|
|
27
|
+
**报告格式**:
|
|
28
|
+
```
|
|
29
|
+
📋 Gate 1 Spec 质量报告
|
|
30
|
+
✅ 强需求 (SHALL/MUST): N 条
|
|
31
|
+
⚠️ 弱需求: N 条 → [列表]
|
|
32
|
+
⚠️ 无验收标准: N 条 → [列表]
|
|
33
|
+
⚠️ 缺边界场景: N 个 → [列表]
|
|
34
|
+
⚠️ 缺错误路径: N 个 → [列表]
|
|
35
|
+
|
|
36
|
+
继续执行?[是 / 修复后继续 / 跳过检查]
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Gate 2:追溯矩阵
|
|
42
|
+
|
|
43
|
+
读取 tasks.md + `openspec/changes/<name>/specs/`,生成映射写入 `.progress.json`:
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"traceability": [
|
|
48
|
+
{
|
|
49
|
+
"requirement": "REQ-001: 系统SHALL支持XXX",
|
|
50
|
+
"task": "Task 3",
|
|
51
|
+
"testFile": "path/to/xxx_test.go",
|
|
52
|
+
"implFile": "path/to/xxx.go"
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**报告**:
|
|
59
|
+
- spec 需求无对应 task → **需求遗漏**
|
|
60
|
+
- task 无对应 spec 需求 → **隐性需求**(建议补 spec)
|
|
61
|
+
- task 无测试文件 → **缺测试**(Gate 3 再检查)
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Gate 3:测试意图(执行中)
|
|
66
|
+
|
|
67
|
+
每个测试函数必须包含:
|
|
68
|
+
```
|
|
69
|
+
// Intent: <为什么这个行为重要,而不仅是它做了什么>
|
|
70
|
+
func TestXxx_Scenario(t *testing.T) { ... }
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- 缺 `// Intent:` → 标为"无意图测试"
|
|
74
|
+
- Intent 只重复函数名("测试批量退款")→ 标为"弱意图",要求重写
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Gate 4:实现一致性(C3)
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git diff --name-only HEAD
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**功能蔓延检测**:
|
|
85
|
+
- 对比 `traceability` 的 implFile 列表
|
|
86
|
+
- 不在矩阵中的变更文件 → "无主变更",列出等用户确认
|
|
87
|
+
|
|
88
|
+
**领域规则检查**:
|
|
89
|
+
- 读取 AGENTS.md/CLAUDE.md 中的约束
|
|
90
|
+
- grep 检查变更文件是否绕过约束(如直接 DB 操作绕过分片路由)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# reference/git-guardrails · Git 安全防护
|
|
2
|
+
|
|
3
|
+
atd-code 内置 git hook 防护,拦截高风险操作。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
`install.sh` 自动处理:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# install.sh 会执行:
|
|
13
|
+
ln -sf ~/atd-code/hooks/guardrails.sh .git/hooks/pre-push
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
也可手动安装到已有项目:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
ln -sf ~/atd-code/hooks/guardrails.sh .git/hooks/pre-push
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
卸载:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
rm .git/hooks/pre-push
|
|
26
|
+
# 恢复默认:
|
|
27
|
+
# cp .git/hooks/pre-push.sample .git/hooks/pre-push
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 拦截规则
|
|
33
|
+
|
|
34
|
+
| 操作 | 行为 | 原因 |
|
|
35
|
+
|------|------|------|
|
|
36
|
+
| `git push` 到 main/master | ❌ 拦截 | 应通过 PR/MR 合并 |
|
|
37
|
+
| `git push --force` 到 main/master | ❌ 拦截 | 不可逆破坏 |
|
|
38
|
+
| `git push --delete` main/master | ❌ 拦截 | 不可逆破坏 |
|
|
39
|
+
| WIP commit 推送 | ⚠️ 警告 | 建议 squash 后推送 |
|
|
40
|
+
| `git stash` 后推送 | ⚠️ 提示 | 提醒检查是否有未完成工作 |
|
|
41
|
+
|
|
42
|
+
非 main/master 分支的普通 push 不受影响。
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 自定义规则
|
|
47
|
+
|
|
48
|
+
编辑 `hooks/guardrails.sh`,在 `# CUSTOM RULES` 标记处添加:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# 示例:禁止推送包含 TODO 的 commit
|
|
52
|
+
if git log $remote_sha..$local_sha --oneline | grep -q "TODO"; then
|
|
53
|
+
echo "❌ commit 中包含 TODO,请处理后再推送"
|
|
54
|
+
exit 1
|
|
55
|
+
fi
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 在 atd-code 工作流中的位置
|
|
61
|
+
|
|
62
|
+
- **安装**:一次性(install.sh),非流程步骤
|
|
63
|
+
- **提醒**:`3-impl` 执行前检测 hook 是否存在;不存在则输出一次性提醒
|
|
64
|
+
- **规则**:`guards.md` R7 记录为硬性规则
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 与其他 git 工具的兼容
|
|
69
|
+
|
|
70
|
+
- 与 Husky pre-commit hook 不冲突(pre-push 和 pre-commit 是不同阶段)
|
|
71
|
+
- 如项目已有自定义 pre-push hook,install.sh 会跳过并提示手动合并
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# reference/guards · 硬性拦截规则
|
|
2
|
+
|
|
3
|
+
> 🔴 此文件是**可执行规则**,不是参考文档。
|
|
4
|
+
> 以下每条规则中的 MUST / HARD STOP / 禁止 / 不得 均有强制执行效力。
|
|
5
|
+
> 3-impl.md Step -1 已强制加载此文件。若未加载 → 回退重新加载。
|
|
6
|
+
|
|
7
|
+
所有规则在执行阶段强制生效,不得跳过或绕过。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## R1 前置检查
|
|
12
|
+
|
|
13
|
+
change 目录必须包含以下全部文件才能开始执行:
|
|
14
|
+
|
|
15
|
+
| 文件 | 说明 |
|
|
16
|
+
|------|------|
|
|
17
|
+
| `proposal.md` | 背景、方案、排除选项 |
|
|
18
|
+
| `design.md` | 模块、接口、数据流 |
|
|
19
|
+
| `tasks.md` | 任务清单 + Verification Checklist |
|
|
20
|
+
| `specs/*/spec.md` | 至少一个模块的 delta spec |
|
|
21
|
+
|
|
22
|
+
change 目录位于 `openspec/changes/<name>/`,任一缺失 → 停止,不得用"先跳过"绕过。
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## R2 TDD 强制
|
|
27
|
+
|
|
28
|
+
每个任务写实现代码**之前**,必须:
|
|
29
|
+
|
|
30
|
+
1. 创建对应测试文件(`_test.go` 或对应语言的测试文件)
|
|
31
|
+
2. 每个测试函数包含 `// Intent: <为什么这个行为重要>`(不是描述做了什么)
|
|
32
|
+
3. 测试编译通过后,才允许写实现
|
|
33
|
+
|
|
34
|
+
跳过测试直接写实现 → 停止,必须补测试后继续。
|
|
35
|
+
|
|
36
|
+
**完整循环**:RED(测试失败)→ GREEN(实现通过)→ REFACTOR(清理)→ 缺任何一步 = 任务未完成。
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## R3 归档强制
|
|
41
|
+
|
|
42
|
+
归档时**禁止**直接 `mv`/`cp` 目录到 archive,必须按顺序:
|
|
43
|
+
|
|
44
|
+
1. 先将 `openspec/changes/<name>/specs/` 合并到 `openspec/specs/<module>/spec.md`
|
|
45
|
+
2. 再 `mv openspec/changes/<name> openspec/changes/archive/<name>`
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## R4 文件边界声明
|
|
50
|
+
|
|
51
|
+
**执行前**:任务必须有 `**Files**:` 字段,缺失则停止。
|
|
52
|
+
|
|
53
|
+
**执行后**:`git diff --name-only HEAD` 对比声明文件列表:
|
|
54
|
+
- 有越界文件 → 停止,等用户确认接受或回滚
|
|
55
|
+
- 声明文件完全未改动 → 询问任务是否真的完成
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## R5 破坏性变更门槛
|
|
60
|
+
|
|
61
|
+
触发条件(任一满足):
|
|
62
|
+
- 删除代码 ≥ 5 行
|
|
63
|
+
- 修改公共函数/方法签名
|
|
64
|
+
- 删除或重命名公共接口/结构体
|
|
65
|
+
- **修改被 >5 个调用方依赖的公共符号**(通过 `codegraph_impact` 确认)
|
|
66
|
+
|
|
67
|
+
必须先执行(**优先 CodeGraph,次选 grep**):
|
|
68
|
+
```
|
|
69
|
+
# 首选
|
|
70
|
+
codegraph_callers "<SymbolName>"
|
|
71
|
+
codegraph_impact "<SymbolName>"
|
|
72
|
+
|
|
73
|
+
# 次选(CodeGraph 无结果时)
|
|
74
|
+
grep -rn "<SymbolName>" --include="*.go" . | grep -v "_test.go" | grep -v vendor
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
展示引用列表 + 引用数 + **风险评分**(按 `@atd-code/reference/risk.md` 计算,3-impl Step -1 已加载),等用户确认后才能动。
|
|
78
|
+
|
|
79
|
+
高风险(blast radius >10 个调用方或跨 ≥3 模块)变更需**额外说明替代方案和回滚策略**。
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## R6 SQL 性能与缓存安全检查
|
|
84
|
+
|
|
85
|
+
触发条件(任务涉及以下**任一**操作时):
|
|
86
|
+
- 新增/修改 SQL 查询(包括 ORM 调用:Find/Count/Where/Group/Create/Update/Delete 等)
|
|
87
|
+
- 写入 Redis 缓存(Set/SETNX/HSet/ZSet/SAdd/批量写入 Pipeline/MSet 等)
|
|
88
|
+
|
|
89
|
+
### 6a. 慢查检查
|
|
90
|
+
|
|
91
|
+
对涉及 SQL 的代码,必须结合上下文(表结构、索引定义、数据量、调用频率)判断:
|
|
92
|
+
|
|
93
|
+
| 检查项 | 判定标准 |
|
|
94
|
+
|--------|---------|
|
|
95
|
+
| WHERE 列是否有索引 | 查表结构/索引定义,确认条件列是某索引的前缀列 |
|
|
96
|
+
| N+1 查询 | 循环/遍历内逐条查询 DB,应改为批量 IN 或 JOIN |
|
|
97
|
+
| IN list 规模 | IN (...) 的元素数量不可控或可能上千,应分批或改写 |
|
|
98
|
+
| GROUP BY / ORDER BY | 是否有索引支撑,避免 filesort / temporary table |
|
|
99
|
+
| 全表扫描风险 | WHERE 条件无索引前缀可用,或 OR 跨索引 |
|
|
100
|
+
| 子查询性能 | 子查询是否可改为 JOIN,是否产生笛卡尔积 |
|
|
101
|
+
|
|
102
|
+
发现问题 → 输出格式:
|
|
103
|
+
```
|
|
104
|
+
⚠️ [R6-6a] 潜在慢查风险
|
|
105
|
+
位置: <file:line>
|
|
106
|
+
SQL/ORM: <具体调用>
|
|
107
|
+
风险: <无索引 / N+1 / 大IN / 全表扫描等>
|
|
108
|
+
建议: <加索引 SQL / 改批量查询 / 分批等>
|
|
109
|
+
```
|
|
110
|
+
**暂停,等用户确认方案后继续。**
|
|
111
|
+
|
|
112
|
+
### 6b. 大 Key 检查
|
|
113
|
+
|
|
114
|
+
对涉及 Redis 写入的代码,必须检查:
|
|
115
|
+
|
|
116
|
+
| 检查项 | 判定标准 |
|
|
117
|
+
|--------|---------|
|
|
118
|
+
| Value 大小 | 是否为未限制大小的结构(未分页的 List、大 Hash、大 JSON、未截断的字符串) |
|
|
119
|
+
| TTL 合理性 | 缓存 Key 是否设置 TTL,TTL 是否过长(>24h 无业务理由) |
|
|
120
|
+
| 批量写入量 | Pipeline/MSet 一次写入的 Key 数量是否过大(>1000) |
|
|
121
|
+
| Key 命名规范 | 是否符合项目 Key 命名规范,避免冲突 |
|
|
122
|
+
|
|
123
|
+
发现问题 → 输出格式:
|
|
124
|
+
```
|
|
125
|
+
⚠️ [R6-6b] 潜在大 Key 风险
|
|
126
|
+
位置: <file:line>
|
|
127
|
+
写入点: <具体调用>
|
|
128
|
+
风险: <Value 无限大 / 无 TTL / 批量过多等>
|
|
129
|
+
建议: <分片/压缩/设 TTL/分批等>
|
|
130
|
+
```
|
|
131
|
+
**暂停,等用户确认方案后继续。**
|
|
132
|
+
|
|
133
|
+
### 不触发 R6 的情况
|
|
134
|
+
|
|
135
|
+
以下场景**不需要** R6 检查(避免误拦截):
|
|
136
|
+
- 仅修改非 SQL/非 Redis 的业务逻辑代码
|
|
137
|
+
- 仅修改常量、配置、日志、错误处理等
|
|
138
|
+
- 查询已有稳定运行且未报慢查的只读接口(无新增/修改 WHERE 条件)
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## R7 风险分级验证
|
|
143
|
+
|
|
144
|
+
4-verify 阶段根据风险评分(按 `@atd-code/reference/risk.md` 计算)决定验证严格度:
|
|
145
|
+
|
|
146
|
+
| 风险等级 | 验证要求 |
|
|
147
|
+
|---------|---------|
|
|
148
|
+
| 🟢 低风险(4-6 分) | 增量验证:只跑变更包的测试 + Verification Checklist |
|
|
149
|
+
| 🟡 中风险(7-9 分) | 标准验证:跑变更模块的全量测试 + Test Gap 检查 |
|
|
150
|
+
| 🔴 高风险(10-12 分) | 全量验证:全量测试 + Test Gap 检查 + 受影响流程 E2E + 人工二次确认 |
|
|
151
|
+
|
|
152
|
+
### 风险评分来源
|
|
153
|
+
|
|
154
|
+
优先级:
|
|
155
|
+
1. `/atd review` 生成的 review 报告中的评分
|
|
156
|
+
2. 4-verify Step 0 自动计算的评分
|
|
157
|
+
3. 1-spec Phase 3 的预估评分(仅作参考,不作为最终依据)
|
|
158
|
+
|
|
159
|
+
### 🔴 高风险的额外要求
|
|
160
|
+
|
|
161
|
+
高风险变更在 4-verify 阶段必须:
|
|
162
|
+
- 所有变更函数都有测试覆盖(Test Gap 检查无 ❌)
|
|
163
|
+
- 受影响的用户流程有对应的集成测试或 E2E 测试
|
|
164
|
+
- 输出变更影响范围报告供人工二次确认
|
|
165
|
+
|
|
166
|
+
高风险 + Test Gap → **阻塞**,不允许跳过。
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## B5 Ponytail 决策梯
|
|
171
|
+
|
|
172
|
+
> 🔴 此规则为强制性自动检查,不得以"看起来不需要"为由跳过。
|
|
173
|
+
> 💡 **L2-L5 检测加速**:用 `/atd:search "<query>"` 或 Semble MCP 查找已有实现模式。
|
|
174
|
+
> 语义搜索例:`semble search "whitelist filter" .` → 直接返回相关代码块,比逐关键词 grep 快 10x+。
|
|
175
|
+
> CodeGraph 结构化查询(callers/callees/impact)不受影响,继续使用。
|
|
176
|
+
|
|
177
|
+
每个 task 新建文件/函数前,MUST 逐级检查并按以下格式标注代码注释:
|
|
178
|
+
|
|
179
|
+
```go
|
|
180
|
+
// Ponytail L{N}: <decision>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 梯级
|
|
184
|
+
|
|
185
|
+
**L1 需求必要性** — 对照 spec SHALL/MUST
|
|
186
|
+
- 跳过条件:spec 未覆盖的"将来可能需要"功能
|
|
187
|
+
- 不适用场景:事务一致性、数据完整性、鉴权逻辑
|
|
188
|
+
|
|
189
|
+
**L2 语言/stdlib** — Go 内建能力
|
|
190
|
+
- `slices.Contains` / `maps.Clone` / `cmp.Or` (Go 1.21+)
|
|
191
|
+
- `time.Format` / `strconv` / `encoding/json` / `net/http`
|
|
192
|
+
- `errors.Is` / `errors.As` / `fmt.Errorf("%w")` (Go 1.13+)
|
|
193
|
+
- 优先用 CodeGraph 查找标准库用法:
|
|
194
|
+
```
|
|
195
|
+
codegraph_search "<关键词>"
|
|
196
|
+
codegraph_callers "<FunctionName>"
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**L3 已有依赖** — go.mod 里的依赖
|
|
200
|
+
- `samber/lo` (functional) / `cenkalti/backoff` (retry)
|
|
201
|
+
- `google/wire` (DI) / `gorm/gen` (codegen)
|
|
202
|
+
- CodeGraph 无结果时才用 grep:
|
|
203
|
+
```bash
|
|
204
|
+
grep -rn "<关键词>" --include="*.go" . | grep -v "_test.go" | grep -v vendor | head -20
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**L4 项目已有模式** — `codegraph_context` 确认
|
|
208
|
+
- CRUD → 复用 BaseModel 模式
|
|
209
|
+
- RPC → 复用 callRPC 模式
|
|
210
|
+
- Filter → 复用 `slices.Contains` / `lo.Filter`
|
|
211
|
+
- DI → 复用容器
|
|
212
|
+
- 错误处理 → 复用 middleware
|
|
213
|
+
|
|
214
|
+
**L5 一行搞定** — 单个函数调用
|
|
215
|
+
|
|
216
|
+
**L6 泛型消除** — 同一项目 ≥3 处相似代码
|
|
217
|
+
- RPC 同构 → `callLocalRPC[T]`
|
|
218
|
+
- CRUD 同构 → `BaseModel[T]`
|
|
219
|
+
- Config Contains → `slices.Contains`
|
|
220
|
+
- 白名单 filter → `filterByWhitelist[T]`
|
|
221
|
+
- 检测到 ≥3 次重复 → **暂停,先提取泛型**
|
|
222
|
+
|
|
223
|
+
**L7 最小接口** — interface ≤ 5 methods
|
|
224
|
+
- 调用方只需 1-2 个方法 → 拆分为小接口(ISP 原则)
|
|
225
|
+
|
|
226
|
+
**L8 不可省略** — 安全/性能边界(以下不得以 Ponytail 为由跳过)
|
|
227
|
+
- R5: blast radius 检查(`codegraph_impact`)
|
|
228
|
+
- R6: SQL 索引/N+1/IN 规模,Redis value 大小/TTL/批量
|
|
229
|
+
- 事务边界、auth middleware、错误处理
|
|
230
|
+
|
|
231
|
+
### 18 种后端可优化模式速查表
|
|
232
|
+
|
|
233
|
+
| # | 优先级 | 模式 | 检测方式 | 梯级 | Ponytail 动作 |
|
|
234
|
+
|---|--------|------|---------|------|-------------|
|
|
235
|
+
| 1 | P0 | CRUD 模板重复 | `codegraph_search "func.*Find.*ctx" method > 10` | L6 | 提取 BaseModel[T] |
|
|
236
|
+
| 2 | P0 | RPC 调用模板 | `grep "httpclient.Post" service/rpc/ > 3` | L6 | 提取 callLocalRPC[T] |
|
|
237
|
+
| 3 | P1 | Service Locator DI | `grep "func Register" service/biz/ > 5` | L3 | 泛型 DI 容器 |
|
|
238
|
+
| 4 | P1 | init() 碎片 | `find service/ -name "*_init.go" > 5` | L8 | 合并到统一 init |
|
|
239
|
+
| 5 | P1 | 错误框架冗余 | `ls internal/errors/gerror/ > 3` | L2 | stdlib errors |
|
|
240
|
+
| 6 | P1 | 白名单 filter 同构 | `codegraph_callers "BuildWhitelistExcludeSet" > 2` | L6 | 提取泛型 |
|
|
241
|
+
| 7 | P2 | 自定义 Contains/Filter | `grep "func.*Contains\\[" utils/ > 0` | L2 | slices.Contains |
|
|
242
|
+
| 8 | P2 | Time 工具函数 | `grep "TimeToString" utils/ > 0` | L2 | time.Format |
|
|
243
|
+
| 9 | P2 | Phone 工具函数 | `grep "FormatPhoneNumber" utils/ > 0` | L3 | 直调 nyaruka/phonenumbers |
|
|
244
|
+
| 10 | P2 | Config type 重复 | `grep "type Apollo.*Config \\[" rtconf/ > 5` | L6 | 合并通用 type |
|
|
245
|
+
| 11 | P2 | BizError 重复 | `codegraph_callers "BizError" > 10` | L4 | 提取 middleware |
|
|
246
|
+
| 12 | P2 | GenCURL | `codegraph_callers "GenCURL" > 0` | L2 | HTTP 库内建 |
|
|
247
|
+
| 13 | P2 | getServerIP | `codegraph_search "getServerIP" > 0` | L2 | net.InterfaceAddrs |
|
|
248
|
+
| 14 | P2 | Custom retry | `grep "retry" utils/ > 0` | L3 | cenkalti/backoff |
|
|
249
|
+
| 15 | P2 | GORM tags 样板 | 手动审查 models/ | L8 | gorm/gen 或 sqlc |
|
|
250
|
+
| 16 | P2 | 大 interface | `codegraph_node "IOrder" methods > 15` | L7 | 拆分小接口 |
|
|
251
|
+
| 17 | P2 | WxPay 同构 | `grep "Wx.*Pay" pay_service.go > 1` | L6 | 合并+参数化 |
|
|
252
|
+
| 18 | P2 | Convert/Map 重复 | `grep "convertTo" service/ > 3` | L6 | 提取 mapper |
|
|
253
|
+
|
|
254
|
+
找到 → 沿用并标注 `// Ponytail L{N}: <理由>`
|
|
255
|
+
未找到 → 新建并标注 `// Ponytail L{N}: new — N levels checked`
|
|
256
|
+
|
|
257
|
+
主观判断"肯定没有"也必须查后确认,不得跳过梯级。
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## R8 Git 安全防护
|
|
262
|
+
|
|
263
|
+
git-guardrails hook 应在项目初始化时安装(`install.sh` 自动处理)。
|
|
264
|
+
|
|
265
|
+
**已安装时**,以下操作被拦截:
|
|
266
|
+
- 直接推送到 main/master 分支
|
|
267
|
+
- force push 到 protected 分支
|
|
268
|
+
- WIP commit 推送(警告)
|
|
269
|
+
|
|
270
|
+
**未安装时**,`3-impl` 执行前输出一次性提醒:
|
|
271
|
+
> ⚠️ git-guardrails 未安装。建议运行 `bash ~/atd-code/install.sh` 安装防护 hook。
|
|
272
|
+
|
|
273
|
+
**手动安装**:`ln -sf ~/atd-code/hooks/guardrails.sh .git/hooks/pre-push`
|
|
274
|
+
|
|
275
|
+
详见 `reference/git-guardrails.md`。
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# reference/learn · self-learning → atd 桥接协议
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## 核心原则
|
|
6
|
+
|
|
7
|
+
self-learning-skills 提供 detection(何时该沉淀),atd-code 提供 persistence(沉淀到哪里)。
|
|
8
|
+
|
|
9
|
+
桥接层负责:**detection 触发 → 按类型路由到 atd 的 3 层记忆系统**。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 3 层路由规则
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
self-learning detection 检测到 golden path
|
|
17
|
+
│
|
|
18
|
+
├─ 单事实 / 一行纠正(env var 名、路径、一个 gotcha)
|
|
19
|
+
│ └─→ .memory.md(⚠️ gotcha 类型)
|
|
20
|
+
│
|
|
21
|
+
├─ 失败模式 + 至少一个死路(超 2 次尝试才解决的问题)
|
|
22
|
+
│ └─→ .errors-log.md(🔴 bugfix pattern)
|
|
23
|
+
│ + .memory.md 中追加简记(交叉引用)
|
|
24
|
+
│
|
|
25
|
+
└─ 满足 promotion rule(3 条件全满足)
|
|
26
|
+
├─ 验证通过(测试通过 / 命令退出 clean)
|
|
27
|
+
├─ 命名了失败模式
|
|
28
|
+
└─ 排除了至少一个死路
|
|
29
|
+
│
|
|
30
|
+
└─→ 自动调用 add-command.py --from-learn
|
|
31
|
+
生成 /atd:<name> 命令(4 端) + prompt(含 what didn't work section)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Promotion rule(来自 self-learning)
|
|
37
|
+
|
|
38
|
+
skill 是权威的——下次 session 无条件信任它。只有 **3 条全满足** 才晋升:
|
|
39
|
+
|
|
40
|
+
1. **A passing check** — 路径已被验证(测试通过 / 命令退出 clean / build green)
|
|
41
|
+
2. **A named failure pattern** — 能命名这个路径避免/诊断的失败模式
|
|
42
|
+
3. **At least one ruled-out dead-end** — 至少一个具体被排除的尝试 + 原因
|
|
43
|
+
|
|
44
|
+
缺任何一条 → 留 memory note,不晋升 skill。
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 写入格式
|
|
49
|
+
|
|
50
|
+
### → .memory.md(gotcha / learned-skill)
|
|
51
|
+
|
|
52
|
+
```markdown
|
|
53
|
+
## 🧠 [YYYY-MM-DD] <skill-name> | ~150t
|
|
54
|
+
done: <一句话描述学到的流程>
|
|
55
|
+
decided: <核心操作步骤,关键词>
|
|
56
|
+
failure: <这个 skill 避免的失败模式>
|
|
57
|
+
dead-end: <被排除的死路>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
类型图标 `🧠` = learned-skill(新类型)。
|
|
61
|
+
|
|
62
|
+
### → .errors-log.md(failure pattern)
|
|
63
|
+
|
|
64
|
+
```markdown
|
|
65
|
+
## [YYYY-MM-DD] <skill-name> / auto-harvest
|
|
66
|
+
|
|
67
|
+
- **失败路径**: <尝试了什么,为什么不 work>
|
|
68
|
+
- **成功路径**: <最终通过的路径>
|
|
69
|
+
- **教训**: <一句话>
|
|
70
|
+
- **关联 skill**: /atd:<name>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### → atd 命令(promotion 成功时)
|
|
74
|
+
|
|
75
|
+
调用 `add-command.py --from-learn`,生成的 prompt 模板包含:
|
|
76
|
+
|
|
77
|
+
- `## 执行步骤` — 操作流程
|
|
78
|
+
- `## What didn't work` — 被排除的死路
|
|
79
|
+
- `## 失败模式` — 这个 skill 避免的诊断
|
|
80
|
+
- `## 验证方式` — passing check
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 检测触发时机
|
|
85
|
+
|
|
86
|
+
| 触发点 | 位置 | 行为 |
|
|
87
|
+
|--------|------|------|
|
|
88
|
+
| Session 启动 | GO.md Step 0d | 注入 self-learning detection prompt(静默) |
|
|
89
|
+
| C3 验证完成 | 4-verify.md Step 3.5 | 反思:本次 change 有没有值得沉淀的路径? |
|
|
90
|
+
| 归档前 | 5-done.md Step 0.5 | Learn checkpoint:检查 promotion rule |
|
|
91
|
+
| 手动触发 | /atd:learn | 强制检测当前 session 的 golden path |
|
|
92
|
+
| compound 扫描 | X-compound.md | 扫描未晋升的 harvested skill,提示晋升 |
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 安全红线
|
|
97
|
+
|
|
98
|
+
- **绝不写入 secret value** — 只记录 env var 名 / MCP 工具名 / selector 函数
|
|
99
|
+
- **promotion rule 严格执行** — "seemed to work" 不晋升
|
|
100
|
+
- **skill 写入前 dedup** — 检查是否已有同名或相似 skill
|