- CLAUDE.md: zwei Lessons-Eintraege (opencode-Default-Pfad kopieren, nicht symlinken; Kommentar in Code != Verhalten) - teilprojekte.md: TP35 Quick-Index auf 'Schicht 6 erledigt, Rest offen', Schicht-6-Befund im TP-Block, Ist-Stand auf 2026-08-28 mit MCP-Bestand- Korrektur - handoff-20260828-session-a-projektstatus.md: Session-A-Bericht mit Drift, Befund, Entscheid, Lehren fuer Session B Skill selbst liegt in ~/.config/opencode/skills/projektstatus/SKILL.md (cp aus ~/.claude/skills/projektstatus/, byte-identisch) - opencode scannt diesen Default-Pfad, kein skills.paths-Eintrag in der JSONC noetig.
83 lines
6.1 KiB
Markdown
83 lines
6.1 KiB
Markdown
# 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/<name>/SKILL.md` und `~/.config/opencode/skills/<name>/SKILL.md` (beide Singular/Plural) — und zusätzlich scannt opencode `~/.claude/skills/<name>/SKILL.md` und `~/.agents/skills/<name>/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)
|