feat(v2.4.0): 开发铁律——DDIC 先行(依赖顺序+实测判定) + 强制闭环(本地改→同步→语法检查→循环至0错→激活→测试);补 2026-09-10 S4T 事故问题总结与自检清单

This commit is contained in:
吴让宇
2026-09-10 23:14:43 +08:00
parent f4210b06db
commit eae0b3547c
3 changed files with 86 additions and 2 deletions
+1 -1
View File
@@ -37,5 +37,5 @@ SAP-CLI-SKILL 是一个让 AI 助手直接操作 SAP ABAP 系统的技能。
--- ---
**当前版本**: 2.2.1 **当前版本**: 2.4.0
**维护者**: SwiftCode Creative Technology **维护者**: SwiftCode Creative Technology
+55 -1
View File
@@ -1,7 +1,7 @@
--- ---
name: sap-cli name: sap-cli
description: "SAP ABAP ADT CLI for AI agents. Trigger when: operating ABAP objects, syncing code to/from SAP, managing transports, querying DDIC, running ABAP programs, reading SAP tables, or any SAP development task via terminal." description: "SAP ABAP ADT CLI for AI agents. Trigger when: operating ABAP objects, syncing code to/from SAP, managing transports, querying DDIC, running ABAP programs, reading SAP tables, or any SAP development task via terminal."
version: "2.3.0" version: "2.4.0"
author: WuRangyu author: WuRangyu
license: MIT license: MIT
triggers: triggers:
@@ -110,6 +110,60 @@ Full rules: `references/sap-tool-constraints.md`. Violations are intercepted by
5. **Non-interactive `delete` needs piped confirm**`echo "yes" | python main.py delete ...` (else EOFError). 5. **Non-interactive `delete` needs piped confirm**`echo "yes" | python main.py delete ...` (else EOFError).
6. **DDIC `sync` failure on NW 7.40 (HTTP 406) is a system limit** — do not retry; report to the user for SE09. 6. **DDIC `sync` failure on NW 7.40 (HTTP 406) is a system limit** — do not retry; report to the user for SE09.
## ⛔ 开发铁律(依赖顺序 + 强制闭环)
> 违反任一条的后果不是「效率低」,而是**后续全部代码必须返工**。2026-09-10 S4T 实测事故后固化。
### 铁律 1:DDIC 未完成,禁止开发任何引用它的代码
代码引用的每一个 DDIC 对象(域 / 数据元素 / 表 / 结构 / 表类型)**必须先完成「上传 → 语法检查通过 → 激活成功」三关**,才能开始写引用它的代码。
- 落地顺序:`domain → dataelement → table/structure → tabletype → interface → class → function → report`
- 「已完成」**以实测为准,不采信会话自述**:
- 结构 → `read-table DD02L``AS4LOCAL = 'A'` 才算激活)
- 表类型 → `read-table DD40L`
- 其他对象 → `info` / `read-table TADIR`
- 违反后果:后续每个引用它的对象语法检查报「类型 XXX 未知 / 结构不存在」,整批返工。
### 铁律 2:强制开发闭环(七步,不得跳步)
```
1. 本地编写 / 修改源码 ← 本地文件是唯一编辑入口,不在 SAP 端直接改
2. 同步到 SAP ← upload / sync --corr_nr
3. SAP 端语法检查 ← syntax-check
4. 有错?→ 回到第 1 步 ← 本地改 → 再同步 → 再检查,循环到 0 错误
5. 语法检查通过 → 激活 ← activate
6. 激活成功 → 才允许执行测试 ← run-program / unit-test
7. 测试不过 → 回到第 1 步
```
**禁止**
- ❌ 跳过语法检查直接 `activate`
- ❌ 未激活就 `run-program` / `unit-test`(跑的是旧版本,或报「对象不存在」)
- ❌ 把「语法检查通过」当成「功能正常」—— `syntax-check` 不校验被调对象的存在性与签名(见 `references/abap-coding-rules.md` E04/E05
- ❌ 把「S4T 演示机通过」表述为「CEM / 生产验证通过」(演示机缺 DDIC、无编号范围、权限不同)
### 铁律 3:引用前先核实存在性(E04/E05 落地)
`CALL FUNCTION` 或引用 `TYPE z...` 之前,必须先 `info` / `read-table DD02L|DD03L` 核实:对象存在、名称逐字符一致、签名与组件一致。核实记录(对象存在性 + 签名比对)纳入交付物。
### 铁律 4:同一任务同时只允许一个开发者
多会话并发操作同一批对象会相互覆盖。**派下一个会话前,先确认前一个已退出**(`ps aux | grep [h]ermes`)。长任务用 `background=true, notify=true`,等完成通知再派下一步。
### 2026-09-10 S4T 事故问题总结
| # | 问题 | 后果 | 对策(已固化) |
|---|------|------|----------------|
| 1 | 用 `CALL FUNCTION` 但检查不校验被调函数是否存在、调用结构是否正确 | 本地语法全绿、运行期 `CALL_FUNCTION_NOT_FOUND` 转储 | 编码规则 E04/E05(强制核实存在与签名) |
| 2 | DDIC 未落地就开发引用代码 | 后续对象语法检查全挂 | 铁律 1(DDIC 先行 + 实测判定) |
| 3 | 跳过「语法检查 → 激活 → 测试」闭环,直接跑测试 | 跑的是旧版本 / 对象不存在,结论无效 | 铁律 2(七步闭环不得跳步) |
| 4 | 采信自述「函数组壳已存在」 | 实查 TFDIR 0 行,对象从未落地 | 铁律 1(实测判定)+ 铁律 3 |
| 5 | 批量生成 DDIC 的工具报表反复 500/转储 | 34 分钟会话耗尽,零交付 | 逐个落对象;`run-program` 不稳定见下方「DDIC 落地方案」 |
| 6 | 多个会话并发改同一批对象 | 相互覆盖,效率崩盘 | 铁律 4(单工作者) |
| 7 | 未读技能就试错(`delete` 交互确认) | 白撞 EOFError 一轮 | 动手前先读 SKILL.md 与 references |
## 🔄 Standard WorkflowSAP 对象操作标准流程) ## 🔄 Standard WorkflowSAP 对象操作标准流程)
> 所有 SAP 对象修改操作必须按此顺序执行,不得跳过或调整步骤顺序。 > 所有 SAP 对象修改操作必须按此顺序执行,不得跳过或调整步骤顺序。
+30
View File
@@ -92,6 +92,32 @@ python main.py show-table --name ZSAPILOT_OBJ
python main.py read-table --name ZSAPILOT_OBJ --max-rows 50 python main.py read-table --name ZSAPILOT_OBJ --max-rows 50
``` ```
## 🚫 规则 7:DDIC 未完成禁止开发引用它的代码(依赖顺序)
代码引用的每个 DDIC 对象(域/数据元素/表/结构/表类型)必须先完成「上传 → 语法检查通过 → 激活成功」三关,才能开始写引用它的代码。
- 落地顺序:`domain → dataelement → table/structure → tabletype → interface → class → function → report`
- 是否完成**以实测为准**:结构查 `DD02L``AS4LOCAL = 'A'`)、表类型查 `DD40L`、其余查 `info` / `TADIR`**不采信会话自述**
- 违反后果:后续每个引用对象语法检查报「类型/结构 XXX 未知」,整批返工
## 🚫 规则 8:强制开发闭环(不得跳步)
```
1. 本地编写/修改源码 → 2. 同步 SAP(upload/sync) → 3. 语法检查(syntax-check)
↑ │
└──────────────── 有错则回到第 1 步 ←───────────────────┘
4. 语法检查 0 错误 → 激活(activate) → 5. 激活成功后才允许执行测试(run-program/unit-test)
└── 测试不过 → 回到第 1 步
```
禁止:
- ❌ 跳过语法检查直接 activate
- ❌ 未激活就 run-program / unit-test(跑旧版本或报对象不存在)
- ❌ 把「语法检查通过」当「功能正常」—— syntax-check 不校验被调对象存在性与签名(见 `abap-coding-rules.md` E04/E05
- ❌ 把「S4T 演示机通过」表述为「CEM/生产验证通过」
- ❌ 多会话并发操作同一批对象(派下一会话前先确认前一个已退出)
## 自检清单 ## 自检清单
每次执行 SAP 操作前,确认: 每次执行 SAP 操作前,确认:
@@ -101,3 +127,7 @@ python main.py read-table --name ZSAPILOT_OBJ --max-rows 50
3. ✅ 我操作的是 Z* 开头的自定义对象吗? 3. ✅ 我操作的是 Z* 开头的自定义对象吗?
4. ✅ 我没有 INSERT/UPDATE/DELETE 系统表吗? 4. ✅ 我没有 INSERT/UPDATE/DELETE 系统表吗?
5. ✅ sync 命令带了 `--corr_nr` 吗? 5. ✅ sync 命令带了 `--corr_nr` 吗?
6. ✅ 我引用的 DDIC 对象都已激活(实测确认)了吗?
7. ✅ 我按「本地改 → 同步 → 语法检查 → 循环至 0 错误 → 激活 → 测试」执行了吗?
8. ✅ 我核实过被调函数/结构的存在性与签名了吗(E04/E05)?
9. ✅ 同一任务只有一个开发者会话在跑吗?