Files
abap-llm/docs/faz1-tasarim.md
Kral 32f03fcad4 Hard batch G0022-G0026: 5/5 accepted; budget floor, CDS checks, mutation check
- generator: budget floor (2x oracle activations, 3x calls), static checks for CDS
  $parameters and UNION annotation
- harness/mutation.py: deterministic mutants of the reference; hidden tests must fail
- G0022 revalidated with harness fixes: oracle 100, null 0
- results in docs/faz1-tasarim.md 11f

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 05:16:30 +02:00

42 KiB
Raw Blame History

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 adapterdir.
  • 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
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ı

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:

# 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.

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üş.