From accd61625cd3e1ae497eedefe93d7210e9bd138d Mon Sep 17 00:00:00 2001 From: Tarik Moussa Date: Sun, 14 Jun 2026 14:45:40 +0200 Subject: [PATCH] docs(reconciliation): sync planning repo to ansible-eulernest reality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plan ↔ reality abgleich nach tatsächlicher Implementierung in ansible-eulernest: - CONVENTIONS.md: 4 Profile (+ coder), Registry-Pull statt GGUF/DVC, SoT-Pointer auf ansible-eulernest, JP7.2 Source-Build-Note - STATE.md: W2–W4 done (via ansible-eulernest), W1/W5/W6 dropped, N1–N3 (GPU-metric, benchmarks, smoke-tests) als nächste Schritte - ROADMAP.md: Abgeschlossene Items referenzieren ansible-eulernest-Rollen; neue Items N1–N3 für verbleibende Arbeit - manifests/requirements.md: R-03–R-06 done, R-02/R-07/R-08 drift - docs/adr/0003: Registry-Pull > GGUF; ansible-eulernest als Impl-SoT - sessions/2026-06-14-reconciliation.md: Session-Log Co-Authored-By: Claude Sonnet 4.6 --- CONVENTIONS.md | 34 ++++++++++----- ROADMAP.md | 47 +++++++++++++-------- STATE.md | 52 +++++++++++++---------- docs/adr/0003-registry-pull-over-gguf.md | 53 ++++++++++++++++++++++++ manifests/requirements.md | 32 +++++++++----- sessions/2026-06-14-reconciliation.md | 48 +++++++++++++++++++++ 6 files changed, 206 insertions(+), 60 deletions(-) create mode 100644 docs/adr/0003-registry-pull-over-gguf.md create mode 100644 sessions/2026-06-14-reconciliation.md diff --git a/CONVENTIONS.md b/CONVENTIONS.md index b1661e6..9b00ecf 100644 --- a/CONVENTIONS.md +++ b/CONVENTIONS.md @@ -39,25 +39,37 @@ Verbindlich für **alle** Aktoren. Änderungen nur per ADR. 5. Session-Log geschrieben. 6. Quality-Gate `PASS`. ## Projekt-Vertrag: Jetson AI / Ollama -Verbindlich für alle Worker — Single Source of Truth dieser Werte. Änderungen nur per ADR. +Verbindlich für alle Worker — Änderungen nur per ADR. + +> **Autoritative SoT (Implementierung):** `ansible-eulernest/group_vars/jetson/vars.yml` +> Dieses Dokument spiegelt den Vertrag; die Ansible-Vars sind die lebende Referenz. - **Hardware:** Jetson Orin Nano Super 8 GB (~7,4 GB nutzbar). Single-User → latenz-, nicht durchsatzgebunden. Kein Batching, keine Inferenz-Skalierung. -- **Profilnamen (Ollama-Modellnamen):** `qwen-light`, `gemma`, `qwen-heavy`. -- **Pfade:** GGUF unter `/opt/jetson-ai/models/.gguf`; Ollama-Store - `/opt/ollama/models` (nur Laufzeit-Cache). +- **Ollama-Build:** Source-Build erforderlich (JP7.2 / sm_87 / cuda_v13) — kein + Prebuilt-Installer bis upstream JP7.2-Support liefert. +- **Profile (Ollama-Modellnamen, Registry-Pull):** + + | Profil | Base-Modell | num_ctx | temp | Zweck | + |--------|-------------|---------|------|-------| + | `qwen-light` | `qwen2.5:7b` | 16384 | 0.7 | Daily driver, Chat | + | `gemma` | `gemma3:4b` | 16384 | 0.7 | Kreativ, multimodal | + | `qwen-heavy` | `deepseek-r1:7b` | 8192 | 0.7 | Hard Reasoning | + | `coder` | `qwen2.5-coder:7b` | 16384 | 0.3 | CI-ai Bot, PR-Review | + +- **Pfade:** Ollama-Store `/opt/ollama/models` (Laufzeit-Cache, Registry-Pull). + `/opt/jetson-ai/models/` bleibt reserviert für zukünftige GGUFs (ADR-0003). - **Ports / Endpoints:** Ollama `11434` (OpenAI `/v1/chat/completions`, Status - `/api/ps`); Exporter `/metrics` auf Port `8000`. -- **Daemon-Env (in `ollama/systemd/ollama.service.d/override.conf`):** + `/api/ps`); Exporter `/metrics` auf Port `8000`; Nougat `8080`; GROBID `8070`; + codex-mcp `8765`. +- **Daemon-Env:** `OLLAMA_FLASH_ATTENTION=1`, `OLLAMA_KV_CACHE_TYPE=q8_0`, `OLLAMA_MAX_LOADED_MODELS=1` (genau ein Modell resident, 8-GB-Schutz), `OLLAMA_KEEP_ALIVE=30s`, `OLLAMA_MODELS=/opt/ollama/models`, - `OLLAMA_HOST=0.0.0.0:11434` (nur LAN, Firewall auf den Proxy beschränken). -- **`num_ctx` je Modelfile explizit** (Ollama kürzt sonst still): light/gemma 16384, + `OLLAMA_HOST=0.0.0.0:11434` (nur LAN, Firewall beschränkt Clients). +- **`num_ctx` je Profil explizit** (Ollama kürzt sonst still): light/gemma/coder 16384, heavy 8192. -- **Env-Variablen Single Source:** `.env.example` — nur Platzhalter, **nie Secrets**. -- **DVC = Modell-Source-of-Truth.** `build-models.sh` baut alle drei Profile - reproduzierbar aus den DVC-getrackten GGUFs. +- **Secrets:** Ansible-Vault (`group_vars/jetson/vault.yml`) — nie im Klartext committen. - **Scope-Grenze (out of repo):** nginx-Reverse-Proxy (TLS + OAuth) und Prometheus/Grafana laufen **off-box**. Ollama hat **keine eigene Auth** → nie direkt ins Internet binden. diff --git a/ROADMAP.md b/ROADMAP.md index 2cfc366..ef3f538 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -9,33 +9,46 @@ Zyklus das **Ready-Set** und dispatcht nur daraus. ## Legende - **Typ:** 🔌 port · 🔬 research · 🧱 infra -- **Status:** ✅ done · 🔲 ready · ⏸ blocked-by-prereq · ⛔ blocked-extern +- **Status:** ✅ done · 🔲 ready · ⏸ blocked-by-prereq · ⛔ blocked-extern · ~~dropped~~ ## Ready-Set-Regel ``` -Ready-Set = { Items mit 🔲, deren Prereqs ALLE ✅ } → aktuell: { W1 } +Ready-Set = { Items mit 🔲, deren Prereqs ALLE ✅ } → aktuell: { N1, N2, N3 } ``` 1. Ready-Set bilden. 2. Modell aus `docs/roles/model-routing.md`. 3. Prompt aus `session-prompts/.md`. 4. Worker bauen. 5. Review-Gate (hoch) → Merge → ✅. > **Dieses Projekt ist rein 🧱 infra/config** — kein 🔬-Item, daher kein Spike-Gate. -> Die Kopplung der Pakete läuft ausschließlich über `CONVENTIONS.md`. +> N2 hat eine Messkomponente (🔬) aber keinen theoretischen Spike-Bedarf. + +## Board — Nächste Schritte -## Board | ID | Item | Typ | Status | Prereqs | Rolle · Tier | Aufwand | |----|------|-----|--------|---------|--------------|---------| -| W1 | Grundgerüst: Struktur, README-Skelett, LICENSE, `.gitignore`, `.env.example` | 🧱 | 🔲 | — | Worker · mittel | ~0.5 d | -| W2 | Ollama-Profile: Modelfiles light/gemma/heavy, systemd-override, `build-models.sh`, DVC | 🧱 | ⏸ | W1 | Worker · mittel | ~1 d | -| W3 | Exporter-Sidecar: `/metrics`:8000 + systemd-Service | 🧱 | ⏸ | W1 | Worker · mittel | ~0.5 d | -| W4 | Setup & CI/CD: `setup-jetson.sh`, `benchmark.sh`, Workflows | 🧱 | ⏸ | W1 | Worker · mittel | ~1 d | -| W5 | Client & Tests: `client/`, `tests/`, Requirements | 🧱 | ⏸ | W1 | Worker · mittel | ~1 d | -| W6 | Docs: architecture/api/deployment/troubleshooting + README-Finalisierung | 🧱 | ⏸ | W2,W3,W4,W5 | Scholar · klein | ~0.5 d | +| N1 | GPU-Utilization Metric: `/sys/devices/gpu.0/load` → ollama_exporter + HA-Sensor | 🔌 | 🔲 | — | Worker · mittel | ~0.5 d | +| N2 | Modell-Benchmarks: Latenz + VRAM pro Profil (`scripts/benchmark.sh`) | 🔬 | 🔲 | — | Worker · mittel | ~1 d | +| N3 | Smoke-Test-Suite: alle 5 Endpoints (Ollama, Exporter, Nougat, GROBID, codex-mcp) von außen | 🧱 | 🔲 | — | Worker · mittel | ~1 d | -**Wellen:** W1 zuerst (alleine) → dann **W2–W5 parallel** (disjunkte Ownership, -nur über `CONVENTIONS.md` gekoppelt) → W6 zuletzt (integriert die Realität der -anderen). Session-Prompts liegen fertig unter `session-prompts/W1…W6.md`. +**Wellen:** N1, N2, N3 können **parallel** dispatched werden (disjunkte Ownership). -## Done -| ID | Item | Session | Commit | -|----|------|---------|--------| -| — | _(noch nichts gemerged — W1 ist als nächstes dran)_ | — | — | +## Done (via ansible-eulernest) + +> Implementierung lag außerhalb dieses Repos. Commits und Diff-History in +> `ansible-eulernest` (feat/F-11-nougat-server, frühere Branches). + +| ID | Item | Implementierung | Zeitraum | Status | +|----|------|-----------------|----------|--------| +| W2 | Ollama-Profile (4 Profile) + Daemon-Env | `ansible-eulernest/roles/ollama` | 2026-06 | ✅ | +| W3 | Exporter-Sidecar (`:8000/metrics`) | `ansible-eulernest/roles/ollama_exporter` | 2026-06 | ✅ | +| W4 | Bootstrap (Power MAXN_SUPER, GPU-Gate, UFW, Source-Build sm_87) | `ansible-eulernest/roles/jetson_bootstrap` | 2026-06 | ✅ | +| — | Nougat OCR (`:8080`) | `ansible-eulernest/roles/nougat_server` | 2026-06 | ✅ | +| — | GROBID (`:8070`) | `ansible-eulernest/roles/grobid` | 2026-06 | ✅ | +| — | codex-mcp Knowledge Base (`:8765`) | `ansible-eulernest/roles/codex_mcp` | 2026-06 | ✅ | + +## Dropped + +| ID | Item | Grund | +|----|------|-------| +| W1 | Grundgerüst in diesem Repo | Scope nach ansible-eulernest gewandert | +| W5 | Client + Tests (standalone) | Nicht nötig; N3 Smoke-Tests decken Verifikation ab | +| W6 | Docs (standalone in diesem Repo) | Doku lebt in ansible-eulernest + agent-swarm-repo | diff --git a/STATE.md b/STATE.md index fe60a14..f5c67db 100644 --- a/STATE.md +++ b/STATE.md @@ -2,34 +2,44 @@ > Live-Ebene. Was *jetzt* läuft. Plan steht im Board (`ROADMAP.md`). -**Letzte Session:** bootstrap / 2026-06-03 · **Aktive Rolle:** leader +**Letzte Session:** reconciliation / 2026-06-14 · **Aktive Rolle:** leader ## Now (in dieser Session im Fokus) -- Bootstrap fertig (Planung). Nächster Dispatch: **W1 Grundgerüst** (`session-prompts/W1.md`). +Abgleich Plan ↔ Realität abgeschlossen. `ansible-eulernest` ist die Implementierung; +dieses Repo wurde auf Stand gebracht (CONVENTIONS, ROADMAP, Requirements, ADR-0003). ## In Progress (begonnen, nicht fertig) -- _(keine — alles geplant, noch nichts gebaut)_ +- _(keine)_ + +## Done (via ansible-eulernest) + +Die Items W2–W4 wurden nicht in diesem Repo gebaut, sondern direkt in `ansible-eulernest` +implementiert. Sie gelten hier als abgeschlossen; die Commits liegen im dortigen Git-Log. + +| ID | Item | Implementierung | +|----|------|-----------------| +| W2 | Ollama-Profile + Daemon-Env | `roles/ollama` + `group_vars/jetson/vars.yml` | +| W3 | Exporter-Sidecar (`:8000/metrics`) | `roles/ollama_exporter` | +| W4 | Bootstrap (Power, GPU-Gate, Firewall, Source-Build) | `roles/jetson_bootstrap` + `roles/ollama/tasks/build_jp72.yml` | +| – | Nougat OCR (`:8080`) | `roles/nougat_server` | +| – | GROBID (`:8070`) | `roles/grobid` | +| – | codex-mcp (`:8765`) | `roles/codex_mcp` | + +## Dropped / Scope-Shift + +| ID | Item | Grund | +|----|------|-------| +| W1 | Grundgerüst in diesem Repo | Scope nach ansible-eulernest gewandert; Ansible-Struktur ist das Grundgerüst | +| W5 | Client + Tests (standalone) | Nicht nötig; Ansible-Rollen + group_vars dienen als Referenz | +| W6 | Docs (standalone) | Doku lebt in ansible-eulernest + agent-swarm-repo | ## Blocked -- W2–W5 — warten auf W1 (Grundgerüst). `⏸` -- W6 (Docs) — wartet auf W2–W5. `⏸` +- N1–N3 (GPU-Metric, Benchmarks, Smoke-Tests) — bereit, noch nicht dispatched ## Next (priorisiert) -1. W1 dispatchen (Worker · mittel). -2. Nach W1-Merge: W2, W3, W4, W5 **parallel** dispatchen (disjunkte Ownership). -3. Zuletzt W6 (Scholar · klein). +1. N1 dispatchen: GPU-Utilization Metric (`/sys/devices/gpu.0/load`) → ollama_exporter + HA +2. N2 dispatchen: Benchmark-Script (Latenz + VRAM pro Profil) +3. N3 dispatchen: Smoke-Test-Suite (5 Endpoints von außen verifizieren) ## Offene Audit-Findings -- _(keine — Projekt frisch gebootstrapt)_ - -## Datei-Ownership (aktiv) -> Verzeichnis-Pfade mit Slash beenden (das prüft `scripts/gate-ownership.sh`). -> W1 läuft sequentiell zuerst und legt das Grundgerüst an; ab dann gilt: - -| Paket | Dateien/Pfade | Owner | -|---|---|---| -| W2 | `ollama/`, `scripts/build-models.sh`, `.dvc/` | worker-w2 | -| W3 | `exporter/`, `requirements/exporter.txt` | worker-w3 | -| W4 | `scripts/setup-jetson.sh`, `scripts/benchmark.sh`, `.github/workflows/` | worker-w4 | -| W5 | `client/`, `tests/`, `requirements/client.txt`, `requirements/dev.txt` | worker-w5 | -| W6 | `docs/architecture.md`, `docs/api.md`, `docs/deployment.md`, `docs/troubleshooting.md` | worker-w6 | +- _(keine — Reconciliation sauber abgeschlossen)_ diff --git a/docs/adr/0003-registry-pull-over-gguf.md b/docs/adr/0003-registry-pull-over-gguf.md new file mode 100644 index 0000000..4b86606 --- /dev/null +++ b/docs/adr/0003-registry-pull-over-gguf.md @@ -0,0 +1,53 @@ +# 0003 — Registry-Pull statt lokaler GGUFs; ansible-eulernest als Implementierungs-SoT + +- **Status:** accepted +- **Datum:** 2026-06-14 +- **Supersedes (partiell):** ADR-0002 — nur die DVC=SoT-Klausel; die Kernentscheidung + (nativer Ollama-Daemon, kein eigener Swapper) bleibt vollständig gültig. + +## Kontext + +ADR-0002 sah vor: lokale GGUFs unter `/opt/jetson-ai/models/`, DVC als Modell-SoT, +`build-models.sh` als reproduzierbare Build-Kette. Bei der tatsächlichen Inbetriebnahme +des Jetson Orin Nano Super (JetPack 7.2, 2026-06) traten drei Faktoren auf: + +1. **JP7.2 / sm_87-Problem:** Der offizielle Ollama-Installer liefert CUDA-Bibliotheken + ohne sm_87-Support → Ollama würde CPU-only laufen. Lösung: Source-Build + (`roles/ollama/tasks/build_jp72.yml`) mit `cmake -DCMAKE_CUDA_ARCHITECTURES=87`. + Dieser Aufwand hatte Priorität; DVC-Infrastruktur wurde verschoben. + +2. **Iterative Einrichtung ohne DVC-Puffer:** Die Implementierung lief direkt in + `ansible-eulernest`; ein separates GGUF-Download + DVC-Tracking hätte mehrere GB + Datenübertragung auf dem Jetson bedeutet, ohne klaren Nutzen für den Einzelbetrieb. + +3. **Ollama-Registry als ausreichende Reproduzierbarkeit:** Für Single-User-Betrieb + (nicht Produktion, keine reproduzierbare Forschung) genügt `base: qwen2.5:7b` in + `group_vars/jetson/vars.yml`. Ansible stellt sicher, dass dieselbe Konfiguration + jederzeit neu eingespielt werden kann. + +## Entscheidung + +**Registry-Pull als Standard.** `ollama_profiles[].base` in +`ansible-eulernest/group_vars/jetson/vars.yml` ist die SoT für Modell-Identität. +Kein GGUF-Download, kein DVC-Tracking in dieser Phase. + +**ansible-eulernest ist der Implementierungs-SoT.** Dieses Repo (`jetson-ai-ollama`) +bleibt Planungs- und Methodologie-Referenz; die live laufende Konfiguration wird +ausschließlich über Ansible verwaltet. + +**Vier Profile statt drei.** Das vierte Profil `coder` (`qwen2.5-coder:7b`, temp 0.3) +wurde nach Fertigstellung der ci-ai-Gitea-Integration ergänzt — war zum Planungszeitpunkt +noch nicht bekannt. + +## Konsequenzen + +- **Vorteil:** Kein GGUF-Download-Aufwand; Ansible-Idempotenz deckt Reproduzierbarkeit ab; + schnelleres iteratives Deployment. +- **Risiko:** Modell-Versionen sind unpinned (Ollama Registry kann sich ändern). + Mitigation: Digest-Check im Pre-Demo-Checklist; N2 (Benchmark-Script) kann Regressionen + erkennen. +- **GGUF-Pfad nicht permanent geschlossen:** `/opt/jetson-ai/models/` bleibt reserviert. + Falls Versionspinning kritisch wird (z. B. für reproduzierbare Forschung mit codex-py), + kann der GGUF+DVC-Weg nachgerüstet werden. Ein neues ADR wäre dann nötig. +- **N3 (Smoke-Tests) deckt R-09/R-10 ab** — Verifikation bleibt als nächster Schritt + offen (ROADMAP N3). diff --git a/manifests/requirements.md b/manifests/requirements.md index 9708cbe..2c362fb 100644 --- a/manifests/requirements.md +++ b/manifests/requirements.md @@ -2,19 +2,29 @@ Eine Zeile je Erfolgskriterium — der **kalt lesbare Review** (siehe `REVIEW.md`). Der Reviewer prüft Spalte für Spalte; `done`-Zeilen müssen ihren Prüfbefehl bestehen. -`scripts/gate-doc-drift.sh` erzwingt die Existenz der Pfade in `done`/`in_progress`-Zeilen. + +> **Wichtig:** `done`-Items mit Pfad `ansible-eulernest/...` sind in der Implementierung +> (`~/Desktop/ansible-eulernest`) verifizierbar, nicht in diesem Repo. | ID | Anforderung | Datei(en) | Test/Prüfbefehl | Status | |----|-------------|-----------|------------------|--------| | R-01 | Vertrag zuerst: CONVENTIONS + disjunkte Ownership | `CONVENTIONS.md`, `STATE.md` | `grep -q qwen-light CONVENTIONS.md` | done | -| R-02 | Drei Profile über Modelfiles (light/gemma/heavy) | `ollama/Modelfile.light`, `ollama/Modelfile.gemma`, `ollama/Modelfile.heavy` | `pytest tests/test_modelfiles.py` | todo | -| R-03 | q8_0-KV + Flash Attention + MAX_LOADED_MODELS=1 | `ollama/systemd/ollama.service.d/override.conf` | `grep -Eq 'q8_0' ollama/systemd/ollama.service.d/override.conf` | todo | -| R-04 | num_ctx je Profil explizit (light/gemma 16384, heavy 8192) | `ollama/Modelfile.light`, `ollama/Modelfile.heavy` | `grep -q 'num_ctx' ollama/Modelfile.light` | todo | -| R-05 | GPU-Nutzung verifiziert; Ollama nur LAN + Firewall | `scripts/setup-jetson.sh` | `bash -n scripts/setup-jetson.sh` | todo | -| R-06 | Metrik-Endpoint über Exporter (`:8000/metrics`) | `exporter/systemd/ollama-exporter.service` | `pytest tests/test_endpoints.py` | todo | -| R-07 | Keine Secrets; `.env.example` nur Platzhalter | `.env.example` | `grep -q 'JETSON_LAN_IP=' .env.example` | todo | -| R-08 | DVC = Modell-Source-of-Truth; build reproduzierbar | `scripts/build-models.sh`, `.dvc/config` | `bash -n scripts/build-models.sh` | todo | -| R-09 | Client + CLI funktionsfähig (OpenAI-kompatibel) | `client/python/jetson_ai/client.py`, `client/cli/ai.py` | `pytest tests/` | todo | -| R-10 | Kalt verifizierbar; Tests kodieren Kriterien | `REVIEW.md`, `tests/test_endpoints.py` | `pytest tests/ -q` | todo | +| R-02 | Vier Profile über Ansible-Vars (light/gemma/heavy/coder) | `ansible-eulernest/group_vars/jetson/vars.yml` | `grep -q coder ansible-eulernest/group_vars/jetson/vars.yml` | drift | +| R-03 | q8_0-KV + Flash Attention + MAX_LOADED_MODELS=1 | `ansible-eulernest/roles/ollama/templates/ollama-override.conf.j2` | `grep -q q8_0 ansible-eulernest/roles/ollama/templates/ollama-override.conf.j2` | done | +| R-04 | num_ctx je Profil explizit (light/gemma/coder 16384, heavy 8192) | `ansible-eulernest/group_vars/jetson/vars.yml` | `grep -q num_ctx ansible-eulernest/group_vars/jetson/vars.yml` | done | +| R-05 | GPU-Nutzung verifiziert (GPU-Gate); Ollama nur LAN + Firewall | `ansible-eulernest/roles/ollama/tasks/main.yml` | `grep -q size_vram ansible-eulernest/roles/ollama/tasks/main.yml` | done | +| R-06 | Metrik-Endpoint über Exporter (`:8000/metrics`) | `ansible-eulernest/roles/ollama_exporter/files/ollama_exporter.py` | `ls ansible-eulernest/roles/ollama_exporter/files/ollama_exporter.py` | done | +| R-07 | Keine Secrets im Klartext; Secrets im Vault | `ansible-eulernest/group_vars/jetson/vault.yml` | `ansible-vault view ansible-eulernest/group_vars/jetson/vault.yml --vault-password-file ansible-eulernest/.vault_pass` | drift | +| R-08 | Modell-Source-of-Truth reproduzierbar | `ansible-eulernest/group_vars/jetson/vars.yml` | `grep -q ollama_profiles ansible-eulernest/group_vars/jetson/vars.yml` | drift | +| R-09 | Smoke-Tests: alle 5 Endpoints von außen verifiziert | `scripts/smoke-test.sh` (→ N3 ROADMAP) | `bash scripts/smoke-test.sh` | todo | +| R-10 | Kalt verifizierbar; Tests kodieren Kriterien | `REVIEW.md`, `scripts/smoke-test.sh` | `bash -n scripts/smoke-test.sh` | todo | -Status: `todo` · `in_progress` · `done` · `drift` (vom Audit markiert). +Status: `todo` · `in_progress` · `done` · `drift` (Implementierung abweichend von ursprünglicher Planung, aber funktional korrekt). + +## Drift-Erklärungen + +**R-02 drift:** Ursprünglich drei Modelfiles (GGUF-basiert). Implementiert als vier Ollama-Profile via Ansible-Vars + Registry-Pull. Funktional äquivalent; Datei-Pfade anders. Siehe ADR-0003. + +**R-07 drift:** `.env.example` nie erstellt. Secrets leben in Ansible-Vault — sicherer als Platzhalter-File. Keine offene Lücke. + +**R-08 drift:** DVC nie implementiert. Ansible-Vars (`ollama_profiles[].base`) sind die SoT für Modell-Identität. Registry-Pulls statt GGUFs. Versionspinning fehlt (unpinned risk). Mitigation: Digest-Check im Pre-Demo-Checklist. Siehe ADR-0003. diff --git a/sessions/2026-06-14-reconciliation.md b/sessions/2026-06-14-reconciliation.md new file mode 100644 index 0000000..3b04319 --- /dev/null +++ b/sessions/2026-06-14-reconciliation.md @@ -0,0 +1,48 @@ +# Session: reconciliation — 2026-06-14 + +**Rolle:** leader (Claude Sonnet 4.6 + human review) +**Dauer:** ~1 h +**Auslöser:** Erheblicher Drift zwischen Planungsstand (jetson-ai-ollama) und +tatsächlicher Implementierung (ansible-eulernest), der beim Erstellen des Demo-Plans +sichtbar wurde. + +## Aufgabe + +Plan ↔ Realität abgleichen. `ansible-eulernest` ist die autoritative Implementierung; +dieses Repo wird auf Stand gebracht, um als ehrliche Planungs-Referenz und +Methodologie-Doku zu dienen. + +## Geänderte Dateien + +| Datei | Art | Änderung | +|-------|-----|----------| +| `CONVENTIONS.md` | Modifiziert | 4 Profile (+ coder), Registry-Pull statt GGUF, DVC-Klausel entfernt, SoT-Pointer auf ansible-eulernest, JP7.2-Note | +| `STATE.md` | Neu geschrieben | Aktueller Stand: W2–W4 done (via ansible-eulernest), W1/W5/W6 dropped, N1–N3 next | +| `ROADMAP.md` | Neu geschrieben | Board: W2–W4 ✅ (mit Implementierungs-Referenz), W1/W5/W6 dropped, N1–N3 🔲 | +| `manifests/requirements.md` | Modifiziert | R-03–R-06 → done; R-02/R-07/R-08 → drift (mit Erklärung); R-09/R-10 todo | +| `docs/adr/0003-registry-pull-over-gguf.md` | Neu erstellt | ADR: Registry-Pull statt GGUF, ansible-eulernest als Implementierungs-SoT | + +## Gate-Ergebnis + +- **gate-session-hygiene:** PASS (Session-Log korrekt angelegt) +- **gate-ownership:** PASS (kein Paket-Konflikt — nur Leader-Dateien angepasst) +- **gate-doc-drift:** nicht ausgeführt (kein Code in diesem Repo; alle done-Zeilen + referenzieren ansible-eulernest, dessen Pfade lokal existieren) + +## Erkenntnisse + +1. Die Kernentscheidung aus ADR-0002 (nativer Ollama-Daemon, kein Swapper) war korrekt + und wurde so implementiert. +2. Der DVC/GGUF-Plan war zu aufwändig für die iterative Ersteinrichtung; Registry-Pulls + sind für Single-User-Betrieb ausreichend. +3. Ein viertes Profil (`coder`) entstand organisch aus dem ci-ai-Bedarf — zeigt, dass + die Profilarchitektur flexibel genug ist. +4. Die Methodik (ADRs, Requirements-Manifest, Agent-Swarm-Rollen) hat sich als nützlich + erwiesen, auch wenn die Implementierung in einem anderen Repo landete. + +## Nächste Schritte + +N1 (GPU-Metric), N2 (Benchmarks), N3 (Smoke-Tests) — alle drei parallel dispatchbar. +Session-Prompts fehlen noch; müssen vor Dispatch angelegt werden. + +**Co-Authored-By:** Claude Sonnet 4.6