54 lines
3.3 KiB
Markdown
54 lines
3.3 KiB
Markdown
|
|
# Nacht-Agent
|
|||
|
|
|
|||
|
|
Arbeitet einmal pro Nacht (01:00 Uhr, `kc-night-agent.timer`) offene Plane-Tickets mit dem Label
|
|||
|
|
**„agent“** ab, in den Status Backlog oder Todo. Ergebnis ist **immer** ein Branch auf der Forge
|
|||
|
|
(`https://forge.flessinghome.de/flessinglabs/kundencenter`), bei Erfolg zusätzlich ein Pull
|
|||
|
|
Request und Ticket-Status „In Review“. **Nichts wird automatisch gemergt oder live geschaltet** –
|
|||
|
|
das bleibt bei der morgendlichen Durchsicht durch den Assistenten bzw. den Nutzer.
|
|||
|
|
|
|||
|
|
## Absicherung
|
|||
|
|
Der Agent läuft als Betriebssystembenutzer `kundencenter` (systemd-Dienst `kc-night-agent.service`,
|
|||
|
|
zusätzlich `ProtectSystem=strict`/`ProtectHome=true`, nur `/var/lib/kundencenter/night-agent`
|
|||
|
|
beschreibbar). Dieser Benutzer:
|
|||
|
|
- hat kein `sudo`, kann also kein `systemctl restart` und keine Dienste anfassen,
|
|||
|
|
- kann `/etc/kundencenter/*` nicht lesen (root:root, chmod 600) – keine Geheimnisse erreichbar,
|
|||
|
|
- arbeitet in einer **eigenen frischen Arbeitskopie** (`/var/lib/kundencenter/night-agent/work`),
|
|||
|
|
niemals in `/srv/kundencenter` selbst.
|
|||
|
|
|
|||
|
|
Zusätzlich bekommt jeder Lauf feste Leitplanken als System-Prompt
|
|||
|
|
(`ops/night-agent-guardrails.md`): ein Ticket = ein Branch, Tests müssen grün sein, keine
|
|||
|
|
Vermutungen bei fehlenden Zugangsdaten, kein Aufräumen außerhalb des Tickets.
|
|||
|
|
|
|||
|
|
## Ablauf je Ticket
|
|||
|
|
1. Plane-Status → „In Progress“, Kommentar mit Branch-Namen.
|
|||
|
|
2. `claude -p` mit Ticket-Text + Leitplanken, Budget-Deckel (`--max-budget-usd`, Standard 3 $),
|
|||
|
|
Zeit-Deckel (Standard 45 Min./Ticket, insgesamt max. 150 Min./Nacht).
|
|||
|
|
3. Unabhängig vom Agenten prüft das Skript selbst: `pnpm install && pnpm build && pnpm typecheck
|
|||
|
|
&& pnpm test` (Tests laufen automatisch gegen eine frische `kundencenter_test`, nie gegen die
|
|||
|
|
produktive Datenbank).
|
|||
|
|
4. Grün + Agent meldet `AGENT_STATUS: ok` → Branch pushen, Pull Request eröffnen, Plane-Status
|
|||
|
|
„In Review“, Kommentar mit PR-Link.
|
|||
|
|
5. Rot, oder Agent meldet `AGENT_STATUS: blocked`, oder keine Änderungen → Branch wird trotzdem
|
|||
|
|
gepusht (nichts geht verloren), aber **kein** Pull Request; Kommentar in Plane beschreibt das
|
|||
|
|
Problem. Status bleibt unverändert (kein automatisches „Wartet auf Input“, das entscheidet der
|
|||
|
|
Mensch nach Lektüre des Kommentars).
|
|||
|
|
|
|||
|
|
## Einrichtung
|
|||
|
|
- `/etc/kundencenter/night-agent.env` (chmod 600, root): `ANTHROPIC_API_KEY` (eigener, vom
|
|||
|
|
interaktiven Zugang getrennter Schlüssel – siehe unten) sowie optionale Stellschrauben
|
|||
|
|
(`NIGHT_AGENT_MAX_TICKETS`, `NIGHT_AGENT_BUDGET_USD`, `NIGHT_AGENT_DEADLINE_MIN`,
|
|||
|
|
`NIGHT_AGENT_TICKET_TIMEOUT_MIN`).
|
|||
|
|
- `/etc/kundencenter/forge.env`: `FORGE_URL`, `FORGE_REPO` (`flessinglabs/kundencenter`),
|
|||
|
|
`FORGE_TOKEN`.
|
|||
|
|
- Plane-Label „agent“ muss auf ein Ticket gesetzt sein, damit der Agent es aufgreifen darf.
|
|||
|
|
- Aktivieren: `systemctl enable --now kc-night-agent.timer`. Einmalig von Hand testen:
|
|||
|
|
`systemctl start kc-night-agent.service` (Logs: `journalctl -u kc-night-agent` sowie
|
|||
|
|
`/var/lib/kundencenter/night-agent/logs/`).
|
|||
|
|
|
|||
|
|
## Bekannte Grenzen
|
|||
|
|
- `kundencenter_test` wird bei jedem `pnpm test` neu angelegt (siehe `apps/api/test/global-setup.ts`)
|
|||
|
|
– Agent-Lauf und ein manueller Testlauf am Tag sollten sich nicht überschneiden.
|
|||
|
|
- Der Agent öffnet nie mehr als `NIGHT_AGENT_MAX_TICKETS` Pull Requests pro Nacht.
|
|||
|
|
- Kein Zugriff auf Anbieter-Testzugänge (z. B. KeyHelp, KCS) – bei Tickets, die das brauchen,
|
|||
|
|
meldet der Agent `blocked`.
|