- Static bundle checks (name length, seed type, reserved words, contract test classes, testclasses_file), local abaplint parser check before SAP, max_tokens, robust JSON parse - Runner: G2 for CDS views with parameters, contract_check detail in report - G0020 and G0013 fixed by review and revalidated (oracle 100, null 0) - Pilot results in docs/faz1-tasarim.md 11e; handover notes merged into CLAUDE.md and docs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
604 lines
40 KiB
Markdown
604 lines
40 KiB
Markdown
# Faz 1 Tasarım — ABAP Danışman Modeli: Eval Seti, Görev Formatı, Harness
|
||
|
||
Durum: taslak v23 · 2026-10-02 · v23: Adım B — FM, rapor, CDS desteği; T13–T15; eşzamanlılık bulgusu.
|
||
|
||
## 1. Amaç
|
||
|
||
Faz 1 iki şey üretir:
|
||
|
||
1. **Eval seti:** A4H'da otomatik puanlanan ABAP görevleri. Hedef 100 görev; bu dokümanda 10 örnek.
|
||
2. **Harness:** Bir modeli EPOD ADT MCP ile A4H'ya bağlar, görevi çalıştırır, puanlar, yörüngeyi kaydeder.
|
||
|
||
Aynı harness sonraki fazlarda eğitim verisi üretir: başarılı yörüngeler SFT verisi, puanlar RL ödülü olur.
|
||
|
||
## 2. Rol sınırı
|
||
|
||
**Modelin sözleşmesi (karar, 2026-10-02):** *Metin olarak ABAP görevi + genel ABAP MCP arayüzü.* Model belirli bir plan formatına veya belirli bir server'ın tool isimlerine bağlı değildir.
|
||
|
||
|
||
`plan-agent.md` bugün implementer'ı "ABAP idiomlarını güvenilir hatırlamaz" diye tanımlıyor. Bu yüzden zanaat kararlarını planner veriyor. Yeni düzende bu kararlar modele geçer.
|
||
|
||
| Konu | Spec (fonksiyonel taraf / planner) | Model (ABAP danışmanı) |
|
||
|---|---|---|
|
||
| Goal, iş kuralları, alan eşlemesi | ✓ | |
|
||
| Open questions | ✓ | Eksik görürse durur, sorar |
|
||
| Context: obje adı, imza, DDIC | ✓ (kısmi olabilir) | Eksikse ADT ile okur |
|
||
| Public kontrat (sınıf adı, public metot imzası, hata davranışı) | ✓ | Değiştirmez |
|
||
| Zanaat kararları: tablo tipi, key, erişim yolu, SELECT stratejisi, exception tasarımı, release'e uygun syntax | | ✓ |
|
||
| Private tasarım, yardımcı metotlar, testler | | ✓ |
|
||
| Kod, aktivasyon, doğrulama döngüsü | | ✓ |
|
||
|
||
**Kritik kural:** Public kontrat spec'te sabittir. Gizli testler bu kontrata bağlanır. İç tasarım tamamen modelindir.
|
||
|
||
## 3. Spec formatı (modelin girdisi)
|
||
|
||
`plan-agent.md` yapısı temel alınır, dil STE100 kalır. Değişiklikler:
|
||
|
||
- **Decisions** bölümü kaldırılır. Sadece iş kararları kalır ("Business rules").
|
||
- **Steps** iş seviyesine çekilir. Obje sırası ve zanaat detayı modele bırakılır.
|
||
- **Contract** ayrı bölüm olur. Gizli testlerin bağlandığı yer burası.
|
||
- **Constraints** eklenir. İçeriği:
|
||
- Hedef release, paket, isim öneki.
|
||
- Coding standards: projeye özgü, denetlenebilir kurallar.
|
||
- Out of scope: dokunulmayacak objeler ve eklenmeyecek davranışlar.
|
||
|
||
Bölümler, bu sırayla:
|
||
|
||
1. Goal
|
||
2. Open questions (pozitif görevlerde boş)
|
||
3. Context
|
||
4. Contract
|
||
5. Business rules
|
||
6. Constraints
|
||
7. Acceptance
|
||
|
||
**Plan formatının rolü (karar, 2026-10-02):** `plan-agent.md` formatı zorunlu girdi değil, **en iyi sonuç veren** girdidir. Model serbest metin ve eksik görev tanımıyla da çalışabilmelidir. Görevlerin çoğu bu formatta yazılır; kategori K (bölüm 8) serbest ve eksik girdiyi ölçer. Kral'ın kendi akışında (`/sapplan` → build) plan kullanımı değişmez.
|
||
|
||
**Coding standards örneği** (her görevde değişebilir):
|
||
|
||
- No comment restates what the code does.
|
||
- No Given/When/Then comment header in a test.
|
||
- Method length stays below 40 statements.
|
||
- No new global variable.
|
||
- No method chaining (release kısıtı olan görevlerde).
|
||
- Use text elements for user-facing text.
|
||
|
||
Bu kuralların çoğu abaplint ile denetlenir (`method_length`, `global_class`, syntax version). Kalanlar özel AST kontrolüdür.
|
||
|
||
## 4. Model çıktısı
|
||
|
||
Model şunları üretir:
|
||
|
||
1. **Decisions bloğu** (STE100): `plan-agent.md` Decisions listesindeki maddeler. Release, tablo tipi ve key, erişim yolu, loop dışı SELECT, exception sınıfı, yeni objelerin adı ve paketi. Her biri tek satır gerekçeyle.
|
||
2. **Objeler:** A4H'da oluşturulmuş ve aktif.
|
||
3. **Kendi testleri:** ABAP Unit, modelin kendi yazdığı.
|
||
4. **ATC kararları:** Her P1/P2 bulgusu ya düzeltilir ya da tek satır gerekçeyle bırakılır. False positive belgelenir.
|
||
5. **Rapor** (STE100): `build-agent.md` Reporting kuralı. Her adım, doğrulama sonucu, sapmalar.
|
||
6. **Change summary tablosu:** Object · Type · Action · Reason. Throwaway objeler (`$TMP` smoke sınıfı vb.) ayrı işaretlenir.
|
||
|
||
Davranış kuralları `build-agent.md`'den uyarlanır:
|
||
|
||
- Public kontratı değiştirme. Değiştirmen gerekiyorsa dur ve raporla.
|
||
- İş kuralı eksik veya çelişkiliyse dur ve sor. Tahmin etme.
|
||
- Zanaat kararı spec'te yoksa **kendin ver**. (Eski kural: "dur ve sor". Bu kural tersine döner.)
|
||
- Spec'te istenmeyen davranış ekleme.
|
||
- Constraints altındaki out of scope listesine dokunma.
|
||
- Aynı doğrulama iki kez başarısız olursa dur ve raporla. Üçüncü deneme yok.
|
||
- ABAP Unit'in kapsayamadığı bir davranışı (ör. factory'nin runtime çözümü) `$TMP` smoke objesiyle doğrula. Smoke objesi teslimata girmez.
|
||
- Testler gerçek veritabanını okumaz. DB erişimi `CL_OSQL_TEST_ENVIRONMENT` veya `CL_CDS_TEST_ENVIRONMENT` ile izole edilir.
|
||
|
||
## 5. Ortam
|
||
|
||
**Sistem:** A4H, Mac mini üzerinde Docker.
|
||
|
||
**Sistem kimliği:** MCP server'da tek sistem bağlı: `epodabap`, mod `write`. SAP_BASIS 816 SP01. Modern syntax'ın tamamı mevcut; eski release hedefleri sadece abaplint ile denetlenir.
|
||
|
||
**İzolasyon:** MCP server paket (DEVC) oluşturamaz. Bu yüzden her koşu `$TMP` içinde çalışır, objeler koşuya özel önekle adlanır. Önek şeması: `Z<run 3 hane><task 3 hane>_` (ör. `Z007003_DISC_CALC`). Önek her koşuda yenidir; eski koşunun objeleriyle çakışma olmaz. Spec ve gizli testler isimleri yer tutucuyla taşır (`{{P}}DISCOUNT_CALC`); harness koşu başında doldurur. 30 karakter sınırı görev yazımında kontrol edilir.
|
||
|
||
**Seed verisi:** MCP server'da tablo yazma tool'u yok (`sap_sql_query` sadece okur). Harness, seed verisini `IF_OO_ADT_CLASSRUN` uygulayan bir seed sınıfı ile yükler ve `sap_run_class` ile çalıştırır.
|
||
|
||
**Teardown:** Harness, koşu sonunda objeleri ADT'nin kendi silme API'si ile siler. MCP server değişmez, model bu yolu görmez.
|
||
|
||
```
|
||
POST /sap/bc/adt/deletion/delete
|
||
Accept: application/vnd.sap.adt.deletion.response.v1+xml
|
||
Content-Type: application/vnd.sap.adt.deletion.request.v1+xml
|
||
|
||
<del:deletionRequest xmlns:del="http://www.sap.com/adt/deletion"
|
||
xmlns:adtcore="http://www.sap.com/adt/core">
|
||
<del:object adtcore:uri="/sap/bc/adt/ddic/ddl/sources/zz_sample_client">
|
||
<del:transportNumber/>
|
||
</del:object>
|
||
</del:deletionRequest>
|
||
```
|
||
|
||
- Yanıt her obje için `del:isDeleted="true|false"` ve mesaj döner. DDIC objelerinde silme log linki gelir.
|
||
- Obje URI'leri `sap_search_object` sonucundaki `uri` alanından alınır (önekle arama).
|
||
- `$TMP` objelerinde `transportNumber` boş kalır.
|
||
- Harness, CSRF token'ı (`x-csrf-token: fetch`) ve oturum cookie'sini yönetir.
|
||
|
||
**Doğrulandı (2026-10-02, Mac mini):** 3 bağımlı obje (interface, onu implemente eden sınıf, test sınıfı) tek istekte silindi. Toplam 20 objeden 19'u silindi. Kalan 1 obje (`Z002001_IBAN_VALIDATOR`) "You are already editing" ile reddedildi: başka bir oturumda (muhtemelen MacBook'taki ADT) açık kilit. Harness bunu `deleted: false` olarak raporluyor; kilit kalkınca `teardown` tekrar çalıştırılır.
|
||
|
||
Önceki doğrulama listesi (tarihsel):
|
||
- Bir istekte birden çok `del:object` kabul ediliyor mu?
|
||
- Bağımlı objeler (ör. sınıf + kullandığı tablo tipi) aynı istekte doğru sırayla siliniyor mu? Değilse harness sırayı verir: test sınıfı → sınıf → interface → CDS → tablo tipi → yapı/tablo → data element → domain → mesaj sınıfı.
|
||
- `isDeleted="false"` dönen obje: harness loglar, koşuyu "kirli" işaretler, sonraki koşu yine benzersiz önekle başlar.
|
||
|
||
**Sızıntı koruması** (silme başarısız olursa diye, ek güvenlik): Her koşunun öneki benzersizdir. Harness, modelin `sap_search_object` ve `sap_usage_references` sonuçlarından başka koşuların öneklerini filtreler.
|
||
|
||
**Paralellik (test edildi, 2026-10-01):** MCP server en fazla **8 eşzamanlı oturum** tutuyor. Bu sınır bilinçli: A4H ve ADT'nin taşıyabileceği yük kadar. 9. oturum `initialize`'da ID alıyor ama ilk çağrıda HTTP 404 dönüyor. 8 paralel syntax check 1–2 saniyede bitti. Toplam kapasite 8 oturumla sınırlı; Adım 3 ve 5 (binlerce koşu) için süre hesabı buna göre yapılır. (Karşılaştırma: normal geliştirme sistemlerinde 12 agent aynı anda çalışabiliyor; kısıt A4H'nın kaynakları.)
|
||
|
||
**Makine dağılımı (v13: her şey Mac mini'de):**
|
||
|
||
Yük testi, 2026-10-02, Mac mini M4 Pro 64 GB, A4H çalışırken Qwen 3.8 27B (MLX, nvfp4), `num_ctx` 32k:
|
||
|
||
| Ölçüm | Değer |
|
||
|---|---|
|
||
| A4H bellek (üretim sırasında) | 28,9 GB (Docker limiti 62,7 GB) |
|
||
| Sistem boş bellek / swap | %49 / 0,5 GB — baskı yok |
|
||
| A4H tepkisi | Etkilenmedi |
|
||
| Prompt eval | 119 token/s |
|
||
| Üretim (eval) | 31 token/s |
|
||
| Test prompt'u (T01 benzeri, tek sınıf + testler) | 11 678 token, 6 dk 18 sn |
|
||
|
||
Sonuç: A4H, MCP server, harness ve model Mac mini'de birlikte çalışır. MacBook serbest kalır.
|
||
|
||
- 11 678 token'ın çoğu muhtemelen düşünme (thinking) çıktısı. Ölçümde iki mod da denenir: thinking açık ve kapalı. Süre ve puan farkı baz model seçimine girer.
|
||
- Kaba süre tahmini: görev başına 15 tur × ~2 000 token ≈ 16 dk üretim + tool süresi → 20–30 dk/görev. 100 görev ≈ 35–50 saat/model. Mac mini 7/24 koşarsa model başına ~2 gün.
|
||
- Opsiyonel koruma: Docker Desktop bellek limitini ~34 GB'a indirmek; HANA büyüyüp modelin alanına girmesin.
|
||
- Adım 3'te kapasite yetmezse: ikinci A4H (kiralık VM) veya modeli kiralık GPU'da koşturmak.
|
||
|
||
Harness kuralları:
|
||
- Yerel model (MacBook): **tek worker**, paralel istek yok. Paralel worker (en fazla 6, 2 oturum senin kullanımın için) sadece model uzakta çalışıyorsa (kiralık GPU).
|
||
- Her worker koşu boyunca tek oturum kullanır, koşu sonunda oturumu `DELETE` ile kapatır.
|
||
- 404 alan çağrı: oturumu yeniden aç, çağrıyı bir kez tekrarla, koşuyu "kirli" işaretle.
|
||
|
||
Opsiyonel server iyileştirmesi: sınır aşıldığında `initialize` aşamasında açık hata (429/503) dönmek. Böylece harness oturumu almadan bekler. Paralel **yazma ve aktivasyon** henüz test edilmedi; Adım 1.3'te ölçülecek.
|
||
|
||
**Genel ABAP MCP arayüzü (karar, 2026-10-02).** Model EPOD tool isimlerini değil, genel bir "ABAP MCP" arayüzünü görür. Ayrıntılı spec: `abap-mcp-arayuz.md` (sonra yazılacak).
|
||
|
||
| Genel tool | EPOD karşılığı (ilk adapter) |
|
||
|---|---|
|
||
| `search_object` | `sap_search_object` |
|
||
| `read_source` | `sap_pull_source` |
|
||
| `object_structure` | `sap_object_structure`, `sap_object_members` |
|
||
| `where_used` | `sap_usage_references` |
|
||
| `create_object` | `sap_create_object` |
|
||
| `write_source` | `sap_push_source`, `sap_push_element` |
|
||
| `activate` | `sap_activate` |
|
||
| `syntax_check` | `sap_syntax_check` |
|
||
| `run_unit_tests` | `sap_run_unit_test`, `sap_check_object` (coverage) |
|
||
| `run_atc` | `sap_atc_run` |
|
||
|
||
- EPOD bu arayüzü native destekleyecek. O zamana kadar harness proxy'si genel arayüzü EPOD tool'larına çeviren **ilk adapter**dir.
|
||
- **Delete/teardown arayüzde yok.** Harness'e aittir (ADT deletion API).
|
||
- Çekirdek dışındaki EPOD tool'ları (`sap_sql_query`, `sap_run_class`, `sap_short_dumps`, `sap_element_info`, `sap_inactive_objects`, `sap_pretty_print`, `sap_push_message`) için genel karşılık spec'te kararlaştırılacak.
|
||
- **Eğitimde az miktarda tool isim ve şema varyasyonu** kullanılır (ör. `read_source` / `get_source`, parametre adlarında farklılık). Amaç: model belirli bir isim setine ezber yapmasın.
|
||
|
||
**Tool seti (server v2.3.0, 33 tool).** Model sadece aşağıdaki beyaz listeyi görür. Server tool'larında `readOnlyHint` anotasyonu yok; bu yüzden ayrım harness'te beyaz listeyle yapılır.
|
||
|
||
| Grup | Model görür | Model görmez |
|
||
|---|---|---|
|
||
| Okuma | `sap_search_object`, `sap_pull_source`, `sap_object_structure`, `sap_object_members`, `sap_usage_references`, `sap_element_info`, `sap_inactive_objects`, `sap_short_dumps`, `sap_sql_query` | `sap_adt_raw_get`, `sap_list_systems`, `sap_compare_systems`, `sap_object_versions`, `sap_object_diff`, `sap_pull_source_to_file` |
|
||
| Yazma | `sap_create_object`, `sap_push_source`, `sap_push_element`, `sap_push_message`, `sap_activate` | `sap_push_source_from_file`, `sap_lock`, `sap_unlock` |
|
||
| Kalite | `sap_syntax_check`, `sap_check_object` (`runUnitTest`, `coverage`), `sap_run_unit_test`, `sap_atc_run`, `sap_pretty_print` | |
|
||
| Çalıştırma | `sap_run_class` (`$TMP` smoke için) | |
|
||
| Transport | | `sap_transport_list`, `sap_transport_of_object`, `sap_transport_create`, `sap_transport_release` |
|
||
|
||
Notlar:
|
||
- `sap_create_object` 16 tip oluşturur: PROG, CLAS, INTF, FUGR, FUNC, DTEL, DOMA, TABL, TTYP, STRU, DDLS, DDLX, SRVD, DCLS, DDLA, MSAG. BDEF oluşturamaz → kategori J (RAP) için server'a BDEF create eklenmeli.
|
||
- `sap_check_object` P1/P2 ATC bulgusunda başarısız döner; G5 bununla ölçülür. `coverage=true` sadece global sınıfı ölçer.
|
||
- `sap_push_source` varsayılan olarak aktive eder. Birden çok objeli değişiklikte `activate=false` + `sap_activate` sırası modelin öğrenmesi gereken bir beceri.
|
||
|
||
**Aktivasyon kontrolü:** Planlarda geçen "MCP activation wedge" nedeniyle harness, her push sonrası aktif versiyonu ayrıca okur. Modelin raporu değil, aktif kaynak puanlanır.
|
||
|
||
## 6. Puanlama
|
||
|
||
### 6.1 Kapılar (0/1)
|
||
|
||
Bir kapı geçilmezse görev puanı 0'dır.
|
||
|
||
- G1: Kontrattaki tüm objeler var ve aktif.
|
||
- G2: Kontrattaki public imzalar spec ile birebir aynı.
|
||
- G3: Gizli testlerin derlenmesi ve en az bir testin geçmesi.
|
||
- G4: Out of scope listesindeki hiçbir obje değişmemiş. Harness, seed objelerinin aktif kaynağını koşu öncesi ve sonrası karşılaştırır.
|
||
- G5: Açık P1 ATC bulgusu yok.
|
||
|
||
### 6.2 Bileşenler (kapılar geçildiyse)
|
||
|
||
| Bileşen | Ağırlık | Ölçüm |
|
||
|---|---|---|
|
||
| Doğruluk | 40 | Gizli ABAP Unit testlerinin geçme oranı |
|
||
| Zanaat | 20 | Görevin `craft_checks` listesi (abaplint kuralları + özel AST kontrolleri) |
|
||
| Clean ABAP + Coding standards | 15 | abaplint Clean ABAP kuralları + görevin coding standards kontrolleri |
|
||
| Modelin testleri | 15 | (a) Hatalı referans implementasyonu yakalama, (b) statement/branch coverage (hedef görevde verilir, ör. %70), (c) gerçek DB erişimi yok |
|
||
| Disiplin | 10 | Gerekçesiz P2 bulgusu yok; iki başarısızlık sonrası durma kuralına uyma; change summary eksiksiz ve doğru; tool çağrısı bütçesi |
|
||
|
||
Ağırlıklar başlangıç değeri. İlk baz model ölçümünden sonra ayarlanır.
|
||
|
||
### 6.3 Negatif görevler
|
||
|
||
Beklenen sonuç `stop` olan görevlerde:
|
||
|
||
- Model obje oluşturmadan durur ve eksik noktayı adlandırır: 100.
|
||
- Model durur ama yanlış noktayı adlandırır: 30.
|
||
- Model uygular: 0.
|
||
|
||
"Doğru noktayı adlandırdı mı" kontrolü: görevde `expected_gap` anahtar kelimeleri + hakem model. Hakem modeli sadece bu kontrol için kullanılır.
|
||
|
||
### 6.4 Release hedefi
|
||
|
||
A4H en yeni release'te. Ama gerçek sistemler eski olabilir: senin planlarında "this system does not support method chaining" kısıtı var. Bu yüzden her görev bir `release_target` taşır. abaplint `syntax.version` ayarı (ör. `v702`, `v740sp05`, `v750`) bu hedefi A4H'dan bağımsız denetler. Hedef release'i aşan syntax G1'i düşürür.
|
||
|
||
### 6.5 abaplint ve standart tipler (test edildi, 2026-10-01)
|
||
|
||
Test: abaplint 2.120.63, abapGit formatında seed objeleri (yapı, tablo tipi, şeffaf tablo) + bunları kullanan bir sınıf.
|
||
|
||
| Kontrol | Sonuç |
|
||
|---|---|
|
||
| Seed tiplerini çözme (alan seviyesine kadar) | ✓ `ls_order-amountx` → "Component not found" |
|
||
| Eksik Z tipi | ✓ `ZEVAL_TT_MISSING` → `unknown_types` |
|
||
| Standart tipler (`TIMESTAMPL`, `SYUNAME`, `WAERS`, `CL_ABAP_TSTMP`) | Yanlış alarm yok (`errorNamespace: ^(Z|Y|LCL_|TY_|LIF_)`) |
|
||
| Standart sınıfta yanlış parametre adı | ✗ Yakalanmıyor (beklenen) |
|
||
| `db_operation_in_loop` | ✓ |
|
||
| Release hedefi v702: inline `DATA(...)` | ✓ Hata |
|
||
|
||
Sonuç ve iş bölümü:
|
||
- **A4H syntax check / aktivasyon = doğruluk.** Standart API kullanımı burada denetlenir.
|
||
- **abaplint = release hedefi, zanaat, stil.** Standart tipleri bilmesi gerekmez.
|
||
- Seed objeleri abapGit formatında tutulur; abaplint onları doğrudan okur. Aynı dosyalar A4H'ya MCP ile kurulur.
|
||
- Not: v702 hatalarında zincirleme (cascade) hatalar oluşuyor. Release kapısı için hata sayısı değil, "en az bir `check_syntax` hatası var mı" ölçülür.
|
||
|
||
## 7. Görev şeması
|
||
|
||
```yaml
|
||
id: T03
|
||
version: 1
|
||
category: C # bkz. bölüm 8
|
||
difficulty: 2 # 1-3
|
||
release_target: v750
|
||
expected_outcome: implement # implement | stop
|
||
budget:
|
||
max_tool_calls: 60
|
||
max_activations: 15
|
||
spec: spec.md # bölüm 3 formatında, STE100
|
||
seed: # görev başında A4H'ya kurulur
|
||
objects: seed/ # abapGit formatında DDIC, sınıflar
|
||
data: seed/data.json # tablo içerikleri
|
||
faulty_reference: seed/ref_faulty/ # modelin testlerini ölçmek için
|
||
hidden_tests: hidden/ # global test sınıfı, kontrata bağlı
|
||
craft_checks:
|
||
- abaplint: db_operation_in_loop
|
||
- custom: lookup_table_is_sorted_or_hashed
|
||
expected_gap: [] # sadece stop görevlerinde
|
||
```
|
||
|
||
Gizli testler global test sınıfıdır (`FOR TESTING`). Modelin sınıfına sadece public kontrat üzerinden erişir. Bu yüzden G2 (imza eşleşmesi) kapıdır.
|
||
|
||
## 8. Kategoriler
|
||
|
||
| Kod | Kategori | Ölçülen beceri |
|
||
|---|---|---|
|
||
| A | Saf mantık, yeni sınıf | Dil, OO, Clean ABAP |
|
||
| B | Veritabanı erişimi + test double | Open SQL, CDS, `CL_OSQL_TEST_ENVIRONMENT` |
|
||
| C | Internal table zanaatı | Tablo tipi, key, erişim yolu |
|
||
| D | Exception tasarımı | Class-based exception, T100 mesajları |
|
||
| E | Refactoring | Legacy kodu davranışı koruyarak temizleme |
|
||
| F | Bilinmeyen obje | Spec'te imzası olmayan seed objesini ADT ile okuyup kullanma |
|
||
| G | Release kısıtı | Eski release'e uygun syntax |
|
||
| H | Negatif | Eksik veya çelişkili spec'te durma |
|
||
| I | Hata düzeltme | Kırmızı test veya short dump'tan kök nedene |
|
||
| J | CDS / RAP | View entity, behavior (sonraki dalga) |
|
||
| K | Eksik / serbest girdi + farklı tool şeması | Plan formatı olmadan, serbest metin veya eksik görev tanımıyla çalışma; farklı tool isim ve şemalarına uyum. Eksik bilgi kritikse durup sorma (H ile ilişkili) |
|
||
|
||
Hedef dağılım (beceri kategorisine göre): A 10, B 15, C 15, D 10, E 15, F 10, G 10, H 10, I 5, **K 10** (toplam 110). J ikinci dalgada. K görevleri diğer kategorilerin görevlerinin serbest metin veya farklı şemalı varyantları olarak üretilir.
|
||
|
||
### 8.1 İkinci boyut: obje tipi
|
||
|
||
Beceri kategorisi tek başına yetmez. T01–T12'nin hepsi sınıf; gerçek işte function module, rapor ve DDIC de var. Her görev bir beceri kategorisi **ve** bir ana obje tipi taşır.
|
||
|
||
| Obje tipi | Hedef pay | MCP ile mümkün mü | Gizli test yöntemi |
|
||
|---|---|---|---|
|
||
| CLAS / INTF | ~35 % | ✓ | Global test sınıfı, public kontrat üzerinden |
|
||
| FUGR / FUNC | ~15 % | ✓ (`sap_create_object` FUGR + FUNC) | Global test sınıfı `CALL FUNCTION` ile çağırır; exception'lar `EXCEPTIONS` ile kontrol edilir |
|
||
| PROG (rapor, selection screen, ALV) | ~10 % | ✓ | `SUBMIT ... WITH ... AND RETURN` + `cl_salv_bs_runtime_info=>set( display = abap_false data = abap_true )` ile ALV verisi yakalanır; WRITE listeleri `EXPORTING LIST TO MEMORY` + `LIST_FROM_MEMORY` ile |
|
||
| DDIC (TABL, STRU, DTEL, DOMA, TTYP) | ~10 % | ✓ | Yapı kontrolü: `sap_object_structure` / `DD03L`, `DD04L`, `DD01L` sorguları; kullanan kodun derlenmesi |
|
||
| CDS (DDLS, DCLS, DDLX, SRVD) | ~25 % | ✓ (BDEF hariç) | `CL_CDS_TEST_ENVIRONMENT` ile test double; sonuç kümesi karşılaştırması |
|
||
| MSAG + exception | ~5 % | ✓ (`sap_push_message`) | T100 mesaj metni ve parametre kontrolü |
|
||
|
||
**CDS alt konuları** (25 görev civarı): view entity ve join'ler, association ve path expression, aggregation ve `GROUP BY`, `CASE` / cast / built-in fonksiyonlar, parametreli view, access control (DCLS), annotation ve metadata extension (DDLX), table function + AMDP sınıfı, service definition (SRVD), ABAP'tan CDS tüketimi (Open SQL ile association kullanımı). RAP (BDEF) server'a BDEF oluşturma eklenince J kategorisinde.
|
||
|
||
Kapsam dışı (ADT/MCP ile yapılamıyor): dynpro (`CALL SCREEN`), SmartForms, BAdI/enhancement implementasyonu, IDoc tanımı. Gerçek işte var ama A4H + MCP ile doğrulanamıyor.
|
||
|
||
**Gerçek işten uyarlanabilir desen:** FI-CA event modülleri gibi "sabit arayüzlü FM" işleri. Seed'de örnek bir FM (sabit imza) verilir; görev aynı imzayla yeni bir FM yazmaktır. Bu, F kategorisini (bilinmeyen objeyi okuyup taklit etme) gerçek bir desenle ölçer.
|
||
|
||
**Release ile ilişki:** Eski release hedefli görevler (G kategorisi) doğal olarak FM ve rapor ağırlıklı olur: 7.02'de sınıf yerine FORM rutinleri ve FM'ler yaygın.
|
||
|
||
**Harness'te gereken değişiklikler:**
|
||
- G2 (kontrat): FUNC için imza kontrolü (`FUNCTION ... IMPORTING/EXPORTING/TABLES/EXCEPTIONS` bloğu), PROG için selection screen parametreleri.
|
||
- abaplint dışa aktarımı: şu an sadece CLAS/INTF. PROG ve FUGR abapGit formatı eklenecek.
|
||
- Teardown sırası: FUNC → FUGR, PROG.
|
||
- Seed kurulumu: FUGR + FUNC (FM önce grup ister).
|
||
|
||
**Sıradaki görevler:** T13 (FUNC, sabit arayüzlü FM, kategori F) ve T14 (PROG, selection screen + ALV, kategori B).
|
||
|
||
## 9. Örnek görevler
|
||
|
||
### 9.1 Tam örnek: T03 (kategori C)
|
||
|
||
**Seed:** `ZEVAL_DISC_RULE` tablosu (`CUST_GROUP` CHAR4 key, `MIN_AMOUNT` CURR, `DISCOUNT_PCT` DEC 5,2), 200 satır. `ZEVAL_S_ORDER` yapısı ve `ZEVAL_TT_ORDER` tablo tipi.
|
||
|
||
**spec.md:**
|
||
|
||
```markdown
|
||
# 1. Goal
|
||
Calculate the discount for each order line. The sales team uses the result in a
|
||
nightly batch run with up to 500 000 order lines.
|
||
|
||
# 2. Open questions
|
||
None.
|
||
|
||
# 3. Context
|
||
- Table ZEVAL_DISC_RULE, package ZEVAL_T03. Key: CUST_GROUP.
|
||
Fields: CUST_GROUP (CHAR4), MIN_AMOUNT (CURR 15,2), DISCOUNT_PCT (DEC 5,2).
|
||
One customer group has one or more rules.
|
||
- Table type ZEVAL_TT_ORDER, line type ZEVAL_S_ORDER.
|
||
Fields: ORDER_ID (CHAR10), CUST_GROUP (CHAR4), AMOUNT (CURR 15,2),
|
||
CURRENCY (CUKY).
|
||
|
||
# 4. Contract
|
||
- Create the class ZCL_EVAL_DISCOUNT_CALC in the package ZEVAL_T03.
|
||
- Public method CALCULATE:
|
||
IMPORTING it_orders TYPE zeval_tt_order
|
||
RETURNING VALUE(rt_result) TYPE zeval_tt_disc_result
|
||
- Create the table type ZEVAL_TT_DISC_RESULT. Line fields: ORDER_ID,
|
||
DISCOUNT_PCT, DISCOUNT_AMOUNT (CURR 15,2), CURRENCY.
|
||
- The method returns one result line for each order line, in the input order.
|
||
|
||
# 5. Business rules
|
||
- For an order line, use the rule of the same customer group with the highest
|
||
MIN_AMOUNT that is less than or equal to AMOUNT.
|
||
- If no rule applies, the discount is 0.
|
||
- DISCOUNT_AMOUNT is AMOUNT multiplied by DISCOUNT_PCT divided by 100. Round
|
||
half up to 2 decimals.
|
||
|
||
# 6. Constraints
|
||
- Release target: 7.50.
|
||
- Do not change ZEVAL_DISC_RULE.
|
||
|
||
# 7. Acceptance
|
||
- The hidden tests pass.
|
||
- The class runs 500 000 order lines without a database access in a loop.
|
||
```
|
||
|
||
**Gizli testler:** kural yok, tek kural, sınır değer (`AMOUNT = MIN_AMOUNT`), çoklu kural, yuvarlama, boş girdi, sıra korunumu.
|
||
|
||
**craft_checks:** `db_operation_in_loop` (abaplint); özel: kural tablosu `SORTED` veya `HASHED`, ya da tek `SELECT` + sıralı okuma; loop içinde `LOOP AT ... WHERE` üzerinde standart tablo yok.
|
||
|
||
**faulty_reference:** Sınır değerde `<` yerine `<=` hatası olan implementasyon. Modelin testleri bunu yakalamalı.
|
||
|
||
### 9.2 Kısa örnekler
|
||
|
||
| ID | Kat. | Release | Görev özeti | Beklenen zanaat / davranış |
|
||
|---|---|---|---|---|
|
||
| T01 | A | 7.58 | IBAN biçim doğrulayıcı sınıf; mod-97 kontrolü, hata nedenleri enum olarak | Saf fonksiyonlar, `ENUM` veya sabitler, küçük metotlar |
|
||
| T02 | B | 7.58 | Seed tablosundan açık kalemleri yaşlandırma bantlarına göre toplayan sınıf | Tek aggregate `SELECT`, `CL_OSQL_TEST_ENVIRONMENT` ile test |
|
||
| T03 | C | 7.50 | Yukarıdaki tam örnek | Loop dışı SELECT, sorted/hashed lookup |
|
||
| T04 | D | 7.58 | Dosya satırı parser'ı; satır ve alan bilgisiyle anlamlı hata | Class-based exception, T100 mesaj sınıfı, `IF_T100_DYN_MSG` |
|
||
| T05 | E | 7.58 | 300 satırlık seed rapor (FORM'lar, global data) → sınıfa refactor; mevcut çıktı testle sabit | Davranış korunur, global state yok, testlenebilir yapı |
|
||
| T06 | F | 7.58 | Seed'deki `ZCL_EVAL_FX_PROVIDER` ile para birimi çevirimi. Spec sadece sınıf adını verir, imzayı vermez | Model önce ADT ile okur, sonra kullanır |
|
||
| T07 | G | 7.02 | T03 benzeri lookup, ama 7.02 hedefi | Inline declaration yok, `NEW`/`VALUE`/`COND` yok, method chaining yok |
|
||
| T08 | H | 7.58 | Spec iki çelişkili yuvarlama kuralı içeriyor | `stop`; `expected_gap`: rounding |
|
||
| T09 | H | 7.58 | Spec bir alan eşlemesini vermiyor (kaynak alan belirsiz) | `stop`; `expected_gap`: field mapping |
|
||
| T10 | I | 7.58 | Seed sınıf büyük girdide `TSV_TNEW_PAGE_ALLOC_FAILED` dump'ı veriyor; dump bilgisi spec'te | Kök neden: gereksiz tablo kopyası; düzeltme + regresyon testi |
|
||
| T11 | B+F | 7.50 | Nötr alan: seed'de log tablosu + referans tablosu + factory sınıfı. Görev: iki yönlü reader interface ve sınıfı (anahtardan kayda, kayıttan anahtara), factory'ye `GET_READER` ekle. Belge anahtarı `REF TO data` olarak gelir; iki eşleme dalı | Join + en yeni satır (`ORDER BY ... DESCENDING`, `UP TO 1 ROWS`), cast hatası → anlamlı exception, factory'nin mevcut desenini okuyup taklit etme (F), method chaining yok, OSQL test double, `$TMP` smoke ile factory doğrulaması |
|
||
| T12 | H | 7.58 | T11'in varyantı: istenen exception text id'si için gereken attribute mevcut exception sınıfında yok | `stop` veya açık sapma raporu; `expected_gap`: exception attribute |
|
||
|
||
## 10. Harness akışı
|
||
|
||
```
|
||
1. setup paket oluştur, seed objelerini kur, seed verisini yükle
|
||
2. run modeli başlat: system prompt + spec + MCP tool'ları
|
||
bütçe: max_tool_calls, max_activations, zaman aşımı
|
||
3. collect paketteki tüm objelerin aktif kaynağını çek
|
||
4. gate G1 (aktif mi), G2 (imza eşleşmesi)
|
||
5. test gizli test sınıfını kur, ABAP Unit koştur
|
||
6. check ATC + abaplint + özel craft kontrolleri
|
||
7. own-tests modelin testlerini faulty_reference'a karşı koştur
|
||
8. score puanı hesapla, JSON olarak yaz
|
||
9. log tam yörüngeyi JSONL olarak sakla (SFT adayı)
|
||
10. teardown paketi sil
|
||
```
|
||
|
||
Harness dili: Python (eğitim ekosistemi aynı dilde). MCP istemcisi olarak EPOD ADT MCP server'ına bağlanır.
|
||
|
||
Model arayüzü: OpenAI-uyumlu chat API. Böylece Ollama/MLX ile yerel modeller ve uzak API'ler aynı harness'te koşar.
|
||
|
||
## 11. Baz model ölçümü
|
||
|
||
Faz 1 sonunda aynı 100 görev şu gruplarla koşar:
|
||
|
||
- Aday baz modeller (Apache 2.0, orta boy, agentic). Liste ölçüm öncesi güncel durumla seçilir.
|
||
- Referans üst sınır: Claude. Sadece ölçüm için; çıktıları eğitim verisine girmez.
|
||
|
||
Sonuç tablosu: kategori bazında puan. Baz model seçimi ve eğitim önceliği bu tablodan çıkar.
|
||
|
||
**Hedef çizgi:** Claude referansına tüm kategorilerde en fazla 10 puan geride kalmak. T11 ve T12 bu karşılaştırmanın ana görevleri.
|
||
|
||
## 11a. Adım 1.3 sonuçları (2026-10-01)
|
||
|
||
**Konum:** `~/projects/abap-llm/harness` (MacBook)
|
||
|
||
| Modül | Görev |
|
||
|---|---|
|
||
| `harness/mcp_client.py` | MCP streamable-http istemcisi; 404'te oturumu yeniden açar |
|
||
| `harness/adt_client.py` | ADT deletion API (sadece teardown; kimlik bilgisi `.env`'den) |
|
||
| `harness/proxy.py` | Beyaz liste, bütçe, başka koşu öneklerini filtreleme, yazma hata serisi sayacı, yörünge logu |
|
||
| `harness/agents.py` | `oracle` (referans çözüm), `null`, `llm` (OpenAI-uyumlu, zaman bütçesi 30 dk) |
|
||
| `harness/runner.py` | setup → agent → collect → G1–G6 → gizli testler → kendi testleri → ATC → abaplint → puan → teardown |
|
||
| `harness/cli.py` | `run`, `teardown`, `teardown-all`, `cleanup-list` |
|
||
| `tasks/T01/` | IBAN görevi: spec, seed interface, 12 gizli test, referans |
|
||
|
||
**Koşular (T01):**
|
||
|
||
| Koşu | Agent | Puan | Not |
|
||
|---|---|---|---|
|
||
| 002 | oracle | 85 | 12/12 gizli test, abaplint ve ATC temiz. Kendi testleri 0 (referansta test yok). |
|
||
| 003 | null | 0 | G1, G2, G3 düştü. |
|
||
| 004 | qwen3.8:27b-mlx | — (32 dk sonra elle durduruldu; erken) | 15 tool çağrısı, 11 yazmadan 10'u aktivasyon hatası. Interface metodunu niteleme, offset syntax'ı (`lv_pos+1`), `find( ... ignore_case )` parametreleri. İki başarısızlıktan sonra durmadı. |
|
||
|
||
Oracle ve null, puan aralığının iki ucunu doğruluyor. Koşu 004, eval'in ölçmesi gereken zayıflığı tam gösteriyor: ABAP syntax bilgisi ve durma disiplini.
|
||
|
||
**Eklenen kurallar:**
|
||
- Yerel model kuralları: zaman limiti yok (sınırı tool çağrısı bütçesi koyar; `--max-minutes` opsiyonel). İstekler tek tek gider: tek worker, `parallel_tool_calls: false`, tool çağrıları sırayla çalışır.
|
||
- Disiplin: art arda 3 veya daha fazla başarısız yazma/aktivasyon → disiplin puanından −5.
|
||
|
||
**Ölçüm süresi riski:** Yerel 27B model, Ollama'da 262k bağlamla tur başına 2–3 dakika harcadı. 100 görev × 30 dakika ≈ 50 saat/model. Adım 1.6 öncesi: bağlam penceresini sınırlamak (ör. 32k), MLX server'ı denemek, ölçümü gece ve hafta sonu koşularına bölmek. Koşu 005 (sınırsız süre) ilk gerçek süre ölçümünü verecek.
|
||
|
||
**MCP server eksiği (test include):** Yeni sınıfta test include yok; ADT artık onu otomatik oluşturmuyor (butona basmak gerekiyor). MCP oluşturamıyor. Karar: server'a eklenecek. Geçiş döneminde model testleri global test sınıfına yazabilir; puanlama ikisini de sayıyor. Eklendikten sonra yeni bir probe sınıfıyla test edilir.
|
||
|
||
**Teardown:** Mac mini'de `.env` (A4H kimlik bilgisi) dolduruldu; teardown her koşu sonunda otomatik çalışır. Kilitli 1 obje ve MacBook'taki koşu 005'in objeleri (`Z005001_`) bekliyor; koşu 005 bitmeden silinmez.
|
||
|
||
## 11b. Mac mini kurulumu (2026-10-02)
|
||
|
||
| Konu | Durum |
|
||
|---|---|
|
||
| Konum | `~/projects/abap-llm/harness` (kullanıcı `erhankeseli`) |
|
||
| Erişim | Bu Project'in sohbetleri Mac mini'deki Claude Desktop'tan; Desktop Commander Mac mini'de |
|
||
| MCP server | ADT (Eclipse) içinde, `127.0.0.1:3000`. Sistem adı `A4H`, mod `write` |
|
||
| MCP token | ADT plugin ayarından (`com.epod.adt.mcp.plugin.prefs`) `.env`'e yazıldı; `.env` izni 600 |
|
||
| Python / Node | Python 3.9.6 (sistem), Node 26.8.2; abaplint 2.120.63 |
|
||
| Model | `qwen3.8-27b-32k` = `qwen3.8:27b-mlx` + `num_ctx 32768` (Ollama Modelfile) |
|
||
| Bağlam takibi | Her model yanıtının `usage` değeri yörüngeye yazılıyor; 32k sınırına yaklaşma buradan görülür (Ollama sınırı aşınca sessizce keser) |
|
||
| Koşu numaraları | MacBook: 001–099, Mac mini: 101+. Önekler çakışmaz. |
|
||
|
||
Doğrulama: oracle (koşu 101) **85**, null (koşu 102) **0**. MacBook sonuçlarıyla aynı.
|
||
|
||
### Koşu 103: qwen3.8-27b-32k, T01 — **41,7 / 100**
|
||
|
||
| Bileşen | Puan | Neden |
|
||
|---|---|---|
|
||
| Doğruluk | 16,7 / 40 | 12 gizli testten 5'i geçti. Geçerli IBAN'lar OK dönmüyor (checksum hesabı yanlış); COUNTRY ve LENGTH kontrolleri yanlış sırada veya yanlış. |
|
||
| Zanaat | 10 / 20 | `method_length`: ana metot 45, yardımcı runner metodu 84 statement. |
|
||
| Clean ABAP | 15 / 15 | Bulgu yok. |
|
||
| Kendi testleri | 0 / 15 | İki "test" sınıfı yazdı ama `FOR TESTING` yok; biri interface metodunu niteleme hatasıyla derlenmiyor. Gerçek ABAP Unit testi yok. |
|
||
| Disiplin | 0 / 10 | Tool bütçesi (40) bitti, 22 aktivasyon (bütçe 10), art arda 5 başarısız yazma. Rapor yazamadan durdu. |
|
||
|
||
Süre: 38 dakika (2 269 sn). Yardımcı objeler: bir `IF_OO_ADT_CLASSRUN` runner (smoke için; kurala uygun) ve iki test sınıfı denemesi.
|
||
|
||
**Bu koşudan çıkan harness düzeltmeleri:**
|
||
- abaplint JSON çıktısında `file` alanı string geliyor; parse düzeltildi (koşu 103 bu yüzden puanlama adımında çökmüştü).
|
||
- `rescore` komutu: agent'ı tekrar çalıştırmadan, A4H'daki objelerden ve yörüngeden yeniden puanlar. Puanlayıcı değiştiğinde eski koşular tekrar değerlendirilebilir.
|
||
- G6 (release kapısı) sadece kontrat objelerine uygulanır. Yardımcı objeler abaplint'in bilmediği standart API'leri (`IF_OO_ADT_CLASSRUN`) kullanabilir; bunlarda yanlış alarm oluşuyordu. Doğruluk için A4H syntax check yeterli.
|
||
- G4 karşılaştırması normalize edildi (boşluk ve büyük/küçük harf).
|
||
- Kendi testleri: modelin yazdığı **global test sınıfları** da sayılır (MCP local test include oluşturamadığı için modelin tek yolu bu).
|
||
|
||
**Açık puanlama soruları:**
|
||
- Yardımcı objelerdeki (runner, smoke) bulgular zanaat puanından düşsün mü? Şu an düşüyor.
|
||
- Bütçe bitince rapor yok. Rapor eksikliği ayrıca cezalandırılsın mı, yoksa bütçe aşımı cezası yeterli mi?
|
||
|
||
## 11c. Baştan başlangıç (2026-10-02, koşu 201+)
|
||
|
||
**Test include çözüldü (server):** `sap_create_object` CLAS ile test include'u da oluşturuyor; `sap_push_source` `includeType: "testclasses"` ile local test yazıyor (include yoksa oluşturuyor). Probe `Z191001_TINC`: 1 test, coverage %50 (beklenen). Global test sınıfı geçici çözümüne artık gerek yok; puanlama ikisini de saymaya devam ediyor.
|
||
|
||
**Uygulanan puanlama kararları:**
|
||
- Zanaat bulguları sadece kontrat objelerinden sayılır (yardımcı runner/smoke objeleri hariç).
|
||
- Model rapor yazmadan biterse (boş veya "Stopped:") disiplinden −5.
|
||
|
||
**Referans çözüme local testler eklendi** (T01: 6 test). Oracle artık "kendi testleri" bileşenini de doğruluyor.
|
||
|
||
| Koşu | Agent | Puan | Not |
|
||
|---|---|---|---|
|
||
| 201 | oracle | **100** | 12/12 gizli test; kendi testleri 6/6, coverage %100; teardown 3/3 otomatik |
|
||
| 202 | null | **0** | |
|
||
| 203 | qwen3.8-27b-32k | (çalışıyor) | |
|
||
| 204 | deepseek-v4.1-flash:cloud (Ollama cloud) | **98,5** | 12/12 gizli test; 16 local test, coverage %98; 8 tool çağrısı, 5 aktivasyon; 2,5 dk. Tek bulgu `prefer_xsdbool`. Rapor plan formatında, kararlar gerekçeli. İlk aktivasyon hatasını (string offset) bir denemede düzeltti. |
|
||
|
||
Koşu 204 token kullanımı: 8 tur, 104 093 girdi (kümülatif, çoğu cache), 51 830 çıktı (düşünme dahil), en büyük bağlam 16 496. DeepSeek liste fiyatıyla ≈ 0,09 $ / koşu.
|
||
|
||
Eski koşular `runs/_archive_v1` altında.
|
||
|
||
## 11d. Adım B: FM, rapor ve CDS desteği (2026-10-02)
|
||
|
||
**Doğrulanan mekanizmalar (A4H + MCP):** TABL (DDL kaynağı), DDLS, FUGR, FUNC (kaynakta imza), PROG oluşturma ve yazma; seed verisi `IF_OO_ADT_CLASSRUN` sınıfı + `sap_run_class` (`className`); gizli testlerde `CALL FUNCTION` + `EXCEPTIONS`, `SUBMIT ... AND RETURN` + `cl_salv_bs_runtime_info` ile ALV verisi, `CL_CDS_TEST_ENVIRONMENT` ile CDS test double'ları.
|
||
|
||
**Harness değişiklikleri:**
|
||
- Kurulum: FUGR (kaynaksız), FUNC (`functionGroup`), seed sınıfını çalıştırma (`run: true`), test include.
|
||
- G2 kontrat: FUNC parametre adı + tipi (FUNCTION başlığında), PROG selection screen parametreleri, DDLS alan adları (`sap_sql_query` kolonları).
|
||
- Kendi testleri: PROG içi local test sınıfları; FUNC/DDLS için global test sınıfı; coverage yoksa testler tam puan.
|
||
- abaplint: PROG dışa aktarımı; abaplint'in okuyamadığı koşu objeleri (TABL, DDLS, FUNC) hata sayılmaz, doğruluk A4H syntax check'te.
|
||
- Silme sırası: CLAS → INTF → PROG → FUNC → FUGR → SRVD/DDLX/DCLS → DDLS → TTYP → TABL → … ; CDS'in STOB kayıtları atlanır.
|
||
- Kurulum başarısızsa koşu puanlanmaz (`setup_failed`), objeler silinir.
|
||
|
||
**Eşzamanlılık bulgusu (önemli):** Server oturumlar arasında tek RFC bağlantısı paylaşıyor. Paralel bir çağrı beklemek yerine `[LOCK] Concurrent call detected` hatası alıyor. Koşu 214'te T14'ün seed tablosu bu yüzden aktive olmadı. Harness artık bu hatada bekleyip tekrar deniyor (en fazla 8 kez); model bu hatayı görmez. Kalıcı çözüm server'da: çağrıları bağlantı başına sıraya almak veya bağlantı havuzu.
|
||
|
||
**Koşular:**
|
||
|
||
| Görev | Tip | Oracle | Null | DeepSeek V4.1 Flash |
|
||
|---|---|---|---|---|
|
||
| T13 | FUNC (sabit arayüz, F) | 100 | 0 | 85: 8/8 gizli test; kendi test sınıfı yazmadı; 47 sn |
|
||
| T14 | PROG + ALV (B) | 100 | 0 | 214: seed kurulumu eşzamanlılık hatası → model tabloyu inaktif görüp **doğru şekilde durdu**. 216 (düzeltmeden sonra): **100**, 4 dk |
|
||
| T15 | DDLS (B) | 100 | 0 | 215: çalışıyor |
|
||
|
||
T13'te ATC "slow parameter passing" bulgusu seed arayüzündeki `VALUE()` yüzündendi; seed referans geçişe çevrildi.
|
||
|
||
## 11e. Pilot sonuçları (2026-10-02, G0002–G0021)
|
||
|
||
DeepSeek V4.1 Flash, 20 görev, her görev en fazla 3 onarım turu. Sonuçlar: `runs/gen/pilot.json`.
|
||
|
||
| | Sonuç |
|
||
|---|---|
|
||
| Kabul (oracle 100, null 0) | **16 / 20 (%80)**. CLAS 7/9, FUNC 2/3, PROG 3/3, DDLS 4/5 |
|
||
| İlk denemede kabul | 3 / 20 (G0004, G0007, G0012) |
|
||
| LLM çağrısı | 55 (görev başına 2,75) |
|
||
| Maliyet (liste fiyatı, üst sınır) | 2,52 $ → **0,126 $ / görev**, **0,16 $ / kabul edilen görev** (tahmin 0,05 $ idi) |
|
||
| Çıktı token | ortalama 35k / çağrı (çoğu reasoning). Bir çağrıda 393k token, içerik boş (G0006, ~0,47 $) |
|
||
| Süre | ~2 saat (görev başına ~6 dk) |
|
||
|
||
Başarısız denemelerin nedenleri (oracle koşusu < 100 olan 37 deneme):
|
||
|
||
| Neden | Sayı | Görevler | Önlem |
|
||
|---|---|---|---|
|
||
| İsim > 30 karakter (çoğu test metodu) | 6 | G0002, G0003, G0005, G0009, G0010, G0017 | Statik kontrol + prompt kuralı |
|
||
| Metot imzasında `TYPE c LENGTH n` / `TYPE p LENGTH n`; SAP sadece "save operation failed" der | 7 | G0005 (3×), G0006 (3×), G0008 | Yerel abaplint `parser_error` ön kontrolü (satır numarasıyla) + prompt kuralı |
|
||
| CDS sözdizimi: parametre `default`, UNION anahtar uyumu, eksik anotasyon | 4 | G0020, G0021 | Prompt kuralı |
|
||
| Ayrılmış kelime alan adı (HOURS, MODE) | 2 | G0017, G0021 | Statik kontrol + prompt kuralı |
|
||
| Parametreli CDS'te G2 her zaman düşüyor (**harness hatası**: `SELECT *` parametresiz çalışmaz) | 3 | G0020 | Runner: SELECT sütun döndürmezse eleman adları kaynaktan okunur. G0020 tek satır düzeltmeyle oracle 100 |
|
||
| Tablo seed'i DDLS tipiyle | 2 | G0003 | Statik kontrol + prompt kuralı |
|
||
| Geçersiz / boş JSON | 3 | G0002, G0006, G0010 | `raw_decode`, `max_tokens` 100k, boş içerikte yeniden deneme |
|
||
| Eski seed kodu 816'da aktive olmuyor (yeni/eski SQL karışık) | 1 | G0016 | Prompt kuralı |
|
||
| Referans mantık hatası (gizli test düşüyor), tip uyumsuzluğu, CX_CDS_FAILURE | 6 | G0013, G0014, G0018, G0019, G0015 | Onarım turu çözdü |
|
||
| Sözleşmede sınıf var, yerel testi yok → own_tests 7,5 | 2 | G0011 | Statik kontrol: her referans sınıfının `testclasses_file`'ı olmalı (istisna sınıfları hariç) |
|
||
|
||
Diğer bulgular:
|
||
- Onarım geri bildiriminde G2 nedeni yoktu; model sözleşme hatasını göremiyordu. Runner artık `contract_check` yazar, generator bunu geri bildirime ekler.
|
||
- Kabul edilen G0013'ün sözleşmesinde test sınıfı var (`REPL_TEST`). Statik kontrol artık bunu reddeder. G0013 incelemede düzeltilmeli.
|
||
- Üretilen görevler örnekteki isimleri kopyalıyor (`T02_HIDDEN`, `T14_TEST`). Kozmetik.
|
||
- Statik kontrol ve abaplint ön kontrolü SAP'ye gitmez. Pilottaki 37 başarısız denemenin ~18'ini doğrulama koşusundan önce yakalar (tahmin).
|
||
|
||
## 12. Açık sorular
|
||
|
||
Cevaplananlar (Adım 1.2):
|
||
- ~~MCP yazma tool'ları~~ → bölüm 5.
|
||
- ~~A4H release ve abapGit~~ → SAP_BASIS 816 SP01. abapGit standalone kurulu (`ZABAPGIT_STANDALONE`). Standalone sürüm script'le kullanılamaz; seed kurulumu MCP üzerinden yapılır. code pal for ABAP kurulumu için kullanılabilir.
|
||
|
||
- ~~Eşzamanlı oturum sınırı~~ → 8 (MCP server), bölüm 5.
|
||
- ~~abaplint ve seed tipleri~~ → çalışıyor, bölüm 6.5.
|
||
|
||
Açık olanlar:
|
||
- EPOD server istekleri (Kral): (1) yazma başarısız olursa syntax check çalıştırıp mesajlarını döndürsün; şu an sadece "save failed" diyor, model nedeni göremez (2026-10-02). (2) RFC bağlantısı başına kuyruk veya bağlantı havuzu ("Concurrent call detected"). (3) BDEF oluşturma (RAP).
|
||
- Genel ABAP MCP arayüzünün spec'i (`abap-mcp-arayuz.md`): tool isimleri, parametre şemaları, çekirdek dışı tool'lar, hata formatı. Sonra yazılacak.
|
||
1. ~~Görevleri kim yazar?~~ → Öneri (2026-10-02): DeepSeek V4.1 Flash yazar. İnceleme üç katmanlı, Kral'ın tam incelemesi yok:
|
||
- **Otomatik kapılar:** oracle = 100, null = 0, gizli testler bozuk referansta (mutasyon) düşer, her iş kuralı en az bir gizli testle örtülü.
|
||
- **Ampirik süzgeç:** Görev 2–3 modelle koşulur. Güçlü model düşük, referans yüksek puan alıyorsa spec belirsiz olabilir → işaretlenir. Herkesin kolayca geçtiği görevler eval'den çıkarılır.
|
||
- **Claude incelemesi** (bu Project'te, kontrol listesiyle): spec netliği, kontrat–test uyumu, gerçekçilik. Sadece eval görevleri; eval görevleri eğitim verisine girmez.
|
||
- **Kral:** sadece işaretlenen görevler + kategori başına 1 örnek (~10 görev, ~30 dk).
|
||
2. Hakem modeli yerel mi, uzak mı?
|
||
|
||
## 13. Faz 1 bitti sayılır, eğer
|
||
|
||
- ~~abaplint, A4H seed tiplerini tanıyarak çalışıyor.~~ ✓
|
||
- Harness T01–T10'u uçtan uca koşturuyor ve puanlıyor.
|
||
- 100 görevlik set yazılmış ve senin incelemenden geçmiş.
|
||
- En az iki baz model ve Claude referansı ölçülmüş.
|