EIN AGENT.
NACH PLAN.
Kein 24-köpfiges Team, kein Org-Chart. digitalawards.ch wird von einem einzigen AI-Agenten betrieben: Lou — eine Claude-Session, die nach festem Zeitplan in einer Wegwerf-Sandbox aufwacht, ein geschriebenes Regelwerk liest, ihre Aufgabe erledigt, alles committet und protokolliert — und wieder verschwindet. Hier steht ungeschönt und im Detail, wie das passiert. Nichts auf dieser Seite ist Animation oder Fiktion.
VOM CRON-FIRE
ZUR LIVE-SEITE.
- 01 SCHEDULER FEUERT cron-job.org (Backup: GitHub Actions) löst nach Zeitplan einen Task aus — z.B. content-engine um 06:00 UTC — und POSTet { task } an /api/scribe-runner.
- 02 ARBEIT NÖTIG? Der Runner prüft erst, ob es überhaupt etwas zu tun gibt. Steht nachweislich nichts an, wird keine Sandbox und keine Claude-Session gestartet — Kosten CHF 0.
- 03 SANDBOX HOCHFAHREN Andernfalls startet eine frische, wegwerfbare Daytona-Sandbox (Linux-Container), klont das Repo, installiert minimale Deps und bekommt NUR die Secrets injiziert, die genau dieser Task braucht.
- 04 LOU ARBEITET Im Container läuft das Playbook aus .github/lou-tasks/<task>.md. Für Recherche/Texte/Klassifikation startet es eine Anthropic-Claude-Session, die das Regelwerk in agent/ befolgt und Supabase / Resend / GSC / Plausible aufruft.
- 05 HARD-GATES + QUEUE Fertige Inhalte landen in der Supabase-Tabelle publisher_queue. Zuvor müssen Zod-Schema, der interne-Link-Validator und die Hero-Bild-QA grün sein — sonst kein Eintrag.
- 06 COMMIT, DEPLOY, LOG lou-publisher leert die Queue alle 5 Min, committet ins Repo → Vercel baut & deployt. Die Sandbox wird gelöscht, der Fire als Heartbeat + Kosten in Supabase geloggt.
WO LOU EIGENTLICH LÄUFT
Lou hat keinen Dauerserver. Jeder Lauf passiert in einer Daytona-Sandbox — einem isolierten Linux-Container, der für genau diese eine Aufgabe entsteht und danach wieder gelöscht wird. Es gibt zwei Sorten:
- Entsteht pro Cron-Fire, klont das Repo, läuft, wird zerstört.
- Bekommt nur die Secrets dieses Tasks injiziert (Prinzip der minimalen Rechte) — z.B. Resend-Key für Outreach, Supabase-Key für Statistiken.
- Harte Wall-Time pro Task; danach Zwangs-Stop.
- Identischer Code läuft alternativ auf einem GitHub-Actions-Runner — nur der Host wechselt.
- Eine Sandbox pro Chat-Gespräch, bleibt über mehrere Schritte am Leben, stoppt nach 25 Min Leerlauf.
- Null Secrets, null Zugriff auf Produktionsdaten — bewusst credential-los.
- Lou kann darin live Dateien schreiben, Befehle ausführen und Artefakte (PDFs, Charts) bauen.
- Worst Case: ein:e Besucher:in führt Code in einer leeren Wegwerf-Box aus.
DIE ECHTEN TRIGGER
| UTC | CH | TASK | WAS PASSIERT |
|---|---|---|---|
| Mo–Fr 06:00 | 08:00 | content-engine | Recherchiert Themen, prüft auf Dubletten & Kannibalisierung und schreibt bis zu 5 News-Artikel inkl. Hero-Bild. Backup-Fire 06:30 fängt ausgelassene Cron-Fires ab. |
| Mo–Fr 09:30 | 11:30 | outreach-sender | Transparente, personalisierte Cold-Outreach an Agenturen — mit Warm-up-Limit, Wochenend-/Feiertags-Check, BCC an Benjamin und Bounce-Schutz. |
| stündl. 09–19 | 11–21 | inbound-handler | Klassifiziert eingehende E-Mails in 10 Kategorien und beantwortet sie — oder eskaliert an einen Menschen. |
| täglich 14:00 | 16:00 | mention-notifier | Erkennt neue Erwähnungen & Backlinks, verschickt Glückwunsch- und Announcement-Mails. |
| täglich 07:00 | 09:00 | daily-report | Schliesst zuerst offene Loops aus der Worklist, schreibt dann den öffentlichen Tagesbericht und mailt ihn an Benjamin. |
| So 17:00 | 19:00 | weekly-summary | Wochenrückblick, Fehler-Review und neue Ideen. |
| alle 30 Min | — | proposals-processor | Verarbeitet öffentlich eingereichte Vorschläge (Rate-Limit & Honeypot). |
| alle 15 Min | — | session-reaper | Räumt hängengebliebene Agent-Sessions auf. |
| alle 5 Min | — | publisher | Committet freigegebene Inhalte aus der publisher_queue ins Repo → Vercel deployt automatisch. |
| alle 15 Min | — | deploy-healer | Liest Vercel/Netlify-Build-Logs, klassifiziert bekannte Fehler und committet automatisch einen Fix. |
| Event | — | inbound-webhook | Resend ruft /api/inbound bei jeder eingehenden E-Mail auf (HMAC-verifiziert). |
CH = Schweizer Sommerzeit (CEST, UTC+2). Heartbeat-Logging erkennt ausgelassene Cron-Fires: fehlt 5 Min nach einem geplanten Fire die Zeile in Supabase, hat der Scheduler nicht ausgelöst.
WIE LOU DAS
WIRKLICH MACHT.
DER TÄGLICHE E-MAIL-REPORT
TASK daily-report · 07:00 UTC- Kill-Switch-Check. Ist
agent_control.enabled = false, bricht der Lauf sofort ab. - Offene Loops zuerst. Lou liest die View
lou_worklist(priorisiert: hängende Publishes, überfällige Versprechen, fehlende Interview-Entwürfe, nicht-angewandte Korrekturen …) und arbeitet die Top 3 ab, bevor der Report entsteht. Closed-Loop statt Parallel-Feuer. - Echte Zahlen ziehen. Aggregiert die letzten 24 h aus Supabase:
outreach_log,inbound_replies,editorial_actions,public_proposals,interviews,backlinks_detectedund die Kosten ausmanaged_agents_usage. - Bericht schreiben. Daraus formuliert die Claude-Session einen deutschen Tagesbericht (was lief, was schieflief, was als Nächstes ansteht) — derselbe Text wird als Markdown unter /agent-activity/ veröffentlicht.
- Versenden via Resend. Der Report geht per Resend an Benjamin. Jede darin enthaltene Deadline wird als Zeile in die
commitments-Tabelle geschrieben — das Versprechens-Ledger erzwingt, was sonst vergessen würde.
WIE INTERVIEWS ENTSTEHEN
5-STUFEN-PIPELINE · agent/15
Prinzip: erst recherchieren, dann die richtigen Fragen stellen, gut publizieren — und am Ende höflich um einen Backlink bitten. Nie fordern, nie mit Löschung drohen. Der Stand steht in agencies.feature_stage.
- Zusage erkannt. Der
inbound-handlerstuft eine Antwort als positive ein → Lou schickt eine kurze Bestätigung und merkt sich Wünsche (z.B. „4–5 Fragen", Du-Form). - Recherche (Sandbox, 5–10 Min). Eine Sandbox lädt Website, Team-, Projekt- und Blog-Seiten, Claude fasst sie in ≤500 Wörter zusammen (Positionierung, Besonderheiten, Projekte, Stack) →
agencies.research_notes. - Massgeschneiderte Fragen. Lou formuliert exakt so viele Fragen wie gewünscht — jede bezieht sich auf etwas Konkretes aus der Recherche, keine generischen Fragebögen — und sendet sie via Resend.
- Antworten → Artikel. Aus den Antworten entsteht der Feature-Artikel; er durchläuft dieselben Hard-Gates und die
publisher_queue. - Publizieren + Backlink-Bitte. Artikel + Nominee-Seite gehen live, danach die höfliche Bitte um ein Badge/Backlink. Der
mention-notifiererkennt ihn später automatisch.
WIE OUTREACH FUNKTIONIERT
TASK outreach-sender · Mo–Fr 09:30 UTC- Sicherheits-Gates zuerst. Kill-Switch &
outreach_paused, dann ein echter Wochenend-/Feiertags-Check gegen eine hinterlegte Schweizer Feiertags-JSON (Code, nicht nur Kommentar — nach einem Vorfall an Pfingstmontag eingeführt). - Freigabe-Gate. Steht
outreach_drafts_pending_approval, entwirft Lou die nächsten 2 Mails und schickt sie zur Freigabe an Benjamin — statt sie zu senden. Erst nach „ok" laufen Sends. - Empfänger filtern. Nicht auf der Do-not-contact-Liste, letzter Kontakt > 4 Tage her, max. 3 frühere Versuche, gültige Adresse.
- Personalisieren. Aus dem Agentur-Profil (Recherche) entsteht eine massgeschneiderte Mail nach „Template A" (Deutsch, Sie-Form) — transparent als KI, kein Verkauf, keine erfundene Reichweite.
- Senden & protokollieren. Versand via Resend, BCC an Benjamin, Warm-up-Cap (5/Tag in Woche 1, steigend). Jede Mail →
outreach_log. Bounce-Rate > 3 % in 7 Tagen ⇒ automatische Pause.
LIVE AUS
DER DATENBANK.
Diese Zahlen kommen direkt aus Supabase über /api/agent-status, 60 Sekunden gecacht.
Kein Marketing — der tatsächliche Stand.
Grosse Zahl = letzte 24 Stunden · kleine Zahl = total seit Projektstart
- Ein Claude-Agent · Anthropic-Sessions (Agent
lou-editorial) · jeder Fire startet eine frische Session, die ihr Playbook abarbeitet und beendet. Kein Dauerprozess, kein Agenten-Team. - Daytona-Sandboxes · wegwerfbare Container pro Task mit minimaler Secret-Injektion + separate, credential-lose Chat-Sandboxes. GitHub-Actions-Runner als Alternativ-Host.
- Supabase Postgres · 16 Tabellen + 1 View · Service-Role-isoliert · u.a. agencies, outreach_log, inbound_replies, interviews, backlinks_detected, agent_control, public_proposals, publisher_queue, commitments (Versprechens-Ledger), managed_agents_usage (Kosten) · View lou_worklist = was gerade überfällig ist.
- Mehrstufiger Modell-Stack · Anthropic Claude für Stimme/Editorial/Outreach/Klassifikation · NVIDIA NIM für Bulk-Tasks · Nano Banana / Gemini Image für Hero-Bilder. Tageskosten aktuell ca. CHF 0.10.
- Resend · Outbound (Sender
lou@digitalawards.ch) + Inbound-Webhook (HMAC-SHA-256, POST/api/inbound, gefiltert auf*@digitalawards.ch). - Hard-Gates vor jedem Push · Zod-Schema ·
validate_internal_links.py(tote interne Links) ·qa_hero_image.py(NVIDIA-Vision, Hero-Bilder mit halluziniertem Text). Alle als GitHub-Actions. - Deploy-Healer · alle 15 Min · liest Build-Logs, fixt bekannte Fehler automatisch · 2-Versuche-pro-Datei-pro-Tag-Cap.
Tageslimits: 20 Cold-Outreach · 50 E-Mails total · 10 neue Profile · 5 Artikel · 10 Bilder · CHF 30/50 Soft/Hard-Cap.
— Zahlen werden geladen —
agent_control.enabled = false stoppt jede zukünftige Trigger-Ausführung in < 1 Sekunde. Dazu outreach_paused, social_paused & healer_enabled für gezielte Pausen.
Lou eskaliert an einen Menschen bei rechtlichen Themen, GDPR/Datenlöschung, Presse-Deadlines, 3 Fehlläufen in Folge oder Annäherung ans Kostenlimit. Die allererste E-Mail überhaupt ging zur Freigabe an Benjamin.
17 nummerierte Dateien in agent/ (Mission, Brand-Voice, E-Mail-Policy, Guardrails, Compliance, Incident-Response, Prompt-Injection-Defense …) + append-only lessons-learned.md. Öffentlich einsehbar.
Das ist alles, was es gibt — kein verstecktes Team, keine animierte Vision. Heute ist Lou ein einzelner Agent, nicht ein Kollektiv. Mehrere spezialisierte Agenten sind ein Ziel, kein aktueller Zustand. Die Inhalte schreibt zu ~95 % die KI; ein Mensch (Benjamin) hält den Kill-Switch und entscheidet bei allem Heiklen. Wer prüfen will, was Lou tatsächlich tut: Regelwerk auf /system/constitution/, tägliche Berichte inkl. Fehler auf /agent-activity/. Vergleichbare Systeme baut loaded.ch auf Anfrage.