Πριν από έξι μήνες, ενώ εργαζόμασταν σε ένα εσωτερικό εργαλείο παραγωγικότητας, η ομάδα μας πήρε μια αμφιλεγόμενη (τότε) απόφαση: θα χτίζαμε το αποθετήριό μας χωρίς καθόλου κώδικα γραμμένο από άνθρωπο. Κάθε γραμμή στο αποθετήριο του έργου μας έπρεπε να έχει παραχθεί από το Codex.
Για να το πετύχουμε, επανασχεδιάσαμε τη μηχανική ροή εργασίας μας από το μηδέν. Χτίσαμε ένα αποθετήριο φιλικό προς πράκτορες, επενδύσαμε πολύ σε αυτοματοποιημένες δοκιμές και δικλίδες ασφαλείας, και αντιμετωπίσαμε το Codex ως πλήρες μέλος της ομάδας. Καταγράψαμε αυτήν τη διαδρομή στην προηγούμενη ανάρτησή μας για τη μηχανική harness.
Και είχε αποτέλεσμα, αλλά μετά συναντήσαμε το επόμενο εμπόδιο: την εναλλαγή θεματικού πλαισίου.
Για να λύσουμε αυτό το νέο πρόβλημα, χτίσαμε ένα σύστημα που ονομάζεται Symphony. Το Symphony(ανοίγει σε νέο παράθυρο) είναι ένας ενορχηστρωτής πρακτόρων που μετατρέπει έναν πίνακα διαχείρισης έργου όπως το Linear σε επίπεδο ελέγχου για πράκτορες προγραμματισμού. Κάθε ανοιχτή εργασία παίρνει έναν πράκτορα, οι πράκτορες εκτελούνται συνεχώς και οι άνθρωποι ελέγχουν τα αποτελέσματα.
Σε αυτήν την ανάρτηση εξηγούμε πώς δημιουργήσαμε το Symphony —με αποτέλεσμα αύξηση 500% στα pull request που ολοκληρώθηκαν σε ορισμένες ομάδες— και πώς να το χρησιμοποιήσετε για να μετατρέψετε το δικό σας σύστημα παρακολούθησης ζητημάτων σε έναν πάντα ενεργό ενορχηστρωτή πρακτόρων.
Ο πήχης για τα τους διαδραστικούς πράκτορες προγραμματισμού
Ακόμη κι όσο γίνονται πιο εύχρηστοι, οι πράκτορες προγραμματισμού —είτε η πρόσβαση σε αυτούς γίνεται μέσω εφαρμογών web είτε μέσω CLI— παραμένουν διαδραστικά εργαλεία.
Καθώς η κλίμακα της εργασίας με πράκτορα αυξανόταν στην OpenAI, βρήκαμε ένα νέο είδος επιβάρυνσης. Κάθε μηχανικός άνοιγε μερικές συνεδρίες Codex, ανέθετε εργασίες, εξέταζε το αποτέλεσμα, καθοδηγούσε τον πράκτορα και επαναλάμβανε. Στην πράξη, οι περισσότεροι άνθρωποι μπορούσαν άνετα να διαχειριστούν τρεις έως πέντε συνεδρίες τη φορά προτού η εναλλαγή θεματικού πλαισίου γίνει επώδυνη. Πέρα από αυτό, η παραγωγικότητα έπεφτε. Ξεχνούσαμε ποια συνεδρία έκανε τι, πηδούσαμε ανάμεσα σε τερματικά για να επαναφέρουμε τους πράκτορες στην πορεία τους και κάναμε αποσφαλμάτωση σε μακρόχρονες εργασίες που κολλούσαν στη μέση.
Οι πράκτορες ήταν γρήγοροι, αλλά είχαμε ένα εμπόδιο στο σύστημα: την ανθρώπινη προσοχή. Είχαμε ουσιαστικά χτίσει μια ομάδα από εξαιρετικά ικανούς νέους μηχανικούς και μετά αναθέσαμε σε μηχανικούς μας να τους κάνουν μικροδιαχείριση. Μα η εξέλιξη δεν ήταν η αναμενόμενη.
Μια αλλαγή οπτικής
Συνειδητοποιήσαμε ότι βελτιστοποιούσαμε το λάθος πράγμα. Προσανατολίζαμε το σύστημά μας γύρω από περιόδους προγραμματισμού και συγχωνευμένα PR, ενώ τα αιτήματα PR και οι περίοδοι είναι στην πραγματικότητα μέσα για την επίτευξη ενός στόχου. Οι ροές εργασίας λογισμικού οργανώνονται σε μεγάλο βαθμό γύρω από παραδοτέα: ζητήματα, εργασίες, δελτία υποστήριξης, ορόσημα
Οπότε αναρωτηθήκαμε τι θα συνέβαινε αν σταματούσαμε να επιβλέπουμε απευθείας τους πράκτορες και αντί γι’ αυτό τους αφήναμε να αντλούν δουλειά από το σύστημα παρακολούθησης εργασιών μας.
Αυτή η ιδέα εξελίχθηκε στο Symphony, μια γραπτή προδιαγραφή που λειτουργεί ως επόπτης για την ενορχήστρωση εργασίας με πράκτορα.
Μετατρέποντας το σύστημα παρακολούθησης ζητημάτων μας σε ενορχηστρωτή πρακτόρων
Το Symphony ξεκίνησε με μια απλή ιδέα: κάθε ανοιχτή εργασία θα πρέπει να αναλαμβάνεται και να ολοκληρώνεται από έναν πράκτορα. Αντί να διαχειριζόμαστε περιόδους σύνδεσης Codex σε πολλές καρτέλες, κάναμε το σύστημα παρακολούθησης ζητημάτων το επίπεδο ελέγχου.
Σε αυτήν τη διαμόρφωση, κάθε ανοιχτό ζήτημα στο Linear αντιστοιχίζεται σε έναν αποκλειστικό χώρο εργασίας πράκτορα. Το Symphony παρακολουθεί συνεχώς τον πίνακα εργασιών και διασφαλίζει ότι κάθε ενεργή εργασία έχει έναν πράκτορα που λειτουργεί στον κύκλο μέχρι να ολοκληρωθεί. Αν ένας πράκτορας παρουσιάσει σφάλμα ή κολλήσει, το Symphony τον επανεκκινεί. Αν εμφανιστεί νέα εργασία, το Symphony την αναλαμβάνει και αρχίζει να οργανώνει τις εργασίες.
Χτίσαμε τη ροή εργασίας μας με βάση τις καταστάσεις των δελτίων, χρησιμοποιώντας το εργαλείο διαχείρισης εργασιών Linear ως μηχανή καταστάσεων.
Στην πράξη, το Symphony αποσυνδέει την εργασία από τις συνεδρίες και από τα pull request. Ορισμένα ζητήματα παράγουν πολλαπλά PR σε διάφορα αποθετήρια, άλλα είναι καθαρά διερεύνηση ή ανάλυση που δεν αγγίζουν ποτέ τη βάση κώδικα.
Μόλις η εργασία αφαιρετικοποιηθεί με αυτόν τον τρόπο, τα αιτήματα μπορούν να αντιπροσωπεύουν πολύ μεγαλύτερες μονάδες εργασίας.
Χρησιμοποιούμε τακτικά το Symphony για να ενορχηστρώνουμε σύνθετα χαρακτηριστικά και μεταβάσεις υποδομής. Για παράδειγμα, μπορεί να καταχωρίσουμε μια εργασία ζητώντας από τον πράκτορα να αναλύσει τη βάση κώδικα, το Slack ή το Notion και να παράγει ένα πλάνο υλοποίησης. Μόλις μείνουμε ικανοποιημένοι από το πλάνο, ο πράκτορας δημιουργεί ένα δέντρο εργασιών, χωρίζοντας τη δουλειά σε στάδια και ορίζοντας εξαρτήσεις μεταξύ των εργασιών.
Οι πράκτορες αρχίζουν να εργάζονται μόνο σε εργασίες που δεν είναι μπλοκαρισμένες, οπότε η εκτέλεση εξελίσσεται φυσικά και βέλτιστα παράλληλα για αυτό το DAG (μια ακολουθία βημάτων εκτέλεσης). Στο παρακάτω παράδειγμα, επισημάναμε ότι η αναβάθμιση της React ήταν μπλοκαρισμένη από μια μετάβαση στο Vite. Όπως αναμενόταν, οι πράκτορες άρχισαν να αναβαθμίζουν τη React μόνο αφού ολοκληρώθηκε η μετάβαση στο Vite.
Οι πράκτορες μπορούν επίσης να δημιουργούν οι ίδιοι εργασίες. Κατά την υλοποίηση ή τον έλεγχο, συχνά εντοπίζουν βελτιώσεις που υπερβαίνουν το εύρος της τρέχουσας εργασίας: ένα πρόβλημα απόδοσης, μια ευκαιρία για αναπαραγοντοποίηση ή μια καλύτερη αρχιτεκτονική. Όταν συμβαίνει αυτό, απλώς καταχωρίζουν ένα νέο ζήτημα, το οποίο μπορούμε να αξιολογήσουμε και να προγραμματίσουμε αργότερα. Πολλές από αυτές τις επακόλουθες εργασίες αναλαμβάνονται επίσης από πράκτορες. Ενώ εμείς επιβλέπουμε αυτήν τη διαδικασία, οι πράκτορες παραμένουν οργανωμένοι και συνεχίζουν να προωθούν την εργασία.
Αυτός ο τρόπος εργασίας μειώνει δραματικά το γνωστικό κόστος έναρξης ασαφούς εργασίας. Αν ο πράκτορας κάνει κάτι λάθος, αυτό παραμένει χρήσιμη πληροφορία και το κόστος για εμάς είναι σχεδόν μηδενικό. Μπορούμε πολύ φθηνά να καταχωρίζουμε δελτία υποστήριξης ώστε ο πράκτορας να πρωτοτυπεί και να εξερευνά, και να πετάμε όποιες διερευνήσεις δεν μας αρέσουν.
Επειδή ο ενορχηστρωτής εκτελείται σε devbox και δεν κοιμάται ποτέ, μπορούμε να προσθέτουμε εργασίες από οπουδήποτε και να ξέρουμε ότι ένας πράκτορας θα τις αναλάβει. Για παράδειγμα, ένας μηχανικός στην ομάδα μας έκανε τρεις σημαντικές αλλαγές από την εφαρμογή Linear στο τηλέφωνό του, από μια άνετη εξοχική κατοικία με προβληματικό Wi-Fi.
Αύξηση της εξερεύνησης δουλεύοντας με αυτόν τον τρόπο
Παρατηρώντας τα αποτελέσματα της εργασίας με το Symphony, η πιο προφανής αλλαγή ήταν το αποτέλεσμα. Σε ορισμένες ομάδες στην OpenAI, είδαμε τον αριθμό των PR που ολοκληρώθηκαν να αυξάνεται κατά 6 φορές μέσα στις πρώτες τρεις εβδομάδες. Εκτός OpenAI, ο ιδρυτής του Linear Κάρι Σααρίνεν επισήμανε μια έξαρση στους χώρους εργασίας που δημιουργήθηκαν(ανοίγει σε νέο παράθυρο) καθώς κυκλοφορήσαμε το Symphony. Ωστόσο, η βαθύτερη αλλαγή είναι ο τρόπος με τον οποίο οι ομάδες αντιμετωπίζουν την εργασία.
Όταν οι μηχανικοί μας δεν αφιερώνουν πλέον χρόνο στην επίβλεψη συνεδριών Codex, τα οικονομικά των αλλαγών κώδικα αλλάζουν πλήρως. Το αντιλαμβανόμενο κόστος κάθε αλλαγής πέφτει επειδή δεν επενδύουμε πλέον ανθρώπινη προσπάθεια στην ίδια την καθοδήγηση της υλοποίησης.
Αυτό άλλαξε τη συμπεριφορά μας. Έχει γίνει πλέον ασήμαντα εύκολο να ξεκινάμε δοκιμαστικές εργασίες στο Symphony. Να δοκιμάζουμε μια ιδέα, να εξερευνούμε μια αναπαραγοντοποίηση, να ελέγχουμε μια υπόθεση και να κρατάμε μόνο τα αποτελέσματα που φαίνονται υποσχόμενα.
Διευρύνει επίσης τον κύκλο των ατόμων που μπορούν να ξεκινούν εργασίες. Ο υπεύθυνος έργου και ο ντιζάινερ μπορούν πλέον να καταχωρίζουν αιτήματα για λειτουργίες απευθείας στο Symphony. Δεν χρειάζεται να κάνουν ελέγξουν το αποθετήριο ή να διαχειρίζονται μια περίοδο Codex. Περιγράφουν τη λειτουργία και λαμβάνουν ένα πακέτο ελέγχου που περιλαμβάνει μια περιήγηση σε βίντεο, όπου φαίνεται η λειτουργία να εκτελείται μέσα στο πραγματικό προϊόν.
Το Symphony ξεχωρίζει επίσης σε μεγάλα monorepo (όπως αυτό που έχουμε στην OpenAI), όπου το τελευταίο στάδιο της ενσωμάτωσης ενός PR είναι αργό και εύθραυστο. Το σύστημα παρακολουθεί το CI, κάνει rebase όταν χρειάζεται, επιλύει διενέξεις, επαναλαμβάνει ασταθείς ελέγχους και γενικά καθοδηγεί τις αλλαγές μέσα από τη ροή. Μέχρι ένα αίτημα να φτάσει στην κατάσταση Συγχώνευση, έχουμε μεγάλη βεβαιότητα ότι η αλλαγή θα περάσει στον κύριο κλάδο χωρίς ανθρώπινη επίβλεψη.
Η πρόοδος φέρνει νέα, διαφορετικά προβλήματα
Η λειτουργία σε αυτό το επίπεδο συνοδεύεται από συμβιβασμούς. Όταν περάσαμε από τη διαδραστική καθοδήγηση πρακτόρων στην ανάθεση εργασίας στο επίπεδο δελτίων υποστήριξης, χάσαμε τη δυνατότητα να τους καθοδηγούμε συνεχώς κατά τη διάρκεια της πορείας και να διορθώνουμε την κατεύθυνση όταν χρειαζόταν. Μερικές φορές ο πράκτορας παρήγαγε κάτι που δεν είχε κανένα αποτέλεσμα. Αυτό ήταν χρήσιμο — αυτές οι αποτυχίες αποκάλυψαν κενά στο σύστημα και μας βοήθησαν να το κάνουμε πιο ανθεκτικό.
Αντί να διορθώνουμε το αποτέλεσμα χειροκίνητα, προσθέσαμε δικλίδες ασφαλείας και δεξιότητες ώστε οι πράκτορες να μπορούν να τα καταφέρουν την επόμενη φορά. Με τον καιρό, αυτό μας οδήγησε να προσθέσουμε νέες δυνατότητες στο harness μας, όπως την εκτέλεση ολοκληρωμένων δοκιμών, τον χειρισμό της εφαρμογής μέσω του Chrome DevTools και τη διαχείριση δοκιμών smoke QA. Βελτιώσαμε σημαντικά την τεκμηρίωσή μας και αποσαφηνίσαμε πώς είναι ένα καλό αποτέλεσμα.
Δεν ταιριάζει κάθε εργασία στο στιλ εργασίας του Symphony. Κάποια προβλήματα εξακολουθούν να απαιτούν από τους μηχανικούς να δουλεύουν απευθείας με διαδραστικές συνεδρίες Codex, ειδικά όταν πρόκειται για ασαφή προβλήματα ή για εργασία που απαιτεί ισχυρή κρίση και εξειδίκευση. Στην πράξη, αυτές είναι συνήθως οι πιο ενδιαφέρουσες και ευχάριστες εργασίες στις οποίες αφιερώνουν χρόνο οι μηχανικοί μας.
Η διαφορά είναι ότι το Symphony μπορεί να αναλάβει τον όγκο της συνηθισμένης εργασίας υλοποίησης. Αυτό επιτρέπει στους μηχανικούς να εστιάζουν σε ένα δύσκολο πρόβλημα τη φορά αντί να αλλάζουν συνεχώς θεματικό πλαίσιο ανάμεσα σε μικρότερες εργασίες.
Μάθαμε, επίσης, ότι η αντιμετώπιση των πρακτόρων ως άκαμπτων κόμβων σε μια μηχανή καταστάσεων δεν λειτουργεί καλά. Τα μοντέλα γίνονται πιο έξυπνα και μπορούν να λύσουν μεγαλύτερα προβλήματα από το πλαίσιο στο οποίο προσπαθούμε να τα στριμώξουμε. Για παράδειγμα, στις πρώτες εκδόσεις, όλες οι ενσωματώσεις του GitHub αποτελούσαν μέρος του εξωτερικού harness. Δηλαδή, οι πρώτες εκδόσεις περίμεναν από το Codex μόνο να κάνει αλλαγές στον κώδικα, ενώ η υπόλοιπη διαδικασία (η υποβολή αλλαγών, η εκτέλεση δοκιμών) καθοριζόταν στον κώδικα. Στις πρώτες εκδόσεις της εργασίας με πράκτορα, ζητούσαμε από το Codex μόνο να υλοποιήσει την εργασία. Αυτή η προσέγγιση αποδείχθηκε υπερβολικά περιοριστική. Το Codex είναι απόλυτα ικανό να δημιουργεί πολλαπλά PR, καθώς και να διαβάζει σχόλια ελέγχου και να τα αντιμετωπίζει. Έτσι, του δώσαμε εργαλεία, gh CLI, δεξιότητες για την ανάγνωση αρχείων καταγραφής CI κ.λπ., και πλέον μπορούμε να ζητάμε από το Codex να κάνει περισσότερα, όπως να κλείνει παλιά RP ή να αντλεί αναφορές για ολοκληρωμένες έναντι εγκαταλειμμένων εργασιών. Αυτοί οι τύποι εργασιών βρίσκονταν πολύ έξω από το αρχικό πλαίσιο υλοποίησης λειτουργιών.
Έτσι, τελικά στραφήκαμε στο να δίνουμε στους πράκτορες στόχους αντί για αυστηρές μεταβάσεις, παρόμοια με έναν καλό μάνατζερ που θα ανέθετε έναν στόχο σε κάποιο μέλος της ομάδας του. Η δύναμη των μοντέλων προέρχεται από την ικανότητά τους για συλλογιστική, οπότε δώστε τους εργαλεία και θεματικό πλαίσιο και αφήστε τα να δράσουν.
Χρησιμοποιήσαμε το Symphony για να χτίσουμε το Symphony
Όταν ανοίγετε το αποθετήριο Symphony, το πρώτο πράγμα που θα παρατηρήσετε είναι ότι το Symphony είναι ουσιαστικά απλώς ένα αρχείο SPEC.md — ένας ορισμός του προβλήματος και της επιδιωκόμενης λύσης. Αντί να χτίσουμε ένα σύνθετο σύστημα επίβλεψης, ορίσαμε το πρόβλημα και τις επιδιωκόμενες λύσεις, δίνοντας στους πράκτορες καθοδήγηση υψηλού επιπέδου.
Η υλοποίηση αναφοράς είναι γραμμένη σε Elixir —γιατί όταν ο κώδικας είναι ουσιαστικά δωρεάν, μπορείς επιτέλους να επιλέγεις γλώσσες με βάση τα πλεονεκτήματά τους, όπως η ταυτόχρονη εκτέλεση της Elixir— αλλά η βασική ιδέα μπορεί να εκφραστεί σε ένα απλό έγγραφο Markdown. Σας ενθαρρύνουμε να ορίσετε τον αγαπημένο σας πράκτορα προγραμματισμού ώστε να ανατρέξει στις προδιαγραφές και να τον βάλετε να υλοποιήσει τη δική του εκδοχή.
Η πρώτη έκδοση του Symphony ήταν απλώς μια συνεδρία Codex που έτρεχε σε tmux, έκανε polling στο Linear και εκκινούσε υποπράκτορες για νέες εργασίες. Δούλευε, αλλά δεν ήταν ιδιαίτερα αξιόπιστη. Η δεύτερη έκδοση υπήρχε μέσα στο κύριο αποθετήριό μας, το οποίο είχε σχεδιαστεί έχοντας κατά νου πράκτορες. Είχαμε ήδη χτίσει το harness των πρακτόρων ώστε να τους δίνει τις δεξιότητες και το πλαίσιο για να κάνουν δουλειά υψηλής ποιότητας σε αυτό το αποθετήριο, οπότε το Symphony απλώς τα συνέδεσε όλα.
Μόλις εμφανίστηκε η βασική λειτουργικότητα, χρησιμοποιήσαμε το Symphony για να χτίσουμε το Symphony.
Όταν παρουσιάσαμε εσωτερικά το σύστημα να διαχειρίζεται εργασίες και να επισυνάπτει το βίντεο proof-of-work, η αντίδραση ήταν συντριπτικά θετική: το κανάλι του έργου Symphony μεγάλωσε και ομάδες σε όλο τον οργανισμό άρχισαν να το χρησιμοποιούν οργανικά. Η εσωτερική προσαρμογή αγοράς προϊόντος είναι προϋπόθεση για εξωτερική κυκλοφορία στην OpenAI. Με βάση τη χρήση που είδαμε στην OpenAI, έγινε σαφές ότι έπρεπε να διαθέσουμε το Symphony και πέρα από τα τείχη της εταιρείας.
Έτσι, μεταφέραμε την ιδέα σε ένα αυτόνομο SPEC.md και ζητήσαμε από το Codex να το υλοποιήσει. Για την υλοποίηση αναφοράς, επιλέξαμε την Elixir, μια σχετικά εξειδικευμένη γλώσσα με εξαιρετικά βασικά δομικά στοιχεία για την ενορχήστρωση και την εποπτεία ταυτόχρονων διεργασιών. Το Codex δημιούργησε την υλοποίηση σε Elixir με την πρώτη προσπάθεια και από εκεί συνεχίσαμε να βελτιώνουμε τόσο τις προδιαγραφές όσο και την υλοποίηση. Για να τελειοποιήσουμε τις προδιαγραφές, ζητήσαμε μάλιστα από το Codex να τις υλοποιήσει σε αρκετές άλλες γλώσσες —TypeScript, Go, Rust, Java, Python— και να χρησιμοποιήσει τα αποτελέσματα για να εντοπίσει ασάφειες και να απλοποιήσει το σύστημα. Τα κατάφερε σε κάθε γλώσσα.
Μέσα από τη διαδικασία κατασκευής του Codex, αφαιρέσαμε πολλή συμπτωματική πολυπλοκότητα, όπως εξαρτήσεις από συγκεκριμένα αποθετήρια ή από το Linear MCP. Το Symphony δεν εξαρτάται πλέον από τα εσωτερικά μας αποθετήρια ή τις ροές εργασίας μας. Η βασική προσέγγιση έγινε απλή:
Για κάθε ανοιχτή εργασία, εξασφαλίστε ότι ένας πράκτορας εκτελείται στον δικό του χώρο εργασίας.
In addition to helping with the active work, the development workflow is now something agents know and follow. The development workflow—work on an issue, check out a repo, put it in progress so the PM knows it's being worked on, add the PR, move it to the Review status, attach videos, etc.—is now captured in a simple WORKFLOW.md file. All of this is a process that humans followed, but it was never documented. Rather than relying on this implicit set of steps, we now document it, and Symphony ensures agents follow it. This lets us build agents that work alongside us. If we decide that agents should also attach self-reflection to finished work, we'll add that to the WORKFLOW.md, and Symphony will guide the agents to that step.
We also got to use Codex in app server mode(ανοίγει σε νέο παράθυρο), a built-in headless mode for Codex. This mode allowed us to run Codex and talk to it programmatically via a well documented JSON-RPC API for things like starting a thread or reacting to turns. It’s more convenient and scalable than trying to interact with Codex via CLI or live tmux sessions.
Codex App Server was a perfect fit for our use case: we take advantage of the harness Codex provides while having knobs and hooks to plug into. For example, to avoid exposing the Linear access token to subagents, we use dynamic tool calls(ανοίγει σε νέο παράθυρο) to expose the raw linear_graphql function that executes arbitrary requests against Linear, without relying on MCP or exposing the access token to containers.
What’s next
Symphony is an intentionally minimal orchestration layer. We’re open sourcing it to demonstrate the power of Codex App Server when paired with different workflow tools, like Linear. As such, we don't plan to maintain Symphony as a standalone product. Think of it as a reference implementation. Similar to how many developers pointed their coding agents at the harness engineering post to scaffold their repositories, we hope you point your favorite coding agent at the Symphony spec(ανοίγει σε νέο παράθυρο) and repository(ανοίγει σε νέο παράθυρο) to build your own versions tailored to your environments.
The power comes from Codex and its app server. Symphony was a way to connect Codex to Linear, two things we already used, to solve the work management problem. As coding agents become better at reasoning and following instructions, we suspect the bottleneck at other companies will shift from writing code toward managing agentic work, too. The exciting part is that the barrier to experimenting with these coding agent systems is now surprisingly low. You can just build things with Codex.
Αναφορές στην κοινότητα
Χαιρόμαστε πολύ που βλέπουμε την κοινότητα μηχανικών να χρησιμοποιεί το Symphony τις εβδομάδες μετά την κυκλοφορία του, συγκεντρώνοντας πάνω από 15.000 αστέρια στο GitHub(ανοίγει σε νέο παράθυρο) έως τις 23 Απριλίου.