Nicht als Metapher. Ein Kortix-Projekt ist ein Git-Repo, und dieses Repo ist das Unternehmen: seine Agenten, die von ihm entwickelten Skills, alles, was es gelernt hat, und die Definition der Maschinen, auf denen all das läuft. Versioniert. Als Diff darstellbar. Vollständig in deinem Besitz.
skill: reconcile-invoices – teilweise Rückerstattungen behandeln
skills/reconcile-invoices/SKILL.md
9f4c2b7e → main · von invoice-clerk geöffnet
kortix.yaml ist die Kortix-Ebene: die Maschine, auf der Sitzungen starten, die Connectoren, Trigger, Secret-Namen und was jeder Agent berühren darf. Die OpenCode-Konfiguration ist die Laufzeit, in der die Agenten denken. Alles darüber hinaus sind Dateien im Repo.
# Schema-Version 2. Die Laufzeit ist OpenCode.kortix_version: 2runtime: opencode project: name: Northwind # Der Agent, der antwortet, wenn keiner angegeben ist.default_agent: kortix # Speicherort der Laufzeitkonfiguration. Danach: Dateien.opencode: config_dir: harnesses/opencode # Nur Secret-NAMEN. Die Werte werden auf der# Plattform verschlüsselt und beim Start der Maschine injiziert.env: required: [STRIPE_API_KEY] optional: [LINEAR_API_KEY] # Die Maschine, auf der eine Sitzung startet.sandbox: default: python templates:- slug: python image: python:3.12-slim cpu: 2 memory: 4 # Zugriff auf die Außenwelt. Die Definition liegt in# git. Die Zugangsdaten niemals.connectors:- slug: gmail-read provider: pipedream app: gmail authorization_strategy: user # Governance: worauf jeder Agent zugreifen darf – niemals, was# er sagt. Eine ausgelassene Freigabe wird zu none aufgelöst.agents: kortix: connectors: all secrets: all skills: all kortix_permissions: all invoice-clerk: sandbox: python connectors: [gmail-read] secrets: [STRIPE_API_KEY] skills: [reconcile-invoices] kortix_permissions: [project.cr.open]Die Kortix-Ebene – eine Datei im Stammverzeichnis des Repos.
{ // Docs: https://opencode.ai/docs/ "$schema": "https://opencode.ai/config.json", "theme": "system", "default_agent": "kortix", // Die Sitzung läuft bereits auf einer isolierten Maschine auf einem // Wegwerf-Branch, damit der Agent völlig offen startet. // Hier pro Tool einschränken, wenn du eine strengere // Richtlinie möchtest. "permission": "allow"}Die Laufzeit – Modelle, Tools, Berechtigungen.
---description: Gleiche Rechnungen mit Zahlungen ab.mode: primarypermission: bash: ask--- Du bist der Rechnungsprüfer von Northwind. Ordne jede Zahlung anhand der Rechnungsnummer zu, niemalsanhand des Betrags. Wenn das nicht möglich ist, erstelle eine Änderungsanfrageund sage genau, was du nicht abgleichen konntest.Der Agent – eine standardmäßige OpenCode-Agentendatei. Was darin steht, gilt hier.
Welche Maschine, welche Konnektoren, welche Secrets, welche Skills, welche CLI-Verben. Nur Governance. Fehlt eine Gewährung, wird sie zu keiner: Ein Agent erhält genau das, was du ihm gegeben hast, und nichts weiter.
Prompts, Modelle, Tools, Plugins und Berechtigungen. Ein Agent ist ein standardmäßiger OpenCode-Agent – Markdown als Grundlage und darüber hinaus die Tools, Plugins und die Modellkonfiguration in seiner Umgebung im selben Repo. Lies das Verzeichnis, und du weißt genau, was dieser Agent tun wird.
Das Manifest nennt Secrets und gewährt sie pro Agent. Die Werte werden auf der Plattform verschlüsselt, zur Laufzeit in die Maschine injiziert und niemals ins Repo oder in die Logs geschrieben.
Agenten, Skills und Memory sind keine Zeilen in einer Datenbank, die du nicht sehen kannst. Sie sind Markdown-Dateien neben deinem Code, werden in jede Session geklont, sind für Menschen lesbar und können von einem Agenten bearbeitet werden.
Es gibt keine verborgene Ebene, zu der du Fragen stellen musst. Jede Überzeugung, jede Berechtigung und jede Anweisung ist eine Zeile in einer Datei, und die Tools, die du bereits verwendest, liefern die Antwort.
# Was glaubt das Unternehmen über Preise?$ grep -ri "annual" memoryMEMORY.md: annual erst nach der Sicherheitsprüfung nennen # Wer darf den Stripe-Schlüssel verwenden?$ grep -n "STRIPE_API_KEY" kortix.yaml18: erforderlich: [STRIPE_API_KEY]48: geheimnisse: [STRIPE_API_KEY] # Wer hat den Rechnungsprüfer wann geändert?$ git log --oneline agents/8f2a1c4 invoice-clerk: keine Rückerstattungen mehr erraten1d90b73 invoice-clerk: erster Entwurf der PersonaJeder Agenten-Prompt, jeder Skill, jede gespeicherte Tatsache und jede Gewährung ist Text in einem Repo. Keine Konsole zum Durchklicken, kein Export, den du anfordern musst.
Jede Änderung an einer Agenten-, Skill- oder Memory-Datei ist ein Commit mit Autor, Zeitstempel und Diff. Nichts verschwindet und nichts geschieht im Verborgenen.
Ist am Dienstag eine schlechte Anweisung hinzugekommen? Lies den Diff, setze den Commit zurück und öffne eine Änderungsanfrage. Das Unternehmen kehrt zu seinem vorherigen Zustand zurück.
Wenn ein Agent eine bessere Vorgehensweise entwickelt, merkt er sie sich nicht heimlich. Er bearbeitet den Skill, committet ihn in seinem eigenen Branch und öffnet eine Änderungsanfrage. Ein Mensch liest den Diff und entscheidet.
## Eine Zahlung einer Rechnung zuordnen 1. Rechnung anhand der Nummer abrufen, niemals anhand des Betrags.2. Bei abweichenden Beträgen zur Prüfung durch einen Menschen markieren.2. Wenn die Differenz mit einer bereits erfassten Rückerstattung übereinstimmt, als teilweise Rückerstattung schließen und die Rückerstattungs-ID auf der Rechnung vermerken.3. Bei jeder anderen Ursache die Zahlung zur Prüfung durch einen Menschen markieren und angeben, was du geprüft hast. Niemals selbst eine Rückerstattung ausstellen.Wenn ein Agent seine eigenen Anweisungen umschreibt, geschieht das genauso wie bei einer Datenbankmigration: Branch, Commit, Diff, Prüfer. Das Unternehmen hat einen Prüfprozess, nicht zwei.
Die Maschine kann Vorschläge machen. Ein Mensch entscheidet. Arbeit erreicht main nur über eine von jemandem genehmigte Änderungsanfrage – so kann das Unternehmen nicht unbemerkt abdriften.
Ein Agent kann seine eigene Konfiguration lesen, bearbeiten und die Änderung vorschlagen. Lege das nach einem Zeitplan fest, und das Repo wird besser darin, dein Unternehmen zu sein, während alle schlafen.
agents: memory-reflector: # darf eine Änderungsanfrage öffnen. Sonst nichts. kortix_permissions: [project.cr.open] triggers:- slug: memory-reflectorname: Memory-Reflektor type: cron agent: memory-reflector enabled: falsecron: "0 0 3 * * *" timezone: UTC prompt: | Reflektiere über die letzten 24 Stunden der Projekt- aktivität. Prüfe die Git-Historie, gemergte Änderungs- anfragen und Session-Zusammenfassungen. Aktualisiere memory/ und öffne eine Änderungsanfrage mit dem Titel `memory: ...`. Beende die Ausführung ohne eine Anfrage, wenn kein dauerhaftes Wissen vorhanden ist.Aus der Startervorlage. Jedes neue Projekt wird damit ausgeliefert, standardmäßig deaktiviert.
Setze enabled auf true, und der Trigger wird um 03:00 UTC ausgelöst, ohne dass jemand zusieht. Trigger sind Cron-Zeitpläne und signierte Webhooks, die in derselben Datei wie alles andere deklariert werden.
Er erhält seinen eigenen Cloud-Computer und seinen eigenen Branch – mit genau der einen Gewährung aus dem Manifest: der Berechtigung, eine Änderungsanfrage zu öffnen.
Er liest die Git-Historie und die Sessions des letzten Tages und schreibt dann seine Erkenntnisse als reines Markdown in memory/.
Morgens wartet eine Änderungsanfrage auf dich. Merge sie, und das Unternehmen weiß etwas Neues. Schließe sie, und nichts ist geschehen.
Kein Exportprozess, kein Support-Ticket, kein proprietäres Format, das du entschlüsseln musst. Das Unternehmen ist bereits Text in einem Branch – es lässt sich klonen, forken und zurücksetzen, und du kannst es mitnehmen.
# jedes Verzeichnis in ein Kortix verwandeln$ kortix init # prüfen, ob es kompiliert, nach fehlenden Secrets fragen,# hochladen und alles live schalten$ kortix ship # ab hier ist es einfach ein Repo$ git clone git@github.com:northwind/northwind.git$ git revert 8f2a1c4$ kortix crBeginne mit einer Aufgabe und wachse von dort aus.