53 lines
3.3 KiB
Markdown
53 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`.
|