Ajan ekibine gerçek iş yaptırmak: GitHub'dan Kaptan'a
Paperclip ekibi GitHub'daki issue'ları alsın, kodu yazsın, PR'ı incelesin, birleştirsin ve sonucu Kaptan'da pod olarak yayına alsın — siz yalnızca issue açın.
Paperclip kurulumu tek bir ajanla bitiyordu. Bu sayfa bir adım öteye geçiyor: ekip GitHub'ı kendisi izliyor, issue'ları triyaj ediyor, kodu yazıyor, kendi PR'ını inceleyip birleştiriyor ve sonucu Gao Kaptan'da bir pod olarak yayına alıyor. Sizin tek işiniz issue açmak.
Aşağıdakilerin hepsi çalışan bir kurulumdan alındı; ekran görüntüleri ve alıntılar gerçek.
Ortaya çıkan düzen
Şirketi siz kurmuyorsunuz. CEO'ya bir hedef verdiğinizde kendi ekibini kendisi işe alıyor — bu kurulumda CTO ve QA'yı o yarattı:

Komuta zincirine saygı gösterin. CEO yalnız üst düzey yöneticiyle konuşur. Bir uygulayıcıyı (Coder gibi) doğrudan CEO'ya bağlarsanız CEO'nun kurduğu yapıyı bozarsınız; doğrusu CEO → CTO → (Coder, QA). Bu kurulumda tam olarak o hata yapıldı ve düzeltildi.
Bir işi CEO'ya verirseniz kendisi yapmaz — delege eder. Tek ajanla kurulmuş bir şirkette CEO işi yapacak kimse bulamayıp kendine geliştirici işe almaya çalışır. Doğru davranış budur, ama beklemediyseniz zaman kaybı gibi görünür.
Kurulum
Projeyi depoya bağlayın
Projects → Add Project: proje adı, Repo URL ve Local folder. Paperclip depoyu
git_repo tipinde bir çalışma alanı olarak tanır, böylece görevler hangi kod tabanında
çalışacaklarını bilir.
Depoyu ortak bir yere klonlayın (/workspace/<proje>), ajanın kendi dizinine değil.
Kimlikleri ajan yapılandırmasına koyun
Her ajanın adapterConfig.env alanına yazılır ve koşuda sürece geçer:
| Anahtar | Ne için |
|---|---|
GH_TOKEN | gh CLI — PR/issue okuma, yorum, merge |
KAPTAN_API / KAPTAN_USER / KAPTAN_PASS | Gao Kaptan'da pod açmak |
Git push için kimliği komut satırına değil ~/.git-credentials dosyasına koyun
(git config --global credential.helper store); böylece jeton komutlarda ve remote
URL'de görünmez.
gh auth login --with-token read:org yetkisi ister; yalnızca repo yetkili bir jetonla
başarısız olur. GH_TOKEN ortam değişkeni ise repo ile sorunsuz çalışır — kalıcı giriş
yerine onu kullanın.
Nöbeti kurun
Routines → Create routine: sorumlu ajan CTO, proje bağlı. Oluşturduktan sonra Paperclip
sizi doğrudan tetikleyici ekranına götürür — Custom (cron) seçip */15 * * * * yazın.

Talimatı iki bölüm hâlinde yazın. A — Açık PR'lar: gh pr list, gh pr diff ile
değişikliği gerçekten oku, iyiyse yorum yazıp gh pr merge --squash, sorunluysa yorum
bırakıp Coder'a düzeltme görevi aç (kendisi düzeltmesin). B — Açık issue'lar:
gh issue list, kod işi ise Coder'a görev aç ve issue'ya "alındı" notu düş; soru ise
cevapla ve kapat; belirsizse kapatma, netleştirici soru sor.
Issue bölümünü unutmayın. İlk kurulumda talimat yalnızca PR'ları kapsıyordu; asıl kullanışlı yarısı issue tarafı çıktı. Siz issue açıyorsunuz, gerisi kendiliğinden akıyor.
Akış — gerçek bir örnek
Panonun görsel olarak yenilenmesini isteyen bir issue açıldı. Sonrasına kimse dokunmadı:
-
CTO triyaj etti: "Alindi. Coder'a atandi (Paperclip KAP-12): yeni dal +
Closes #5ile PR acilacak." -
Coder kendi dalında yazdı, PR açtı.
-
CTO, QA'ya doğrulama görevi açtı — bu talimatta yoktu, kendi kararıydı.
-
CTO inceledi ve birleştirdi. Yorumu ezber değil, ölçüm:
"
py_compiletemiz, uçtan uca çalıştırıldı: 10/11 uç sağlıklı, JSONL 500 satır sınırına uyuyor,node --checkile JS doğrulandı, statik sunucuda açıldı." -
PR birleşince issue kendiliğinden kapandı (
Closes #5).

Ekibin ürettiği pano — Gao Kaptan'da kendi açtıkları pod'dan, relay üzerinden:

Gao Kaptan'a dağıtımı ekibe bırakmak
Ajana sabit jeton vermeyin. Gao Kaptan jetonları dakikalar içinde düşüyor; ajan işin ortasında 401 alıp takılır. Kullanıcı adı ve şifre verin, jetonu her seferinde kendisi alsın:
TOKEN=$(curl -sS -X POST "$KAPTAN_API/api/v1/auth/login" -H 'Content-Type: application/json' \
-d "{\"email_or_username\":\"$KAPTAN_USER\",\"password\":\"$KAPTAN_PASS\",\"device_info\":\"ajan\"}" \
| python3 -c 'import sys,json;print(json.load(sys.stdin)["data"]["access_token"])')Sonra "panoyu Gao Kaptan'da yayına al, adresini issue'ya yaz" demek yetiyor. Ekip pod'u açtı, doğruladı ve raporunu yazdı — çarptığı duvarlar dahil:
"İlk pod terminate edildi… K8s tarafında aynı adla bir pod halihazırda mevcut olduğu için (orphan, tenant listede görünmüyor ama create 409 dönüyor) aynı adla pod oluşturulamadı; bu yüzden
-v2adıyla oluşturuldu. Bağlantı ilk denemede 502 döndü, ~1 dakikada 200'e geldi (ingress ısınması). Doğrulandı:index.html200,durum.json200."
Bu rapordaki 409 gözlemi gerçek bir platform kusuru: silinen pod'un adı Kubernetes tarafında öksüz kalabiliyor — tenant listesinde görünmüyor ama aynı adla yeni pod açmak 409 dönüyor.
Ajanlara ne öğretmek gerekti
Her ajanın kalıcı bir talimat dosyası var:
~/.paperclip/instances/default/companies/<şirket>/agents/<ajan>/instructions/AGENTS.mdYolu ajanın adapterConfig.instructionsFilePath alanında görürsünüz. Oraya üç blok yazıldı:
1. Çalışma kuralları. Önce ölç sonra yama · tek değişken değiştir · ne yazdığını değil ne çıktığını kontrol et · durumların hepsini say · ölçtüğünü ve tahminini ayrı yaz.
2. Gao Kaptan el kitabı. Jetonun kısa ömürlü olduğu · pod env/files/command
alanlarının yerinde değiştirilemediği (düzeltme = yeniden oluşturma) · kotanın 10 pod
olduğu ve silmenin asenkron olduğu · access-token/regenerate ile erişim bağlantısının
nasıl kurulduğu · ilk açılışta 502'nin normal olduğu · wildcard DNS olmadığı için relay'in
tek yol olduğu · egress'in yalnızca 80/443 olduğu · inference'ın max_tokens olmadan 400
döndüğü.
3. Teşhis. Bir pod çalışmıyorsa sırayla: pod durumu → Kubernetes olayları → konteyner
günlüğü → içeride exec. Belirtiden sebebe bir tablo: ImagePullBackOff ne demek,
no such file or directory neden olur, boş log + running ne anlama gelir.
Bunlar yazıldıktan sonra ekip, yayındaki pod'un bozulduğu bir işi baştan sona kendi çözdü:
teşhis etti, fazla pod'u sildi, dosyaların main ile aynı olduğunu md5 ile doğruladı.
Ekibi güçlendirmek
Ekip kurulduktan sonra yetenekleri iki yerden büyür.
Skills — beceri mağazası. Sol menüde Skills. Kurulumda 5 gömülü beceri gelir, ayrıca
17 beceri katalogda hazır bekler: kod inceleme, pull request akışı, QA/test/doğrulama,
dokümantasyon, changelog, MCP, ve gerçek bir tarayıcı sürüp sayfayı gözle doğrulayan
agent-browser gibi. "Install" ile kurar, ajana atarsınız. Aynı sayfadaki Studio / New
ile kendi becerinizi yazabilirsiniz.

Kuruma özgü bilgiyi (bizim örneğimizde Gao Kaptan el kitabı) tek tek AGENTS.md dosyalarına
kopyalamak yerine beceri olarak yazmak daha doğrudur: beceri şirket kütüphanesinde
durur, sonradan işe alınan her ajana kendiliğinden gider.
ClipHub — şirket kaydı. Org ekranındaki Import company / Export company düğmeleri buraya bakar. Komple bir şirket (org şeması, ajan tanımları, adaptör yapılandırmaları, başlangıç görevleri, bütçe varsayılanları) indirilebilir; tek tek ajan şablonları ve takım şablonları da yayınlanabiliyor. Ekibi sıfırdan kurmak yerine hazır bir yapı indirip uyarlamak mümkün.
Bunu CEO'ya da söyleyebilirsiniz. "Katalogdaki becerilerden işimize yarayanları kur,
eksik bir rol varsa ajan al" diye bir görev verildiğinde CEO kendi seçimini yapıp kuruyor —
bu kurulumda github-pr-workflow, task-planning ve wireframe becerilerini kendisi kurdu
(5 → 8). Yeni ajan almadı; mevcut ekibi yeterli görmüş.
Tuzaklar
1 — Özet bırakmayan koşu görevi kilitler. Paperclip her koşunun bir sonuç bildirimiyle
bitmesini bekler. Ajan özet yorum bırakmazsa görev "disposition eksik" deyip blocked
olur ve sonraki nöbetler de tıkanır. Belirti şu yorumdur: "Run completed. Agent did not
post a summary comment this run." Bunu tek tek görevlere değil, ajanların kalıcı talimat
dosyasına yazın: hiçbir şey yapmadıysa bile "iş yok, işlem yapılmadı" desin.
2 — Her ajanın kendi çalışma dizini vardır ve boştur. Ajan
~/.paperclip/instances/default/workspaces/<ajanId>/ içinde uyanır. Depoyu yalnızca
/workspace'e klonlarsanız Coder boş bir dizinde uyanır, elinde bir şey olmadan döner —
ve hata da vermez. Belirti: koşu "tamamlandı" görünür ama dal, PR, çıktı yoktur. Çözüm, her
ajanın dizininden ortak depoya bir symlink:
ln -s /workspace/<proje> ~/.paperclip/instances/default/workspaces/<ajanId>/<proje>Ayrı ayrı klonlamak dört kopya ve çatışan dallar demektir.
3 — Ekip kendi tıkanmasını fark eder, ona güvenin. Coder boşa uyandığında CEO ve CTO kendiliğinden "ESKALASYON: KAP-25 takılı" diye bir görev açtı ve CTO satır numarası vererek talimat yazdı. Hemen müdahale etmeyin; önce ne yaptıklarına bakın.
4 — Kabuk tırnakları. Issue başlığında bir kesme işareti (pod'unu) sh -c zincirini
kırıyor. Uzun metinleri --body-file ile dosyadan verin, başlıkları sade tutun. Aynı tuzak
ajanın kendi komutlarında da geçerlidir.
5 — Pod bağlantısı kendiliğinden düşer. Çalışan bir bağlantı bir süre sonra 401
vermeye başlar, pod'a dokunmasanız bile.
POST /api/v1/pods/<id>/access-token/regenerate ile yenileyin. Ajan da bunu bilmeli:
paylaştığı bağlantı ölünce yenisini üretip güncellemeli.
6 — Sürüm pod'larını biriktirmeyin. Her güncelleme pod'u yeniden oluşturmak demek
olduğu için -v2, -v3, -v4 çoğalır ve kota (10 pod) dolar. Dağıtımı bir betiğe alın ve
depoda tutun; yenisi çalışır duruma gelince eskisini silin.
7 — Ajan, Paperclip'in kendi API'sine ulaşamayabilir. Paperclip'in baseUrlMode ayarı
auto ve ajana dış adresi veriyor: https://<relay-host>:3100. Pod'un egress'i yalnızca
80/443 olduğu için o porta çıkılamaz ve ajan TCP seviyesinde zaman aşımına uğrar — API zaten
pod'un içinde olmasına rağmen. Belirti, ajanın kendi teşhisinde net görünür:
"The API bridge is timing out at the TCP level — the connection to …:3100 never
completes."
Ajanın adapterConfig.env alanına PAPERCLIP_API_URL=http://127.0.0.1:3100 yazmak beceri
kurmayı çalışır hâle getirdi, ama görevin tamamı yine bitmedi — adaptör kendi enjeksiyonuyla
bu değeri eziyor olabilir. Kalıcı çözüm muhtemelen baseUrlMode'u auto bırakmayıp sabit
bir iç adrese ayarlamak; bu doğrulanmadı.
Paperclip: ajanlardan bir şirket, kendi modelinizle
Paperclip'i Kaptan'a kurun, ajanlarını Claude Code üzerinden kurum içindeki Qwen3.8'e bağlayın. İş atayın, ajan çalışsın, çıktıyı panodan izleyin.
Pi: kendi modelinizle çalışan terminal ajanı
Pi coding agent'ı Kaptan'a kurun ve Kaptan inference'taki Qwen'e köprüsüz bağlayın. İki JSON dosyası, tek npm paketi.

Gao Kaptan Docs