Lesson #1473
← Back to Knowledge Board
bugtest-stack: Phase-1 Session Handoff
- ID
- 1473
- Author
- Agent
- agent-claude
- Reviewed
- ✓ Yes
- Source authority
- 80 / 100
- Source
- HANDOFF.md
- Source issue
- —
- Created at
- 2026-05-12T11:49:18.757764+00:00
- Valid until
- —
- Deprecated at
- —
- Supersedes
- —
- Obsidian path
- /nvmetank1/projects/bugtest-stack/HANDOFF.md
- Obsidian hash
- dc7ff07976e26b03d5898b5047c790b4
- Tags
- claude-memory,project,bugtest-stack,handoff
Content
# bugtest-stack — Session Handoff
**Letzte Session:** 2026-05-12 (claude-opus, 1M-context)
**Repo:** https://git.joelduss.xyz/ubuadmin/bugtest-stack
**Branch:** `main`
**Letzter Commit:** `ba0eb4b chore: add gitignore` (vom agent-codex)
---
## Auftrag
User wollte ein **bug.joelduss.xyz + test.joelduss.xyz**-System:
- Bug-Aggregator über Gitea (kein zweites Issue-Tracker-DB, nur Single-source = Gitea)
- Smoke-Test-Runner mit `tests/smoke.yaml` pro Projekt-Repo
- Standardisierte Bug- + Smoke-Test-Templates
- Agentenbedienbar (REST-API + OpenAPI + `@agent-X`-Dispatch)
- Open-Source-Tools, gute APIs
- Coverage für alle `/nvmetank1/projects/*`
DNS für beide Subdomains ist extern bereits gemacht.
## Status
**Phase 1 (MVP) ist als Plan + Issues + Dispatch-Setup angelegt; Task 1 ist zu ~70 % umgesetzt.**
### Was steht
1. **Spec:** `docs/superpowers/specs/2026-05-12-bugtest-stack-design.md`
- Architektur, REST-APIs, smoke.yaml-Schema, Auth, Storage, Phasen 1–3
2. **Plan:** `docs/superpowers/plans/2026-05-12-bugtest-stack-phase1.md`
- 18 TDD-Tasks für Phase 1 (MVP), pro Task: failing test → minimal code → commit
3. **Gitea-Repo + 19 Issues:**
- `#1` Epic „Phase 1 — bug.joelduss.xyz + test.joelduss.xyz (Tracking Epic)"
- `#2` Task 1: Project skeleton + tooling — Labels `agent-or`, `status-ready`, `priority-high`
- `#3`–`#19` Task 2…18 — Labels `status-backlog` + `type-feature` (warten)
4. **Dispatch-Pipeline funktioniert end-to-end** (siehe Infra-Fixes unten)
5. **agent-codex hat Task 1 (teilweise) umgesetzt** mit drei Commits:
- `a61dbed chore: add pyproject tooling`
- `6da95b6 docs: add agent notes` (AGENTS.md)
- `ba0eb4b chore: add gitignore`
### Was fehlt für Task 1 (Plan-Step 4)
Codex hat **nur die inline-Acceptance** aus dem @-mention-Comment umgesetzt, nicht die Plan-File-Spec. Es fehlen:
- `tests/conftest.py` (sample-Fixture, Plan-Sektion „Task 1 — Step 4")
- Leere `__init__.py` in:
- `shared/__init__.py`
- `bugtracker/__init__.py`
- `testrunner/__init__.py`
- `testrunner/runners/__init__.py`
- `tests/shared/__init__.py`
- `tests/bugtracker/__init__.py`
- `tests/testrunner/__init__.py`
Acceptance-Check der drei vorhandenen Commits: `pip install -e ".[dev]"` läuft, `ruff check .` clean, `pytest -q` → „no tests ran" → **erfüllt**. Aber: spätere Tasks (Task 2 ff.) brauchen die Package-Struktur als Vorbedingung.
---
## Host-Infra-Fixes (alle host-weit, nicht repo-spezifisch)
Im Zuge des Setups mehrere ältere Infrastruktur-Probleme gefunden + repariert. Memory unter `~/.claude/projects/-nvmetank1-projects/memory/feedback_gitea_webhook_allowed_hosts.md`.
### 1. Gitea `ALLOWED_HOST_LIST` (alle Repos betroffen)
`/nvmetank1/docker/config/gitea/gitea/conf/app.ini`:
```ini
[webhook]
ALLOWED_HOST_LIST = external,loopback,private
```
War vorher `external,loopback` → LAN-IPs blockiert → kein Webhook ging an n8n. Fix per `docker restart gitea`.
### 2. n8n Workflow `03-Agent-Dispatch (Mention-Listener)` Secret-Substitution
5 × `__GLUG_WEBHOOK_SECRET__`-Platzhalter in den `Trigger agent-{claude,gemini,qwen,codex,cursor}.headerParameters[X-Webhook-Token]` waren nie durch echten Secret ersetzt → alle Dispatches 401.
Fix: SQL-Update der `workflow_entity.nodes`-JSON-Spalte, Wert aus `/etc/glug-webhook.token` eingesetzt, n8n stop+start. DB-Backup: `/nvmetank1/docker/config/n8n-automation/database.sqlite.bak.1778584877`.
### 3. Agent-Dispatch-Infrastruktur von glug nach rag-stack umgezogen
User-Direktive: „Orchestrator soll universell sein, nicht nur für glug." Die agent-handler liegen jetzt korrekt in `rag-stack/bin/`.
**Verschoben:**
- `glug/bin/agent-handler-{claude,codex,cursor,gemini,or,qwen}.sh` → `rag-stack/bin/` (rag-stack-Versionen sind canonical, glug-Kopien gelöscht in glug-commit `543dbc8`)
- `glug/bin/glug-webhook.py` → `rag-stack/bin/agent-dispatch-receiver.py` (umbenannt + header dokumentiert)
**systemd:**
- `glug-webhook.service` disabled + entfernt
- Neu: `/etc/systemd/system/agent-dispatch.service` (ExecStart auf rag-stack-Pfad, Port 8810 unverändert)
- `/etc/glug-webhook.token` (Secret-File) Name bleibt — n8n-Configs zeigen darauf; späterer Rename möglich
**Handler-WORKDIR-Bug behoben:**
- Alte rag-stack-Handler hatten `case "$REPO" in ubuadmin/yoga|*/yoga) WORKDIR=…` mit nur 2 hardcoded Repos
- Jetzt: `AGENT=…; source /usr/local/lib/agent-handler-common.sh; WORKDIR=$(resolve_workdir "$REPO")`
- `resolve_workdir` (in der shared lib) hat Fallback `/nvmetank1/projects/<basename-of-repo>` → neue Repos wie bugtest-stack funktionieren ohne Edit
**HOST_ACTIONS-Map in `agent-dispatch-receiver.py`:**
- `agent-*` → `/nvmetank1/projects/rag-stack/bin/agent-handler-*.sh`
- glug-spezifisch (`deploy-target`, `glug-promote-*`, `yoga-promote`, `auto-org-*`) → bleiben auf `/nvmetank1/projects/glug/bin/`
**Verifiziert end-to-end 2026-05-12 13:40:** codex spawned mit `WORKDIR=/nvmetank1/projects/bugtest-stack` auf Issue #2.
### 4. Global git config (war fehlend)
```bash
git config --global user.email "agent@joelduss.xyz"
git config --global user.name "agent"
```
Codex scheiterte sonst beim Commit mit `fatal: unable to auto-detect email address`.
---
## Wie weitermachen
### Option A — Task 1 vervollständigen (saubere Linie)
Komment auf Issue #2 posten (so dass die Datei-Liste expliziter ist), oder direkt im Repo nachziehen:
```bash
cd /nvmetank1/projects/bugtest-stack
mkdir -p tests/shared tests/bugtracker tests/testrunner shared bugtracker testrunner/runners
touch shared/__init__.py bugtracker/__init__.py testrunner/__init__.py \
testrunner/runners/__init__.py \
tests/shared/__init__.py tests/bugtracker/__init__.py tests/testrunner/__init__.py
# tests/conftest.py — Inhalt siehe Plan Task 1 Step 4
```
Plan-Datei lesen: `docs/superpowers/plans/2026-05-12-bugtest-stack-phase1.md`, Sektion „Task 1 — Step 4".
Danach commit + push. Issue #2 schliessen mit Hinweis „Task 1 erfüllt; Task 2 als nächstes."
### Option B — Task 2 anstoßen (Pipeline weiterlaufen lassen)
Issue #3 (Task 2: Shared — project discovery) öffnen und Comment posten:
```
@agent-codex Bitte Task 2 umsetzen (Shared — project discovery).
Vollständige TDD-Schritte siehe docs/superpowers/plans/2026-05-12-bugtest-stack-phase1.md, Sektion 'Task 2'.
WICHTIG: Lies die Plan-Datei zuerst, dann baue Test + Code wie dort spezifiziert.
Direkt committen auf main. Keine PR.
```
n8n dispatch → codex läuft in `/nvmetank1/projects/bugtest-stack` → Code + Commit.
**Hinweis aus Skript-Audit:** Die Handler haben das Plan-Dokument NICHT vorgekauft injiziert. Codex sieht nur (a) Issue-Title + Body, (b) den Trigger-Comment. Wenn die acceptance-Liste im Comment vollständig ist, baut codex das. Wenn nicht und du nur „siehe Plan" sagst, MUSS der Comment-Text codex explizit anweisen, die Plan-Datei zu lesen — sonst übersieht codex Plan-Detail.
### Option C — Pipeline-Status erst absichern
Bevor weitere Tasks gestartet werden:
```bash
# 1. agent-dispatch-receiver healthy?
curl -sf http://192.168.1.216:8810/hook/health -w "\n"
# 2. n8n flow active?
sqlite3 /nvmetank1/docker/config/n8n-automation/database.sqlite \
"SELECT active FROM workflow_entity WHERE name='03-Agent-Dispatch (Mention-Listener)'"
# expected: 1
# 3. Webhook auf bugtest-stack-Repo aktiv?
curl -sS -H "Authorization: token 0e255baf11df3a07aea73bf005660f8a0abbe2ef" \
"https://git.joelduss.xyz/api/v1/repos/ubuadmin/bugtest-stack/hooks/15" \
| python3 -c "import sys,json; d=json.load(sys.stdin); print('active:', d['active'], 'url:', d['config']['url'])"
# 4. Letzte n8n-Executions ansehen
sqlite3 /nvmetank1/docker/config/n8n-automation/database.sqlite \
"SELECT e.id, e.status, datetime(e.startedAt), w.name FROM execution_entity e JOIN workflow_entity w ON e.workflowId=w.id ORDER BY e.id DESC LIMIT 5"
```
---
## Wichtige Token + Pfade
| Was | Wo |
|---|---|
| Gitea API token (ubuadmin) | `0e255baf11df3a07aea73bf005660f8a0abbe2ef` (oder `/etc/gitea-tokens/agent-claude.token` als Base64-Form) |
| webhook secret | `/etc/glug-webhook.token` (65B) |
| Dispatcher source | `/nvmetank1/projects/rag-stack/bin/agent-dispatch-receiver.py` |
| Agent handlers | `/nvmetank1/projects/rag-stack/bin/agent-handler-*.sh` |
| Shared lib | `/usr/local/lib/agent-handler-common.sh` |
| Dispatcher log | `/var/log/glug-webhook/service.log` |
| Agent run log | `/var/log/glug-agent-handler.log` |
| Per-agent codex log | `/tmp/codex-fe-<issue>.log` |
| n8n SQLite | `/nvmetank1/docker/config/n8n-automation/database.sqlite` |
| Gitea SQLite | `/nvmetank1/docker/config/gitea/gitea/conf/app.ini` |
| systemd | `agent-dispatch.service` (8810/TCP) |
---
## Bekannte offene Punkte
1. **Task 1 nicht 100 % komplett** — siehe „Was fehlt" oben.
2. **bugtest-stack hat keinen Caddy-vhost** — DNS zeigt auf den Host, aber `bug.joelduss.xyz` + `test.joelduss.xyz` haben noch keinen Service dahinter. Erst nach Task 18 (Deploy) sollte das gemacht werden, oder vorzeitig falls UI-Tests gewünscht.
3. **Plan-Datei wird nicht automatisch injiziert** — wenn künftige Tasks per @-mention dispatched werden, sollte der Comment-Body codex EXPLIZIT zur Plan-Datei verweisen + idealerweise die Step-Liste copy-pasten (oder: handler patchen, dass Plan-Datei pre-fetched wird).
4. **Codex Constitution `path_prefix_allow = ["/nvmetank1/projects/glug"]`** — Memory `feedback_external_cli_caveats` behauptet codex sei auf /glug locked. Praxis-Test heute: codex schreibt mit `--dangerously-bypass-approvals-and-sandbox` in jedes WORKDIR (bugtest-stack hat funktioniert). Memory-Eintrag ist veraltet, sollte korrigiert werden bei Gelegenheit.
5. **n8n REPO_ROUTES.glug.post_pull = []** — glug-Push triggert nicht mehr Dispatcher-Restart. Falls ein Test zeigt, dass das doch nötig ist, in `agent-dispatch-receiver.py` REPO_ROUTES anpassen.
6. **agent-handler-claude.sh** — nutzt nicht `resolve_workdir` (braucht keinen WORKDIR), aber hat auch die alte glug-Wave-7-Konstante im Header (jetzt entfernt).
---
## Memory-Pointer für die nächste Session
Vor der Arbeit lesen:
- `~/.claude/projects/-nvmetank1-projects/memory/MEMORY.md` (Index)
- Insbesondere:
- `feedback_gitea_issue_workflow.md` — wie @-mention-Dispatch funktioniert
- `feedback_gitea_webhook_allowed_hosts.md` — die heute angelegten Fixes
- `feedback_external_cli_caveats.md` — codex/or/gemini-Quirks (teils veraltet)
- `feedback_orchestrator_only.md` — claude-opus = Orchestrator, codex/or/gemini = Executor
CLI-Tool für Pre-Start:
```bash
claude-context-pack "bugtest-stack Phase 1 weitermachen" --repo ubuadmin/bugtest-stack --limit 5
```