Starke Meinungen,
im Code verankert

Jedes Projekt hat Überzeugungen. Die meisten davon existieren in den Köpfen von jemandem und sickern bei jeder Code-Überprüfung einzeln heraus. Dies sind die von Duct, aufgeschrieben, jeweils mit der Datei, die sie durchsetzt.

Duct ist ein KI-Agent, der deinen Produkt- und Growth-Stack liest und Dinge darin ändern kann. Das ist viel Vertrauen, das man von einem Tool verlangt, das man nicht selbst geschrieben hat. Daher ist die Argumentation öffentlich, und der Code, der sie stützt, auch.

Nichts von dem Folgenden ist Wunschdenken. Jedes Prinzip verlinkt auf die Datei, die es wahr macht. Wenn du eine findest, bei der der Code der Seite widerspricht, ist das ein Bug und ich hätte gerne das Issue.

01

Der Agent schlägt vor. Ein Mensch gibt frei.

Duct kann eine Änderung an deinen Live-Systemen vorbereiten: eine Kampagne pausieren, negative Keywords hinzufügen, ein GA4-Schlüsselereignis markieren. Es zeigt dir eine Vorschau und eine Sicherheitsprüfung. Dann stoppt es.

Es gibt kein Agenten-seitiges Tool zum Freigeben oder Anwenden. Kein deaktiviertes, keines hinter einem Flag. Es existiert nicht im Tool-Register, das das Modell sieht, sodass das Modell es nicht aufrufen, nicht dazu überredet werden kann, es aufzurufen, und nicht per Prompt-Injection dazu gebracht werden kann, es aufzurufen. Das destruktive Gate ist absolut: Keine Konfiguration erlaubt eine automatische Anwendung einer destruktiven Operation. Rollback ist Teil des Vertrags jedes Executors, keine nachträgliche Überlegung.

Höhere Autonomie ist eine Haltung, keine breitere Zulassungsliste. Sie ändert, wie oft der Agent dich unterbricht. Sie ändert nie, was ohne Klick angewendet werden darf.

backend/service/execution/policy.py
02

Duct mietet ein Agenten-Harness. Es heiratet keines.

Agenten-Frameworks sind die am schnellsten wechselnde, am wenigsten differenzierte Schicht in diesem Stack. Sie sind 0.x, werden wöchentlich ausgeliefert, und jedes von ihnen hat jemanden zu einer breaking migration gezwungen. Dein Produkt auf einem davon aufzubauen, ist wie das Mieten eines Fundaments.

Der Domänen-Code importiert hier also kein Agenten-Framework. Prompts, Tools, Schemas, Ziele, Scoring und der Artefakt-Vertrag sind reines Python. Framework-Importe befinden sich nur in Runnern und Bindern, und ein Test erzwingt die Grenze mit einer expliziten Zulassungsliste. Das Hinzufügen einer Datei zu dieser Zulassungsliste ist eine bewusste Handlung, nicht die Art, wie du einen fehlgeschlagenen Test behebst.

Es gibt bewusst keine AgentHarness-Schnittstelle, und es sollte auch nie eine geben. Nimm den Schnittpunkt und du verlierst Subagenten, Dateisystem, Fähigkeiten, HITL-Granularität und Kompaktierung, was der gesamte Grund ist, ein Harness zu mieten. Nimm die Vereinigung und du schreibst ein Framework.

backend/agents/core/ports/__init__.py
03

Schreibe den Adapter bei der zweiten Implementierung, nicht bei der ersten.

Ein Port mit einer Implementierung ist eine Vermutung. Ein Port mit zwei ist eine Tatsache. Abstraktionen, die vor dem zweiten Fall erstellt werden, kodieren, was auch immer der erste Fall zufällig benötigte, und danach kämpft alles gegen die Form.

Jeder Port in der Agenten-Schicht hat zwei Adapter, außer einem, und dieser eine sagt dies in seinem eigenen Docstring und benennt die Implementierung, die ihn verdienen würde. Das Benennen der Lücke verhindert, dass sie stillschweigend mit einer Vermutung gefüllt wird.

STYLE.md
04

Autorisierung ist Mitgliedschaft, und ein API-Schlüssel ist keine Grenze.

Der API-Schlüssel der App wird an den Browser gesendet. Er beweist: „Diese Anfrage kam von der Duct-App.“ Er hat nie bewiesen: „Dieser Anrufer besitzt diese Zeile“, und ihn so zu behandeln, als ob er es täte, führt zu Datenlecks in Multi-Tenant-Systemen.

Jede Route, die eine projektbezogene Zeile betrifft, löst also einen angemeldeten Benutzer und prüft die Mitgliedschaft. Ein Nicht-Mitglied erhält 404, nicht 403, da 403 ihnen sagt, dass die Zeile existiert. Ein Test durchläuft jede Route im Baum und schlägt den Build fehl, wenn eine ohne schriftlichen Grund ungesichert ist.

backend/tests/test_route_auth_boundaries.py
05

Deine Maschine, deine Schlüssel, deine Daten.

Duct läuft als Desktop-App, die das Backend als lokalen Sidecar bündelt: SQLite auf der Festplatte, nur Loopback, Anbieter-Schlüssel im OS-Schlüsselbund. Kein Konto, kein Server, nichts verlässt die Maschine. Oder hoste das Backend selbst. Oder nutze die gehostete Version auf getduct.ai, die denselben Code ausführt, den du lesen kannst.

Bringe auch dein eigenes Modell mit. Anthropic, OpenAI, Gemini oder alles auf OpenRouter, pro Job über drei Stufen zugewiesen, damit denkintensive Arbeit und günstige Zusammenfassungen nicht den gleichen Preis zahlen. Ein Tool, das dein gesamtes Geschäft liest, sollte nicht auch entscheiden, wer dein Anbieter ist.

desktop/README.md
06

Kommentare tragen das Warum. Der Diff zeigt bereits das Was.

Ein Kommentar, der die darunter liegende Zeile wiederholt, ist schlimmer als kein Kommentar, weil er Leser lehrt, Kommentare zu überspringen. Diejenigen, die es wert sind, geschrieben zu werden, tragen das, was der Code nicht kann: die Einschränkung, den Vertrag, den Fehler, der die Zeile motivierte, die abgelehnte Alternative und warum.

Dies ist in einer teilweise von Agenten geschriebenen Codebasis wichtiger, nicht weniger wichtig. Eine Reihe von einzeln vertretbaren Änderungen, die zusammen eine Architektur auflösen, ist die spezifische Art, wie Agenten-beschleunigte Codebasen scheitern: Jede Änderung argumentiert für sich selbst und nichts argumentiert für das Ganze. Die im Code hinterlassene Begründung ist das, was der nächsten Person oder dem nächsten Modell ermöglicht, den Unterschied zu erkennen.

STYLE.md
07

Von Agenten verfasste Beiträge sind willkommen. Härter geprüft, nicht weniger.

Viele Projekte verbieten stillschweigend KI-unterstützte Pull-Requests. Duct fragt das Gegenteil: Das PR-Template fragt, wo ein Agent geholfen hat, damit ein Reviewer weiß, wo er am genauesten hinschauen muss. Das ist keine Strafbank. Es ist derselbe Grund, warum du sagst, bei welchem Teil einer Änderung du dir am wenigsten sicher warst.

Duct ist ein Agentenprodukt, das mit Agenten gebaut wurde. Im Beitragsprozess so zu tun, als wäre es anders, wäre unehrlich und würde das nützlichste Signal, das ein Prüfer erhalten kann, wegwerfen.

CONTRIBUTING.md

Nicht einverstanden?

Gut. Ein Issue öffnen.

Jeder dieser Punkte ist eine Standardeinstellung mit Grund, kein Gesetz. Wenn der Grund falsch ist, ist der Grund das, was sich ändern sollte. Diese Diskussion gehört in die Öffentlichkeit.

Diskussion starten → Code lesen →