# Handoff 2026-08-28 — Session A (TP35 Schicht 6: /projektstatus-Skill für opencode) > **Bezug:** Handoff 2026-08-28 Bestand + Performance (`handoff-20260828-mcp-bestand-und-performance.md`) > → diese Session A (eine von drei Folge-Sessions aus dem obigen Handoff). > Diese Datei: **was in Session A passiert ist**, **was bleibt**, **Einstieg für Session B (shelly-mcp-Deploy)**. ## TL;DR - **`/projektstatus`-Skill läuft jetzt in opencode.** Kopie (`cp`, kein `ln -s`) nach `~/.config/opencode/skills/projektstatus/SKILL.md`. - **Kein** `skills.paths`-Eintrag in `~/.config/opencode/opencode.jsonc` nötig — opencode scannt den Default-Pfad. - **Lehre** im CLAUDE.md-Lessons-Block: Default-Pfad kopieren, nicht symlinken, keine `skills.paths`-Konfiguration. - **Doku nachgezogen:** TP35 Schicht 6 als ✅, Quick-Index ⏳ (Rest offen), Ist-Stand-Block auf 2026-08-28 mit MCP-Bestand-Korrektur. ## Was war (Drift → Befund → Entscheid) ### Drift - Im gestrigen Handoff (`handoff-20260828-mcp-bestand-und-performance.md`) stand, der testweise angelegte Symlink `~/.config/opencode/skills/projektstatus → ~/.claude/skills/projektstatus/` sei wieder entfernt worden. Wahr: das Verzeichnis `~/.config/opencode/skills/` existierte danach **nicht** mehr, opencode fand den Skill nicht. - Christoph-Direktive (verbatim aus CLAUDE.md-Lessons): "opencode ist die neue Umgebung, soll eigene Skill-Pfade haben, keine Symlinks". Frage: **wohin genau?** war offen. ### Befund (verifiziert, nicht geraten) - opencode-Schema aus `https://opencode.ai/config.json` (gefetched und gelesen): `skills.paths: string[]` ist der dokumentierte Multi-Pfad-Loader. - **Globale Default-Pfade** lauten `~/.config/opencode/skill//SKILL.md` und `~/.config/opencode/skills//SKILL.md` (beide Singular/Plural) — und zusätzlich scannt opencode `~/.claude/skills//SKILL.md` und `~/.agents/skills//SKILL.md` als **externe** Skills (auto-loaded). - Die Lehrstelle gestern war ein Holzweg: Symlink-Workaround für etwas, wofür das Schema einen eingebauten Default-Pfad hat. ### Entscheid - **Kopie** der `SKILL.md` nach `~/.config/opencode/skills/projektstatus/` — keine Konfigurationsänderung an `opencode.jsonc`. - Begründung: hält die Welten sauber getrennt (zwei Pflegeorte für spätere Drift-Reparaturen), nutzt den opencode-Default-Pfad ohne Sonderlock, vermeidet die gestern explizit abgelehnte Symlink-Lösung. ### Verifikation - `cp` lief, `diff -q ~/.claude/skills/projektstatus/SKILL.md ~/.config/opencode/skills/projektstatus/SKILL.md` → **byte-identisch** (kein Output = identisch). - Berechtigungen symmetrisch zur Quelle (`-rw-r--r--`). - `opencode.jsonc` ist **unverändert** (kein Backup nötig, kein Diff). - **Was die nächste Sitzung bestätigen muss:** opencode neu starten, `/projektstatus` triggern, den Baum lesen — der eigentliche Funktionsbeweis steht noch aus. ## Was sich geändert hat (in dieser Session, im Repo) | Datei | Änderung | |---|---| | `CLAUDE.md` (Lessons) | Zwei neue Einträge: (a) "opencode-Skills: Default-Pfad kopieren, NICHT symlinken" mit Schema-Referenz; (b) "Kommentar in Code ≠ Verhalten" als Generalisierung des credentials.json/.env-gitignore-Funds aus dem Commit-Schritt. | | `docs/teilprojekte.md` Quick-Index Z. 208 | TP35: `🔜 → ⏳` (Schicht 6 ✅, Rest offen). | | `docs/teilprojekte.md` TP35-Block Z. 1747 | Schicht 6 als ✅ markiert, Datum 2026-08-28, Befund-Block. | | `docs/teilprojekte.md` Ist-Stand Z. 28 | Datum auf 2026-08-28, neue Bullet-Zeile MCP-Bestand-Korrektur. | **Was bewusst NICHT geändert wurde:** - `opencode.jsonc` — der Pfad ist Default-Scan, kein Eintrag nötig. - `~/.claude/skills/projektstatus/` — die Quelle, bleibt unverändert. - `docs/handoff-20260828-mcp-bestand-und-performance.md` — gestern abgeschlossen, nicht überschrieben. ## Sicherheitsfund (nicht-Session-A-Arbeit, aber heute aufgetaucht) Beim `commit`/`push` der untracked Session-B-Vorbereitung: - `routeros/cloudflared/credentials.json` (Tunnel-PrivateKey base64) lag ungegittoret im Working Tree. - `mcp/shelly/.env` trug den Kommentar "gitignored, NICHT committen" — es gab aber **kein** `mcp/shelly/.gitignore`. - **Beide gefixt** in den Commits `27863c1` und `433e600` (siehe Lessons-Block). - Working Tree ist clean, kein Secret jemals in den Index geraten. ## Drei Folge-Sessions — was ist abgearbeitet, was steht | Session | Status | |---|---| | **A** — `/projektstatus`-Skill global | ✅ erledigt (diese Datei) | | **B** — shelly-mcp-Container auf DS923 deployen (live, ssh) | 🔜 vorbereitet (Repo-Materialien committed `27863c1`, .env lokal) | | **C** — Caddyfile↔CF-Ingress-Drift-Probe + Backup-Guard | 🔜 unangetastet | ## Lehren für die nächste Session (B) 1. **Live-Sweep am 2026-08-28 hat 23 Shellys auf VLAN30 bestätigt** (`.30.202`–`.226` + `.233`). `SHELLY_SWEEP=10.40.30.180-250` in `~/.secrets/exports.zsh` ist die Range, in der die echten Geräte **alle** liegen — die zusätzlichen 50 IPs sind Reserve, kein toter Sweep-Bereich. 2. **Container-Pfad** = DS923 (`10.40.20.10`), NICHT macmini. Macmini belasten wir nicht, das war Christoph-Direktive. 3. **Container-Definition lebt NICHT in `docs/nas-vlan20/stacks/shelly-mcp.yml`** — der wurde gestern gelöscht (User-Direktive: kein MCP-Client für shelly-mcp). Deployment = direkt via Portainer-API, nicht als Stack. 4. **DHCP-Reservierung** = `crs326-core` `dhcp-v20`, MAC nach erstem Boot per MikroMCP `manage_dhcp_lease make-static` festnageln. 5. **WLAN-PSKs** in `SHELLY_IOT_PSK` / `SHELLY_DEVICE_PW` (aus `~/.secrets/credentials.env`) — **niemals** ins Repo oder in den Container-Image. ## Commit - **Hash:** siehe `git log --oneline -1` nach diesem Handoff. - **Geänderte Dateien:** `CLAUDE.md`, `docs/teilprojekte.md`, neue Datei `docs/handoff-20260828-session-a-projektstatus.md`. - **Commit-Message (Vorschlag):** `TP35 Schicht 6: /projektstatus-Skill in opencode aktiviert + Doku nachgezogen` ## Stand - 2026-08-28, ~19:30 - Diese Session = Skill-Pfad-Findung + Kopie + Lessons-Eintrag + TP35/Ist-Stand-Update + Handoff - Sessions B + C aus dem gestrigen Handoff unverändert - `~/.config/opencode/opencode.jsonc` ist unverändert (kein Backup)