Le processus de travail du StyloAgent: Comment construire et gérer des systèmes de grande taille (et de grande envergure ) Utilisant les codes LLM (Partie
Il s’agit d’une partie 1 de deux : du problème et du modèle StyloAgent. Partie 2 : Le processus de travail dans la pratique Il s’applique.
La génération de code a cessé d'être un problème il y a quelque temps. Les modèles écrivent un bon code. Ils suivent les conventions dans le fichier qu'ils éditent, et si vous les pointez sur une erreur d'essai, ils la règle généralement corrigent.
La partie qui ne fonctionne pas est la mémoire.
Le problème n’est plus : "le modèle peut-il écrire le code?
Chaque nouvelle session commence à ne savoir rien au sujet du système qu’elle est sur le point de changer. Elle redécouverte que Stylo.Bot est deux répertoires, que la bande de risque sur le tableau de bord est dérivée au moment du lecture et n’est jamais cachée , qu’il y a exactement une seule usine de connexion à la base de données et qu’un magasin SQLite ne doit jamais faire l’ombre
Il s’agit du flux de travail que j’ai construit pour cesser de payer le coût.
Le problème principal: La dérive architecturale
Stylo.BotM SK1s moteur de détection n'est pas un simple ASP.NET CRUD appMSC3 Il fonctionne sur une architecture éphémère , signauxMNK5etMRK6atoms MMK7 atomes détenaient l'état MNK8 les signaux annonçaientMZK9 a scoped SignalSink pour chaque demande, le panneau blackboard, est un seul ScheduleCoordinator émet des signaux de cadence tick au lieu d'une pile de services de fond, la classification est la plus proche - centroid avec drift plutôt que les règlesM SK2 et les verdicts sont dérivés fresh at read instead of cached. Cette forme est l'ensemble du point du produitMSC4 C'est ce qui lui permet d'apprendre à partir d'un comportement observé au lieu de correspondre à une liste statique
Un code LLM ne veut pas construire ce qu’il a vu un million de fois dans ses données de formation : plain CRUD. Demandez à un agent frais d’ajouter une fonctionnalité et il atteint chaque foisM SK3 , pour l’ASPMSC5 Réflexe NET :
| Le réflexe ASPM SK1NET (plain CRUD) | StyloMska5BotM Ska6s modèle prévu |
|---|---|
A BackgroundService par emploi périodique |
Un ScheduleCoordinator émettre des signaux de tick |
A ConcurrentDictionary utilisé comme entrepôt |
Les atomes ont un état de conservation ; il n'y a pas d'actuelle persistance dans la mémoire |
A switch la cartographie d'une chaîne à une catégorie |
La plus procheM SK1 Classification centroïde, dériveMSC3 Leiden |
| Cachez la valeur calculée pour la localité | La dériver à lecture |
A bare DbContext dans l’ordinateur |
L’État vit dans le moteur , lire sur un fil M SK2 |
An ILogger pour vérifier ce qui s’est passé |
Les signaux annoncent ; le signalSink est la plaque d’affichage. |
Chaque cellule à gauche est un manuel ASP.NET et corrigée dans une application normale. CLAUDE.md ce qui dit ainsi, explicitement : centroids non règles, aucun service de fond ne fait appel au Coordonnateur des horairesM SK3 aucun entrepôt de mémoireMSC4 aucun cache ne favorise la fraîcheur sur la localitéMNK6 signaux et atomes pas ASPMMK7 normes NETMRK8
Il n’a pas retenu. CLAUDE.md Le modèle régresse à la moyenne de ses données de formation, qui est CRUD.
Cela coûte des semaines de réaménagement. Aucun déclin dramatique n’a été observé. BackgroundService renvoyé à un coordonnateur tick, a ConcurrentDictionary qui avait quietement été un magasin parasitaire supprimé, a switch la déclaration est remplacée par une recherche centroïde, session après session après séance. Le bogue n'a jamais été le point . La dérive a été le puntoM SK3 Un fichier d'instructions perMSC4repo est la récupérationMST5 et la recupération n'était pas suffisante Mst6 l'agent avait les règles devant luiM st7 ne comprenait pas pourquoi la forme éphémère était importanteMstr8 et l'a érodée en tout état de causeMtr9
Ce n'est pas "l'agent peut't coderM SK2 mais "il est possible pour l'agent de tenir la architectureMSC4il n'y a pas de fichier d'instruction plus grand qui l'ait corrigéeMNK6 Il s'agissait de donner l'architecture à un propriétaire.
L'ampleur de la question
L’échelle n’a pas provoqué la dérive. Elle l’a multipliéeM SK1
Stylo.Bot n'est pas un jouet . Il s'agit d'un bot-plate-forme de détection M SK3 moteur de détection FOSS qui fait face aux applications Web par l'intermédiaire d'une passerelle YARPMSC4 plus une couche commerciale avec gestion de la flotteMNK5 un rédacteur de configuration en direct MNK6 persistance Postgres et pgvectorMMK7 fournisseurs commerciaux de LLMMRK8 un moteur de rapportsMBK9 membres et parMDK10 licence de domaineMGK11 et un exploitant KubernetesMdk12
Counted honestly:
- Deux dépôts principaux pour Stylo.Bot M SK1 le moteur de détection FOSS et la couche commerciale.
- Environ vingt projets dans le seul cadre de la repo commerciale1
- Un grand nombre de mon propre NuGet paquets les produits partage :
Mostlylucid.Ephemeral(le substratM SK1StyloExtract,StyloFlow,StyloIssues, lucidVIEW. - Infrastructure : Cartes d'helmM SK1 microk 8 grappe de groupement, entrepôt secretMSC4 registre des conteneursMNK5
- Un site de marketing qui effectue la vérification et intègre le tableau de bord réel.
Chacune d’entre elles est une surface dont le débordement peut s’écouler à l’intérieur, et un agent frais doit tenir la même discipline éphémère sur chacune de celles-ci . Un changement à un seul élan de séparation détectable dans la passerelleM SK2 le plug-in commercial, la projection du tableaux de bordMSC4 et le pipeline de déploiementMNK5 Écrire le changement n’a jamais été la partie difficileMMK6 Maintenir l’architecture stable tout en la rendant stableMRK7 partout où elle atterre~, session après sessionMST9 étaitMSS10
The Myth of the Single Super-Agent
L’industrie continue de rechercher la même réponse : donner à l’agent un plus grand contexte . fenêtres plus grandes MSC2 millions - promptstoken M SK4 RAG pour extraire les fichiers appropriés MST5 MCP pour atteindre les systèmes en direct MSM6 couches de mémoire qui résument les séances passées et les répètent
Tout cela améliore la récupération.
Retrieval finds the relevant file. Understanding knows why the file is the way it is , what invariant it protects, and what breaks two repositories away if you change itM SK3 A bigger window lets an agent read more at onceMSC4 It does not let the agent remember what it concluded last TuesdayMNK5
Que la re-derivation est le coût réel . Regardez un agent de refroidissement démarrer sur StyloM SK2Bot :
- Il greppe pour le pipeline de détection.
- Il lit l’orchestre.
- Il s’avère que le verdict a trois axes et qu’il est composé de:, non stockéM SK1
- Il constate que le plugin commercial remplace les couches FOSS par injection de dépendance.
Trente minutes plus tard, il sait assez pour faire un changement de ligne.
Une recherche plus intelligente est la mauvaise solution. La recherche elle-même doit cesser de se produire.
Comment les humains construisent réellement des logiciels
Aucun ingénieur ne comprend l’ensemble du système d’entreprise. Personne dans une entreprise réelle n’a les paiements en sa possession, auth , le pipeline de donnéesM SK3 et la frontend dans leur tête à pleine résolution dès lorsMSC4 Ce n’est pas un échecMNK5 C’est comment sont construites les grands systèmesMRK6
Les équipes décomposent le système en domaines et mettent sur chacun un spécialiste.
La propriété est plus importante que le savoir encyclopédique. Le spécialiste n’a pas besoin de connaître tout. Il faut connaître son domaine profondément, et savoir qui demander le resteM SK2
Ce qui maintient un système décomposé cohérent est la communication. La personne chargée des paiements parle à l’auth avant de changer le format du tokenM SK1 Une demande de retrait traverse une frontière et le propriétaire de cette frontière pesa dans . L’architecture demeure cohérente non pas parce qu’une personne en détient tout, mais parce que les personnes qui en détentent des morceaux parlent entre elles.
Cela fonctionne. C’est la façon dont fonctionne chaque équipe réelle . Les agents de codage sont conduits d’une manière opposée
Mon problème était différent
La dérive serait un nuisance dans une petite application. Dans tous les systèmes que je possède, il est corrosif , parce qu’ils ne sont pas un seul système. Il s’agit de produits distinctsM SK3 dans des dépôts séparés
Le substrat est Mostlylucid.Ephemeral, mon propre paquet NuGet : les primitives d'exécution et le flux de données le moteur de détection est construit surM SK2 Stylo. le Bot tire plus de mes paquets en haut de celui-ci StyloExtract pour l'emplacement-détermination des empreintes digitales, StyloFlow pour les flux de travail et la délivrance des licences conduites par le signal- StyloIssues pour la rétroaction UX sur le site de commercialisation. StyloAgent, la flotte dans cet articleM SK2 est construite à partir des paquets moi aussi : lucidVIEW rend ses documentsMSC4 et Mostlylucid.Avalonia.UITesting génére ses screenshots. Je crée les produits avec l’outil, et je crée l’instrument à partir des produitsM SK2
Il s’agit là d’un véritable aliment pour chiens, et c’est ce qui fait de la dérive dangereuse. BackgroundService ou un ConcurrentDictionary n’est pas en train de détruire une seule application. Il est en train d’éroder un paquet chacun de ces produits se trouvant sur. Les navires à dérive dans un dépôt et les surfaces d’un produit deux dépôts à l’extérieur , où l’agent qui l’a écrit ne semble jamais
Un primitive dérivé. Tous les produits construits sur lui.
Le codage n’a jamais été le plus difficile à cette échelle.
Ownership, Non Contexte
Contexte est l’axe erroné. Les échelles de coût sont calculées en fonction du nombre de sessions, et non de la taille de la fenêtre.
Le problème n’est pas : "comment donner plus de contexte à un agent?
Load knowledge into a window and it dies with the window. Give it to a specialist and it carries forward . The detection specialist does not reload the detection architecture each sessionM SK2 It already owns it, and it starts from what it worked out last timeMNK4 because last time it wrote that down as itself and not as a summary for someone elseMRK5
Une session paie ensuite pour prolonger le système, mais non pour le réaménager.
Le modèle StyloAgent
StyloAgent transforme cette structure en processus courants. Les parties :
- Vue d'ensemble : l’architecte et le coordonnateur
overview-). Il détient les trois documents vivants (spec, architectureM SK3 liste de travailMSC4 arbitrait les différends d’étendueMNK5 et détermine les routes des travaux arrivantsMMK6 Il ne fait pas le travail du domaine lui-mêmeMRK7 - Spécialistes : propriétaires de domaine.
foss-possède le moteur de détection.deploy-a la propriété de l’ouvrage-toM SK1staging-~-production pipeline .mae-a des membres et du commerce électronique.dash-etedit-détenir les voies de lecture et d’écriture du tableaux de bord.prod-détient la sécurité de la plate-forme.test-possède la suite. Chacun possède les fichiers, non les tâches . - L'autobus de message : un fichier git -backed, fileM SK3drop channel avec
inbox,outbox,archive, etsaved-context. Les messages portent une priorité et une surface à l’agentM SK1à la limite de tournement de . - Réhydratation et déshydratation : chaque agent conserve un document contextuel vivant . Il déshydrate lorsqu’il s’arrête et réhydrate quand il se réveille
- Les espaces de travail : le répertoire FOSS et le registre commercial comme un espace de travail
- Communications : une règle stricte . Restez dans votre lane. Hit a blocker in a file you donn't ownM SK3 and you stop and message
overview-plutôt que de collider avec le propriétaire.

Qu'est-ce qu'il en fait?
StyloAgent est un cockpit de bureau , construit en .NET 10 et Avalonia. Chaque spécialiste est un vrai claude Processus exécuté sur un PTY, avec son propre terminal dans la cabine de pilotage, son propre noyau de travail git , et son propre document contextuelM SK3 La cabine d’ pilotage héberge le serveur MCP que les agents appelent et le socket hook qui signale leur étatMSC4 Le produit lui-même est construit par quatre propriétairesMST5 et l’architecture se double en tant que carte de propriété Mst6
flowchart TD
operator([Human operator])
subgraph SA["Styloagent cockpit"]
cockpit[Cockpit Shell<br/>Avalonia + Dock]
bus[Coordination and Fleet<br/>Channel, Mcp, Diagrams]
session[Session and Terminal Runtime<br/>Sessions, Hooks, PTY]
repo[Git and Document Library<br/>worktrees, Lucene search]
end
agents[Agent fleet<br/>claude specialists]
fs[(Filesystem and Git<br/>durable trace + worktrees)]
operator --> cockpit
cockpit --> bus
cockpit --> session
cockpit --> repo
bus --> session
session -->|runs claude over a PTY| agents
agents -->|MCP verbs| bus
bus -->|reads and writes channel files| fs
session -->|writes context doc on dehydrate| fs
agents -->|commit in own worktree| fs
style SA fill:none,stroke:#6b7280,stroke-width:1px
style cockpit fill:none,stroke:#7c3aed,stroke-width:2px
style bus fill:none,stroke:#d97706,stroke-width:2px
style session fill:none,stroke:#2563eb,stroke-width:2px
style repo fill:none,stroke:#16a34a,stroke-width:2px
style agents fill:none,stroke:#6b7280,stroke-width:2px
style fs fill:none,stroke:#16a34a,stroke-width:3px
style operator fill:none,stroke:#6b7280,stroke-width:2px
MCP est le noyau. Le cockpit héberge un serveur MCP, et tout ce que le spécialiste fait pour coordonner est un appel d’outils MCP contre lui, non une convention ou un fichier il espère qu’un autre agent litM SK2 L’ensemble des verbes est la couche de coordination MSC3
send_message/check_inbox: Travailler sur le trajet et l’en retirer , PrioritéM SK2 Résolue.spawn_agent: un propriétaire partage un nouveau spécialiste sous son régimeclaim/heartbeat/release: serialiser l'accès à un environnement partagé (un hôte SSHM SK2 une cible de déploiement) afin que les deux agents ne se collident pasdehydrate_agent/rehydrate_agent: réserver un spécialiste et le restaurerwrap_up: essaiM SK1 fusionner , et nettoyer une branche finie.report_issue,architecture_impact,agent_color,list_fleet: déposer un blocage , visualiser le changement de conception avant qu’il ne pénètre
Le fichier-le canal de déversement sous-jacent est la trace durable de ce qui a été dit ,et non le mécanisme.Le mécanisme est le serveur MCP livrant à un agent vivant à sa limite d’arrivéeM SK3Les arbres de travail Git donnent à chaque spécialiste une arbre isolé pour s’engager dansMSC4 mais la couche MCP est ce qui les rend une flotte au lieu d’un ensemble de processus qui partagent un dossierMNK5

Comment le bus livre-t-il
send_message écrive un fichier de marquage durable dans le canal et fournit également dans ChannelDeliveryCoordinator surveille les nouveaux fichiers, garde un ensemble visible de façon à ce que chaque message soit livré exactement une fois , l’achemine aux destinataires en direct
La difficulté de l’interruption d’un message n’est pas un frein. DeliveryMode enum, une ladder d'interruption M SK1
public enum DeliveryMode
{
Interrupt, // send ESC to break the current turn, inject immediately
NextPrompt, // queue; inject when the agent next reaches idle
Poll, // not pushed; the agent checks on its own cadence
Convenient, // surfaced in the Bus HUD only
Informational, // never actioned or injected; shown as info
}
La livraison est inactive-gated and atM SK1least-onceMSC3and the acknowledgement is a observed sideMST4effectM ST5not a promiseM st6 An urgent message breaks into the current turnM St7 A normal one waits for the next idle prompt so it does not corrupt an agent midMst8thoughtMSt9
Comment la propriété est exercée
Le fait de rester dans votre lane n’est pas un système d’honneur. ownership.yaml, et un OwnershipMap réglemente tout chemin de repo-relatif au préfixe d'agent qui en est propriétaireM SK1 la plupart-la victoire mondiale spécifique :
// most-specific glob wins, so a session- carve-out inside cockpit-'s
// src/Styloagent.App/** beats the broad glob
public string? OwnerOf(string? path) { /* ... */ }
Une passerelle PreToolUse consomme ce résoluteur et empêche un agent d'écrire un fichier appartenant à un autre agent, avec des exemptions sensibles : overview- peut traverser les frontières parce qu’il arbitrait, les fichiers non appartenant à la propriété sont partagés , les sorties de construction et les essais sont exonérésM SK2 La carte est les mêmes données qui colorent le diagramme CMSC3 . L’image de qui possède ce que et l’exécution de qui détient ce que sont une source
Le cycle de docs vivant-
overview- n’est pas indépendant. Son prompt de système le place sur les rails : travaille en haut de la machine- descend dans trois couchesM SK3 et ne passe pas à l’avantMSC4
flowchart LR
spec["spec.md<br/>what the system is"]
shape["architecture.md<br/>C4 shape, owner-coloured"]
fleet["proposed-agents.yaml<br/>who owns each component"]
spec --> shape --> fleet
fleet -.->|specialists report on the bus| spec
style spec fill:none,stroke:#2563eb,stroke-width:2px
style shape fill:none,stroke:#d97706,stroke-width:2px
style fleet fill:none,stroke:#16a34a,stroke-width:2px
Préciser tout d’abord : ce que le système est , convenu avec l’être humain avant tout autre M SK2 Puis former : un seul diagramme de composants C MSC4 où chaque composant est coloré par son propriétaire visé MST5 Ensuite, la flotte МST6 un agent proposé par tête M ST7 une composante à niveau M st8 partager sa composante M St9 sa couleur M T10 Comme les spécialistes apprennent le système réel et font rapport sur l’autobus Mst11 overview- folds their findings back into the spec, reM SK1derives the shape , and adjusts the fleet. The three documents stay a live projection of the design instead of decaying into fictionMSC4
Spécialistes au lieu de tâches
La plupart des outils d’agent créent des travailleurs. Décrivez une tâche, un travailleur tourne vers l’avantM SK2 le fait-il , il disparaîtMSC4 la prochaine tâche reçoit un nouveau travailleur sans mémoire de celui qui l’a été jusqu’à présentMST5 L’expertise ne s’accumule jamais parce qu’il n’y a rien pour elle à accumuler dans la dernière
StyloAgent crée des experts. foss- n’est pas un travailleur qui a touché le moteur de détection une fois. Il s’agit du moteur de détection ' son propriétaire M SK2 et il demeure le propriétaire pendant toutes les sessions . Cette différence n’était pas cosmétique MSC4 C’est pourquoi la flotte a capté un erreur d’une tâche MST5 le travailleur basé sur MST6 aurait manqué

Les robots connus apparaissent sur le tableau de bord et sont considérés comme présentant un risque très élevé. foss- ne l’a pas fait, car foss- sachant que la projection existait déjà et qu’il savait où regarder sous-elle. Il a constaté que les bandes de risque n’apparaissent à l’amiable que lorsqu’une empreinte digitale est conservée avec un statut de réclamation vérifié , et que la méthode qui établit ce statut , UpdateClaimVerificationAsync, avait Nombre d'appels en production nul. Written and never wiredM SK1 Every fingerprint stayed unverified forever, so every known bot read as very high riskMSC3 and redeploying the projection could never have fixed itMST4
Ce diagnostic provient de la propriété accumulée. foss- a déjà mapped l’orchestre, le compositeur du verdict, et la grille de revendications dans les sessions antérieures . Le bug était invisible pour une recherche et évident pour un propriétaireM SK3
StyloAgent prouve ceci sur lui-même. L'outil est construit par sa propre flotte : cockpit- appartenant à l’Avalonia shell, bus- détient la coordination et la prestation, session- est propriétaire des PTYs et de la machine d’état de fraie, repo- propriétaire de git et de la bibliothèque des documents. Les propriétaires permanents, pas un seulM SK2 tâches prises à l’égard d’un objet . Les leçons difficiles qu’ils apprennent sont écrites dans leur contexte, ce qui les ne permet jamais de les répéter. session-' son propre document de contexte :
## HARD-WON DISCIPLINE (enforced this session, confirmed by overview-)
- Commit by explicit pathspec, atomically, in ONE command. The shared tree has ONE git
index. A bare `git commit` after `git add` lets ANOTHER agent's concurrent commit sweep
your staged files (it happened: my clipboard work landed mis-attributed in cockpit-'s 5e54207).
Un travailleur basé sur une tâche, -, frappe cette collision et le travailleur suivant la frappe de nouveau,,, car rien ne permet d’avancer la leçon. session- , comprenait pourquoi , et codait la correction comme faisant partie de qui elle est. C'est la différence entre effectuer une tâche et être un expertM SK3
Réhydratation au lieu de redécouverte
Une séance froide débute par un ritual : rechercher la base de codeM SK1 résumer ce que vous trouvez , reconstruire l’architecture, tenter de se rappeler ce qui s’est passé la dernière foisMNK4 Il peut manger la première moitié d’une sessionMRK5
Rehydratation élimine le ritual. La séquence devient : réveille l’expertM SK2 rétablit son état , poursuivre
L’État vit dans un fichier par spécialiste. C’est le contexte actualisé pour foss-, légèrement trimmée :
# foss- saved context
## Repo state
- Branch: main. My fix commit: 9b849629 (NOT pushed) - the known-bots-VeryHigh fix.
## DONE this session
- known-bots-VeryHigh fix (9b849629) - overview APPROVED, shipped:
ROOT: UpdateClaimVerificationAsync had ZERO prod callers (never wired). Every fp
stayed 'unverified' -> known bots read VeryHigh. Redeploying #115 could never fix it.
## NEXT (open, in priority order)
1. overview follow-up: add a REAL end-to-end test through the REAL store, not a double.
2. RISK display Face 1 (still OPEN): risk band missing from dashboard LIST rows.
## Guardrails
- ANY prod fingerprint-DB op = staging-first + express human go.
- CF-IP caveat: if the gateway verifies the bot against CF egress not the real client IP,
the latch never sets -> still VeryHigh.
Un nouveau foss- affiche ce qui suit et est immédiatement en vigueur. Il sait le dernier engagement, pourquoi il existeM SK2 ce qui reste ouvert , et les voies de garde qui restreignent le prochain mouvementMSC4 Aucune nouvelle découverteMST5 parce que le spécialiste l’a écrit pour son propre avenir personnelMSP6 Une règle est stricte MSV7 elle ne contient jamais un valeur secreteM SV8 qu’un indicateur vers où une personne crédible vitM Sv9
Il s’agit d’une machine à état réel, pas de métaphoreM SK1 Une session d’agent se déplace par quatre états : Unspawned, Live, Dehydrated, Exited.
flowchart LR
Unspawned[Unspawned] -->|spawn: PTY + launch prompt| Live[Live]
Live -->|write context doc, stop PTY| Dehydrated[Dehydrated]
Dehydrated -->|rehydrate: restore from context| Live
Live -->|wrap up: test, merge, cleanup| Exited[Exited]
style Unspawned fill:none,stroke:#6b7280,stroke-width:2px
style Live fill:none,stroke:#16a34a,stroke-width:2px
style Dehydrated fill:none,stroke:#d97706,stroke-width:2px
style Exited fill:none,stroke:#6b7280,stroke-width:2px
Dehydratation écrit le document de contexte et libère la PTY, pour qu’un spécialiste statiqué ne coûte rien pendant son sommeil . Rehydratation le rétablit et il est en mode de vie de nouveau M SK2 courant depuis la première tournage . Établissement est l’extrémité propre
Continuer à la partie 2
C’est le problème et le modèle. Partie 2 : Le processus de travail dans la pratique : débarrasser la flotte sur un système inconnu , travailler à travers les dépôts , pourquoi chaque décision a sa provenance M SK3 et un exemple de travail complet retiré directement du bus
Articles connexes
- Pourquoi les LLM échouent en tant que capteurs - l'erreur de catégorie de l'utilisation d'un synthétiseur probabiliste en tant que dispositif de limite
- MCP est un transport, Non une architecture - pourquoi l'architecture vit au-dessus du protocole, ne se trouve pas à l'intérieur de celui-ci
- Stylo.BotM SK1 Comment les bottes sont devenues plus intelligentes (Part 2) - le moteur de détection que cette flotte construit et exploite