Anvil CoderAnmelden

Unter der Haube

Wie das System gebaut ist

Anvil Coder ist eine hexagonal aufgebaute Anwendung aus zwei Deployables: einem Coordinator, der den Ausführungsgraphen hält, und Workern, die die atomaren Arbeitsschritte abarbeiten — die Worker-Seite ist waagerecht ausgelegt und nimmt beliebig viele nebeneinander auf. Verbunden sind sie über NATS JetStream, eine dauerhafte Warteschlange — kein Arbeitsschritt geht verloren, wenn ein Worker ausfällt.

Warum hexagonal

Die fachliche Logik kennt weder Datenbank noch Sprachmodell noch Warteschlange. Sie spricht ausschliesslich über Ports; die Anbindungen liegen aussen als Adapter. Das klingt nach Lehrbuch und hat einen sehr praktischen Grund: das Sprachmodell ist austauschbar, ohne dass die Fachlogik davon erfährt.

Für einen Käufer heisst das: die Abhängigkeit von einem einzelnen Anbieter liegt an einer Stelle, nicht verteilt über die Codebasis.

Die Bausteine

Coordinator
Hält den Ausführungsgraphen, verteilt die Slices und führt die Ergebnisse zusammen. Er ist die einzige Stelle, die den Gesamtplan kennt.
Worker
Nimmt genau einen TaskSlice, führt einen AI-Prompt aus, validiert und committet. Die Bauweise erlaubt beliebig viele nebeneinander; wie viele wirklich laufen, ist eine Frage der Betriebsart.
NATS JetStream
Die dauerhafte Warteschlange dazwischen. Ein Slice geht nicht verloren, wenn ein Worker ausfällt — er wird erneut zugestellt.
query-svc
Ein zweiter Betriebsmodus desselben Images für Lesezugriffe. Ansichten überleben dadurch einen Neustart des Coordinators.

Waagerecht zu skalieren ist eine Eigenschaft des Zuschnitts, keine Aussage über den heutigen Betrieb: solange ein Worker seinen Arbeitsbaum im eigenen Pod hält, fährt der betriebene Dienst genau einen. Mehr Durchsatz heisst deshalb zuerst, den Arbeitsbaum aus dem Pod zu lösen — und erst danach die Obergrenze anzuheben.

Womit es gebaut ist

Java 25 und Spring Boot 4 bilden den Fachkern, Angular mit Signals das Cockpit und Astro diesen statisch ausgelieferten Auftritt. PostgreSQL hält Projekte und Konfiguration, MongoDB den append-only Audit-Verlauf, Redis kann den verteilten Laufzustand übernehmen und NATS JetStream ist die dauerhafte Warteschlange zwischen Coordinator und Worker. Kubernetes und Flux CD liefern den betriebenen Dienst aus; Keycloak, nginx, Prometheus, Grafana und Tempo decken Identität, Edge und Observability ab.

Werkzeuge und Schnittstellen

Die Git-Integration läuft über JGit. Verbunden wird über die bestätigte GitHub-App-Installation der Organisation, für GitLab über OAuth 2.0 mit PKCE (heute gitlab.com), für Bitbucket Cloud über OAuth 2.0. Die KI-Schicht kapselt Anthropic, Claude CLI beziehungsweise agent-service und OpenAI-kompatible Anbieter wie OpenAI, Groq, Gemini, Mistral und Ollama hinter einem gemeinsamen Port. Drei optionale, read-only MCP-Server liefern YouTrack-, GitHub- und kuratierten Dokumentationskontext tenant-isoliert an den Agenten.

Die öffentliche Dokumentation enthält die freigegebenen Konzepte und Anleitungen; interne Betriebs-Runbooks und Zugangsdaten werden nicht veröffentlicht.

Zwei Achsen, die sich kreuzen

Phasen laufen nacheinander und haben Gates — REQUIREMENTS, ARCHITECTURE, IMPLEMENTATION, RECONCILIATION, TEST, VERIFY, DOCUMENTATION, CONSISTENCY; zwei davon sind zuschaltbar (RECONCILIATION und VERIFY) — im Auslieferungszustand aus, im betriebenen Dienst eingeschaltet.TaskSlices laufen innerhalb einer Phase parallel.

Diese Trennung ist der Kern: die Reihenfolge bleibt gewahrt, wo sie fachlich zählt, und fällt weg, wo sie nur bremst. Ein Projekt entsteht nicht schneller, weil jemand schneller tippt, sondern weil mehr gleichzeitig entsteht.

Was passiert, wenn etwas ausfällt

Ein Slice gilt erst als erledigt, wenn sein Ergebnis committet ist. Fällt ein Worker vorher aus, wird der Slice erneut zugestellt. Bleibt ein Slice unbestätigt liegen, zählt er als Bedarf, und ein Worker wird nachgezogen (zuschaltbar).

Die Lesezugriffe laufen über einen eigenen Betriebsmodus desselben Images. Ein Neustart des Coordinators nimmt deshalb niemandem die Sicht auf laufende Aufträge.