feat(v2.4.0): 开发铁律——DDIC 先行(依赖顺序+实测判定) + 强制闭环(本地改→同步→语法检查→循环至0错→激活→测试);补 2026-09-10 S4T 事故问题总结与自检清单
This commit is contained in:
@@ -37,5 +37,5 @@ SAP-CLI-SKILL 是一个让 AI 助手直接操作 SAP ABAP 系统的技能。
|
||||
|
||||
---
|
||||
|
||||
**当前版本**: 2.2.1
|
||||
**当前版本**: 2.4.0
|
||||
**维护者**: SwiftCode Creative Technology
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
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."
|
||||
version: "2.3.0"
|
||||
version: "2.4.0"
|
||||
author: WuRangyu
|
||||
license: MIT
|
||||
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).
|
||||
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 Workflow(SAP 对象操作标准流程)
|
||||
|
||||
> 所有 SAP 对象修改操作必须按此顺序执行,不得跳过或调整步骤顺序。
|
||||
|
||||
@@ -92,6 +92,32 @@ python main.py show-table --name ZSAPILOT_OBJ
|
||||
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 操作前,确认:
|
||||
@@ -101,3 +127,7 @@ python main.py read-table --name ZSAPILOT_OBJ --max-rows 50
|
||||
3. ✅ 我操作的是 Z* 开头的自定义对象吗?
|
||||
4. ✅ 我没有 INSERT/UPDATE/DELETE 系统表吗?
|
||||
5. ✅ sync 命令带了 `--corr_nr` 吗?
|
||||
6. ✅ 我引用的 DDIC 对象都已激活(实测确认)了吗?
|
||||
7. ✅ 我按「本地改 → 同步 → 语法检查 → 循环至 0 错误 → 激活 → 测试」执行了吗?
|
||||
8. ✅ 我核实过被调函数/结构的存在性与签名了吗(E04/E05)?
|
||||
9. ✅ 同一任务只有一个开发者会话在跑吗?
|
||||
|
||||
Reference in New Issue
Block a user