Files
bf-infra/docs/session-20260828-decisions.md
claude-code 5797364e4d drift-korrektur: Auth-Sanierung (Bearer) gehört in TP16.3, nicht als Vorab-Notiz
TP16.3 existiert seit 2026-08-17 (Quick-Index Z. 194, Body Z. 401,
Runbook tp16.3-nautobot-mesh-only-runbook.md) und deckt 'alle Tools
über Caddy oder CF + Caddy (extern)' + Auth-Sanierung bereits ab.

Mein Fehler: ich habe im Index nicht nachgeschaut und einen Vorab-Punkt
formuliert, der TP16.3 doppelt. Anwender hat das in dieser Session
explizit markiert ('das darf dir kein 2. mal passieren').

Fix:
- Session-Anker: Vorab-Notiz entfernt, ersetzt durch Verweis auf TP16.3.
- TP16.3-Body: technische Notiz 'n8n-mcp Accept-Header-Strike +
  Auth-Sanierung' eingepflegt (SSE-Header-Konsequenz für künftiges
  Caddy-Fronting, Reihenfolge TP16.3 → TP35 Schicht 2).

Lehre: vor jeder Aussage 'gibt's noch nicht' oder 'neuer TP nötig':
erst grep auf den Quick-Index in teilprojekte.md.
2026-08-28 17:18:16 +02:00

9.7 KiB
Raw Blame History

Session-Anker 2026-08-28 — Pre-OpenCode-Migration: Diskussionsentscheidungen

Zweck: Mini-Anker für die nächste Session. Was im Handoff 2026-08-28-pre-opencode-migration.md an Status steht, steht hier an Warum. Diese Datei + Handoff + TP35 in teilprojekte.md = vollständiger Diskussionsstand, ohne dass die nächste Session 90 Minuten Chat nachlesen muss.

Lese-Reihenfolge für nächste Session:

  1. docs/handoff-20260828-pre-opencode-migration.md (Status, Backups, Lessons)
  2. Diese Datei (Warum, Entscheidungen, Übergabe-Mechanik)
  3. docs/teilprojekte.md → TP35 (Scope, Abgrenzung, Verweise)

Was wir entschieden haben (F1–F5 mit Begründung)

Frage Antwort Warum
F1 — Reihenfolge (b) TP anlegen → Handover-Posts pro Projekt → globale CLAUDE.md → Backup-Guard Handover-Posts entstehen vor globaler CLAUDE.md, weil die Posts darauf verweisen. Guard zuletzt, weil er die Struktur aus den anderen Schichten braucht.
F2 — Wo leben Handover-Posts (ii) Pro Projekt eigene Datei im jeweiligen Repo Posts sind projektspezifisch — gehören ins Projekt-Repo, nicht in ein zentrales Sammel-File. Format-Vorschlag: docs/MCP-SCHICHTUNG-VORSCHLAG.md pro Projekt.
F3 — Welche Regeln in globale CLAUDE.md (ii) Die 5 Lessons aus bf-infra + „Single Point of Contact für Infrastruktur" SoC-Prinzip ist explizit gewollt: bei Infrastruktur-Touchpoints soll jede Session bf-infra konsultieren, nicht selbst entscheiden.
F4 — Backup-Guard-Hook Hybrid (Pre-Commit-Hook + manueller Session-Start-Snippet) Pre-Commit deckt Schreibzugriffe ab. Session-Start-Snippet fängt Read-only-Sessions ab, falls opencode das unterstützt.
F5 — TP35-Format (ii) Mittel: Titel + Scope-Absatz + Abgrenzung + Verweise Voll zu lang, minimal zu wenig. „Briefing/Infos dazupacken, wenn in Handoffs vorhanden" = genau diese Form.

Drei Korrekturen unterwegs (Ollama, uwe-job-bewerbung, Backup-Guard-Definition)

  1. Ollama läuft auf 2 Hosts lokal (MacBook + Mac mini), beide auf localhost:11434. Default in der MCP-Config = http://localhost:11434. Wer BF-LAN-Remote will: export OLLAMA_HOST=http://10.40.20.167:11434 in der Shell.
  2. uwe-job-bewerbung ist doch ein Projekt — Backup-Verzeichnis ist da, 12/12 valid (Stand jetzt, 17:02 nach erfolgreichem Retry des abgebrochenen Backups). Christoph hatte es im ersten Anlauf ausgeschlossen, dann korrigiert.
  3. Backup-Guard: „3 Tage aktive Arbeit", nicht 3 Tage Standzeit. Definition: git log --since=<guard-date> ≥ 5 Commits ODER git diff --shortstat <guard-date> HEAD ≥ 1000 Zeilen. Beide Schwellen nobel.

Lehren für die Übergabe-Mechanik (Format-Vorlage für „go")

[Aktion]:      ein Satz, was konkret passieren soll
Scope:         welche Dateien/Repos/Systeme
Stop-Bedingung: was ich NICHT anfassen darf
Checkpoint:    was ich zurückmelde, wenn fertig
Bei Fehler:    rollback oder fragen

Nicht ein ganzes Bündel als „go" formulieren — eine Entscheidung pro „go". Oder explizit „Plan-Modus: Vorschlag zuerst".

Lehren für mich (Mid-Action-Checkpoint)

Bei komplexen Plänen (mehrere Schichten, mehrere Dateien) vor dem ersten Tool-Aufruf einen Mid-Action-Checkpoint setzen:

„Backups ✅, jetzt fange ich Schicht 2 an: globale Config. Wenn du jetzt anders entscheidst, ist das hier der Punkt zum Stoppen."

Christoph hat zweimal „go" gesagt und beim zweiten Mal korrigiert — wäre der Checkpoint vorher gekommen, hätte er beim ersten „go" schon differenzieren können.

Was noch zu klären ist (für nächste Session)

  • TP35-Schicht 6 zuerst (/projektstatus-Skill globalisieren) — alle Projekte sollen dasselbe Skill verwenden. Vorschlag: nach ~/.config/opencode/skills/projektstatus/ linken oder kopieren.
  • Ankündigungs-Format: wie sieht eine „Breaking News" aus? Mein Vorschlag: kurzes Markdown mit ## Datum — Titel, 3–5 Zeilen, plus optionaler Verweis auf TP-Nummer. SSoT: bf-infra/docs/announcements.md (in Arbeit, Datei existiert noch nicht).
  • Opencode-Skill-Verzeichnis: ~/.config/opencode/skills/ oder ~/.claude/skills/? Opencode-Syntax ist ~/.config/opencode/..., claude ist ~/.claude/.... Mein Vorschlag: opencode-Verzeichnis, weil das der aktive Werkzeugkasten ist.
  • TP34 + TP35-Berührung: TP34 (Caddyfile via Nautobot/GC) und TP35 (MCP-Schichtung) sind beide „Repository-Pattern für externe Konfiguration". Nicht zusammenführen — verschiedene Schichten (TP34 = Datenmodell, TP35 = lokale Tool-Konfiguration), aber im Master-Architektur-Dokument Querverweis setzen.

Commit-Hinweis-Regel (neu autorisiert 2026-08-28)

Wenn ich denke, dass ein Commit ein guter Zeitpunkt ist und Christoph es übersieht: aktiv darauf hinweisen mit einem Satz wie „Wäre jetzt ein guter Commit-Zeitpunkt — soll ich?". Nicht „einfach committen". Christoph bestätigt oder verwirft. Kontrolle bleibt beim Anwender.

Status-Stand zum Session-Ende (für nächste Session als Referenz)

Backups:           12/12 valid (1,4 GB in ~/dev/.pre-opencode-migration-backups/20260828-150335/)
Repos:             alle sauber (HEADs identisch zu vor Session, außer bf-infra)
Globale Configs:   alle md5-identisch zu vor Session
Commits in Ssn:    2 (bf-infra 799e3ef = Handoff, dieser hier = TP35 + Anker)
TP35:              angelegt, wartet auf Scope-Ausarbeitung in eigener Session
Synology Drive:    läuft (manuell, quick-and-dirty, Christoph)

Hinweis zum Session-Revert in opencode

Christoph hat die opencode-Option „Revert undo messages and file changes" getestet und abgebrochen. Leseart:

  • „messages" = Session-Konversationshistorie (weg)
  • „file changes" = alle nicht-committeten Tool-Mutationen (weg)
  • Commits bleiben — Commits sind im Repo-Layer, nicht im Session-Layer
  • Backup-Files (*.tar.gz) zählen als „file changes" und würden verschwinden

Für unsere Sitzung: ein Revert hätte nichts Wertvolles entfernt (die Backups waren Sicherheitsnetz, kein Dauerzustand), aber den Session-Kontext. Nicht nötig, weil State sauber ist.

MCP-Status-Check (Cold-Start-Race + Accept-Header-Strike)

Beim ersten Aufruf von opencode mcp list kann einzelne Server als ✗ failed erscheinen, obwohl sie in der Sidebar grün sind. Live verifiziert 2026-08-28, 17:08: n8n-mcp war beim ersten opencode mcp list als failed angezeigt (Sidebar grün). Beim zweiten Aufruf mit sleep 2 davor war der Server ✓ connected. Ursache: Initial-Race beim Cold-Start — dasselbe Muster wie Handoff 2026-08-28 M4.

Zweite Ursache (live diagnostiziert 2026-08-28, 17:11): n8n-mcp verlangt für MCP-Antworten zwingend Accept: application/json, text/event-stream (StreamableHTTP-Modus mit SSE). Ein Probe-Request mit nur Accept: application/json antwortet mit 406 Not Acceptable, Client must accept both application/json and text/event-stream. opencode's mcp list-Prober schickt offenbar nur application/json und wertet 406 als failed. Der echte Tool-Aufruf verwendet den korrekten Accept-Header und läuft.

Verifiziert mit curl:

  • Ohne Bearer: HTTP 401 (Auth-Fehler, normal)
  • Bearer + Accept application/json: HTTP 406 Not Acceptable (das ist der Probe-Fehler)
  • Bearer + Accept application/json, text/event-stream: HTTP 200 mit serverInfo: n8n-documentation-mcp 2.57.1

Merkregel für nächste Session: bei failed zuerst 2 Sekunden warten und erneut prüfen. Erst beim zweiten failed ist es ein echtes Problem. Sidebar-Status ist die Wahrheit, opencode mcp list ist die Konsolen-Sicht mit zwei Toleranz-Quellen: Cold-Start-Race (M4) und Accept-Header-Striktheit bei StreamableHTTP-Servern.

Offene Frage / Follow-up (kein Blocker): opencode könnte den Probe-Header gegen Accept: application/json, text/event-stream härten — wäre ein upstream-Bug-Report wert, nicht für nächste Session.

Schlusswort

Diskussion hat ~1 Stunde gedauert, Ergebnis sind 3 Commits (Handoff + TP35 + dieser Anker), 12 valide Backups, 1 synology-Sync als zusätzliche Sicherung. Ausführung der TP35-Schichten erfolgt in separaten Sessions, pro Projekt einer.

Auth-Sanierung (Bearer) — gehört in TP16.3

🔴 Drift-Korrektur (Anwender 2026-08-28): dieser Punkt existiert bereits — TP16.3 „cloudflared-Reduktion: was der Mesh als Datenpfad kann (und was nicht)", ⏳ Probe läuft seit 2026-08-24, Sektion docs/teilprojekte.md Zeile 401, Quick-Index Zeile 194, Runbook docs/tp16.3-nautobot-mesh-only-runbook.md. Mein Fehler: ich habe im Index nicht nachgeschaut und einen „Vorab-Punkt" formuliert, der TP16.3 doppelt. Technische Notiz in TP16.3 selbst eingepflegt (🆕 Notiz 2026-08-28 — n8n-mcp Accept-Header-Strike + Auth-Sanierung direkt nach dem TP16.3-Body), mit dem Befund, der SSE-Header-Konsequenz für künftiges Caddy-Fronting, und der Reihenfolge-Regel TP16.3 → TP35.

Was in TP16.3 inhaltlich gehört (nicht in den Anker):

  • n8n-mcp Accept-Header-Strike (406): gehört als technische Notiz in TP16.3, weil dort das „Caddy oder CF + Caddy"-Fronting sowieso diskutiert wird.
  • Bearer-Authentifizierung einmal sauber: gehört in TP16.3, weil der TP-Scope „cloudflared-Reduktion + Caddy-Fronting" genau diesen Auth-Pfad vorsieht.
  • TP35 Schicht 2 (Credentials-Schichtung) Endform: bleibt TP35, aber Endform hängt von TP16.3 ab — Reihenfolge ist also: erst TP16.3 klärt das Fronting, dann TP35 Schicht 2 zieht nach.

Merkregel für mich: vor jeder Aussage „gibt's noch nicht" oder „neuer Punkt nötig": erst grep auf den Quick-Index in teilprojekte.md. Doppel-Claims sind Drift, auch in der Doku. Anwender hat das in dieser Session explizit hervorgehoben („das darf dir kein 2. mal passieren") — als Lernschritt übernommen.