Mert Özen Her Satırda Daha İleri
Yapay Zeka GitHub Copilot — #10

Ekipte ve Kurumda Copilot: Policy'ler, Content Exclusion, Model Erişimi, Kullanım Metrikleri, Maliyet ve Claude Code/Codex ile Karşılaştırma

Mert Özen 15 Kas 2026 13 dk 5 görüntülenme
Ekipte ve Kurumda Copilot: Policy'ler, Content Exclusion, Model Erişimi, Kullanım Metrikleri, Maliyet ve Claude Code/Codex ile Karşılaştırma

Kurumda Copilot maliyetini en çok model seçimi ve her push'ta code review belirler: sekiz kişilik bir Business ekibinde Sonnet oturumları ve her push'ta Balanced review ortak havuzu ayın dokuzda birinde bitiriyor, kredinin üçte ikisi review'dan geliyor. Policy katmanları, content exclusion, managed settings ve MCP allowlist, metrikler, audit log, bütçeler ve Claude Code/Codex karşılaştırması.

Sürüm notu: Bu yazıdaki script'ler .NET 10 ile çalıştırılmış; content exclusion YAML (girintiye dayalı bir yapılandırma biçimi) dosyaları yq 4.54 ile, managed-settings.json jq 1.8 ile ayrıştırılarak denetlenmiştir. Policy'ler, content exclusion, enterprise managed settings, kullanım metrikleri, audit log ve bütçe kontrolleri 15 Kasım 2026'da docs.github.com'dan alınmıştır; bu yazıda bir organization ya da enterprise hesabında ayar yapılmadı. Maliyet tablosu, ilk yazıdaki oturum hesabının ve dokümandaki review ortalamalarının üzerine kurulmuş bir tahmindir.

Önce Tahmin Et

Sitedeki serilerin ortak örnek uygulaması Bookstore (bir online kitapçı) ekibinde sekiz geliştirici Copilot Business kullanıyor. Her biri günde dört agent oturumu açıyor (Claude Sonnet 5.5, otuz adım), ayda on iki pull request açıyor ve repoda sekizinci yazıdaki ruleset ile her push'ta Balanced code review çalışıyor.

Tahminin ne? Ortak havuzdaki 15.200 AI Credits ayın kaçta biri eder? Aylık kredinin büyük kısmını agent oturumları mı harcar, code review mu? Ekstra fatura kabaca ne kadar olur? Yazının ortasındaki tabloda üç sorunun da cevabı var.

Kurumda Copilot'un Katmanları

Copilot Business ve Enterprise'da ayarlar üç katmanda duruyor: enterprise, organization ve repository. Policy'lerin çoğunu enterprise açıyor, kapatıyor ya da "Let organizations decide" ile organization'a bırakıyor; enterprise bir şeyi seçtiyse organization onu değiştiremiyor. Policy'ler lisansı nereden aldıysan oranın kuralı: bir kullanıcı aynı enterprise'daki iki organization'dan lisans alıyorsa genelde en az kısıtlayıcı ayar, farklı enterprise'lardan alıyorsa neredeyse her zaman en kısıtlayıcı ayar geçerli. Bir kullanıcı Business ya da Enterprise planına eklenince kişisel planı iptal ediliyor; kişisel ayarlarıyla kurumun ayarları bu yüzden çakışmıyor.

Policy'ler IDE'lerde, GitHub web sitesinde ve Copilot CLI'da, yani kullanıcının Copilot'a giriş yaptığı her yüzeyde uygulanabiliyor; ama her policy her yüzeyde değil. GitHub'ın "Supported surfaces for GitHub Copilot policies" tablosu bunu policy policy listeliyor. Yeni çıkan GA (genel kullanıma açık) özellik ve modellerin varsayılan olarak açık mı kapalı mı geleceğini de iki ayrı policy belirliyor.

Policy'ler: Özellikler, Modeller ve Preview'lar

Organization ayarlarında Copilot altında iki sayfa var. Policies sayfası özelliklerin ve gizlilik ayarlarının, Models sayfası temel modellerin ötesindeki modellerin erişimini yönetiyor; ikinci sayfadaki modeller ek maliyet getirebiliyor. Bu seride değindiğimiz policy'lerin bir kısmı:

  • MCP (Model Context Protocol; agent'ın dış araçlara bağlandığı protokol) için MCP servers in Copilot: server'ların Copilot istemcilerinde hiç çalışıp çalışamayacağı. GitHub bunu açık tutup izinli server'ları bir allowlist ile sınırlamayı öneriyor.
  • Copilot code review ve lisansı olmayan üyeler için code review: altıncı ve sekizinci yazılardaki review'u açan ve Business ile Enterprise'da lisanssız üyelere de açabilen iki ayar.
  • Allow use of Copilot CLI billed to the organization: dokuzuncu yazıdaki GITHUB_TOKEN ile çalışan CLI workflow'u için gerekli.
  • Editor preview features, Copilot can search the web, Copilot Memory, Suggestions matching public code ve kendi model sağlayıcısını bağlamaya izin veren Configure custom models.

Models sayfası hakkında bir not: sekizinci yazıda gördüğümüz gibi code review model seçtirmiyor ve dokümana göre Models sayfasında açık olmayan modelleri de kullanabiliyor; o sayfa yalnız Copilot Chat'i yönetiyor. Business ve Enterprise'da "Opt in to preview features" açılırsa kullanıcılar henüz GA olmamış özellikleri deneyebiliyor; preview özellikler değişebilir ya da kaldırılabilir. Bu seride geçen Max review effort, ACP (Agent Client Protocol; editörlerin agent'larla konuştuğu protokol) ve JetBrains'teki custom agent'lar 15 Kasım 2026 itibarıyla preview.

Content Exclusion

Content exclusion, belirtilen dosyaları Copilot'tan saklıyor: o dosyalarda inline suggestion çalışmıyor, içerikleri başka dosyalardaki önerilere ve cevaplara girmiyor ve code review onları review etmiyor. Visual Studio, Visual Studio Code (VS Code) ve JetBrains IDE'lerinin chat'i ve agent'ı, Copilot CLI, Copilot in the cloud ve code review bunu destekliyor; Xcode ve Eclipse'te yalnız inline suggestion tarafı var. Repository yöneticileri kendi reposu için, organization sahipleri kendi lisansladıkları kullanıcılar için kural yazabiliyor. Bookstore için iki taslak hazırladık:

# Repoda Settings > Copilot > Content exclusion, "Paths to exclude in this repository" kutusuna yapıştırılır.
# Content exclusion hassas içerik içindir, context boyutu için değil (onun için search.exclude).
- "/.env"
- "*.pfx"
- "appsettings.Production.json"
# Hata ayıklamak için alınan anonim sipariş export'larında hâlâ gerçek adresler var.
- "/data/exports/**"
# Organization'da Settings > Copilot > Content exclusion, "Repositories and paths to exclude" kutusuna yapıştırılır.
# "*" Git dışındaki dosyaları da kapsar, örneğin her geliştiricinin user-secrets deposu. Pattern'ler büyük/küçük harf duyarsız.
"*":
  - "**/.env"
  - "**/usersecrets/**/secrets.json"
bookstore:
  - "/data/exports/**"

Organization kuralındaki "*" anahtarı Git dışındaki dosyaları da kapsıyor. Bookstore'un connection string'i README'deki gibi user-secrets'ta, yani reponun dışında, her geliştiricinin kullanıcı profilinde duruyor; repository düzeyindeki bir kural onu göremez. Pattern'ler fnmatch biçiminde ve büyük/küçük harf duyarsız; ilk taslağımızda Windows'taki UserSecrets için ayrı bir satır yazmıştık, dokümanı yeniden okuyunca sildik. Dosyaları YAML olarak ayrıştırıp kontrol ettik, ama bir organization'a yapıştırıp sonucunu denemedik.

Sınırlarını bilmek şart. Doküman content exclusion'ın bir dosya sistemi güvenlik sınırı olmadığını açıkça söylüyor: GitHub'ın kontrol ettiği araçlar için bir korkuluk; üçüncü taraf MCP server'ları ve istemciler buna uymak zorunda değil. Agent'larda Copilot tool'larıyla erişimi engelliyor ve komutlardaki tanınabilir dosya yollarını kontrol ediyor, ama dolaylı erişimi yakalamayabiliyor. IDE'nin sağladığı tip bilgisi gibi dolaylı içerik yine modele gidebiliyor, symlink'ler ve uzak dosya sistemleri kapsam dışında, bir değişikliğin IDE'lere ulaşması 30 dakikayı bulabiliyor. Ve üçüncü yazıdaki search.exclude'un aksine bu bir context boyutu aracı değil: üretilmiş dosyaları exclusion'a koyarsan code review da onları görmez.

İstemciyi Yönetmek: Managed Settings

Policy'ler "hangi özellik açık" sorusunu cevaplıyor. İstemcinin nasıl davranacağını (hangi komutların reddedileceği, hangi MCP server'larının çalışabileceği, sandbox'ın zorunlu olup olmadığı) ise enterprise managed settings belirliyor. managed-settings.json enterprise'ın .github-private reposunda copilot/ klasörüne konuyor ve Copilot CLI, VS Code, GitHub Copilot app, Copilot in the cloud ve JetBrains IDE'lerine dağıtılıyor; her istemci her anahtarı desteklemiyor. Aynı dosya MDM (mobil cihaz yönetimi) ile ya da işletim sistemindeki sabit bir konuma dosya olarak da dağıtılabiliyor; kaynaklar çakışırsa önce MDM, sonra server, en son dosya kazanıyor. Bookstore organization'ı için bir taslak:

{
  "model": "auto",
  "permissions": {
    "disableBypassPermissionsMode": "disable",
    "deny": [
      "Shell(dotnet ef database update *)",
      "Shell(git push --force *)",
      "Read(~/.ssh/**)",
      "Read(~/.microsoft/usersecrets/**)",
      "Read(~/AppData/Roaming/Microsoft/UserSecrets/**)"
    ],
    "ask": [
      "Shell(git push *)"
    ]
  },
  "allowedMcpServers": [
    { "serverUrl": "https://api.githubcopilot.com/*" },
    { "serverCommand": ["dotnet", "run", "--project", "src/Bookstore.Mcp", "--no-build"] },
    { "serverCommand": ["npx", "-y", "@playwright/mcp@0.0.85", "--isolated", "--allowed-origins", "http://localhost:4200"] }
  ],
  "sandbox": {
    "enabled": true,
    "allowBypass": false
  }
}

disableBypassPermissionsMode değeri "disable" olunca CLI'daki --yolo ve --allow-all başlangıçta etkisiz kalıyor, VS Code'da global otomatik onay kapanıyor; bu anahtarda en kısıtlayıcı katman kazanıyor. deny kuralları her kaynaktan geçerli ve bypass moduyla aşılamıyor; altıncı yazıdaki hook'un yaptığını burada kurum düzeyinde yapıyoruz. allowedMcpServers ise yerel server'ları komut ve argümanlarla birebir eşleştiriyor; joker karakter yok. Bunun pratik sonucunu görmek için dördüncü yazıdaki kontrol script'ine, .mcp.json'daki her server'ın allowlist'te olup olmadığını soran bir kural ekledik:

$ dotnet run eng/check-instructions.cs
...
.mcp.json: bookstore -> in the managed MCP allowlist
.mcp.json: playwright -> in the managed MCP allowlist
Always loaded (AGENTS.md + copilot-instructions.md): 2,334 characters, budget 8,000
OK

# .mcp.json'da @playwright/mcp@0.0.85, 0.0.86 yapıldıktan sonra
$ dotnet run eng/check-instructions.cs
...
.mcp.json: playwright -> NOT in the managed MCP allowlist
Always loaded (AGENTS.md + copilot-instructions.md): 2,334 characters, budget 8,000
error: .mcp.json: server 'playwright' (npx -y @playwright/mcp@0.0.86 --isolated --allowed-origins http://localhost:4200) is not in eng/copilot/managed-settings.json allowedMcpServers
1 error(s)

Playwright'ın sürümünü bir artırmak, allowlist'i de güncellemeyi gerektiriyor; aksi hâlde server kurumdaki herkes için engellenir. Bu kontrolü CI'da çalıştırmak, sürüm güncellemesini yapan pull request'in allowlist değişikliğini de getirmesini sağlıyor.

Kullanım Metrikleri ve Audit Log

Copilot'un kullanım metrikleri üç dashboard'da (kullanım, kod üretimi, etki) ve enterprise ile organization düzeyinde API'ler ve NDJSON (her satırı bir JSON kaydı olan dosya) export'larıyla geliyor. Ölçtükleri: aktif kullanıcı, hangi özelliklerin kullanıldığı, kabul oranı, önerilen ve eklenen satırlar, pull request'lerin açılma ve birleşme süreleri. Doküman bu sayıları verimlilik ölçüsü olarak okumamayı açıkça söylüyor: tek bir sayıya değil desenlere bakmak ve geliştirici geri bildirimiyle birleştirmek gerekiyor. Etki dashboard'undaki karşılaştırmalar da GitHub'ın kendi ifadesiyle nedensellik değil ilişki gösteriyor. Kabul oranının neden yanıltıcı olduğunu, hangi ölçümlerin daha anlamlı olduğunu AI Destekli Geliştirme serisinin altıncı yazısında ayrıntılı anlattık.

İki pratik not: bir günün verisi o gün kapandıktan sonra en geç iki tam UTC (eşgüdümlü evrensel saat) günü içinde geliyor ve aynı kullanıcı birden fazla organization'da olabildiği için organization toplamlarını toplayıp enterprise toplamı elde etmemek gerekiyor. Metrikler aktiviteyi ölçüyor, lisans atamasını değil.

Agent'ların ne yaptığını görmek için audit log var. Enterprise audit log'unda actor:Copilot filtresi son 180 günün agent olaylarını gösteriyor; olaylarda actor_is_agent ve olayı üreten oturumu gösteren agent_session_id alanları, işi başlatan kişi de user alanında. Yedinci yazıdaki cloud agent pull request'inin hangi oturumdan geldiğini buradan izleyebilirsin.

AI Credits Bütçesi

Business ve Enterprise'da her lisans ortak bir havuza kredi ekliyor: Business lisans başına aylık 1.900, Enterprise 3.900 AI Credits; havuz bitince ölçülen (metered) kullanım başlıyor. Bütçe kontrolleri dört düzeyde. Kullanıcı düzeyindeki bütçe bir kişinin bir fatura döneminde harcayabileceği krediyi her zaman sert biçimde kesiyor; 0 dolarlık bir bütçe kredi harcayan özellikleri hemen engelliyor. Cost center (maliyet merkezi) ve organization bütçeleri havuz bittikten sonraki ölçülen harcamayı sınırlıyor; cost center için included usage controls ise bir ekibin havuzdan kendi lisanslarının getirdiğinden fazlasını çekmesini engelliyor. Önce Tahmin Et'in sayılarını bir script'le hesapladık:

#:property PublishAot=false
// Bir ekibin aylık AI Credits'i ile Copilot Business ya da Enterprise'ın ortak havuzu.
// Oturum kredisi: eng/ai-credits.cs (30 adımlık agent oturumu). Review kredisi: docs.github.com'daki
// review başına ortalama (Lite 0.25, Balanced 1.50, Max 10 USD), 2026-11-15. 1 AI credit = 0.01 USD.
// Run: dotnet run eng/team-credits.cs -- [developers] [business|enterprise]
using System.Globalization;

CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

int developers = args.Length > 0 ? int.Parse(args[0]) : 8;
bool enterprise = args.Length > 1 && args[1] == "enterprise";
int poolPerSeat = enterprise ? 3_900 : 1_900;
decimal seatPrice = enterprise ? 39m : 19m;
const int WorkingDays = 21;
const int SessionsPerDay = 4;
const int PullRequestsPerMonth = 12;   // geliştirici başına
const int PushesPerPullRequest = 6;    // "Review new pushes" açıkken pull request başına review
int pool = developers * poolPerSeat;

Scenario[] scenarios =
[
    new("Luna sessions, Lite review once", SessionCredits: 4, ReviewCredits: 25, ReviewsPerPullRequest: 1),
    new("Sonnet sessions, Balanced review once", 64, 150, 1),
    new("Sonnet sessions, Balanced on every push", 64, 150, PushesPerPullRequest),
    new("Opus sessions, Max on every push", 128, 1_000, PushesPerPullRequest),
];

Console.WriteLine($"{developers} developers, Copilot {(enterprise ? "Enterprise" : "Business")}: seats {developers * seatPrice:N0} USD, pool {pool:N0} AI credits per month");
Console.WriteLine($"{"Scenario",-42}{"Sessions",10}{"Reviews",10}{"Total",10}{"Pool",9}{"Extra USD",11}");
foreach (Scenario s in scenarios)
{
    long sessions = (long)s.SessionCredits * SessionsPerDay * WorkingDays * developers;
    long reviews = (long)s.ReviewCredits * s.ReviewsPerPullRequest * PullRequestsPerMonth * developers;
    long total = sessions + reviews;
    decimal extra = Math.Max(0, total - pool) / 100m;
    Console.WriteLine($"{s.Name,-42}{sessions,10:N0}{reviews,10:N0}{total,10:N0}{(decimal)total / pool,9:P0}{extra,11:N2}");
}
Console.WriteLine("GitHub Actions minutes for code review and the cloud agent are not included.");

record Scenario(string Name, int SessionCredits, int ReviewCredits, int ReviewsPerPullRequest);
$ dotnet run eng/team-credits.cs
8 developers, Copilot Business: seats 152 USD, pool 15,200 AI credits per month
Scenario                                    Sessions   Reviews     Total     Pool  Extra USD
Luna sessions, Lite review once                2,688     2,400     5,088     33 %       0.00
Sonnet sessions, Balanced review once         43,008    14,400    57,408    378 %     422.08
Sonnet sessions, Balanced on every push       43,008    86,400   129,408    851 %   1,142.08
Opus sessions, Max on every push              86,016   576,000   662,016  4,355 %   6,468.16
GitHub Actions minutes for code review and the cloud agent are not included.

Cevap üçüncü satırda: ortak havuz ayın ancak dokuzda birine yetiyor, 129.408 kredinin 86.400'ü code review'dan geliyor ve ekstra fatura ayda 1.142 dolar civarında; sekiz koltuğun 152 dolarlık bedelinin yedi katından fazla. Aynı ekip review'u pull request başına bir kez çalıştırırsa ekstra 422 dolara iniyor. Hesap bir tahmin: oturum maliyeti ilk yazıdaki otuz adımlık modele, review maliyeti dokümandaki ortalamalara dayanıyor ve GitHub Actions dakikaları dahil değil. Ama hangi ayarın maliyeti belirlediğini doğru gösteriyor: model seçimi ve Review new pushes.

Copilot mı, Claude Code mu, Codex mi

Bu seri Claude Code ve OpenAI Codex serileriyle aynı Bookstore görevlerini kullandı. Karar için kısa bir tablo; her aracın güncel fiyatı ve ayrıntısı kendi serisinde:

ÖlçütGitHub CopilotClaude CodeOpenAI Codex
IDEVisual Studio, VS Code, JetBrains, Xcode, Eclipse; inline suggestion dahilVS Code ve JetBrains eklentileri; terminal öncelikliIDE eklentisi ve masaüstü uygulaması
GitHub entegrasyonuIssue'dan pull request'e cloud agent, code review, ruleset, Agent MergeGitHub Actions ve GitHub app üzerindenCodex Cloud ve GitHub'da pull request review
Terminal agentcopilot, copilot -p, ACPclaude, claude -pcodex, codex exec
Maliyet modeliKoltuk ücreti ve AI Credits; birden fazla sağlayıcının modelleri tek faturadaClaude abonelik planları ya da API kullanımıChatGPT planları ya da API kullanımı
Kurum yönetimiPolicy'ler, content exclusion, managed settings, metrikler, audit logKurum planları ve yönetilen ayarlarChatGPT Business ve Enterprise yönetimi

Bookstore gibi .NET ve Angular kodu GitHub'da duran, Visual Studio ve VS Code kullanan bir ekip için Copilot'un en güçlü tarafı GitHub'a ve IDE'lere zaten gömülü olması: aynı lisansla inline suggestion, agent, cloud agent ve code review. Terminalde uzun agent oturumlarını öne alan ekipler Claude Code ve Codex'i de denemeli; dördüncü yazıdaki AGENTS.md kararı, araçlar arasında geçişi talimat dosyalarını yeniden yazmadan mümkün kılıyor.

Üretimde Dikkat

Policy'yi kimin değiştirdiğini izle. Doküman policy kayması (policy drift) riskine karşı policy ayarına erişen kişileri düzenli gözden geçirmeyi ve değişiklikleri audit log'dan izlemeyi öneriyor.

Kullanıcı bütçesini ilk günden koy. Havuz bütün organization'ın; tek bir kullanıcının Max review'lu ya da uzun agent oturumlu bir haftası herkesin kredisini bitirebilir.

Content exclusion ve managed settings'i güvenlik katmanı sanma. İkisi de GitHub'ın istemcileri için; asıl sınır secret'ların repoda ve geliştirici makinesinde hiç bulunmaması, erişim kontrolü ve secret taraması.

Preview özellikleri production iş akışına bağlamadan önce GA olmalarını bekle ya da geri dönüş planı yaz.

Sık Düşülen Tuzaklar

Kişisel hesapla kurumsal kodda çalışmak. Policy'ler ve organization'ın content exclusion kuralları lisansı organization'dan alan kullanıcılara uygulanıyor; kişisel bir planla aynı repoda çalışan biri bu kuralların bir kısmının dışında kalabilir. Repository ayarlarındaki "Block reviews requested with an external Copilot license" seçeneği code review için bu kapıyı kapatıyor.

Politikayı yazıp eğitimi atlamak. Ekip disableBypassPermissionsMode'un neden açık olduğunu, hangi komutların neden reddedildiğini bilmezse kuralları aşmanın yolunu arar; bu serideki talimat, skill ve hook dosyalarını ekibe göstermek policy kadar önemli.

Kabul oranını verimlilik saymak. Yüksek kabul oranı, ikinci yazıdaki gibi okunmadan Tab'lanan öneriler de demek olabilir.

Review new pushes'ı her repoda varsayılan açmak. Maliyet tablosundaki en büyük kalem bu ayar.

MCP allowlist'ini sürüm güncellemelerinden ayrı yönetmek. Birebir eşleşme yüzünden her sürüm artışı allowlist değişikliği istiyor.

Küçük Bir Deneme

★☆☆ eng/team-credits.cs'i kendi ekibinin sayılarıyla çalıştır: geliştirici sayısı, günlük oturum, aylık pull request ve push. Havuz ayın kaçıncı gününde bitiyor?

★★☆ Bookstore'un content exclusion taslağına, kendi reponda git-ignore edilmiş ama makinende duran hassas dosyaları ekle. Hangileri repository düzeyinde, hangileri organization'ın "*" kuralında olmalı?

★★★ managed-settings.json taslağına, dokuzuncu yazıdaki shell(gh pr) sorununu kapatan deny ve ask kuralları ekle (gh pr merge ve gh pr close için onay iste) ve kontrol script'ine bu kuralların sözdizimini denetleyen bir adım yaz.

Seri burada bitiyor. On yazıda Copilot'u planlar ve AI Credits'ten başlayıp inline suggestion, Chat ve context, talimat dosyaları, IDE agent'ı, MCP, skill, custom agent ve hook'lar, coding agent, code review ve CLI üzerinden kurum düzeyine kadar aynı Bookstore reposunda kullandık. Her adımda ortak bir sonuç çıktı: Copilot'un yazdığı ya da onayladığı şeyi diff'ten, testten ve deterministik kontrollerden doğrulamak, aracın ne kadar iyi olduğundan bağımsız olarak ekibin sorumluluğu. Araçtan bağımsız pratik için AI Destekli Geliştirme serisi, aynı görevlerin Claude Code ve Codex'teki karşılıkları için de o iki seri bir sonraki adım.