Spesifikasi open-source kanggo orkestrasi Codex: Symphony
Dening Alex Kotliarskyi, Victor Zhu, lan Zach Brock
Nem wulan kepungkur, nalika nggarap piranti produktivitas internal, tim kita njupuk keputusan sing kontroversial (nalika kuwi): kita bakal mbangun repositori kita tanpa kode sing ditulis manungsa. Saben baris ing repositori proyek kita kudu diasilaké déning Codex.
Supaya kuwi bisa mlaku, kita ngrancang ulang alur kerja rekayasa saka dhasar. Kita nggawe repositori sing ramah agen, nandur investasi gedhé ing tes otomatis lan pengaman, lan nganggep Codex minangka anggota tim sing lengkap. Kita ndokumentasikaké lelampahan kasebut ing tulisan blog babagan rekayasa pengikat sadurungé.
Lan iki kasil, nanging banjur kita nemoni hambatan sabanjuré: gonta-ganti konteks.
Kanggo ngrampungake masalah anyar iki, kita mbangun sawijining sistem sing diarani Symphony. Symphony(mbukak ing jendhela anyar) yaiku orkestrator agen sing ngowahi papan manajemen proyek kaya Linear dadi control plane kanggo agen ngoding. Saben tugas sing isih mbukak diwenehi agen, agen mlaku terus-terusan, lan manungsa mriksa asilé.
Artikel iki nerangake kepiye kita nggawe Symphony—sing ngasilake kenaikan 500% ing pull request sing kasil digabung ing sawetara tim—lan kepiye cara nggunakake Symphony kanggo ngowahi pelacak masalah njenengan dhewe dadi orkestrator agen sing tansah aktif.
Tataran paling dhuwur saka agen ngoding interaktif
Sanajan saya gampang digunakaké, agen ngoding—apa diakses liwat aplikasi web utawa CLI—isih dadi piranti interaktif.
Nalika skala kerja agentik ing OpenAI saya mundhak, kita nemokaké jinis beban anyar. Saben insinyur bakal mbukak sawetara sesi Codex, menehi tugas, mriksa output, ngarahake agen kasebut, banjur mbaleni maneh. Ing praktiké, umume wong bisa kanthi nyaman ngelola telu nganti limang sesi ing wektu sing padha sadurunge gonta-ganti konteks dadi krasa abot. Sakwisé kuwi, produktivitas mudhun. Kita kerep lali sesi endi sing lagi nindakake apa, pindhah-pindhah antarane terminal kanggo ngarahake agen bali menyang jalur sing bener, lan nge-debug tugas sing mlaku suwe sing macet ing tengah proses.
Para agen iku cepet, nanging kita nduwé alangan ing sistem: kawigatèn manungsa. Sejatine, kita wis mbangun tim sing isiné engineer junior sing trampil banget, banjur nugasake engineer manungsa kita kanggo ngatur wong-wong mau nganti rinci banget. Kuwi ora bakal bisa diskalakake.
Pergeseran perspektif
Kita nyadari manawa kita ngoptimalake perkara sing salah. Kita biyèn nyusun sistem kita kanthi fokus ing sesi coding lan PR sing wis digabung, nanging PR lan sesi kuwi sejatiné mung sarana kanggo nggayuh tujuan. Alur kerja piranti lunak umume diatur adhedhasar asil kerja: isu, tugas, tiket, lan tonggak.
Mula kita takon marang awake dhewe apa sing bakal kelakon yen kita mandheg ngawasi agen kanthi langsung lan ngidini agen njupuk tugas saka pelacak tugas kita.
Gagasan kasebut dadi Symphony, spesifikasi tinulis sing fungsine minangka pengawas kanggo ngatur gaweyan agentik.
Ngowahi pelacak masalah kita dadi orkestrator agen
Symphony diwiwiti kanthi konsep prasaja: tugas apa wae sing isih kabuka kudu ditangani lan dirampungaké dening agen. Tinimbang ngatur sesi Codex ing pirang-pirang tab, kita nggawe pelacak masalah kita dadi pusat kontrol.
Ing pangaturan iki, saben isu Linear sing mbukak dipetakake menyang ruang kerja agen khusus. Symphony terus-terusan ngawasi papan tugas lan mesthekake saben tugas aktif nduwé agen sing mlaku ing loop nganti rampung. Yen agen ngalami crash utawa macet, Symphony miwiti maneh agen kasebut. Yen ana kerja anyar sing muncul, Symphony bakal nangani lan miwiti ngatur kerja.
Kita mbangun alur kerja adhedhasar status tiket, nggunakake pangelola tugas Linear minangka mesin kahanan.
Ing praktiké, Symphony misahaké pakaryan saka sesi lan saka pull request. Sawetara masalah ngasilake pirang-pirang PR ing macem-macem repositori; liyane murni investigasi utawa analisis sing ora tau nyentuh basis kode.
Sawise pakaryan diabstraksikaké kanthi cara iki, tiket bisa makili unit pakaryan sing luwih gedhé banget.
Kita kanthi rutin nggunakake Symphony kanggo ngorkestrasi fitur kompleks lan migrasi infrastruktur. Contone, kita bisa nggawe tugas sing njaluk agen supaya nganalisa basis kode, Slack, utawa Notion lan ngasilake rencana implementasi. Sawise kita wis marem karo rencana kasebut, agen bakal ngasilake struktur wit tugas, mecah pagawéan dadi tahap-tahap lan netepake dependensi ing antarane tugas.
Agen mung miwiti nggarap tugas sing ora keblokir, mula eksekusi lumaku kanthi alami lan optimal kanthi paralel ing DAG iki (urutan langkah-langkah eksekusi). Contone, kita nandhani upgrade React minangka keblokir nganti migrasi menyang Vite rampung. Kaya sing wis diarep-arep, agen miwiti nganyarke React mung sawisé migrasi menyang Vite rampung.
Agen uga bisa nggawe gaweyan dhewe. Sajrone implementasi utawa mriksa, dheweke kerep nemokake perbaikan sing ana ing njaba cakupan tugas saiki: masalah kinerja, kesempatan kanggo ngrefaktor, utawa arsitektur sing luwih apik. Nalika kuwi kedadeyan, dheweke mung ngajokake isu anyar sing bisa kita evaluasi lan jadwalake mengko—akeh saka tugas tindak lanjut iki uga banjur ditangani dening agen. Nalika kita ngawasi proses iki, agen tetep tertata lan njaga pakaryan supaya terus maju.
Cara kerja iki kanthi drastis ngurangi beban kognitif kanggo miwiti pakaryan sing ora cetha. Yen agen nggawe kesalahan, kuwi isih dadi informasi sing migunani, lan biaya kanggo kita meh nol. Kita bisa ngajokake tiket kanthi biaya murah banget supaya agen bisa nggawe prototipe lan njajaki, banjur mbuwang asil panjlajahan apa wae sing ora disenengi.
Amarga orkestrator mlaku ing devbox lan ora tau turu, kita bisa nambahake tugas saka ngendi wae lan ngerti yen ana agen sing bakal njupuk tugas kasebut. Contone, siji engineer ing tim kita nggawe telung owah-owahan penting saka aplikasi Linear ing ponselé, saka kabin sing nyaman nganggo Wi‑Fi sing ora stabil.
Tambahé eksplorasi amarga kerja nganggo cara iki
Nalika ngamati pengaruh saka kerja nganggo Symphony, owah-owahan sing paling cetha yaiku output. Ing sawetara tim ing OpenAI, kita weruh jumlah PR sing wis digabung mundhak 500% sajrone telung minggu kapisan. Ing njaba OpenAI, pendiri Linear Karri Saarinen nyorot lonjakan ruang kerja sing digawe(mbukak ing jendhela anyar) nalika kita ngrilis Symphony. Nanging, owah-owahan sing luwih jero yaiku cara tim mikir babagan pakaryan.
Nalika para insinyur kita ora maneh ngentekake wektu kanggo ngawasi sesi Codex, keekonomian babagan pangowahan kode owah sakabehe. Biaya sing dirasakaké kanggo saben owah-owahan mudhun amarga kita wis ora maneh nanduraké upaya manungsa kanggo nggerakaké implementasiné dhéwé.
Iku ngowahi prilaku kita. Saiki wis dadi sepele kanggo nyiyapake tugas spekulatif ing Symphony. Coba gagasan, jajaki refaktor, uji hipotesis, lan mung nyimpen asil sing katon njanjeni.
Iki uga ngluwaské cakupan sapa wae sing bisa miwiti kerja. Manajer produk lan desainer kita saiki bisa ngajokake panjaluk fitur langsung menyang Symphony. Dheweke ora perlu checkout repo utawa ngatur sesi Codex. Dheweke njlèntrèhaké fitur kasebut banjur nampa paket ulasan sing kalebu video pandhuan babagan cara fitur kasebut mlaku ing produk nyata.
Symphony uga unggul ing monorepo gedhé (kaya sing ana ing OpenAI) sing proses tahap pungkasan kanggo ngleboni PR alon lan rentan. Sistem ngawasi CI, nindakake rebase yen perlu, ngrampungake konflik, nyoba maneh cek sing rapuh, lan umume nuntun owah-owahan liwat pipeline. Nalika tiket wis tekan Nggabungake, kita yakin banget yèn owah-owahan kasebut bakal mlebu menyang cabang utama tanpa perlu pengawasan manual terus-terusan.
Sawise ngetrapake Symphony, kita masrahake luwih akeh tugas marang agen lan fokus marang tugas sing luwih angel lan eksploratif.
Kemajuan dibarengi masalah anyar sing beda
Operasi ing tingkat iki ana kompromi sing kudu ditampa. Nalika kita pindhah saka ngarahake agen kanthi interaktif menyang menehi pakaryan marang dheweke ing level tiket, kita kelangan kemampuan kanggo terus-terusan menehi arahan cilik nalika proses isih lumaku lan mbenerake arah yen perlu. Kadhangkala agen ngasilaké soko sing babar pisan ora cocog karo sing dikarepaké. Kuwi migunani—kegagalan-kegagalan kasebut nuduhake kekurangan ing sistem lan mbantu kita nggawe sistem kasebut luwih kokoh.
Tinimbang nambal asil kanthi manual, kita nambahake pembatas lan ketrampilan supaya para agen bisa sukses ing wektu sabanjure. Suwe-suwe, iki ndadekake kita nambah kemampuan anyar menyang piranti kita, kayata nglakokake tes lengkap, ngoperasikake aplikasi liwat Chrome DevTools, lan ngatur tes smoke kanggo QA. Kita wis ningkataké dokumentasi kita kanthi signifikan lan njlentrehaké kaya apa sing apik.
Ora saben tugas cocog karo gaya kerja Symphony. Sawetara masalah isih mbutuhake insinyur supaya makarya langsung karo sesi Codex interaktif, utamane masalah sing ambigu utawa pakaryan sing mbutuhake penilaian sing mateng lan keahlian. Ing praktiké, iki biasané dadi tugas sing paling menarik lan nyenengaké kanggo digarap déning para insinyur kita.
Bedane yaiku Symphony bisa nangani mayoritas pakaryan implementasi rutin. Iki ngidini engineer fokus marang siji masalah sing angel ing siji wektu, tinimbang terus-terusan ngganti konteks antarane tugas-tugas sing luwih cilik.
Kita uga sinau manawa nganggep agen minangka node kaku ing mesin kahanan ora efektif. Model saya pinter lan bisa ngrampungake masalah sing luwih gedhe tinimbang kothak sing kita coba kanggo ngemot. Versi-versi awal saka pakaryan agentik kita mung njaluk Codex supaya nerapake tugas kasebut. Pendekatan kuwi kabukten mbatesi banget. Codex bisa banget nggawe pirang-pirang PR, uga maca umpan balik tinjauan lan nangani umpan balik kasebut. Dadi, kita menehi alat marang Codex—CLIgh, katrampilan kanggo maca log CI, lsp.—lan saiki kita bisa njaluk Codex nindakake luwih akeh, kayata nutup PR lawas utawa njupuk laporan babagan pakaryan sing wis rampung dibandhingake karo sing ditinggalake. Jinis-jinis tugas iki adoh banget saka lingkup implementasi fitur awal.
Mula, pungkasane kita luwih milih menehi agen tujuan tinimbang transisi sing ketat, kaya manajer sing apik menehi target marang bawahan langsung ing timé. Kakuwatan model asalé saka kaprigelané kanggo nalar, mula wènèhana piranti lan konteks, banjur ben model-model kuwi ngolah kanthi maksimal.
Nggunakake Symphony kanggo mbangun Symphony
Nalika njenengan mbukak repositori Symphony,(mbukak ing jendhela anyar) bab pisanan sing bakal njenengan gatekake yaiku manawa Symphony sacara teknis mung file SPEC.md —definisi saka masalah lan solusi sing dituju. Tinimbang mbangun sistem pengawasan sing kompleks, kita netepake masalah lan solusi sing dikarepake, kanthi menehi arahan tingkat dhuwur marang para agen.
Implementasi referensi ditulis nganggo Elixir—amarga nalika kode sacara efektif gratis, njenengan pungkasane bisa milih basa pemrograman adhedhasar kekuwatane, kaya konkurensi ing Elixir—nanging gagasan intine bisa diandharake ing dokumen Markdown sing prasaja. Kita nyengkuyung njenengan kanggo ngarahake agen ngoding favorit njenengan menyang spesifikasi kasebut lan njaluk supaya agen kuwi ngimplementasikake versine dhewe.
Versi kapisan Symphony mung sesi Codex sing mlaku ing tmux, mriksa Linear sacara berkala lan mbukak sub-agen kanggo tugas anyar. Iki bisa mlaku, nanging ora pati andal. Versi kapindho ana ing njero repositori proyek utama kita, sing dibangun kanthi nggatekake agen. Kita wis luwih dhisik mbangun harness agen kanggo menehi para agen katrampilan lan konteks supaya bisa nindakake pakaryan berkualitas dhuwur ing repo iki, mula Symphony mung nyambungake kabeh mau.
Sawise fungsi dhasar wis ana, kita nggunakake Symphony kanggo mbangun Symphony.
Nalika kita nindakake demo internal babagan sistem sing ngatur tugas lan masang video bukti karya, tanggapané positif banget: saluran proyek Symphony kita saya ngrembaka, lan tim-tim ing saindhenging organisasi wiwit nggunakake kanthi alami. Kecocokan produk-pasar internal minangka prasyarat kanggo peluncuran eksternal ing OpenAI. Adhedhasar panggunaan sing kita deleng ing OpenAI, dadi cetha manawa kita kudu mbagikaké Symphony ngluwihi wates perusahaan.
Mula, kita ngekstrak gagasan kasebut dadi dokumen SPEC.md sing mandiri lan njaluk Codex supaya ngetrapaké. Kanggo implementasi rujukan, kita milih Elixir, basa sing relatif kurang umum kanthi primitif sing apik banget kanggo ngatur lan ngawasi proses-proses konkurèn. Codex mbangun implementasi Elixir mung sapisan langsung, banjur saka kono kita terus nindakake iterasi ing spesifikasi lan implementasi kasebut. Kanggo nyempurnakake spesifikasi, kita malah njaluk Codex kanggo nerapake ing sawetara basa liyane—TypeScript, Go, Rust, Java, Python—lan nggunakake asilé kanggo ngenali ambiguitas lan nyederhanakake sistem kasebut. Iki kasil ing saben basa.
Sajrone proses mbangun Symphony, kita ngilangi akeh kerumitan sing ora perlu, kayata ketergantungan marang repositori khusus utawa Linear MCP. Symphony saiki ora ketergantungan maneh marang repositori utawa alur kerja internal kita. Cara utama saiki dadi luwih gampang:
Kanggo saben tugas sing isih kabukak, pastèkna manawa agen mlaku ing ruang kerjane dhewe.
Saliyane mbantu gaweyan sing aktif, alur kerja pangembangan saiki dadi bab sing dingerteni lan dituruti dening para agen. Alur kerja pangembangan—nggarap masalah, checkout repo, nyetel status dadi lagi digarap supaya PM ngerti yen lagi digarap, nambah PR, mindhahaké menyang status Review, nglampiraké video, lsp.—saiki kacathet ing file WORKFLOW.md sing prasaja. Kabèh iki minangka proses sing ditindakake déning manungsa, nanging ora tau didokumentasikaké. Tinimbang ngandelake rangkéan langkah implisit iki, saiki kita ndokumentasikake langkah kasebut, lan Symphony mesthekake yen para agen ngetutake. Iki ngidini kita mbangun agen sing makarya bebarengan karo kita. Yen kita mutusaké yèn agen uga kudu nyantumaké refleksi dhiri menyang pakaryan sing wis rampung, kita bakal nambahaké kuwi menyang WORKFLOW.md. lan Symphony bakal nuntun para agen menyang langkah kasebut.
Kita uga bisa nggunakake Codex ing mode server aplikasi(mbukak ing jendhela anyar), sawijining mode headless gowoan kanggo Codex. Mode iki ngidini kita mbukak Codex lan komunikasi karo Codex kanthi programatis liwat API JSON-RPC sing didokumentasèkaké kanthi apik kanggo perkara kaya miwiti thread utawa nanggapi giliran. Iki luwih trep lan bisa diskalakake tinimbang nyoba sesambungan karo Codex liwat CLI utawa sesi tmux langsung.
Codex App Server pancen pas banget kanggo conto panggunaan kita: kita bisa ngoptimalake harness sing disedhiyakake Codex, lan isih nduweni kenop pangaturan lan hook kanggo digandhengake. Contone, supaya ora mbabarake token akses Linear marang subagen, kita nggunakake panggilan piranti dinamis(mbukak ing jendhela anyar) kanggo nyedhiyakake fungsi mentah linear_graphql sing nglakokake panjaluk sembarang marang Linear, tanpa gumantung marang MCP utawa mbabarake token akses marang kontainer.
Apa sabanjuré
Symphony minangka lapisan orkestrasi sing kanthi sengaja minimal. Kita ngrilis iki minangka open source kanggo nduduhaké kekuwatan Codex App Server nalika dipasangake karo macem-macem piranti alur kerja, kayata Linear. Mula saka kuwi, kita ora ngrancang kanggo njaga Symphony minangka produk mandiri. Anggepen iki minangka implementasi referensi. Kaya dene akeh pangembang ngarahake agen ngoding-e menyang kiriman engineering harness kanggo nyiapake kerangka repositorine, muga-muga njenengan ngarahake agen ngoding favorit njenengan menyang spesifikasi(mbukak ing jendhela anyar) lan repositori(mbukak ing jendhela anyar) Symphony kanggo mbangun versi dhewe sing disesuaikake karo lingkungan njenengan.
Kekuwatané asalé saka Codex lan server aplikasiné. Symphony minangka cara kanggo nyambungake Codex menyang Linear, rong piranti sing wis kita gunakake, kanggo ngrampungake masalah manajemen kerja. Nalika agen ngoding saya apik anggone nalar lan ngetutake instruksi, kita ngira hambatan utama ing perusahaan liyane uga bakal owah saka nulis kode menyang ngatur kerja agen. Sing nyenengake, saiki alangan kanggo nyoba-nyoba sistem agen ngoding iki wis cilik banget, nganti nggumunake. Kowe cukup gawe apa wae nganggo Codex.
Apresiasi kanggo komunitas
Kita seneng banget ndeleng komunitas rekayasa nggunakake Symphony ing minggu-minggu sawise dirilis, lan wis entuk luwih saka 15K bintang GitHub(mbukak ing jendhela anyar) per tanggal 23 April.