PR konuşmaları
Kod hakkındaki konuşma zaten bir pull request’te gerçekleşir. PR konuşmaları
onu bir Control Center çalışma alanında bir yüzey haline getirir; tıpkı bir
sohbet köprüsünün Slack’i böyle
bir yüzey haline getirmesi gibi: bir PR’da sunucunun GitHub App botunu @ ile
anın, inceleme konularının içinde yanıtlayın veya ai-review etiketini ekleyin
ve iş, PR’ın inceleme alanında gerçekleşir — uygulamada yazılan her şeyle aynı
atıf ve korumalar altında. Bir yorum ayrıca üyeliğe bağlıdır; etiket değildir,
çünkü onun bir yazarı yoktur. Botun yanıtları, sorunun sorulduğu kanal üzerinden
GitHub’a geri döner.
Bu özelliği üç karar şekillendirir ve her biri, sohbet köprüsünün sohbet için verdiği aynı kararın bir forge için yeniden ifade edilmiş halidir: bağlantının hangi yönde çalıştığı, dışarıdan gelen bir yorumu neyin yetkilendirdiği ve her iki tarafın kime atfedildiği.
Taşıma katmanı yoklamadır
Bölüm başlığı “Taşıma katmanı yoklamadır”GitHub’ın bir uygulama için sunduğu tek push kanalı bir webhook’tur ve bir webhook gelen bir URL gerektirir — bu yüzeyin bilinçli olarak asla talep etmediği tek şey. Dolayısıyla keşif bir taramadır: yaklaşık her dakika, her uygulama kurulumu için takma adlı tek bir arama GitHub’dan botu (veya kısa slug’ını) anan PR’ları ve inceleme etiketini taşıyan açık PR’ları ister, hâlihazırda bir inceleme alanı olan PR’ların yorum konuları okunur ve her şeyin farkı, yorum kimliği üzerinden son taramada görülenlere göre alınır.
Tasarımın sonuçlarını adlandırmaya değer:
- Gecikme bir olay değil, bir tarama aralığıdır. 👀 onayı yaklaşık bir dakika içinde düşer. Buna bağlı acil bir şey yok.
- Her yorum için tam olarak bir kez. Yorum kimlikleri GitHub genelinde benzersizdir; her biri uygun olarak sınıflandırıldığı anda, üzerinde herhangi bir şey işlem yapmadan önce kaydedilir. Bir çökme bir yorumun işlenmesini kaybettirebilir, ama onu asla iki kez tetiklemez.
- Çevrimdışı süre yakalanır, yeniden oynatılmaz. Görülenler kümesi kalıcıdır; dolayısıyla bir yeniden başlatma, kapalıyken gelenleri teslim eder. Tek istisna, ilk taramadır: karşılaştıracak bir belleği olmadığından, bekleyen her şey sessizce kaydedilir — bu sunucu var olmadan önce yirmi PR’ı etiketleyen bir operatör, dönüşünde yirmi çalışan incelemeyle karşılaşmamalıdır.
- Etiket bir olay değil, bir kümedir. Arama etiketin varlığını bildirir; dolayısıyla etiketlenmiş bir PR yalnızca bir kez tetiklenir. Bir etiketi kaldırıp yeniden eklemek tarama için görünmezdir; yeniden çalıştırma yolu bir anmadır.
Arama, her kurulum hesabı için o sahibin kendi istemcisi üzerinden bir kez çalışır; çünkü bir kurulum token’ı yalnızca kendi kurulumunun depolarını görür — sunucu genelinde tek bir kimlik bilgisi, uygulamanın diğer kurulumları altındaki her PR’ı sessizce kaçırırdı.
Yetkilendiren şey yorum değil, üyeliktir
Bölüm başlığı “Yetkilendiren şey yorum değil, üyeliktir”Bir PR yorumu, bir yazar giriş adından biraz fazlasını taşıyarak gelir — kanıtlanana kadar kimliği doğrulanmamış bir dış kimlik. Bot bunu, çalışma alanının üyeleri ile onların bağlı GitHub hesaplarının ters dizinine karşı çözer; bu dizin, insanlar sunucu çalışırken oturum açıp davet aldığı için bir TTL ile yeniden kurulur.
Kapalı tarafa düşmek bir merdiven gibidir ve her basamak, reddettiği konuda yanıt verir:
- Bilinmeyen bir giriş adına — bağlı değil ya da bu çalışma alanının üyesi olmayan biri tarafından bağlanmış — oturum açması ve buraya ait olduğundan emin olması söylenir
- Salt okunur bir üyeye (
viewerveyaguest) rolünün iş başlatamayacağı söylenir
İki bilinmeyen giriş adı durumu tek bir yanıtı paylaşır: ters dizin yalnızca bu çalışma alanının bir üyesini döndürür; dolayısıyla bağlı olmayan bir hesap ile bağlı olan ama üye olmayan biri aynı ıskalamadır. Hiçbiri devam etmez. Bir yorum asla onu göndermeyen birine atfedilmez ve bir yabancının sözleri, göremediği bir çalışma alanına asla girmez.
ai-review etiketinin çözülecek bir yazarı yoktur; dolayısıyla bu merdiveni
tırmanmaz. Onun eklenmesi, depoyu zaten bağlamış olan çalışma alanında
incelemeyi başlatır.
Bilinçli olarak iki kimlik
Bölüm başlığı “Bilinçli olarak iki kimlik”Konuşmanın her tarafı farklı bir kimlik taşır ve fark da özelliğin kendisidir:
- GitHub’da bot sunucudur. Köprünün gönderdiği her yorum, tepki ve yanıt uygulamanın kurulum token’ını kullanır. Hiç kimse bir istemcide bir şeye tıklamadı; dolayısıyla hiçbir şey bir kişinin hesabını ödünç almaz — webhook’ları ve yoklamayı insan kimlik bilgilerinden uzak tutan kuralın aynısı.
- Alanın içinde soru size aittir. İleti, yazarın çözümlendiği üyeye atfedilir ve ajan çalıştırması onun adına yürütülür: commit’ler onları ortak yazar olarak gösterir ve alanın özerklik kadranı ile eylem korumaları, tıpkı uygulamada yazılan bir iletiye uygulandığı gibi uygulanır. Çalıştırmadan gelen forge yazmaları yine de uygulama olarak çıkar — yukarıdaki maddenin aynı kuralı — üyenin kişisel token’ıyla değil.
İnceleme bulgularını GitHub’a geri yayımlamak, Control Center’da verilen bir kişi kararı olarak kalır. Bir anma bir incelemeyi başlatabilir; onu yalnızca bir insan yayımlar.
Döngü koruması ve kısa ad
Bölüm başlığı “Döngü koruması ve kısa ad”Bir bot hesabı tarafından yazılan her şey, herhangi bir denetim çalışmadan önce
düşürülür — özellikle bizimki ve her [bot] son eki; böylece başka bir
uygulamanın inceleme botu da bizimkini uyandıramaz. Bu olmasaydı botun kendi
yanıtları yeni yorumlar olarak gelir ve onu sonsuza dek yeniden tetiklerdi.
[bot] son eki, kısa biçimin var olmasının nedenidir. GitHub bir uygulama
hesabının giriş adını <slug>[bot] olarak sabitler, onun için otomatik
tamamlama sunmaz ve @slugı asla uygulamaya çözmez — dolayısıyla çıplak slug’ı
kabul etmek bizim eşleştiricimizin kararıdır ve bunun keşfi, GitHub’ın anma
dizini yerine ham bir yorum metni arama kanalı gerektirir. Maliyet
yumuşatılmadan belirtilir: uygulamanın slug’ını paylaşan bir insan kullanıcı,
kendisinden yapılan her kısa biçimli anmayla bota seslenir. Kendine özgü
uygulama adları bu çakışmayı varsayımsal kılar.
Bilinçli olarak sunulmayanlar
Bölüm başlığı “Bilinçli olarak sunulmayanlar”- Otomatik yayımlama yok. Bulgular inceleme alanına düşer; GitHub’a yayımlamak ayrı, insan eliyle yapılan bir eylemdir
- Bulanık kimlik yok. Yazar tam olarak tek bir üyeye çözülür ya da reddedilir — tahmine dayalı atıf yoktur
- GitHub App webhook’u yok. Bu yüzey hiçbir zaman bir webhook kaydetmez; dolayısıyla PR yorumları için açığa çıkarılacak bir gelen URL yoktur. Diğer ürün webhook’ları (pipeline’lar, bilet eşitleme) ayrı ve isteğe bağlı bir kurulumdur.
İlgili
Bölüm başlığı “İlgili”- Bir GitHub PR’dan Control Center ile konuşma: tüm bunların nasıl yapıldığı
- Sohbet köprüleri: sohbet için verilen aynı üç karar
- GitHub App oluşturma: bot kimliğinin nereden geldiği
- Çok oyunculu — kimlik, üyelik ve varlık: bir giriş adının çözümlendiği Principal’lar ve roller
- Korumalar: yanıt veren ajanın neler yapmasına izin verildiği
- YZ destekli inceleme kullanma: bir anmanın veya etiketin başlattığı pipeline