Generator: pilot analysis and fixes; G0002-G0021 tasks; handover notes merged

- 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>
This commit is contained in:
Kral
2026-10-03 05:04:23 +02:00
parent 15eb9f1bb2
commit 5de5e2851c
162 changed files with 9943 additions and 23 deletions

603
docs/faz1-tasarim.md Normal file
View File

@@ -0,0 +1,603 @@
# 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üş.

161
docs/yol-haritasi.md Normal file
View File

@@ -0,0 +1,161 @@
# ABAP Danışman Modeli — Yol Haritası
Durum: v19 · 2026-10-02
Şu anki konum: **Adım 1.3**
## Adım 0 — Çerçeve ve kararlar
| Karar | Durum |
|---|---|
| Modelin rolü: teknik ABAP danışmanı, modül bilgisi yok | ✓ |
| Sözleşme: metin olarak ABAP görevi + genel ABAP MCP arayüzü | ✓ (2026-10-02) |
| Girdi: `plan-agent.md` formatı en iyi sonuç veren girdi, zorunlu değil; Kral'ın akışında plan kullanımı değişmez | ✓ (2026-10-02) |
| Tool arayüzü: EPOD isimleri yerine genel ABAP MCP; EPOD native destekleyecek, harness proxy ilk adapter; delete/teardown harness'te | ✓ (2026-10-02) |
| Eğitimde az miktarda tool isim/şema varyasyonu | ✓ (2026-10-02) |
| Ortam: A4H (yazma + doğrulama) | ✓ |
| Mevcut planlar: sadece şablon, eğitim verisi değil | ✓ |
| Eski playbook formatı kullanılmaz | ✓ (2026-10-02) |
| Eğitim verisinde Claude çıktısı yok; eval görevleri eğitim verisine girmez | ✓ (2026-10-02) |
| Lisans: Apache 2.0 | ✓ |
| Baz model: sadece Apache 2.0 veya MIT lisanslı adaylar | ✓ (seçim Adım 2'de) |
Bitti. ✓
## Adım 1 — Eval seti ve harness
Amaç: modeli ölçebilmek. Ölçüm olmadan eğitim kör olur.
| Alt adım | İş | Durum |
|---|---|---|
| 1.1 | Tasarım dokümanı (`faz1-tasarim.md`) | ✓ v3 |
| 1.2 | Teknik doğrulamalar: MCP tool'ları, A4H release, teardown (ADT deletion API), abaplint + seed tipleri, paralellik (8 oturum) | ✓ |
| 1.3 | Harness iskeleti: setup → run → puan → teardown, T01 ile uçtan uca | **✓** — Mac mini'de; test include ve teardown çözüldü. Baştan koşular: oracle 100, null 0, Qwen (koşu 203) çalışıyor |
| 1.3b | Genel ABAP MCP arayüz spec'i (`abap-mcp-arayuz.md`) ve harness proxy'sinin bu arayüze çevrilmesi | Sonra |
| 1.4 | T01–T15: seed, gizli testler, hatalı referans | |
| 1.5 | 110 görevlik set (kategori K dahil: eksik/serbest girdi + farklı tool şeması): üretim + senin incelemen | |
| 1.6 | Ölçüm: aday baz modeller + Claude referansı | |
Bitti sayılır: 110 görev, kategori bazında sonuç tablosu.
## Hacim tahmini (kaba, 2026-10-02)
İlk ölçümlerle kalibre edilecek (koşu süresi, kabul oranı).
| Aşama | Görev | Koşu | Obje (oluşturulup silinen) | Süre |
|---|---|---|---|---|
| Eval seti (Adım 1) | 110 | 110 / model / mod | ~5–8 / koşu → ~700 / ölçüm | Yerel 27B: 35–50 saat / ölçüm |
| Ölçüm turu (Adım 1.6) | 110 | ~3–4 model × 2 mod + Claude ≈ 900 | ~6 000 | Yerel modeller birkaç hafta; uzak modeller birkaç gün |
| Eğitim verisi (Adım 3) | 1 500–2 000 üretilmiş görev | 4 deneme / görev ≈ 6 000–8 000 | ~40 000–50 000 | Yerel 27B ile ~5 000 saat → **yerelde mümkün değil** |
| Hedef çıktı (Adım 3) | | %40 kabul → **~3 000 yörünge** | | |
| RL (Adım 5, opsiyonel) | aynı havuz | on binlerce | yüz binler | Ayrı planlama |
**Teacher maliyeti (DeepSeek V4.1 Flash, Ollama cloud):** T01'de ölçülen ≈ 0,09 $ / koşu (liste fiyatı). T01 kolay bir görev; ortalama görev için 0,15–0,20 $ varsayımı:
| İş | Koşu | Maliyet (liste fiyatı) |
|---|---|---|
| Eval ölçümü, DeepSeek (110 × 2 mod) | 220 | ~35–45 $ |
| Adım 3 (2 000 görev × 2 deneme; T01'deki başarıyla kabul oranı yüksek beklenir) | ~4 000 | ~600–800 $ |
| **Toplam (RL hariç)** | | **~650–850 $** |
Ollama paneli, koşu 204'ün 8 isteği tek tek: 6 × <0,01 $, 1 × 0,01 $, 1 × 0,03 $ → **≈ 0,05–0,08 $ / koşu**. Liste fiyatı tahminine (0,09 $) yakın; Ollama kullanımı liste fiyatına yakın sayıyor. (Ayın toplamındaki düşük ortalama, başka küçük isteklerden geliyor.)
| İş | Koşu / görev | Tahmin |
|---|---|---|
| Pilot (B–E): ~20 görev üretimi + doğrulama + koşular | ~100 istek grubu | ~5–10 $ |
| Eval seti üretimi + ölçüm (110 görev, 2 mod) | ~330 | ~25–40 $ |
| Eğitim görevi üretimi (2 000 görev) | 2 000 | ~100 $ |
| Yörünge üretimi (2 000 × 2 deneme) | ~4 000 | ~400–600 $ |
| **Toplam (RL hariç)** | | **~550–750 $** |
Bütçe: şu an ~50 $, her ay +60 $. B–F ve eval ölçümü bu bütçeye sığar. Yörünge üretimi aylık 60 $ ile 7–10 ay sürer; o aşamada ~500–700 $ ek kredi önerilir. Kesin rakam pilottan sonra.
**Karar (2026-10-02): DeepSeek V4.1 Flash (Ollama cloud) teacher ve görev yazarı olarak hemen kullanılıyor.**
Sonuçlar:
- Aynı anda A4H'da en fazla ~50 obje olur (6 worker × ~8). Toplam sayı büyük ama birikmez; teardown her koşu sonunda.
- **Adım 3 yerel modelle yapılamaz.** Teacher model hızlı ve uzakta olmalı (kiralık GPU veya açık lisanslı modelin API'si). O zaman darboğaz A4H olur: 6 worker, koşu başına ~5 dk → saatte ~70 koşu → 8 000 koşu ≈ 5 gün.
- **Önek şeması yetmez:** `Z<run 3 hane><task 3 hane>_` en fazla 999 koşu. Adım 3 öncesi koşu kimliği base36 4 karaktere çıkarılmalı (~1,7 milyon koşu).
- Uzun vadede A4H'da izlenecekler: disk (HANA log, versiyon geçmişi, silme logları).
## Hızlandırılmış sıra (2026-10-02)
Adım 3 görev ister; görevler el ile yazılırsa darboğaz olur. Bu yüzden ilk iş **görev üreteci**: hem eval setini (1.5) hem eğitim görevlerini (3.1) aynı hat üretir.
| Sıra | İş | Durum |
|---|---|---|
| A | Önek şeması: koşu 4 karakter base36, görev 3 karakter base36 (`Z005P001_`) | ✓ |
| B | Harness: FUGR/FUNC, PROG, DDLS desteği (G2 kontrat kontrolü, abaplint dışa aktarımı, silme sırası) | ✓ T13–T15 oracle 100 / null 0. Server eşzamanlılık sorunu bulundu (harness'te retry) |
| C | Görev üreteci: DeepSeek görev yazar (spec, seed, gizli testler, referans + local testler); kategori ve obje tipi dağılımına göre | ✓ `harness/generator.py`: üretim → yapı + statik kontrol + yerel abaplint → oracle/null doğrulama → en fazla 3 onarım turu. Pilot sonrası iyileştirildi (faz1-tasarim 11e) |
| D | Otomatik görev doğrulama: oracle = 100, null = 0, gizli testler bozuk referansta düşmeli | oracle/null hazır; mutasyon kontrolü sonra |
| E | Pilot: ~20 görev, tüm obje tipleri; kabul oranı ve gerçek maliyet ölçümü | ✓ 16/20 kabul, 0,16 $ / kabul edilen görev (faz1-tasarim 11e). İyileştirilmiş generator henüz denenmedi |
| F | Eval seti: 110 görev; Kral incelemesi. Eğitim havuzu: otomatik doğrulanmış görevler, eval ile çakışmasız | |
| G | Ölçüm (1.6) ve yörünge üretimi (3.2) paralel worker'larla (bulut model: en fazla 6) | |
## Bütçe takvimi (Ollama cloud, 2026-10-02)
Kalan: ~50 $ (12 Ekim'e kadar). 12 Ekim'de +60 $, sonra her ay +60 $. Birim maliyet (ölçülen): DeepSeek koşusu ≈ 0,05–0,08 $; görev üretimi ≈ 0,13 $ / görev, 0,16 $ / kabul edilen görev (pilot, liste fiyatı). Yerel modeller (Qwen vb.) ücretsiz; gece koşuları.
| Dönem | Bütçe | İş | Tahmini harcama |
|---|---|---|---|
| **2–12 Ekim** | ~50 $ | C: görev üreteci. D: otomatik doğrulama. E: pilot (20 görev, üretim + DeepSeek koşusu) | ~5 $ |
| | | F: eval seti — ~150 aday görev üret (~20 $), süz, 110 kalsın; her aday 1–2 DeepSeek koşusu (ampirik süzgeç, ~10–20 $) | ~30–40 $ |
| | | Yerel ölçüm (Qwen ve aday baz modeller, ücretsiz, geceleri) | 0 $ |
| | | Yedek | ~15 $ |
| **12 Ekim – 12 Kasım** | 60 $ | Adım 2: baz model seçimi (yerel ölçüm sonuçlarıyla). Adım 3 pilotu: ~300 eğitim görevi + ~600 yörünge denemesi | ~60 $ |
| | | Pilot sonucu: gerçek kabul oranı ve maliyet → Adım 3'ün tamamı için ek kredi kararı (tahmin ~400–600 $) | |
| **12 Kasım sonrası** | 60 $/ay + ek kredi | Adım 3'ün tamamı, ardından Adım 4 (SFT) | |
Kurallar:
- Harness her bulut isteğinin token kullanımını `runs/ledger.jsonl`'e yazar (liste fiyatı, cache indirimi olmadan = üst sınır). Dönem harcaması `BUDGET_LIMIT_USD`'ye (şu an 45 $) ulaşınca yeni üretim veya bulut koşusu başlamaz. ✓
- Eval görevleri ve eğitim görevleri ayrı havuzlar; eval görevleri eğitim verisine girmez.
- Bulut ve yerel model aynı Ollama sunucusunda kuyrukta bekleyebilir; ölçümler sırasında ikisi aynı anda koşturulmaz.
## Adım 2 — Baz model seçimi
Adım 1.6 tablosundan seçilir. Aday havuzu: sadece Apache 2.0 veya MIT lisanslı modeller. Kriterler: puan, boyut, Mac mini'de çalışabilirlik.
Bitti sayılır: tek baz model seçildi, gerekçesi yazıldı.
## Adım 3 — Eğitim verisi üretimi
| Alt adım | İş |
|---|---|
| 3.1 | Görev üreteci: eval görevleriyle aynı şemada binlerce sentetik görev. Eval görevleriyle çakışma yok. Girdilerin bir kısmı serbest metin; yörüngelerin az bir kısmı farklı tool isim/şemalarıyla. |
| 3.2 | Yörünge üretimi: açık lisanslı teacher model görevleri A4H'da çözer. |
| 3.3 | Filtre: sadece puan eşiğini geçen yörüngeler kalır. Deduplikasyon. |
| 3.4 | Opsiyonel: izinli lisanslı açık ABAP kodu (continued pretraining için). |
Eğitim verisinde mutlaka olmalı (pilot bulguları, 2026-10-02): modellerin sık yaptığı hatalar için görev ve onarım yörüngeleri.
- Metot parametresinde `TYPE c LENGTH n` geçersiz; adlandırılmış tip (`TYPES`) gerekir.
- Ayrılmış kelime alan adı (HOURS, MODE).
- 30 karakterden uzun isimler (özellikle test metotları).
Bitti sayılır: filtrelenmiş yörünge seti hazır, kategori dağılımı dengeli.
## Adım 4 — SFT (LoRA)
| Alt adım | İş |
|---|---|
| 4.1 | Küçük deneme: Mac mini, MLX |
| 4.2 | Gerçek koşu: kiralık GPU |
| 4.3 | Eval: Adım 1 setiyle, baz modelle karşılaştırma |
Bitti sayılır: eğitilmiş model baz modeli anlamlı farkla geçiyor.
## Adım 5 — RL (opsiyonel)
SFT hedefe ulaşmazsa. Ödül: harness puanı (syntax, aktivasyon, testler, abaplint, ATC).
Bitti sayılır: hedef çizgi (Claude referansına ≤ 10 puan fark).
## Adım 6 — Gerçek iş akışında deneme
`/sapplan` planı → model build-agent rolünde → gerçek bir görev. Eval'in yakalamadığı sorunlar burada çıkar.
Bitti sayılır: senin seçtiğin gerçek görevlerde kabul edilebilir sonuç.
## Adım 7 — Yayın
Ağırlıklar, model kartı, lisans, eval sonuçları, genel ABAP MCP arayüz spec'i. Opsiyonel: harness ve eval seti açık kaynak.
Bitti sayılır: yayınlandı.