Çok oyunculu — kimlik, üyelik ve varlık
Control Center tek bir operatör için çalışır, ancak altındaki model en baştan çok aktörlüdür. İnsanlar ve ajanlar aynı alanlarda mesajlaşır, aynı biletleri düzenler ve aynı katılımcı listesinde görünür. Bunu güvenli ve anlaşılır kılmak üç karara indirgenir: kimin aktör sayıldığı, erişimi neyin denetlediği ve hangi durumun kalıcı olarak paylaşıldığı, hangisinin yalnızca canlı yayınlandığı.
Principal’ler: kullanıcılar ve ajanlar eşit aktörlerdir
Bölüm başlığı “Principal’ler: kullanıcılar ve ajanlar eşit aktörlerdir”“Bunu kim yaptı”yı kaydeden her şey — mesajlar, biletler, incelemeler, planlar,
çalıştırma günlükleri, denetim kayıtları — bir Principal üzerinden
çözümlenir; bu, UserPrincipal ile AgentPrincipal’ın kapalı bir birleşimidir
ve kompakt bir tel biçimi (user:<id> / agent:<id>) vardır. İsnat, N insanı
(veya N ajanı) tek bir sentinel hesapta asla birleştirmez; böylece bir ajanın
bıraktığı inceleme ile bir insanın bıraktığı inceleme, göründükleri her yerde
ayırt edilebilir.
Principal kimliğin birimi olduğu için aynı zamanda sınırlama birimidir:
- Hız sınırları oturum başına değil, principal başına uygulanır. Uzak araç çağrılarındaki aşırı yük koruması bütçeyi bağlantıya değil kullanıcıya göre ayırır: bir üyenin tüm cihazları tek bir paylaşılan kayan pencereden çeker (dakikada 120 çağrı, bunların en fazla 30’u değişiklik yapabilir); böylece üç cihaz açmak kimsenin kotasını üçe katlamaz ve gürültücü bir üye diğerlerini aç bırakamaz.
- Geri alma principal başına çalışır. Her istemcinin eylem günlüğü yalnızca kendi principal’ının yaptığı değişiklikleri kaydeder. Kendi bilet düzenlemenizi ⌘Z ile geri alabilirsiniz; bir ekip arkadaşınızınkini geri alamazsınız — siz onu gördüğünüzde kalıcı hat onu çoktan çözümlemiştir (aşağıya bakın).
Erişim sınırı üyeliktir — eşleme anahtarı değil
Bölüm başlığı “Erişim sınırı üyeliktir — eşleme anahtarı değil”İki ayrı kimlik bilgisi iki ayrı soruyu yanıtlar. Eşleme anahtarı (bkz. Uzaktan kontrol ve mobil) bir cihazın sunucudaki kimliğini doğrular. Üyelik ise o cihazın kullanıcısına bir çalışma alanı içinde işlem yapma yetkisi verir. Kullanıcısının bir çalışma alanında üyeliği olmayan eşlenmiş bir cihaz, o alanı ne okuyabilir ne de değiştirebilir.
Üyelik, (çalışma alanı, kullanıcı) başına tek bir satırdır ve o çalışma alanının kendi veritabanı dosyasında saklanır; böylece “bu çalışma alanında kim var?” sıradan bir kapsamlı okumadır, tersi soru olan “hangi çalışma alanlarındayım?” ise zorunlu olarak dosyaları kapsar ve izin verilen birkaç çalışma alanları arası fan-out’tan biridir. Çalışma alanı seçicisinin, herhangi bir çalışma alanı seçilmeden önce çalıştırdığı şey budur.
Her satır, beş düzeyli ve rütbe sırasına göre dizilmiş bir merdivenden bir rol taşır:
| Rol | Yapabilecekleri |
|---|---|
owner |
Çalışma alanı silme dahil tam kontrol; her çalışma alanında tam olarak bir tane |
admin |
Üyeleri, davetleri, ayarları ve yıkıcı işlemleri yönetir |
member |
Günlük okuma-yazma: mesajlar, biletler, ajan çalıştırmaları |
viewer |
Çalışma alanı genelinde salt okunur; secret hariç tutma glob’ları, kod içeren yüzeylerde eşleşen yolları gizler |
guest |
Merdivenin en alt sırasında, viewer ile aynı salt okunur taban |
Her erişim kararı “çağıranın rolü en az X mi?” sorusuna indirgenir. Taban, işlem
açıkça bir taban bildirmediği sürece işlemin türünden türetilir: okuma guest
gerektirir, değişiklik member gerektirir, yıkıcı bir işlem admin gerektirir.
Aşağıdaki depo başına izinlerin ötesinde nesne başına ACL’ler bilinçli olarak
kapsam dışıdır.
Davetler, üyeliğin verilme yoludur ve Ayarlar → Çalışma alanı →
Üyeler’den yapılır. Bir admin, varsayılan olarak yedi gün sonra süresi dolan tek
kullanımlık bir kod (bağlantı ya da QR olarak) üretir; sunucu yalnızca kodun
SHA-256 karmasını saklar ve kodun kendisi tam olarak bir kez gösterilir. Kodu
kullanmak, kullanıcıyı JIT ile sağlar, üyeliği davetin rolüyle kaydeder (asla
owner değil — sahiplik açıkça devredilir, davetle asla verilmez) ve cihaz
eşleştirmeye devreder. Eşleştirmeden sonra üretilen cihaz kimlik bilgileri de
30 günle sınırlıdır; yani bir eşleştirme kalıcı bir anahtar değildir.
Depo izinleri üyeliğin altında yer alır. Sunucu tam checkout’ları tuttuğu
için, tek başına çalışma alanı üyeliği kod barındırıcının yetkilerini asla
aşmamalıdır: kod içeren her yüzey — dosyalar, diff’ler, PR incelemesi, kod
arama — üyenin o depodaki iznini denetler. İzinler (çalışma alanı, kullanıcı,
depo) başına tanımlanır ve none → read → review → write biçiminde
sıralanır; burada write, depoya yazan ajan çalıştırmalarını yürütmek anlamına
gelir. Satırın bulunmaması none demektir; sahipler ve admin’ler bağlı her
depoda örtük olarak write sahibidir ve hiç satır taşımaz.
İşbirliği durumunun iki hattı
Bölüm başlığı “İşbirliği durumunun iki hattı”Control Center paylaşılan durumu, zıt kalıcılık kurallarına sahip iki hatta böler; çünkü bu iki durum türü zıt biçimlerde bozulur.
Geçici varlık hattı
Bölüm başlığı “Geçici varlık hattı”Varlık — kim çevrimiçi, nerede, ne yazıyor, bir ajan şu anda ne yapıyor —
bayatladığı anda değersizdir. Kalıcı olsaydı, her yeniden bağlanma “veritabanı
Sam’in bu bileti düzenlediğini söylüyor” ifadesini gerçeklikle uzlaştırmak
zorunda kalırdı. Bu yüzden varlık hiçbir zaman veritabanına yazılmaz.
Sunucudaki bellekte çalışan bir varlık merkezinde yaşar: istemciler
presence.update ile yayınlar, eşler presence.watch ile abone olur ve
kayıtlar üç kaçırılan kalp atışından sonra otomatik olarak sona erer (kalp
atışları her 10 saniyede bir çalışır; merkez her 5 saniyede bir süpürür).
Uzlaştırılacak bir şey yoktur — yalnızca zaman aşımına bırakılacak bir şey.
Hattı güvenilir kılan iki özellik vardır:
- Kimlik istemci argümanlarından değil, oturumdan gelir. Sunucu, bağlantının
kimliği doğrulanmış cihazını bir kullanıcı kimliğiyle eşler; bir istemci
yalnızca kendi varlığını güncelleyebilir, böylece kimse başka bir katılımcının
durumunu veya konumunu taklit edemez. Açık bir
offlinegüncellemesi (bağlantı kesme veya görünmezlik anahtarı) kaydı hemen kaldırır. - Katılımcı listesi sunucu merkezlidir. Eşler varlığı asla doğrudan paylaşmaz; böylece her katılımcı, topoloji ne olursa olsun aynı listeyi görür. Ajanların istemcisi yoktur; bu yüzden sunucu onların kayıtlarını canlı çalıştırma durumundan sentezler — düşünüyor, çalışıyor, bir onay kapısında engellendi, bitti — ve bir ajanın durumunu ve konumunu tek bir temsili çalıştırma belirler; böylece eşzamanlı çalıştırmalar listeyi dalgalandırmaz.
Fan-out, tüketiciye göre katmanlıdır: masaüstü ve web tam katmanda gider (100 ms’de en fazla bir liste yayını), telefon ise özet katmanda (500 ms’de bir); böylece imleç hızındaki güncellemeler PWA’yı eritemez.
Bir katılımcının konumu — şu anda nerede olduğu, esere kadar — kapalı bir
birleşimdir: Space, File (depo + yol + isteğe bağlı satır), Pr, Ticket,
PlanNode. Her konumun atlanacak bir yeri yoktur: dosya görüntüleyici rotası
olmadığından bir File konumu, hedef yerine etiket olarak görüntülenir. Hat
ayrıca yumuşak iddialar taşır (“Sam bu bileti düzenliyor”, “bir ajan bu
çalışma ağacını tutuyor”): çakışma görünürlüğü, kilitler değil. Bilinmeyen
konum türleri null olarak ayrıştırılır; böylece eski bir istemci anlamadığı şeyi
görüntülemez.
Kalıcı paylaşılan hat
Bölüm başlığı “Kalıcı paylaşılan hat”Ayakta kalması gereken kayıtlar — biletler, paylaşılan alan Notes belgesi, mesajlar — ters yolu izler: yetkili, sıralı ve kalıcı. Eşzamanlı düzenlemeler istemci saatlerine göre değil, sunucuya varış sırasına göre son yazan kazanır kuralıyla çözülür. Çözüm bilinçli olarak ince tanelidir: bilet düzenlemeleri sütun başınadır, yani aynı biletin farklı alanlarını düzenleyen iki kişi de kaydeder ve biri diğerinin üzerine yazmaz (iş akışı geçişleri bunun yerine iyimser kilitlemeyi korur); alan Notes belgesi tek bir sütundur, dolayısıyla belgenin tamamı LWW’dir ve varlık hattındaki yumuşak iddialar eşzamanlı düzenlemeyi kilitlenmek yerine görünür kılar. Bu bilinçli olarak bir CRDT değildir — ispat yükü CRDT’dedir ve varış sırasına dayalı LWW ile görünür iddialar gerçek işbirliği kalıplarını karşılar.
“Son yazan”, istemci saatini değil sunucuya varış sırasını ifade eder — saati kaymış bir dizüstü, kaybettiği bir düzenlemeyi kazanamaz. Kalıcı hattın arkasında eşitleme akışı durur: SQLite tetikleyicileri her değişikliği yazan işlemin içinde çalışma alanı başına bir değişiklik günlüğüne ekler ve değişikliğin kendisiyle aynı işlemde, çalışma alanı başına monoton bir sıra numarası ayırır. Bir sunucu servisi bu günlüğü sıra düzeninde sürümlenmiş delta çerçevelerine dönüştürerek takip eder. İstemciler tam anlık görüntülerden delta’lara doğru evrilir; sıradaki bir boşluk, çerçeveleri yanlış uygulamak yerine o veri deposunu anlık görüntü moduna düşürür.
Takip et, yönlendir, devral, geri ver
Bölüm başlığı “Takip et, yönlendir, devral, geri ver”Varlık hattı yalnızca bir katılımcı listesi değildir — işbirliği fiillerini yürütür:
- Takip modu. Bir katılımcıya tıklayın; istemciniz onun konumunu izler ve o gezinirken siz de onunla gezinirsiniz. Takip, “siz harekete geçene kadar” sürer: kendi isteğinizle gezinmeye başladığınız anda takip çözülür. Başka bir katılımcı, içinde bulunduğunuz bir alanı öne çıkarırken (sunum yaparken) kapatılabilir bir şerit bunu bildirir.
- Yönlendirme. Çalışan bir ajana gönderilen mesaj yönlendirme olarak kuyruğa alınır; ajan bir sonraki turuna devam etmeden önce onu yeniden okur; böylece bir çalıştırmayı durdurmadan uçuş ortasında düzeltebilirsiniz.
- Devralma. Bir konuşmanın kontrolünü üstlenmek, etkin her çalıştırmayı bir sonraki temiz tur sınırında duraklatır (güvenli sınırı olmayan bir Claude Code çalıştırması durdurulur); bu, tur başına bir git anlık görüntüsünün arkasında yapılır, böylece devralma geri alınabilir. Kalıcı bir işaretleyici, alana yeni gönderimleri engeller ve sunucu yeniden başlatıldığında da varlığını sürdürür — sunucu, bir insanın yarım kalmış düzenlemesinin üzerine asla otomatik olarak devam etmez. Çalışma ağacı başına tek etkin düzenleyici yumuşak bir iddiadır: ikinci bir devralma görünür olur ve reddedilir, sessizce birleştirilmez.
- Geri verme. Kontrolü geri vermek, çalışma ağacının yapılandırılmış bir diff özetini alana gönderir, bunu duraklatılmış çalıştırmalar için yönlendirme olarak kuyruğa alır, onları sürdürür ve işaretleyiciyi temizler.
Özerklik kadranı
Bölüm başlığı “Özerklik kadranı”Yönlendirme ve devralma, olaydan sonraki müdahalelerdir. Özerklik kadranı ise kalıcı ayardır: alan başına, ajan başına, alan başlığından ayarlanır ve bir ajan onay kapısına takılan bir eyleme ulaştığında ne olacağına karar verir.
| Düzey | Tel değeri | Onay kapısına düşen bir araç çağrısındaki etkisi |
|---|---|---|
| Yalnızca öner | proposeOnly |
Doğrudan reddedilir; ajana iletmesi söylenen bir gerekçeyle birlikte — eylemi tanımlayabilir ama gerçekleştiremez |
| Onayla hareket et | actWithApproval |
Hataya kapalı onay kapısı: bağlı bir operatöre tek bir onay gösterilir ve onaylayan yoksa reddedilir |
| Serbest hareket et | actFreely |
Önceden onaylanmıştır; ancak sert bir deny koruma kuralının geçerli olduğu durumlar hariç — reddetme kuralı her zaman kazanır |
| (ayarlanmamış) | null |
Onayla hareket et ile aynıdır: sunucunun varsayılanı |
İki şey, her iki yönde de kadranın dışında kalır. Bir modun kendi çıktı fiili
sabitlenmiştir ve kadran ne derse desin asla reddedilemez — orkestrasyon modu
bir zamanlar, bir ön ayar o fiilin bildirdiği etki sınıfını reddettiği için tek
teslimatını yapısal olarak üretemiyordu. Ve eylem korumalarından gelen sert bir
deny, actFreely ile geçersiz kılınamaz.
Tek başına kullanımda sıfır gerileme
Bölüm başlığı “Tek başına kullanımda sıfır gerileme”Bunların hepsi eklemelidir. Tek başına çalışan bir operatörün iş akışı değişmez: tek bir insan ve hiç ajan yokken varlık merkezinin yayınlayacağı bir şey yoktur; bu yüzden hat ilk anlık görüntüsünü yayınlar ve ardından sıfır trafikte bekler; LWW ve eşitleme mekanizması her zaman olduğu gibi aynı tek yazarlı yoldur; ve eşleme anahtarı her zaman olduğu cihaz kimlik bilgisi olarak kalır. Üyelik zaten erişim sınırıdır — tek bir insanla tek bir owner satırı vardır ve hiçbir liste arayüz öğesi görünmez.
İlgili kavramlar
Bölüm başlığı “İlgili kavramlar”- Çalışma alanları ve yalıtım: üyeliğin uyguladığı sınır
- Uzaktan kontrol ve mobil: kimliğin eşleme anahtarı ve cihaz kimlik bilgisi tarafı
- Ajan modeli: principal birleşiminin ajan yarısı
- Ajan gönderim yaşam döngüsü: yönlendirme ve devralmanın duraklatıp sürdürdüğü çalıştırmalar
- Korumalar: özerklik kadranının birlikte çalıştığı etki sınıfı politikası
- Alan olayları: canlı güncellemelerin üzerinden geçtiği veriyolu