New self-hosted admin trigger board: board-agent.nix wires up a small Python worker/trigger pair behind an internal Traefik route, backed by a static board.html frontend, with AdGuard rewrite for the new internal hostname. Intent doc captures the design rationale. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CAtPBFEBx3C2QJy6sKGyqd
134 lines
6.8 KiB
Markdown
134 lines
6.8 KiB
Markdown
# Intent: Kanban-Board mit Pilot-Übergang zum Admin-Agenten
|
|
|
|
## Ziel
|
|
|
|
Ein eigenständiges, ausschließlich auf blunix laufendes Kanban-Board, das
|
|
den Intent-Lifecycle (Planner-Dokumente aus `docs/intent/*.md`)
|
|
visualisiert und für einen einzelnen Phasenübergang aktiv steuerbar ist:
|
|
Wird eine Intent-Karte von "Geplant" nach "In Umsetzung" verschoben,
|
|
löst das Board direkt einen echten Auftrag an den Admin-Agenten aus
|
|
(headless `codex exec` mit `agents/admin.md` als Rolle und dem
|
|
Intent-Dokument als Auftragstext) — kein manuelles Abtippen im Chat
|
|
mehr für diesen einen Übergang.
|
|
|
|
## Umfang
|
|
|
|
- Neuer, eigenständiger Stack ausschließlich auf **blunix** (kein Bezug
|
|
zum bestehenden `dashboard`-Repo/pinix, keine Änderung daran).
|
|
- Board zeigt Spalten entlang des bestehenden Rollen-Workflows:
|
|
Idee/Backlog → Geplant (Intent fertig) → In Umsetzung → Review →
|
|
Deployed.
|
|
- Aktiv steuerbar ist **nur** der eine Pilot-Übergang Geplant → In
|
|
Umsetzung. Alle anderen Spaltenwechsel sind zunächst reine
|
|
Anzeige/manuelle Einordnung ohne Automatisierung.
|
|
- Zugriff **Tailnet-only** über blunix' internen Traefik-Entrypoint,
|
|
kein öffentlicher Zugriff.
|
|
- Der Agenten-Aufruf läuft **headless** (`codex exec`, kein interaktives
|
|
Herdr-Pane) und nutzt das bestehende **Abo-Login** (`CODEX_HOME` aus
|
|
vorhandenem `auth.json`, kein `ANTHROPIC_API_KEY`/roher API-Key) —
|
|
Kosten sollen aus dem Abo-Kontingent laufen, nicht als separates
|
|
Pay-per-Token abgerechnet werden.
|
|
- Lauf-Ausgabe muss nachvollziehbar sein: mindestens über
|
|
`journalctl` des auslösenden Dienstes, optional zusätzlich als kurze
|
|
Statusmeldung im bestehenden XMPP-Raum `update@muc.0ff.space`.
|
|
|
|
### Unverbindlicher technischer Anhaltspunkt (keine Vorwegnahme der Umsetzung)
|
|
|
|
Diskutierter Mechanismus, als Orientierung für die Umsetzung, nicht als
|
|
bindende Vorgabe — folgt bewusst dem bereits produktiv laufenden Muster
|
|
von `hosts/blunix/localServices/agent-codex/`:
|
|
|
|
1. Board-Frontend sendet bei Drag "Geplant → In Umsetzung" einen
|
|
HTTP-Request an einen kleinen Trigger-Endpunkt auf blunix.
|
|
2. Der Endpunkt prüft den aktuellen Phasen-Status (verhindert
|
|
Doppel-Trigger), setzt ihn auf "In Umsetzung" und legt eine
|
|
Job-Datei in einem Queue-Verzeichnis ab (z. B.
|
|
`/var/lib/board-agent/inbox/<slug>-<zeitstempel>.json`), analog zu
|
|
`AGENT_QUEUE_DIR`/`inbox/*.json` bei `agent-codex`.
|
|
3. Ein `systemd.paths`-Unit beobachtet dieses Verzeichnis und startet
|
|
bei neuer Datei einen Oneshot-Service (analog
|
|
`agent-codex-worker.path`/`.service`).
|
|
4. Der Oneshot-Service kopiert/nutzt das bestehende Abo-Login
|
|
(`prepareCodexHome`-Muster) und ruft `codex exec --sandbox
|
|
workspace-write -C agents/ --add-dir /home/drone/nixos-config ...`
|
|
mit `agents/admin.md` als Rolle auf, Intent-Inhalt als Auftrag.
|
|
5. Job-Datei wandert nach Abschluss von `inbox/` nach `processing/` und
|
|
`done/`/`failed/`, wie bei `agent-codex` bereits etabliert.
|
|
6. Ausgabe landet in `journalctl`, optional zusätzlich als kurze
|
|
Meldung an `update@muc.0ff.space`.
|
|
7. Die eigentliche Code-/Konfigurationsänderung wird **nicht**
|
|
automatisch committet oder deployt — das bleibt an eine
|
|
ausdrückliche, separate Freigabe gebunden, unverändert gegenüber der
|
|
heutigen Admin-Rolle.
|
|
|
|
## Explizit ausgeschlossen
|
|
|
|
- Kein Aufbau auf/Integration mit Vikunja (bewusst separat, nicht
|
|
dessen Kanban-Ansicht/API genutzt).
|
|
- Keine Automatisierung der Übergänge In Umsetzung → Review → Deployed
|
|
in diesem Vorhaben.
|
|
- Keine Änderung an `agents/admin.md`, `agents/catalog.json` oder
|
|
Rollen-Settings-Dateien als Teil dieses Intents (falls die Umsetzung
|
|
das doch braucht, ist das eine separate Entscheidung der Umsetzung,
|
|
nicht hier vorweggenommen).
|
|
- Keine Änderung am bestehenden `dashboard`-Repo/pinix-Stack.
|
|
- Kein öffentlicher Zugriff auf das Board.
|
|
- Keine automatische Aktivierung/Deployment von Änderungen, die der
|
|
Admin-Agent im Zuge des Pilot-Laufs vornimmt.
|
|
- Kein Einsatz eines rohen API-Keys (`ANTHROPIC_API_KEY` o. Ä.) für den
|
|
Agenten-Aufruf.
|
|
|
|
## Annahmen
|
|
|
|
- Herdr läuft aktiv auf der dauerhaften Admin-Session auf blunix
|
|
(`HERDR_ENV=1`) — für diesen Piloten aber irrelevant, da der
|
|
Agenten-Aufruf bewusst **nicht** über Herdr läuft (siehe Entscheidung
|
|
unten), sondern headless direkt per `codex exec`.
|
|
- Zugriff Tailnet-only via blunix-Traefik-internal, analog zum
|
|
bestehenden Muster interner Dienste.
|
|
- Der Backend-/Worker-Mechanismus liest `docs/intent/*.md` aus dem
|
|
bestehenden `nixos-config`-Checkout auf blunix (kein separates Repo
|
|
für Intent-Inhalte).
|
|
- Headless-Aufruf über bestehendes Abo-Login (wie bei `agent-codex`)
|
|
zieht gegen das Abo-Nutzungskontingent, nicht als separates
|
|
Pay-per-Token — Stand der Recherche zum Zeitpunkt dieses Dokuments;
|
|
ein bekannter, nicht abschließend geklärter Bugreport
|
|
(`anthropics/claude-code#43333`) beschreibt Fälle, in denen
|
|
OAuth/Abo-Login trotzdem als API-Nutzung abgerechnet wurde.
|
|
|
|
## Offene Risiken / zu klärende Punkte (für die Umsetzung, nicht hier entschieden)
|
|
|
|
- **Vor Produktivschaltung: ein einzelner echter Testaufruf**, um zu
|
|
verifizieren, dass der headless-Aufruf tatsächlich gegen das
|
|
Abo-Kontingent und nicht gegen echtes API-Guthaben läuft (wegen des
|
|
oben genannten Bugreports) — gleiches Vorgehen wie beim früheren
|
|
XMPP-Agent-Relay-Vorhaben.
|
|
- Wo der Phasen-Status pro Intent gespeichert wird (Frontmatter in der
|
|
Intent-Datei vs. separate State-Datei/DB) — bewusst offengelassen.
|
|
- Wer im Board die Aktion auslösen darf (nur Owner vs. jede Person mit
|
|
Tailnet-Zugriff) — Zugriffsschutz noch nicht spezifiziert.
|
|
- Das Vorgehen umgeht für den Piloten bewusst die in `agents/admin.md`
|
|
beschriebene Regel, dass der Orchestrator die einzige
|
|
Dialogschnittstelle zu Spezialisten ist — explizit benannte
|
|
Abweichung, keine stille Umgehung. Ob/wie das dauerhaft mit der
|
|
Rollen-Architektur vereinbart wird, ist nicht Teil dieses Intents.
|
|
- Exaktes Job-/Queue-Schema, Locking bei parallelen Triggern,
|
|
Fehlerbehandlung bei einem abstürzenden/unterbrochenen Lauf (z. B.
|
|
durch einen Deploy, der den Worker-Dienst neu lädt) — Sache der
|
|
Umsetzung, analog zu den bereits gelösten Fällen in `agent-codex`.
|
|
|
|
## Erfolgskriterien
|
|
|
|
- Eine fertige Intent-Karte lässt sich im Board von "Geplant" nach "In
|
|
Umsetzung" ziehen.
|
|
- Dieses Verschieben löst nachweisbar einen tatsächlichen, headless
|
|
laufenden Auftrag an den Admin-Agenten mit dem Intent-Inhalt als
|
|
Prompt aus — verifizierbar über `journalctl` des Worker-Dienstes.
|
|
- Der Aufruf läuft nachweislich über das Abo-Kontingent, nicht über
|
|
separates Pay-per-Token (verifiziert durch den Testaufruf aus den
|
|
offenen Risiken oben).
|
|
- Board läuft ausschließlich Tailnet-erreichbar, kein öffentlicher
|
|
Zugriff.
|
|
- Keine bestehende Funktionalität (Planner-Workflow per Chat,
|
|
`dashboard`-Repo, Vikunja, `agent-codex`) wird durch dieses Vorhaben
|
|
verändert oder beeinträchtigt.
|