docs(reconciliation): sync planning repo to ansible-eulernest reality
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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/<name>.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.
|
||||
|
||||
47
ROADMAP.md
47
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/<ID>.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 |
|
||||
|
||||
52
STATE.md
52
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)_
|
||||
|
||||
53
docs/adr/0003-registry-pull-over-gguf.md
Normal file
53
docs/adr/0003-registry-pull-over-gguf.md
Normal file
@@ -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).
|
||||
@@ -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.
|
||||
|
||||
48
sessions/2026-06-14-reconciliation.md
Normal file
48
sessions/2026-06-14-reconciliation.md
Normal file
@@ -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 <noreply@anthropic.com>
|
||||
Reference in New Issue
Block a user