Siberta · Ankara · since 2023
The Siberta Software Factory is how we build software, for our clients and for ourselves. A request becomes a design, planned issues, written code, an independent review and a merged pull request. Our team sets the direction and approves what matters. AI agents do the rest, inside limits that GitHub itself enforces.
How a change flows
Each step is a separate process with its own permissions. No agent can approve its own work, and no step depends on an agent remembering a rule.
A goal in plain language. It stays fixed until someone on the team changes it.
Our representative agent clarifies the request and writes the ideal state, with numbered yes/no decisions, under its own identity.
Decisions are answered in one line. Nothing is built from an unapproved design.
Independent, testable issues with acceptance criteria. A script checks the plan against what the planner declared.
In a fresh, disposable container. Runs the single test entry point and opens a pull request.
Sees only the diff, the description and the issue. Approves or blocks under a second identity.
Green checks first, then rulesets and code owners. Critical paths wait for a person; the issue closes itself.
Inside the factory
The same flow, one level deeper. Click a box to read what happens there; boxes with a thick blue edge open their own flow.
The approach
Tie correctness to mechanism, not intention. Build the mechanism only as far as it is needed.
Earlier internal platforms taught us what to avoid: they piled up policy engines, orchestrators and governance layers before shipping anything. The factory was designed the other way round. It was built in a day on five principles, then rebuilt from a single design document, and everything in it follows from them.
A language model interprets, and interpretation drifts. Hooks, rulesets and file permissions do not.
Test: if this rule is broken, does GitHub refuse it?
Lists of forbidden things never end. Roles are written as "only does this", and permissions are allowlists.
Test: does the definition contain "except" or "don't"?
A container, an extra agent, another document: each has to solve a concrete problem that exists today.
Test: does the argument for it say "someday" or "maybe"?
Securing a system never ends on its own. "Last round" is part of the design, and the accepted residual risk is written down.
Test: is the same component being hardened a third time?
People and models both drift. What prevents it is a written goal and the habit of returning to it.
Test: is it written down how you will know you are done?
Guardrails
Each guardrail is a mechanism that can be checked, and each exists because of a problem the factory actually hit.
One identity writes and merges, one only reviews, and the Architect works under its own. GitHub does not let an author approve their own pull request, and people's accounts are kept for people's actions.
GitHub Apps · short-lived tokensPlanner and reviewer run unattended with an allowlist. Anything not on it is refused without asking.
unattended · allowlist · no promptsThe developer gets a fresh container for every turn, with limited outbound access and read-only inputs from the host.
container · egress allowlistChanges to roles, scripts, CI, templates and design documents wait for a code owner's approval. Ordinary work merges on review and green CI.
CODEOWNERS · rulesets · required ciThe reviewer reads the issue the pull request closes, so a missing acceptance criterion blocks the merge even when the description looks consistent.
diff + description + issueA restarted run reads each issue's state from GitHub and runs only the missing step. Temporary errors are retried a few times; a permanent one stops the run with its reason.
state from GitHub · bounded retriesToday on Claude
The method does not depend on a model: the roles, identities, rules and records stay the same whichever model fills a role. Today every role is filled by Claude, running in Claude Code.
Every plan runs several Claude sessions: a planner, one or more developer turns, an independent review for each turn, and the Architect working with our team throughout. The same pipeline builds our client projects and improves the factory itself, so our use of Claude grows with every project we take on.
Usage is measured per call. Models, retries and outcomes are recorded in one OpenTelemetry trace per plan, so we can see where tokens go and which steps need a stronger model.
Claude Code, unattendedEach role is its own process with a per-run agent definition. Nothing is installed on the machine.The right model for each roleEach role runs on the Claude model and effort level that suit its job. If one model is unavailable, the next continues with the same instructions, and the quality gate never lowers its bar.ArchitectA long-running Claude Code session that represents our team in the factory, works under its own GitHub identity and is reachable from a phone through Remote Control.OpenTelemetryClaude Code's own spans sit under each role's span, inside the plan's trace.How the factory learns
Surprises become issues as they happen. At the end of a project they are grouped by root cause and decided: fixed now, or accepted as a known risk. Fixes go through the factory's own pipeline. One example:
Hundreds of non-blocking review notes were found in merged pull requests. Nearly half had never been tracked anywhere.
Review notes should reach the record by themselves, and the reviewer should see the requirement as well as the diff.
The factory planned, wrote, reviewed and merged both changes through its own pipeline.
The new reviewer cited the issue's acceptance criteria, and its notes opened a tracking issue without anyone filing it.
Siberta
Founded in Ankara in 2023, Siberta works with organisations on consulting, project management, software development and training. The factory is how we build.
Write to us:
siberta.com
Siberta · Ankara · 2023'ten beri
Siberta Yazılım Fabrikası, hem müşterilerimiz hem kendimiz için yazılımı nasıl ürettiğimizdir. Bir istek tasarıma, planlanmış issue'lara, yazılmış koda, bağımsız bir incelemeye ve birleşmiş bir pull request'e dönüşür. Yönü ekibimiz belirler ve önemli olanı onaylar. Gerisini yapay zekâ ajanları, GitHub'ın kendisinin uyguladığı sınırlar içinde yapar.
Bir değişikliğin yolu
Her adım kendi izinleri olan ayrı bir süreçtir. Hiçbir ajan kendi işini onaylayamaz ve hiçbir adım bir ajanın kuralı hatırlamasına bağlı değildir.
Düz bir dille bir hedef. Ekipten biri değiştirene kadar sabit kalır.
Temsilci ajanımız isteği netleştirir ve ideal hâli, numaralı evet-hayır kararlarıyla, kendi kimliğiyle yazar.
Kararlar tek satırla cevaplanır. Onaylanmamış bir tasarımdan hiçbir şey yapılmaz.
Kabul kriterleri olan, bağımsız ve test edilebilir issue'lar. Bir betik planı, planner'ın beyanıyla karşılaştırır.
Her seferinde yeni ve atılabilir bir container'da. Tek test giriş noktasını çalıştırır ve pull request açar.
Yalnızca farkı, açıklamayı ve issue'yu görür. İkinci bir kimlikle onaylar ya da durdurur.
Önce yeşil check'ler, sonra ruleset'ler ve kod sahipleri. Kritik yollar bir insanı bekler; issue kendiliğinden kapanır.
Fabrikanın içi
Aynı akış, bir kat daha derinde. Bir kutuya tıklayınca orada ne olduğunu okursunuz; kalın mavi kenarlı kutular kendi akışını açar.
Yaklaşım
Doğruluğu niyete değil mekanizmaya bağla. Mekanizmayı da ihtiyaç kadar kur.
Önceki iç platformlar bize neden kaçınmamız gerektiğini öğretti: hiçbir şey çıkarmadan politika motoru, orkestratör ve yönetişim katmanı biriktirdiler. Fabrika tersinden tasarlandı. Beş ilke üzerine bir günde kuruldu, sonra tek bir tasarım belgesinden yeniden kuruldu; içindeki her şey bu ilkelerden türer.
Dil modeli yorumlar, yorum kayar. Hook, ruleset ve dosya izni yorumlamaz.
Sınama: bu kural çiğnenirse GitHub reddeder mi?
Yasakların listesi hiç bitmez. Roller "yalnızca şunu yapar" diye yazılır, izinler izin listesidir.
Sınama: tanımda "hariç" ya da "yapma" geçiyor mu?
Container, ek ajan, yeni belge: her biri bugün var olan somut bir sorunu çözmelidir.
Sınama: onu savunan cümlede "ileride" ya da "belki" geçiyor mu?
Bir sistemi güvenceye alma işi kendiliğinden bitmez. "Son tur" tasarımın parçasıdır ve kabul edilen artık risk yazılır.
Sınama: aynı bileşen üçüncü kez mi sertleştiriliyor?
İnsan da model de yolda sapar. Sapmayı önleyen, yazılı hedef ve ona dönme alışkanlığıdır.
Sınama: bittiğini neye bakıp anlayacağın yazılı mı?
Güvenceler
Her güvence denetlenebilen bir mekanizmadır ve her biri fabrikanın gerçekten yaşadığı bir sorun yüzünden vardır.
Bir kimlik yazar ve birleştirir, biri yalnızca inceler, Architect de kendi kimliğiyle çalışır. GitHub yazarın kendi pull request'ini onaylamasına izin vermez; insanların hesapları yalnızca insanların eylemleri içindir.
GitHub App · kısa ömürlü tokenPlanner ve reviewer bir izin listesiyle, gözetimsiz çalışır. Listede olmayan her şey sorulmadan reddedilir.
gözetimsiz · izin listesi · soru yokDeveloper her tur için yeni bir container alır: dışarıya erişimi sınırlıdır, makineden gelen girdiler salt okunurdur.
container · çıkış izin listesiRollere, betiklere, CI'a, şablonlara ve tasarım belgelerine dokunan değişiklikler bir kod sahibinin onayını bekler. Sıradan işler inceleme ve yeşil CI ile birleşir.
CODEOWNERS · rulesets · required ciReviewer, pull request'in kapattığı issue'yu okur; açıklama tutarlı görünse de eksik bir kabul kriteri birleşmeyi durdurur.
fark + açıklama + issueYeniden başlayan çalışma her issue'nun durumunu GitHub'dan okur ve yalnızca eksik adımı çalıştırır. Geçici hatalar birkaç kez yeniden denenir; kalıcı hata çalışmayı nedeniyle durdurur.
durum GitHub'dan · sınırlı yeniden denemeBugün Claude ile
Yöntem bir modele bağlı değildir: bir rolü hangi model doldurursa doldursun roller, kimlikler, kurallar ve kayıtlar aynı kalır. Bugün her rolü Claude Code içinde çalışan Claude doldurur.
Her plan birkaç Claude oturumu çalıştırır: bir planner, bir ya da daha çok developer turu, her tur için bağımsız bir inceleme ve baştan sona ekibimizle çalışan Architect. Aynı hat hem müşteri projelerimizi üretir hem de fabrikanın kendisini geliştirir; bu yüzden Claude kullanımımız aldığımız her projeyle büyür.
Kullanım her çağrıda ölçülür. Modeller, yeniden denemeler ve sonuçlar plan başına tek bir OpenTelemetry izinde kaydedilir; token'ların nereye gittiği ve hangi adımın daha güçlü bir model istediği görülür.
Claude Code, gözetimsizHer rol, yalnızca o çalıştırmaya ait ajan tanımıyla kendi sürecidir. Makineye hiçbir şey kurulmaz.Her role uygun modelHer rol, işine uygun Claude modeli ve efor düzeyiyle çalışır. Bir model kullanılamazsa sıradaki aynı talimatla sürer; kalite kapısı çıtasını hiç düşürmez.ArchitectFabrikada ekibimizi temsil eden, kendi GitHub kimliğiyle çalışan ve telefondan Remote Control ile ulaşılan uzun ömürlü bir Claude Code oturumu.OpenTelemetryClaude Code'un kendi span'leri her rolün span'inin altında, planın izi içinde durur.Fabrika nasıl öğrenir
Şaşırtan her olay anında issue olur. Proje sonunda kök nedene göre gruplanır ve karara bağlanır: şimdi düzeltilir ya da bilinen risk olarak kabul edilir. Düzeltmeler fabrikanın kendi hattından geçer. Bir örnek:
Birleşmiş pull request'lerde yüzlerce engelleyici olmayan inceleme notu bulundu. Neredeyse yarısı hiçbir yerde takip edilmemişti.
İnceleme notları kayda kendiliğinden girmeli, reviewer farkın yanında gereksinimi de görmeli.
Fabrika iki değişikliği kendi hattından planladı, yazdı, inceledi ve birleştirdi.
Yeni reviewer issue'nun kabul kriterlerini tek tek andı; notları kimse açmadan bir takip issue'su oldu.
Siberta
2023'te Ankara'da kurulan Siberta, kurumlarla danışmanlık, proje yönetimi, yazılım geliştirme ve eğitim alanlarında çalışır. Fabrika, nasıl ürettiğimizdir.
Bize yazın:
siberta.com