Files
abap-llm/docs/faz1-tasarim.md

669 lines
47 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 80k (kabul edilen son çağrılar 4k–76k, p90 57k; 60k kabul edilen 2 çağrıyı keserdi), 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).
## 11f. Zor görev partisi (2026-10-03, G0022–G0026)
Amaç: pilot sonrası iyileştirmeleri pilotta düşen tiplerle ölçmek. Görevler: CLAS D (exception), CLAS E (packed sayılı eski kod, `LENGTH` tuzağı), parametreli CDS, UNION'lı CDS, FM. Sonuçlar: `runs/gen/hard.json`.
| | Pilot (20) | Parti (5, zor) |
|---|---|---|
| İlk denemede kabul | 3/20 (%15) | 1/5 (%20): G0023 |
| Toplam kabul | 16/20 | 4/5 üretimde; G0022 harness düzeltmesinden sonra → 5/5 |
| LLM çağrısı / görev | 2,75 | 2,6 |
| Maliyet / kabul edilen görev | 0,16 $ | **0,097 $** (0,39 $ / 5) |
| En büyük çıktı | 393k (kaçak) | 61,5k |
SAP'ye gitmeden yakalanan hata: **2** (abaplint `parser_error`, G0026 ×2). Statik kontroller bu partide hata bulmadı: 30 karakter, tablo tipi, `LENGTH` hataları tekrar etmedi (prompt kuralları etkili).
SAP'de düşen 8 doğrulama:
| Neden | Sayı | Durum |
|---|---|---|
| Harness: referans objeler bağımlılık sırasında kurulmuyor (G0022, G0026) | 2 | Düzeltildi: generator seed/reference listesini sıraya dizer |
| Harness: abaplint `CX_STATIC_CHECK`'i tanımıyor → exception hiyerarşisi G6'da düşer (G0022). LLM koşularında da kategori D'yi 0'a indirirdi | 1 | Düzeltildi: G6 bu mesajı yok sayar (G1 aktivasyonu kontrol eder) |
| CDS view entity'de `:p_from` (G0024) | 1 | Statik kontrol + prompt kuralı |
| UNION'da `@Metadata.ignorePropagatedAnnotations` yok (G0025) | 1 | Statik kontrol + prompt kuralı |
| Referansın kendi testlerinde tip hatası (G0022) | 2 | Onarım turu |
| Abaplint hatası; asıl neden G6 harness hatasıydı (G0022) | 1 | Düzeltildi |
Ek bulgu: G0022'nin bütçesi (12 aktivasyon) referansın kendisine (13) yetmiyordu → oracle disiplinden 5 puan kaybetti. Generator artık bütçeye alt sınır koyar: aktivasyon ≥ 2 × oracle, tool çağrısı ≥ 3 × oracle. Mevcut görevlerden sadece G0022 etkilendi.
G0022 bundle'ı değiştirilmeden yeniden doğrulandı (harness düzeltmeleri + bütçe): oracle 100, null 0 → kabul.
## 11g. Mutasyon kontrolü (Adım D, 2026-10-03)
`harness/mutation.py`: referansın (test sınıfları hariç tüm objeler) implementasyonunda deterministik küçük değişiklikler; her mutant için oracle + gizli testler. Yakalandı = referans aktif ve en az bir gizli test düşüyor. Kabul: en az 2 geçerli mutant ve yakalama oranı ≥ %75. Generator artık oracle 100 / null 0'dan sonra mutasyon kontrolü yapar; hayatta kalan mutantlar onarım geri bildirimi olur. Yakalanan mutantlar `<görev>/faulty/` altında saklanır (kendi testlerin (a) puanı için aday hatalı referans).
Mutant türleri: ilişki operatörünü tersine çevirme (`<`→`>=`), koşul satırında `=`→`<>`, `AND`↔`OR`, `+`↔`-`, `*`→`/`, `abap_true`↔`abap_false`, tamsayı sabiti +1; CDS'te ayrıca `sum(`→`max(`, `inner join`→`left outer join`, literal değer.
Ayarlar (deneyle):
- Sınır kaydırma (`<`→`<=`) kullanılmaz: sınıra sabitleme (clamp) kodunda eşdeğer olur (T13: `IF fee < 1. fee = 1.`).
- `WHILE`/`DO` blokları atlanır: G0002'de bir mutant sonsuz döngü yaptı, unit test RFC bağlantısını ~8 dk kilitledi.
- `sy-subrc`/`sy-tabix` satırları atlanır: çoğu davranış farkı değil short dump verir (`GETWA_NOT_ASSIGNED`).
- CDS tip uzunlukları (`abap.char(1)`) atlanır.
- Mantık yardımcı sınıfta olabilir (G0026: FM bir sınıfı çağırır) → hedef sözleşme değil, tüm referans objeleri.
Sonuç: T01, T13, T14, T15 ve kabul edilen 22 üretilmiş görevin hepsi geçti. Hayatta kalan mutantlar gerçek test boşluğu gösterir: `inner join`→`left outer join` (G0017, G0020: test verisinde eşleşmeyen satır yok), `sum(`→`max(` (G0019: grup başına tek satır). Süre: mutant başına ~10–50 s.
## 11h. Ampirik süzgeç ve inceleme sonuçları (2026-10-03)
DeepSeek (bütçe 60 çağrı) 109 eval görevinde koşuyor, 103'ünün güncel sonucu var; sonuç `tasks_gen/eval/<id>/empirical.json` (eski koşular `_superseded`). Kalan 6 görev (G0107, G0173, G0175, G0177, G0181, G0191) W7B'de koşuyor, bu satırlar o bitince güncellenir.
Kategori ortalaması (güncel koşu): A 96.3, B 88.9, C 88.7, D 97.7, E 93.6, F 91.5, G 84.0, H 71.4, I 91.0, K 93.4.
Dikkat gerektiren görevler:
- G0108 (53.2, 5/11): model hatası, görev geçerli (CDS float sabiti kesilmesi).
- G0119 (49.8): altyapı hatası (3 boş tur); `rerun_queue.txt`.
- G0162 (0, 3 koşuda G1 düştü): 7.02 PROG, SELECT/katı SQL modu aktivasyon hataları; son koşu iki boş 32k-token turuyla bitti. Rerun kuyruğunda; yine G1 düşerse 7.02 kısıtı ile sistemin katı SQL modu çelişiyor mu bakılır.
- G0170, G0176 (H, 0): DeepSeek durmadı, varsayımla uyguladı. G0170 için boşluk (yuvarlama hedefi ve modu) sınırda kritik; G0176 boşluğu (hangi oturumlar sayılır) gerçek. Qwen baseline sonucu karar verir.
- G0172, G0174 (H, 100): durdu.
İnceleme (kontrol listesi, `docs/eval-inceleme.md`): kabul edilen 109 görevin tamamı incelendi. Son 10 (G0121 G0124 G0129 G0130 G0141 G0143 G0144 G0160 G0161 G0189) hepsi `accept`; küçük notlar: G0121 `5->6` mutantı (üst öncelik sınırı veri satırında) hayatta; G0161 TOTAL_COST eşitliğinde sıra tanımsız (G0014/G0015 gibi), spec'te boşluk, test verisinde eşitlik yok. Kural 6 (rastgele 10 yüksek puan, tohum 20261003, DeepSeek ≥ 95 olan 48 görevden): G0100 G0101 G0111 G0114 G0130 G0133 G0136 G0146 G0149 G0164 - sızıntı, ipucu, kural–test eşlemesi tamam, hepsi `accept`. G0111'de yalnız 2 geçerli mutant var (zayıf mutasyon tabanı, kabul sınırında).
Kolay görev işareti (karar 3: işaretle, çıkarma): kural = DeepSeek ≥ 95 ve ≤ 20 araç çağrısı, uygulama görevi. 39 aday, liste `tasks_gen/eval/easy_candidates.json` (C 9, E 7, F 5, A 4, G 4, K 4, D 3, I 2, B 1). Aday kalır; Qwen baseline (25 görev) ile doğrulanır, DeepSeek ile ikisi de yüksekse "kolay" olur.
G0181 (K, W7B rerun, 0 puan, hidden 0/6): neden bulundu. Model ALV çıktı tablosunda `int8` kullandı; gizli testlerde `CL_SALV_BS_DDIC` `CREATE_DATA_UNKNOWN_TYPE` ile düşüyor, 6 test de aynı hatayla. Spec ALV'yi koruyor (düzeltme çalıştı), hata model tercihi (sütun tipi). Görev geçerli; K değerlendirmesinde gerçek bir beceri farkı (SALV ile uyumlu tip seçimi). Başka W7B sonuçları: G0107 85 (G2 düzeltmesi çalıştı), G0173/G0175/G0177 H durdu (100), G0191 100, G0162 yine 0 (rerun kuyruğunda).
Bulgu (proxy): `sap_inactive_objects` başka koşunun nesnesini gösteriyor (`Z0FFK001_IBAN_VALIDATOR`, G0176 koşusunda): ön ek filtresi bu araçta yok. Nesne artık değil, o sırada koşan T01 testine ait (ön ek Z0FFK001); teardown siler. Proxy düzeltmesi baseline sonrası.
## 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). (4) Unit test zaman aşımı: test edilen kodda sonsuz döngü RFC bağlantısını ~8 dk kilitler (mutasyon koşusu 5201, 2026-10-03); N saniye sonra durdurulmalı.
- 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üş.