← Blogs
BlogTürkçe19 Eyl 2026 English →

co-maintainer,
seni taklit eden bir araç

Her repoda kimsenin yazıya dökmediği çeşitli bilgiler vardır. Üç yıldır her pull request’i inceleyen kişinin kafasında durur ve o kişi gittiğinde onunla gider.

northwind/payments-api · 1.284 dosya pull request #312 2 dosya · +41 −6 bu 41 satırın doğru olup olmadığını belirleyen her şey
Şekil 01Bir YZ inceleyiciye bant verilir. Bir insan inceleyici bandı da alır, alanı da zaten kafasında taşır.
01 · tekrar

Bu yorumu daha önce yazdın

Altı ay arayla üç pull request, üç ayrı katkıcı. Her seferinde aynı yorum, her seferinde biraz farklı cümlelerle. Kural gerçek ve herkes onu biliyor. Sadece hiçbir yerde bir makinenin okuyabileceği biçimde yazılı değil.

MKmuratreviewed #218 Mar 3
We keep amounts as integer minor units. amount * 0.029 turns a Money into a float, and the rounding is already gone by the time it reaches the ledger. Use mulRate.
MKmuratreviewed #264 Jun 11
Same thing as #218. This multiplies a Money by a float. mulRate(amount, 29, 1000) does it in one rounding step.
MKmuratreviewed #301 Sep 2
Float math on money again, third time this quarter. mulRate.
co-maintainer bunu CODEBASE.md’ye şöyle not aldı

Money is an integer count of minor units, defined in src/money.ts. Never multiply or divide a Money by a float. Rate math goes through mulRate(amount, numerator, denominator), which rounds once, at the end.

Şekil 02Alttaki cümleyi kimse yazmadı. co-maintainer reponun inceleme geçmişini okudu ve onu reponun kendi sözcükleriyle yazdı. Yorumlar ve kılavuz metni, aracın gerçekte ürettiği gibi İngilizce.
02 · boşluk

Diff’in söylemedikleri

Bir inceleyici yamayı okurken bu kod tabanının dört yılını da kafasında taşır. Bunun ne kadar değerli olduğu şurada görünüyor.

diff’in içinde · src/billing/refund.ts
src/billing/refund.ts#312
40export function refundFee(amount: Money) {
41 const fee = amount * 0.029;
42 return { fee, net: amount - fee };
43}
testler geçti·tipler geçti·lint geçti
diff’te yok · 14 aydır dokunulmamış
src/money.tsmain
7// minor units. 1299 is 12.99
8export type Money = number & { __minor: true };
9
10export const mulRate = (m, n, d): Money =>
11 Math.round((m * n) / d) as Money;
ledger.post() reddeder37.671çalışma zamanında, canlıda
Şekil 03Değişen satır yamanın içinde. Yanlış olmasının sebebi ise kimsenin dokunmadığı bir dosyada.

Tipler derlenir, çünkü markalı bir number hâlâ bir number’dır. Ücret kesirli çıkar, ledger.post() tam sayı bekler ve iade, düzgün bölünmeyen ilk tutarda hata verir.

Kaçan bir bulgu çoğunlukla eksik bir girdidir, zayıf bir model değil.

03 · okuma

Repoyu bir kez oku, her incelemede değil

Her incelemede modele bütün repoyu vermek mümkün ama saçma. Repo onun yerine bir kez, incelemenin dışında okunur. Çıkan kılavuzlar da her yamaya götürecek kadar küçüktür.

probe

Hiçbir şeye mal olmayan kısımla başla

Repoyu GitHub API üzerinden okur ve çalıştırmanız gereken init satırını, limitler doldurulmuş halde yazdırır. Hiçbir model çağrılmaz, hiçbir şey yazılmaz.

init · çıkarım

Ucuz bir model repoyu kanıta çevirir

Ağaç, dosyalar, pull request’ler, diff’leri, üzerlerindeki tartışmalar, commit geçmişi. Her gözlem, onu üreten dosyaya ya da pull request’e bağlı kalır, çünkü kaynağı izlenemeyen bir kural, bir inceleme aracının kural uydurmaya başlama biçimidir.

init · sentez

Akıl yürüten bir model kanıtı üç kılavuza çevirir

Buraya nasıl katkı yapılır, kod gerçekte nasıl yazılır ve buradaki inceleyiciler tarihsel olarak hangi sebeplerle pull request’leri durdurmuş. Klonun içine değil config dizininize yazılırlar, bu yüzden yeni bir checkout onları kaybetmez.

remake

Sonra bir diff’in maliyetine canlı tut

Yeniden çeker, önbelleğin değişmedi dediği her kanıtı yeniden kullanır ve yalnızca yeni commit’lerin dokunduğu kılavuzları baştan yazar. init bir kereliktir. Bu ise döngüdür.

REPO 1.284 dosya · 312 pull request probe northwind/payments-api 312 pull request örneklendi, 4.180 commit görüldü model çağrılmadı, diske bir şey yazılmadı önerdiği init satırını yazdırır KANIT çıkarım düşük maliyetli model her biri bir dosyaya ya da pull request’e bağlı sentez akıl yürüten model DİSKTEKİ KILAVUZLAR SKILL.md 14.2 KB buraya nasıl katkı yapılır CODEBASE.md 9.8 KB kod nasıl yazılır PR_REVIEW_GUIDE.md 6.1 KB inceleyiciler PR’ları neden durdurur 30 KB, sonraki her inceleme bunu yeniden kullanır SONRA · MAIN’E 3 COMMIT GELİR remake yeniden yazıldı değişmedi yeniden yazıldı önbellekteki kanıt yeniden kullanılır, yalnızca dokunulan kılavuzlar için tekrar ödenir
zsh · ~/src/payments-apirepo başına bir kez
$ co-maintainer probe northwind/payments-api --auth=gh repository northwind/payments-api default branch main pull requests 312 sampled over 14 months commits 4,180 on main recommended co-maintainer init northwind/payments-api --include-codebase \ --include-pull-requests --include-pull-request-changes \ --include-commit-history --max-pr-months=12 --max-commits=500 no model was called, nothing was written $ co-maintainer init northwind/payments-api --auth=gh --ai=openrouter extract 1,284 files, 312 pull requests low model synth SKILL.md CODEBASE.md PR_REVIEW_GUIDE.md high model written ~/.config/co-maintainer/repos/northwind/payments-api done in 6m 12s
Şekil 04İki komut, biri bedava. Çıktı, biçimini korumak için kısaltıldı.

Bunun bir kez yapılmasının sebebi:

18.9K yeniden kullanılan repo bağlamı 1.35M repo, her incelemede yeniden okunur 71× aynı pull request’ler · aynı model
Şekil 05Ölçekli çizildi. Küçük kare, repo önceden okunmuşken bir incelemenin maliyetidir.
04 · ürün

Ürün kılavuzlardır

Modeller kiralıktır. Bu çeyrek en iyisi hangisiyse gelecek çeyrek en iyisi o olmayacak. Sahip olduğunuz kısım bağlamdır.

SKILL.md14.2 KB
## Shipping
Pull requests run CI via .github/workflows/ci.yml, which defines a test job and a contract job that replays recorded provider webhooks.
Run npm run verify-pack before tagging a release.
## Tests
A new provider adapter is expected to ship with a webhook replay fixture under test/fixtures/providers/.
buraya nasıl katkı yapılır
CODEBASE.md9.8 KB
## Money
Money is an integer count of minor units, defined in src/money.ts. Never multiply or divide a Money by a float. Rate math goes through mulRate(amount, numerator, denominator).
ledger.post() asserts an integer amount, so a float that reaches it throws rather than rounding quietly.
## Code layout
Each provider adapter lives in src/providers/ and exports only charge, refund and webhook.
kod gerçekte nasıl yazılır
PR_REVIEW_GUIDE.md6.1 KB
## What reviewers here ask for
Float arithmetic on an amount is the most frequently raised issue in this repository's history (#218, #264, #301).
Three adapters have been blocked for shipping without a replay test. Treat a missing fixture as blocking, not as a nit.
## Tone
Reviewers here state the consequence, then the fix, in that order.
buradaki inceleyiciler PR’ları neyle durdurur
Şekil 06Elle yazılmadı, üretildi. Vurgulanan satır Şekil 02’deki satır, sağdaki kartta geçen numaralar da geldiği pull request’ler. Kılavuzlar aracın yazdığı haliyle, İngilizce.

Yüksek sesle okuyun, iki yıldır bu repoya merge eden kişi gibi konuşurlar. Başlık buradan geliyor. Ekibinizden daha iyi bir inceleyici olmaya çalışmıyor, zaten sahip olduğunuz inceleyicinin ucuz bir taklidi olmaya çalışıyor. Gece 2’de bile uyanık, sıkıcı pull request’lerde de.

05 · inceleme

Diff’e ne yazar

Bir pull request açılır. Kılavuzlar zaten diskte, bu yüzden inceleyici hiç görmediği bir yamadan değil, okumuş olduğu bir repodan başlar.

Charge providers: percentage refund fee #312 northwind:feat/refund-fee Open
Review / co-maintainer reading guides and diff…2 findings, 1 blocking 24sDetails
co-maintainerbot reviewed just now
Reviewed against SKILL.md, CODEBASE.md and PR_REVIEW_GUIDE.md for this repository, with codegraph enabled.
1 blocking 1 non blocking 9,312 tokens 24.7s $0.0041
src/billing/refund.ts+3−0
3939export function refundFee(amount: Money) {
40 const fee = amount * 0.029;
41 return { fee, net: amount - fee };
4042}
P1 · blocking

refundFee() returns a fractional amount. ledger.post() asserts an integer count of minor units, so every refund whose fee does not divide evenly throws in production instead of rounding. CODEBASE.md puts rate math through mulRate for exactly this reason.

src/billing/refund.ts:41 · 3 call sites reach this

Suggested change
41 const fee = amount * 0.029;
41 const fee = mulRate(amount, 29, 1000);
Commit suggestion Add to batch
Şekil 07Yeşil tik ilginç kısım değil. İlginç olan, yamanın hiç dokunmadığı bir dosyadaki bir doğrulamayı adıyla anan yorum. Bot yorumu aracın ürettiği haliyle, İngilizce.

Kılavuzlar olmadan burada iki dürüst seçenek var. Hiçbir şey söylememek, çünkü yüzdelik ücret yazılması normal bir şey. Ya da kayan noktayla ilgili belirsiz bir şey söylemek, ki herkes bunu kaydırıp geçmeyi öğrendi.

  • Bulgular taşınır. Düzeltmeyi gönderin, yeniden çalıştırın, bulgu iki kez açılmak yerine kapanır.
  • Engelleyici bir bulgu sıfırdan farklı kodla çıkar. CI’ın ihtiyacı olan tek şey bu.
  • stdout’ta --json, log’lar stderr’de. Bulgular, sayılar, token’lar, süre, codegraph durumu, tek bir belgede.
  • Codegraph isteğe bağlı. Varsayılan olarak açık, ikili dosya sizin haberiniz olmadan değil, istek üzerine kurulur.
06 · üç kapı

Aynı kılavuzlar, üç giriş

İnsanların gerçekten istediği yalnızca üç cevap var: çalışma ağacımdaki dağınıklık, şuradaki pull request ve birincisi, ama her dizüstünü init için ödeme yapmaya zorlamadan.

reviewyerel inceleme
review owner/repo 312pull request incelemesi
review --remoteuzak inceleme
ne okur
Klonunuzdaki staged, unstaged ve untracked dosyalar
Pull request ve yaması gh ile, checkout gerekmez
Birinci sütundaki yerel diff’in aynısı
kılavuzlar nerede
Diskiniz, kendi init’iniz
Diskiniz, kendi init’iniz
Sunucu, ekip için bir kez kurulur
model nerede çalışır
Makineniz, anahtarınız
Makineniz, anahtarınız
Sunucu, kendi anahtarıyla
ne gerekir
Bir klon ve bir init
gh ve bir init
Bir host ve bir token
ne zaman kullanılır
Pull request’i açmadan önce
Başkasının işini incelerken
Yeni bir ekipte ilk haftanız
Şekil 08Pull request incelemesi ve uzak inceleme birleşmez. Biri numara alır, diğeri diff.
07 · uzak inceleme

Bilgisayarında hiç init çalıştırmadan shared contexti kullan

Biri pazartesi günü ekibe katılır ve repoyu klonlar. Yerel inceleme kılavuz ister, kılavuz init ister, init ise dakikalar ve para ister. Bunu dizüstü başına bir kez ödemek, bir aracın üçüncü haftasında ölme biçimidir.

dizüstünüz
$co-maintainer review --remote
·main’e karşı git diff, 2 dosya
·codegraph burada, klonunuzda çalışır
·kılavuz yok, sağlayıcı anahtarı yok, init yok
bu makineden çıkmaz
klon · kimlik bilgileriniz · stage etmediğiniz her şey
diff
araç çağrısı
araç sonucu
bulgular
co-maintainer serve
·northwind/payments-api kılavuzları
·sunucuyu kuran kişi tarafından bir kez oluşturuldu
·model burada, ekibin anahtarıyla çalışır
·iş kuyruğu, token başına eşzamanlılık
hiç görmez
çalışma ağacınız · geçmişiniz · diff dışındaki her şey
1 · el sıkışmatoken cmr_…, şema ve gövde limitleri üzerinde anlaşılır
2 · göndermediff yukarı çıkar, yalnızca diff
3 · kuyruksunucu modeli kendi kılavuzlarıyla çalıştırır
4 · araç köprüsüdizüstünüzden codegraph çalıştırmasını ister ve bekler
5 · senkronbulgular yerel çalıştırmayla aynı biçimde geri gelir
Şekil 09Araç köprüsü, üzerinde durmaya değer kısım. Model sunucuda, incelemesi gereken kod ise sizin makinenizde.

Sıkıcı güvenlik kısımları. Token’lar diskte hash’lenir ve birini devre dışı bırakmak, onunla süren her incelemeyi iptal eder. CLI, bir host’a ilk kez diff yüklediğinde tek seferlik bir bildirim yazdırır, böylece kimse bunu altı ay sonra kaynağı okuyarak öğrenmez.

08 · sunucu

Sıkıcı yarıyı otomatikleştirmek istediğinde

co-maintainer serve tek bir süreç ve tek bir app.db. GitHub App webhook’unu, bir job worker’ı, panoyu ve son bölümdeki uzak inceleme API’sini barındırır.

localhost:5000
co-maintainer panosu tek bir repoyu durumu, bilgi tazeliği, otomatik inceleme anahtarı, inceleme sayısı ve 30 günlük maliyetiyle listeliyor.
Şekil 10Önemli olan Knowledge sütunu. main kılavuzların ilerisine geçtiğinde Needs update yazar ve oradan bir tık uzaklıkta remake var.

Bir repo ekleyin, init izleyebileceğiniz bir iş olarak çalışır. Otomatik incelemeyi açın, bir pull request’in açılması bir inceleme başlatmaya yeter. Yukarıdaki repo 8 gündür bağlı. init, remake ve tüm incelemeler dahil toplam maliyeti $1.20 oldu.

09 · kanıt

Peki bunlar gerçekten işe yarıyor mu?

Kendi repolarımdan birinde otuz pull request. On dördü bilerek eklenmiş, elle doğrulanmış bir hata taşıyor. On altısı temiz kontrol, ki çoğu inceleme benchmark’ı bu kısmı atlar ve precision’ı ölçülebilir kılan da bu kısımdır.

recall 0.857 14 hatanın 12’si bulundu
precision 0.353 temiz koda da takılıyor. Saklamadığımız yarı bu
PR başına maliyet $0.0045 tüm koşu için $0.134
PR başına süre 28.9s ortalama 8.5K token
repo_wide 1.000 codegraph gerekir, dosyalar arası akıl yürütme
convention 1.000 CODEBASE.md gerekir
history 1.000 PR_REVIEW_GUIDE.md gerekir
diff_local 0.800 hiçbir şey gerekmez, hepsi yamada
file_local 0.500 aynı dosyanın geri kalanı gerekir
Şekil 11bench core v3, GroophyLifefor/heap-analysis, 14 Eyl 2026. Hatanın ne tür bağlama ihtiyaç duyduğuna göre recall.

Diff dışında bir şeye ihtiyaç duyan her hata yakalandı. İki kaçırma, gereken her şeyin zaten yamada durduğu eksenlerde, ki bu komik ve biraz da alçaltıcı: bağlam mekanizması çalışıyor, hâlâ kaçan şey sıradan yakın mesafe okuma.

Otuz pull request, tekrar koşu yok, yani varyans ölçülmedi. Temiz pull request başına yaklaşık bir gereksiz bulgu üretiyor ve bir ekibin inceleme botunu tutup tutmayacağını ya da susturup susturmayacağını belirleyen sayı bu.

10 · mesele

Context optimizasyonu verim kaybı değildir

Soru hiçbir zaman hangi modelin en iyi incelediği değildi. Modeller birkaç ayda bir değişir ve cevap onlarla birlikte eskir. Soru, modelin başlarken elinde ne tuttuğudur. Daha fazla context vermek daha doğru tahmin etmesini sağlamaz.

  1. 01daha az context
  2. 02daha az halüsinasyon
  3. 03daha hızlı inceleme
  4. 04daha doğru tahmin
başlangıçnode 24+
$ npm install -g co-maintainer $ co-maintainer probe owner/repo --auth=gh sonra yazdırdığı init satırını çalıştır, sonra: $ co-maintainer review