---
name: swarm-watchdog-inbox
description: Eintraege in die Watchdog-Inbox (inbox.json) fuer GBM-Bauleiter Gueven Kaplangil schreiben – Fristen, Rundgang-Befunde mit Foto, Telefon/Mail-Notizen, Dispatch-Meldungen, Memory-Eintraege, Status-Updates. Beantwortet auch Handy-Fragen zu Projekt-, Plan- und Kontakt-Katalog (z.B. "Plan WHG 404-TH4", "Nummer Oliver Enz", "Foto letzter Rundgang"). Trigger wenn eine der GBM-Projektnummern (042 Pilgerbrunnen, 043 Frohalp, 047 Thujastrasse) mit Aufgabe, Frist, Foto, Plan-Anfrage oder Kontakt-Frage genannt wird – auch casual ("trag ein", "merke dir", "schreib ins Dashboard", "ins Watchdog", "neue Frist", "Dispatch hat gemeldet", "Baustellen-Rundgang", "ich brauche den Plan von", "Nummer von", "falsches Projekt – korrigiere"). Immer diese Skill nutzen statt ad-hoc JSON-Editing.
---

# S.W.A.R.M-Watchdog Inbox

Der Bauleiter-Alltag erzeugt laufend Items: Fristen aus Dispatch-Meldungen, Telefonate mit Handwerkern, Rundgang-Befunde mit Fotos, Mail-Hinweise, Termine. Das S.W.A.R.M-Watchdog-Dashboard (HTML im Cowork-Ordner) sammelt diese in **Fristen / Rundgang / Kontakte / Pläne** – aber nur wenn Einträge sauber strukturiert in `inbox.json` landen und Fotos pro Projekt unter `02_Projekte/<ordner>/rundgang/` liegen.

**Deine Aufgabe, wenn die Skill triggert:**
1. Item, das Güven in einer Claude-Session (Handy, Desktop, Cowork) erwähnt, fehlerfrei in `inbox.json` anhängen.
2. Fragen zu Plänen, Kontakten oder Fotos direkt aus den im Cowork-Ordner liegenden Referenzdaten beantworten.
3. Korrekturen (falsches Projekt, falsche Wohnungs-Nr, Eintrag zurückziehen) sauber umsetzen – nichts im Stillen überschreiben.

Bauleiter-Stil: sachlich, klar, keine „könnte" oder „eventuell". Kein Überbau.

## Dateistandort

Die `inbox.json` liegt im Cowork-Ordner unter:

```
<Cowork-Root>/04_Fristen-Watchdog/inbox.json
```

Auf Claude-Seite (Linux-Mount) typischerweise `/sessions/<session-id>/mnt/Cowork/04_Fristen-Watchdog/inbox.json`. In einer Handy-Session ohne Mount: Datei per `request_cowork_directory` anfordern, oder den JSON-Blob ausgeben und Güven einfügen lassen.

Fotos landen **pro Projekt** im jeweiligen Rundgang-Ordner:

```
<Cowork-Root>/02_Projekte/<ordner>/rundgang/<item-id>.<ext>
```

Beispiel `042 Pilgerbrunnen`: `02_Projekte/042_Pilgerbrunnen/rundgang/rund-2026-04-21-pb-whg405-maler.jpg`

Der Dateiname **matcht die Item-ID 1:1** (gleicher String, gleiche Gross-/Kleinschreibung). Gilt für Baurundgang- UND Mängel-Fotos – beides landet in `rundgang/` des jeweiligen Projekts. Der Pfad in `inbox.json` wird als `02_Projekte/<ordner>/rundgang/<id>.<ext>` (Cowork-Root-relativ) gespeichert; das Dashboard löst das beim Rendern automatisch auf.

## Projekt-Katalog (GBM, Stand 2026)

Immer als `<Nr> <Name>` übernehmen:

| Nr  | Name             | Ordnername                 | Hinweise                                      |
|-----|------------------|----------------------------|-----------------------------------------------|
| 042 | Pilgerbrunnen    | `02_Projekte/042_Pilgerbrunnen` | Neubau, 43 WHG, Wohnungskonvention `NNN-THN-EE` (z.B. `403-TH4-00`) |
| 043 | Frohalp          | `02_Projekte/043_Frohalp`       | Siedlung Frohalp                              |
| 047 | Thujastrasse     | `02_Projekte/047_Thujastrasse`  | Laborwohnungen BGSJ                           |

Nennt Güven eine andere Projektnummer, diese 1:1 übernehmen. Nicht erfinden.

**Disambiguierung**: Wenn nur ein Gewerk oder eine Aufgabe genannt wird ohne klares Projekt, **nachfragen**. Nicht raten. Wenn Güven nachträglich sagt „es ist nicht X sondern Y" → **Korrektur-Workflow** (siehe unten), nicht neuen Eintrag anlegen.

## Item-Typen

Jedes Item braucht mindestens `id`, `ts`, `typ`. Die restlichen Felder hängen am Typ.

### 1. `typ: "frist"` – Neue Frist/Aufgabe

```json
{
  "id": "dispatch-2026-04-21-san-042",
  "ts": "2026-04-21T15:30:00",
  "typ": "frist",
  "projekt": "042 Pilgerbrunnen",
  "aufgabe": "Sanitaer Dichtungen pruefen und abschliessen",
  "frist": "28.04.2026",
  "verantw": "Gueven Kaplangil",
  "bucket": "acht",
  "quelleStatus": "Meldung Dispatch",
  "quelle": { "typ": "termin", "datum": "21.04.2026", "zeit": "15:30", "ref": "Dispatch-Meldung via Claude-App" }
}
```

### 2. `typ: "rundgang"` – Baustellen-Befund (Mangel + Foto(s))

Ein Rundgang-Item = **ein Mangel**. Ein Foto oder mehrere Fotos zu **diesem** Mangel kommen als `fotos`-Array. Mehrere Mängel aus einem Rundgang = mehrere Items (alle mit `typ: "rundgang"`), nie in einen Befund zusammenfassen.

```json
{
  "id": "rund-2026-04-21-pb-whg403-405",
  "ts": "2026-04-21T12:40:00",
  "typ": "rundgang",
  "datum": "2026-04-21",
  "projekt": "042 Pilgerbrunnen",
  "ort": "4.OG Etappe 1 / WHG 405",
  "gewerk": "Maler",
  "befund": "Falsche Wohnungsbeschriftung: WHG 403-TH4-00 angeschrieben, gegen 405 austauschen",
  "status": "offen",
  "personName": "Oliver Enz",
  "personFirma": "GBM",
  "fotos": [
    "02_Projekte/042_Pilgerbrunnen/rundgang/rund-2026-04-21-pb-whg403-405_01.jpg",
    "02_Projekte/042_Pilgerbrunnen/rundgang/rund-2026-04-21-pb-whg403-405_02.jpg"
  ]
}
```

Mindestens `projekt` und `befund` sind Pflicht. `ort`, `gewerk`, `personName`, `personFirma`, `personEmail`, `status` und `fotos` sind optional, aber im Baurundgang fast immer sinnvoll.

**Foto-Pfade** sind Cowork-Root-relativ: `02_Projekte/<ordner>/rundgang/<id>_NN.<ext>`. Die Dateien landen physisch unter `<Cowork-Root>/02_Projekte/<ordner>/rundgang/<id>_NN.<ext>`. Bei nur einem Foto: `02_Projekte/<ordner>/rundgang/<id>.<ext>`. Bei mehreren Fotos: `<id>_01.jpg`, `<id>_02.jpg`, ... (Nummerierung mit führender Null). Das Dashboard löst den Pfad beim Rendern automatisch auf (`../02_Projekte/...`).

Einzel-Foto darf auch als `foto: "02_Projekte/.../rundgang/<id>.jpg"` (ohne Array) übergeben werden – das Script normalisiert automatisch zu `fotos: [...]`.

Gültige `status`-Werte (optional): `offen` · `inarbeit` · `erledigt` · `blockiert`. Default `offen`.

### 3. `typ: "memory"` – Faktum, das die KI behalten soll

```json
{
  "id": "mem-oswald-kontakt",
  "ts": "2026-04-21T09:12:00",
  "typ": "memory",
  "key": "oswald-direktnummer",
  "value": "044 123 45 67 (Bueroleitung GBM)"
}
```

### 4. `typ: "status"` – Status-Update einer bestehenden Frist

```json
{
  "id": "stat-2026-04-21-frist12",
  "ts": "2026-04-21T14:00:00",
  "typ": "status",
  "rowid": "frist-12",
  "status": "erledigt",
  "notiz": "Mit Dierolf abgestimmt, neuer Key rotiert"
}
```

`status` ist einer von: `offen` · `inarbeit` · `erledigt` · `blockiert`.

## Foto-Belege zu Rundgang-Items

**Wenn Güven ein Foto mitschickt oder sagt „speichere das Foto":**

1. Item-ID bauen (siehe ID-Generierung unten), z.B. `rund-2026-04-21-pb-whg403-405`.
2. Projekt-Ordner aus dem `projekt`-Feld ableiten (z.B. `042 Pilgerbrunnen` → `042_Pilgerbrunnen`).
3. Foto in den Rundgang-Ordner des Projekts kopieren:
   - Zielpfad Einzelfoto: `<Cowork-Root>/02_Projekte/<ordner>/rundgang/<item-id>.<ext>`
   - Zielpfad Mehrfachfotos: `<Cowork-Root>/02_Projekte/<ordner>/rundgang/<item-id>_01.<ext>`, `<item-id>_02.<ext>`, ...
   - Erlaubt: `.jpg` · `.jpeg` · `.png` · `.heic` · `.webp`
4. Im Rundgang-Item `"fotos"`-Array mit Cowork-Root-relativen Pfaden setzen (`02_Projekte/<ordner>/rundgang/<id>.<ext>`).
5. **Nicht** in Google Drive, **nicht** im Watchdog-Ordner, **nicht** in einem fremden Projektordner ablegen. Fotos gehören in den `rundgang/`-Ordner des **jeweiligen** Projekts.

Wenn das Foto in einer Handy-Session nur als Image-Attachment vorliegt und Claude keinen Dateisystem-Zugriff hat: Im JSON-Block `"fotos"` trotzdem schon die geplanten Cowork-Root-relativen Pfade setzen, und Güven explizit sagen: „Fotos unter genau diesen Dateinamen in `02_Projekte/<ordner>/rundgang/` ablegen." Dispatch zum Desktop-Claude erledigt den Move automatisch, wenn die Session läuft.

## Baurundgang mit Mängelliste (Standardfall)

Ein Rundgang bringt typisch 3–15 Mängel. Vorgehen:

1. **Jeder Mangel = eigenes `rundgang`-Item.** Nicht mehrere Mängel in einen `befund` zusammenfassen.
2. **Gemeinsames Datum + gemeinsamer Projekt-String** übernehmen.
3. **ID-Pattern pro Mangel:** `rund-<datum>-<projektkuerzel>-<laufnr>` oder sprechende Kurzform (`rund-2026-04-21-pb-whg405-maler`, `rund-2026-04-21-pb-whg405-sanitaer`, ...).
4. **Gewerk** immer setzen, wenn erkennbar – das Dashboard gruppiert danach.
5. **Fotos pro Mangel** in dessen `fotos`-Array. Wenn Güven ein Übersichts-Foto zu mehreren Mängeln schickt, landet es nur beim ersten Mangel; im `befund` der anderen kurz „siehe Foto <id>" vermerken.
6. **Batch-Append:** Alle Items in einem `--items-file`-JSON bündeln und mit einem einzigen `append_inbox.py`-Aufruf eintragen. Spart Schreibvorgänge und hält die `inbox.json` konsistent.
7. **Bestätigung am Ende:** „5 Rundgang-Items für 042 Pilgerbrunnen, Datum 21.04.2026, 8 Fotos in `02_Projekte/042_Pilgerbrunnen/rundgang/`. Dashboard zeigt sie nach nächstem Poll (max. 2 Min)."

## Plan-Suche (Pläne, Wohnungen, Geschosse)

Wenn Güven fragt „ich brauche den Plan von WHG XY" oder „Grundriss 4.OG" oder „wo ist der Plan für 063":

1. **Plan-Index laden:** `<Cowork-Root>/04_Fristen-Watchdog/plan_index.json` – wird vom HTML-Generator bei jedem Lauf aktualisiert. Enthält pro Projekt alle PDF/PNG/JPG/DWG/DXF aus `02_Projekte/<NNN>/00_Pläne/` rekursiv.
2. **Suchen:**
   - WHG-Nr. wie `403-TH4-00` → Geschoss ist die zweite Ziffer (4 = 4.OG) + „Beschriftung"-Plan wenn vorhanden
   - „4.OG" → `Grundriss 4.OG` oder `Grundriss_4OG` (verschiedene Schreibweisen)
   - Falls kein Treffer in plan_index.json → antworten: „Plan nicht im Index. Soll ich ihn aus Drive ziehen? Welcher Ordner?" – NICHT automatisch in Drive raten.
3. **Antwort-Format:** Dateiname + vollständiger relativer Pfad + optional WHG-Kontext.
4. **Wenn Güven sagt „das ist der falsche Plan":** Nachfragen, ob WHG-Einzelplan, Ausbauplan, Elektro, Sanitär etc. gesucht ist. Nicht nochmal denselben Geschossplan anbieten.

**Wohnungskonvention 042 Pilgerbrunnen:** `NNN-THN-EE` = `<Raum>-<Treppenhaus>-<Etappe>`. Beispiel `403-TH4-00` = Whg 403, Treppenhaus 4, Etappe 00. Beschriftungspläne liegen unter `02_Projekte/042_Pilgerbrunnen/00_Pläne/Beschriftung/`.

## Kontakte-Lookup

Adresslisten liegen projektweise unter `02_Projekte/<NNN>/02_Adressliste/adressliste_data.json`.

- `042 Pilgerbrunnen`: `adressliste_data.json` mit ca. 64 Kontakten (Rolle, Firma, Person, Mobile, Tel, Email, Gewerk)
- Weitere Projekte: analog, falls vorhanden

**Wenn Güven fragt „Nummer von <Person>" oder „E-Mail von <Firma>":**
1. Passende `adressliste_data.json` laden (Projekt aus Kontext ableiten oder aus allen).
2. Case-insensitive Match auf `person` oder `firma`.
3. Antwort: Person · Rolle · Mobile + Tel + Email. Kurz und sachlich.
4. Wenn nicht gefunden → sagen „nicht in Adressliste 042. Soll ich in 043 oder 047 suchen?"

## Korrektur-Workflow (falscher Eintrag)

Wenn Güven sagt „das ist nicht X sondern Y" oder „korrigiere den letzten Eintrag":

1. **Alte ID identifizieren**: aus dem Kontext oder durch kurzen Lookup in `inbox.json` (letztes pending-Item mit passendem `typ`/`datum`).
2. **Neue ID bauen** (mit korrigierten Daten, z.B. `rund-2026-04-21-pb-whg403-405` statt `rund-2026-04-21-guggach-whg-403-405`).
3. **Altes Item entfernen** + **neues anhängen** – in einem Schritt via `scripts/append_inbox.py --replace <alte-id>` oder per Read/Edit mit `pending[]`-Rebuild.
4. **Foto-Datei umbenennen**, falls Foto verknüpft ist: gleiche neue ID als Dateiname.
5. Bestätigen: „Korrigiert: alter Eintrag `<alte-id>` ersetzt durch `<neue-id>` (Projekt `042 Pilgerbrunnen` statt `063 Guggach`). Foto umbenannt."

**Nicht** den alten Eintrag stillschweigend stehen lassen und einen neuen daneben schreiben – das führt zu Doppelbeträgen im Dashboard.

## Bucket-Klassifikation (nur bei `typ: "frist"`)

- **`krit`** (rot) – Sicherheit, rechtliche Risiken, Abnahmesperren, Frist in ≤ 3 Tagen, Haftungsthemen. Beispiel: „OpenRouter-Key rotieren – Sicherheitsvorfall"
- **`acht`** (gelb) – Aktiv zu bearbeiten, Frist in ≤ 14 Tagen, gewerkekritisch. Default für normale Dispatch-Meldungen.
- **`lauf`** (grün) – Laufende Themen, Frist > 14 Tage oder ohne scharfes Datum, informativ

Im Zweifel `acht`.

## Standard-Werte

| Feld          | Default                   |
|---------------|---------------------------|
| `verantw`     | `Gueven Kaplangil`        |
| `bucket`      | `acht`                    |
| `quelle.typ`  | `claude-mobil`            |
| `quelleStatus`| `Meldung Claude-Session`  |
| `ts`          | jetzt in ISO-8601 (lokal) |

## ID-Generierung

Stabil, menschenlesbar, eindeutig. Pattern: `<quelle>-<yyyy-mm-dd>-<kuerzel>`.

| Typ      | Pattern                                | Beispiel                             |
|----------|----------------------------------------|--------------------------------------|
| frist    | `dispatch-<datum>-<gewerk>-<projektnr>` | `dispatch-2026-04-21-san-042`        |
| rundgang | `rund-<datum>-<projektkuerzel>-<ort>`   | `rund-2026-04-21-pb-whg403-405`      |
| memory   | `mem-<key-slug>`                        | `mem-oswald-kontakt`                 |
| status   | `stat-<datum>-<rowid>`                  | `stat-2026-04-21-frist12`            |
| telefon  | `tel-<datum>-<person>`                  | `tel-2026-04-21-oswald`              |

Projekt-Kürzel: `pb` (042), `fh` (043), `th` (047). Wenn unsicher: `inbox-<ISO-ts ohne Doppelpunkte>`.

**Nur ASCII in IDs.** Keine Umlaute (`sanitaer` statt `sanitär`).

## Ablauf

1. **Extrahieren** – Aus der User-Nachricht Projekt, Aufgabe/Befund, Frist, Quelle, Foto herausziehen.
2. **Disambiguieren** – Wenn Projekt nicht klar: **nachfragen**. Nicht raten.
3. **Defaults setzen** – Nur nachfragen wenn Kernfeld (Projekt ODER Aufgabe/Befund) fehlt.
4. **Foto ablegen** – wenn vorhanden, in `04_Fristen-Watchdog/fotos/<id>.<ext>`.
5. **Item bauen** – Valides JSON mit allen Pflichtfeldern.
6. **Anhängen** – `scripts/append_inbox.py` aufrufen oder per Read + Edit die `pending[]` erweitern (Meta-Felder erhalten!).
7. **Bestätigen** – Knapp: was, wohin, welche Bucket, Foto verknüpft.

## Script `scripts/append_inbox.py`

Fügt ein oder mehrere Items sicher in `inbox.json` ein. Nutzung:

```bash
python scripts/append_inbox.py \
  --inbox /sessions/<session>/mnt/Cowork/04_Fristen-Watchdog/inbox.json \
  --item '{"id":"...","ts":"...","typ":"frist",...}'
```

Mehrere Items via `--item` mehrfach oder `--items-file <path.json>`. Ersetzen eines bestehenden Eintrags via `--replace <alte-id>` zusammen mit `--item`.

Das Script:
- Liest die bestehende `inbox.json`
- Prüft das Schema (pending-Array vorhanden?)
- Hängt die Items an `pending[]` an, entfernt ggf. `--replace`-IDs
- Prüft ID-Duplikate (überspringt mit Warnung)
- Schreibt zurück mit Einrückung 2 und `ensure_ascii=False`

## Was NICHT tun

- Niemals die ganze `inbox.json` mit `Write`-Tool überschreiben ohne vorheriges Einlesen – das zerschießt `_info`, `_format`, `beispiele`.
- Keine Emojis in `aufgabe`/`befund`/`notiz` – Dashboard rendert SVG-Icons, Emojis brechen den Stil.
- Keine erfundenen Projektnummern, Personen-Namen, Plan-Dateien.
- Keine Umlaute in `id` – ASCII (`sanitaer` statt `sanitär`).
- Keine Foto-Ablage in Google Drive oder im Watchdog-Ordner. Rundgang- und Mängel-Fotos gehören ausschliesslich in `02_Projekte/<ordner>/rundgang/` des jeweiligen Projekts.
- Bei Projekt-Ambiguität NICHT raten – nachfragen.
- Bei Korrekturen NICHT Doppelbeträge anlegen – alten Eintrag ersetzen.
- Mehrere Mängel aus einem Rundgang NICHT in einen `befund` zusammenfassen – ein Item pro Mangel.
- `fotos` NICHT als komma-separierten String senden – immer echtes JSON-Array.

## Beispiel-Dialoge

**Beispiel 1: Dispatch-Meldung**

User: „Dispatch hat gemeldet: Sanitär 042 Pilgerbrunnen Dichtungen bis 28.04. prüfen."

Aktion: Item `typ: "frist"`, `projekt: "042 Pilgerbrunnen"`, `aufgabe: "Sanitaer Dichtungen pruefen"`, `frist: "28.04.2026"`, `bucket: "acht"`, `quelle.typ: "termin"`, `quelleStatus: "Meldung Dispatch"`. Append. Bestätigen.

**Beispiel 2: Rundgang mit Foto (inkl. Korrektur)**

User: „043 Frohalp / Rundgang / 4.OG Etappe 1 – Beschriftung 403 gegen 405 tauschen. Foto ist hier."

Zwischen-Aktion: Item bauen mit `projekt: "043 Frohalp"`, ID `rund-2026-04-21-fh-whg403-405`, Foto nach `02_Projekte/043_Frohalp/rundgang/` speichern.

User (später): „Nein, das ist Pilgerbrunnen, nicht Frohalp."

Korrektur-Aktion:
- Alte ID `rund-2026-04-21-fh-whg403-405` entfernen
- Neue ID `rund-2026-04-21-pb-whg403-405` anlegen mit `projekt: "042 Pilgerbrunnen"`
- Foto-Datei **von `02_Projekte/043_Frohalp/rundgang/` nach `02_Projekte/042_Pilgerbrunnen/rundgang/`** verschieben und umbenennen
- Bestätigen: „Korrigiert auf 042 Pilgerbrunnen. Foto unter `02_Projekte/042_Pilgerbrunnen/rundgang/rund-2026-04-21-pb-whg403-405.jpg`."

**Beispiel 3: Plan-Anfrage (Handy)**

User: „Ich brauche den Plan von WHG 404-TH4-00."

Aktion: `plan_index.json` laden → 042 Pilgerbrunnen → 4.OG Grundriss + Beschriftungs-Plan 4.OG. Antwort: „`156-132-B-216_Grundriss_4OG.pdf` (Geschossplan) oder `Beschriftung/Plan_4OG_markiert.pdf` (mit Wohnungsnummern). Pfad: `02_Projekte/042_Pilgerbrunnen/00_Pläne/...`. Welchen brauchst du?"

**Beispiel 4: Kontakt-Lookup**

User: „Handy-Nummer von Oliver Enz?"

Aktion: `02_Projekte/042_Pilgerbrunnen/02_Adressliste/adressliste_data.json` laden → Suche `person == "Oliver Enz"`. Antwort: „Oliver Enz · Bauleiter BM (GBM) · Mobil +41 79 387 02 09 · Tel +41 43 255 44 15 · oliver.enz@gbmag.ch."

**Beispiel 5: Memory**

User: „Merk dir: Oswalds direkte Nummer ist 044 123 45 67."

Aktion: `typ: "memory"`, `key: "oswald-direktnummer"`, `value: "044 123 45 67"`. Append.

**Beispiel 6: Kritische Frist**

User: „Achtung, Abnahme Frohalp morgen 10 Uhr, wenn die Dokumentation fehlt gibt's eine Sperre."

Aktion: `typ: "frist"`, `projekt: "043 Frohalp"`, `aufgabe: "Dokumentation fuer Abnahme bereitstellen"`, `frist: "<morgen>"`, `bucket: "krit"` (Abnahmesperre!), `quelleStatus: "Eigene Warnung – Sperrrisiko"`.

**Beispiel 7: Baurundgang mit Mängelliste (3 Mängel, 4 Fotos)**

User: „Rundgang 042 Pilgerbrunnen 4.OG heute. WHG 405: Maler – Abplatzer Decke Wohnzimmer (2 Fotos), Sanitär – Siphon Waschbecken tropft (1 Foto). WHG 406: Elektro – Steckdose Küche lose (1 Foto)."

Aktion: **3 separate `rundgang`-Items** in einem `--items-file`-Batch:

```json
[
  {
    "id": "rund-2026-04-21-pb-whg405-maler",
    "ts": "2026-04-21T11:10:00",
    "typ": "rundgang",
    "datum": "2026-04-21",
    "projekt": "042 Pilgerbrunnen",
    "ort": "4.OG / WHG 405",
    "gewerk": "Maler",
    "befund": "Abplatzer an Decke Wohnzimmer, ausbessern und nachstreichen",
    "status": "offen",
    "fotos": [
      "02_Projekte/042_Pilgerbrunnen/rundgang/rund-2026-04-21-pb-whg405-maler_01.jpg",
      "02_Projekte/042_Pilgerbrunnen/rundgang/rund-2026-04-21-pb-whg405-maler_02.jpg"
    ]
  },
  {
    "id": "rund-2026-04-21-pb-whg405-sanitaer",
    "ts": "2026-04-21T11:12:00",
    "typ": "rundgang",
    "datum": "2026-04-21",
    "projekt": "042 Pilgerbrunnen",
    "ort": "4.OG / WHG 405",
    "gewerk": "Sanitaer",
    "befund": "Siphon Waschbecken tropft, Dichtung erneuern",
    "status": "offen",
    "fotos": ["02_Projekte/042_Pilgerbrunnen/rundgang/rund-2026-04-21-pb-whg405-sanitaer.jpg"]
  },
  {
    "id": "rund-2026-04-21-pb-whg406-elektro",
    "ts": "2026-04-21T11:18:00",
    "typ": "rundgang",
    "datum": "2026-04-21",
    "projekt": "042 Pilgerbrunnen",
    "ort": "4.OG / WHG 406",
    "gewerk": "Elektro",
    "befund": "Steckdose Kueche sitzt lose, fachgerecht befestigen",
    "status": "offen",
    "fotos": ["02_Projekte/042_Pilgerbrunnen/rundgang/rund-2026-04-21-pb-whg406-elektro.jpg"]
  }
]
```

Fotos physisch nach `02_Projekte/042_Pilgerbrunnen/rundgang/` kopieren (Dateinamen exakt wie in den `fotos`-Arrays). Ein `append_inbox.py --items-file` Aufruf hängt alle drei Items an. Bestätigung: „3 Rundgang-Items 042 Pilgerbrunnen / 4.OG angelegt, 4 Fotos in `02_Projekte/042_Pilgerbrunnen/rundgang/`, Dashboard zieht sie beim nächsten Poll."

## Dashboard-Regenerierung

Das Dashboard `SWARM-Watchdog_<datum>.html` wird separat täglich neu generiert via `scripts/generate_watchdog_html.js` im Watchdog-Ordner. Inbox-Items landen dort auch ohne Regeneration – das Dashboard liest `inbox.json` alle 2 Min + beim Öffnen. Nur wenn Fristen fest ins Grundgerüst aufgenommen werden sollen, muss der Generator mit Code-Änderung an der `FRISTEN`-Datenstruktur neu laufen. Der Generator aktualisiert gleichzeitig `plan_index.json`.
