# 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_` (ö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 ``` - 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 `/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//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üş.