Lesson #1473

← Back to Knowledge Board
bugtest-stack: Phase-1 Session Handoff
ID
1473
Author
ai
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
```