docs: scope-fix — Jetson extern, F-02-Spike entfernt, DAG vereinfacht
Der Modell-Server ist externer Dienst. F-05 portiert direkt gegen OpenAI-compat API (MODEL_BASE_URL konfigurierbar). ADR-0004 aktualisiert. F-03/F-04/F-05 werden nach F-01 parallel frei. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
21
ROADMAP.md
21
ROADMAP.md
@@ -29,30 +29,27 @@ Ready-Set = { Items mit Status 🔲, deren Prereqs ALLE ✅ sind }
|
|||||||
F-01 (Skeleton) ──┬──► F-03 (Whitelist) ──┐
|
F-01 (Skeleton) ──┬──► F-03 (Whitelist) ──┐
|
||||||
├──► F-04 (Bot-Handler) ──┼──► F-06 (Integration) ──► F-07 (Deploy)
|
├──► F-04 (Bot-Handler) ──┼──► F-06 (Integration) ──► F-07 (Deploy)
|
||||||
└──► F-05 (Model-Connector) ──┘
|
└──► F-05 (Model-Connector) ──┘
|
||||||
F-02 (API-Spike) ──► F-05
|
|
||||||
```
|
```
|
||||||
|
|
||||||
> F-02 ist 🔬: Spike-Gate muss durch, bevor F-05 dispatcht wird.
|
> Nach F-01 ✅ werden F-03, F-04 und F-05 **gleichzeitig** frei — alle drei
|
||||||
> F-05 bleibt ⏸ bis F-01 **und** F-02 ✅ sind.
|
> können parallel dispatcht werden.
|
||||||
> F-06 bleibt ⏸ bis F-03, F-04 **und** F-05 ✅ sind.
|
> F-06 bleibt ⏸ bis F-03 + F-04 + F-05 alle ✅ sind.
|
||||||
> F-07 bleibt ⏸ bis F-06 ✅ ist.
|
|
||||||
|
|
||||||
## Board
|
## Board
|
||||||
|
|
||||||
| ID | Item | Typ | Status | Prereqs | Rolle · Modell | Aufwand |
|
| ID | Item | Typ | Status | Prereqs | Rolle · Modell | Aufwand |
|
||||||
|----|------|-----|--------|---------|----------------|---------|
|
|----|------|-----|--------|---------|----------------|---------|
|
||||||
| F-01 | Projekt-Skeleton (pyproject.toml, Paketstruktur, CI-Stub) | 🧱 | 🔲 | — | Worker · Sonnet | ~0.5 d |
|
| F-01 | Projekt-Skeleton (pyproject.toml, Paketstruktur, CI-Stub) | 🧱 | 🔲 | — | Worker · Sonnet | ~0.5 d |
|
||||||
| F-02 | Spike: Modell-API-Format (welches Endpoint-Schema exponiert der Jetson-Server?) | 🔬 | 🔲 | — | Theorist · Opus → Spike | ~0.5 d |
|
|
||||||
| F-03 | Whitelist-Middleware (User-ID-Allowlist, Env-Var-Config) | 🧱 | ⏸ | F-01 | Worker · Sonnet | ~0.5 d |
|
| F-03 | Whitelist-Middleware (User-ID-Allowlist, Env-Var-Config) | 🧱 | ⏸ | F-01 | Worker · Sonnet | ~0.5 d |
|
||||||
| F-04 | Telegram-Bot-Handler (Polling-Loop, /start, /help, Nachricht-Relay) | 🔌 | ⏸ | F-01 | Porter · Sonnet | ~1 d |
|
| F-04 | Telegram-Bot-Handler (Polling-Loop, /start, /help, Nachricht-Relay) | 🔌 | ⏸ | F-01 | Porter · Sonnet | ~1 d |
|
||||||
| F-05 | Modell-HTTP-Connector (async httpx-Client zum lokalen Modell-Server) | 🔌 | ⏸ | F-01, F-02 | Porter · Sonnet | ~0.5 d |
|
| F-05 | Modell-HTTP-Connector (httpx-Client gegen konfigurierbaren OpenAI-compat Endpoint) | 🔌 | ⏸ | F-01 | Porter · Sonnet | ~0.5 d |
|
||||||
| F-06 | Integration & Smoke-Test (Whitelist + Handler + Connector verdrahtet, E2E-Test) | 🧱 | ⏸ | F-03, F-04, F-05 | Worker · Sonnet | ~1 d |
|
| F-06 | Integration & Smoke-Test (Whitelist + Handler + Connector verdrahtet, E2E-Test) | 🧱 | ⏸ | F-03, F-04, F-05 | Worker · Sonnet | ~1 d |
|
||||||
| F-07 | Deployment-Config (.env.example, Docker oder systemd-Unit für Jetson) | 🧱 | ⏸ | F-06 | Worker · Haiku | ~0.5 d |
|
| F-07 | Deployment-Config (.env.example, Docker oder systemd-Unit) | 🧱 | ⏸ | F-06 | Worker · Haiku | ~0.5 d |
|
||||||
|
|
||||||
> F-02 ist `🔬`: vor Produktionscode erst **Spike** (`docs/loops/spike-gate.md`) —
|
> F-04 ist `🔌`: Referenz-Impl = python-telegram-bot-v21-Dokumentation (golden oracle vorhanden).
|
||||||
> Nachweis, dass wir den Modell-Server erfolgreich ansprechen können (Connectivity-GO).
|
> F-05 ist `🔌`: Referenz-Impl = OpenAI Chat Completions API (de-facto-Standard für
|
||||||
> F-04 ist `🔌`: Referenz-Impl = python-telegram-bot-v21-Doku (golden oracle vorhanden).
|
> selbst gehostete Modelle; Endpoint-URL ist reine Config, kein Forschungsproblem).
|
||||||
> F-05 ist `🔌`: Referenz-Impl entsteht aus F-02-Spike-Spec.
|
> ADR-0004 begründet, warum kein Spike nötig ist.
|
||||||
|
|
||||||
## Done
|
## Done
|
||||||
| ID | Item | Session | Commit |
|
| ID | Item | Session | Commit |
|
||||||
|
|||||||
16
STATE.md
16
STATE.md
@@ -5,28 +5,26 @@
|
|||||||
**Letzte Session:** S-BOOTSTRAP / 2026-06-03 · **Aktive Rolle:** leader
|
**Letzte Session:** S-BOOTSTRAP / 2026-06-03 · **Aktive Rolle:** leader
|
||||||
|
|
||||||
## Now (in dieser Session im Fokus)
|
## Now (in dieser Session im Fokus)
|
||||||
- Bootstrap-Planning: ROADMAP befüllt, ADRs angelegt, Session-Prompts für F-01 und F-02 erzeugt.
|
- Scope-Korrektur: Jetson/Modell-Server ist extern — F-02-Spike entfernt, DAG vereinfacht.
|
||||||
|
|
||||||
## In Progress (begonnen, nicht fertig)
|
## In Progress (begonnen, nicht fertig)
|
||||||
- _(keine — Bootstrap ist abgeschlossen, nächste Dispatch-Sessions stehen bereit)_
|
- _(keine — bereit zum Dispatch)_
|
||||||
|
|
||||||
## Blocked
|
## Blocked
|
||||||
- F-03 Whitelist — wartet auf F-01 (`⏸`).
|
- F-03 Whitelist — wartet auf F-01 (`⏸`).
|
||||||
- F-04 Bot-Handler — wartet auf F-01 (`⏸`).
|
- F-04 Bot-Handler — wartet auf F-01 (`⏸`).
|
||||||
- F-05 Model-Connector — wartet auf F-01 + F-02 (`⏸`).
|
- F-05 Model-Connector — wartet auf F-01 (`⏸`).
|
||||||
- F-06 Integration — wartet auf F-03, F-04, F-05 (`⏸`).
|
- F-06 Integration — wartet auf F-03 + F-04 + F-05 (`⏸`).
|
||||||
- F-07 Deployment — wartet auf F-06 (`⏸`).
|
- F-07 Deployment — wartet auf F-06 (`⏸`).
|
||||||
|
|
||||||
## Next (priorisiert)
|
## Next (priorisiert)
|
||||||
1. F-01 dispatchen (Worker · Sonnet) — `session-prompts/F-01-skeleton.md`.
|
1. **F-01** dispatchen (Worker · Sonnet) — `session-prompts/F-01-skeleton.md`.
|
||||||
2. F-02 dispatchen (Theorist · Opus → Spike-Gate) — `session-prompts/F-02-api-spike.md`.
|
2. Nach F-01 ✅: F-03, F-04, F-05 können **parallel** dispatcht werden.
|
||||||
Beide können **parallel** starten, da kein Prereq zwischen ihnen.
|
|
||||||
|
|
||||||
## Offene Audit-Findings
|
## Offene Audit-Findings
|
||||||
- _(keine — Projekt frisch gestartet)_
|
- _(keine)_
|
||||||
|
|
||||||
## Datei-Ownership (aktiv)
|
## Datei-Ownership (aktiv)
|
||||||
| Paket | Dateien/Pfade | Owner |
|
| Paket | Dateien/Pfade | Owner |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| skeleton | `pyproject.toml`, `src/`, `tests/` | worker-F01 |
|
| skeleton | `pyproject.toml`, `src/`, `tests/` | worker-F01 |
|
||||||
| spike-api | `spike/model-api/` | theorist-F02 |
|
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
# 0004 — Modell-API-Format: erst Spike, dann Connector
|
# 0004 — Modell-Connector gegen OpenAI-kompatible API, kein Spike nötig
|
||||||
|
|
||||||
- **Status:** accepted
|
- **Status:** accepted (ersetzt: 2026-06-03, vorherige Version sah Spike vor)
|
||||||
- **Kontext:** Der Jetson Orin Nano Super hostet ein lokales Modell. Das
|
- **Kontext:** Der selbst gehostete Modell-Server (Jetson Orin Nano Super) ist
|
||||||
Endpoint-Schema ist nicht festgelegt (mögliche Backends: Ollama,
|
ein **externer Dienst** außerhalb dieses Repos. Das Backend (Ollama, llama.cpp,
|
||||||
llama.cpp-HTTP-Server, vLLM, custom FastAPI). Kein golden oracle.
|
vLLM o. ä.) ist Sache des Betreibers, nicht dieses Projekts.
|
||||||
- **Entscheidung:** F-02 (🔬 Spike) läuft **vor** F-05 (🔌 Connector).
|
- **Entscheidung:** Der Connector (F-05) portiert gegen die **OpenAI Chat
|
||||||
Der Spike bestimmt das tatsächliche API-Schema und erzeugt eine
|
Completions API** (`POST /v1/chat/completions`). Das ist der de-facto-Standard
|
||||||
Mini-Spec (`spike/model-api/spec.md`). F-05 portiert gegen diese Spec.
|
für selbst gehostete Modelle. Die Basis-URL wird via Env-Var `MODEL_BASE_URL`
|
||||||
- **GO-Kriterium:** Python-Skript sendet eine Test-Nachricht und empfängt
|
konfiguriert. Kein Spike nötig — die API-Spec ist bekannt und stabil.
|
||||||
eine nicht-leere Antwort vom lokalen Server. Latenz < 30 s akzeptabel.
|
- **Gründe:**
|
||||||
- **NO-GO-Kriterium:** Kein Endpoint erreichbar oder Antwort-Format
|
- Ollama, llama.cpp-HTTP, vLLM und LiteLLM exponieren alle diese Schnittstelle.
|
||||||
vollständig undokumentiert → Human-Entscheid, welcher Backend aufzusetzen.
|
- Der Connector funktioniert mit jedem Backend, das sich daran hält.
|
||||||
- **Konsequenz:** F-05 bleibt ⏸ bis Spike ✅ + GO. Wenn NO-GO: ⛔ blocked-extern.
|
- Ein Spike wäre nur nötig, wenn das API-Format unbekannt wäre — das ist hier
|
||||||
Spike-Branch `spike/model-api` wird nach GO verworfen; Spec bleibt in `docs/`.
|
nicht der Fall.
|
||||||
|
- **Konsequenz:** Wenn der externe Server ein nicht-kompatibles Format hat,
|
||||||
|
ist das ein Ops-Problem, kein Code-Problem. F-05 dokumentiert das erwartete
|
||||||
|
Schema im Manifest (R-0006).
|
||||||
|
|||||||
@@ -9,10 +9,9 @@ Eine Zeile je Erfolgskriterium. Der Reviewer prüft Spalte für Spalte.
|
|||||||
| R-0003 | Ruff meldet 0 Befunde | `src/`, `tests/` | `uv run ruff check src/ tests/` | todo |
|
| R-0003 | Ruff meldet 0 Befunde | `src/`, `tests/` | `uv run ruff check src/ tests/` | todo |
|
||||||
| R-0004 | Bot antwortet nur auf whitelistete User-IDs | `src/bot/whitelist.py` | `uv run pytest tests/test_whitelist.py -v` | todo |
|
| R-0004 | Bot antwortet nur auf whitelistete User-IDs | `src/bot/whitelist.py` | `uv run pytest tests/test_whitelist.py -v` | todo |
|
||||||
| R-0005 | Nicht-whitelistete User erhalten keine Antwort | `src/bot/whitelist.py` | `uv run pytest tests/test_whitelist.py::test_blocked_user -v` | todo |
|
| R-0005 | Nicht-whitelistete User erhalten keine Antwort | `src/bot/whitelist.py` | `uv run pytest tests/test_whitelist.py::test_blocked_user -v` | todo |
|
||||||
| R-0006 | Bot leitet Nachrichten an lokales Modell weiter | `src/bot/connector.py` | `uv run pytest tests/test_connector.py -v` | todo |
|
| R-0006 | Connector sendet POST /v1/chat/completions an MODEL_BASE_URL | `src/bot/connector.py` | `uv run pytest tests/test_connector.py -v` | todo |
|
||||||
| R-0007 | Modell-Antwort wird an User zurückgesendet | `src/bot/handlers.py` | `uv run pytest tests/test_handlers.py -v` | todo |
|
| R-0007 | Modell-Antwort wird an User zurückgesendet | `src/bot/handlers.py` | `uv run pytest tests/test_handlers.py -v` | todo |
|
||||||
| R-0008 | Spike-Ergebnis: Modell-API erreichbar (GO) | `spike/model-api/result.md` | manuell: `python spike/model-api/probe.py` | todo |
|
| R-0008 | Config lädt aus Env-Vars ohne Exception | `src/bot/config.py` | `uv run pytest tests/test_config.py -v` | todo |
|
||||||
| R-0009 | Config lädt aus Env-Vars ohne Exception | `src/bot/config.py` | `uv run pytest tests/test_config.py -v` | todo |
|
| R-0009 | `.env` nicht im Git-Index | `.gitignore` | `git ls-files .env` → leer | todo |
|
||||||
| R-0010 | `.env` nicht im Git-Index | `.gitignore` | `git ls-files .env` → leer | todo |
|
|
||||||
|
|
||||||
Status: `todo` · `in_progress` · `done` · `drift` (vom Audit markiert).
|
Status: `todo` · `in_progress` · `done` · `drift` (vom Audit markiert).
|
||||||
|
|||||||
@@ -1,69 +0,0 @@
|
|||||||
# Session-Prompt F-02 — Spike: Modell-API-Format (Theorist + Prototyper)
|
|
||||||
|
|
||||||
```
|
|
||||||
Modell: Opus
|
|
||||||
|
|
||||||
Du arbeitest in /Users/tarikmoussa/Desktop/files/agent-swarm-repo auf einem neuen Branch
|
|
||||||
`spike/model-api` (von `main`).
|
|
||||||
|
|
||||||
WICHTIG: Dies ist ein Research-Spike. Der Branch ist Wegwerf. Kein Produktionscode.
|
|
||||||
Spike-Gate-Regeln: `docs/loops/spike-gate.md`
|
|
||||||
ADR: `docs/adr/0004-modell-api-spike-first.md`
|
|
||||||
|
|
||||||
## Aufgabe
|
|
||||||
Bestimme das API-Format des selbst gehosteten Sprachmodells auf dem Jetson Orin Nano Super
|
|
||||||
und produziere eine Mini-Spec (`spike/model-api/spec.md`), gegen die F-05 dann portiert.
|
|
||||||
|
|
||||||
Hintergrund: Das Modell läuft auf einem lokalen Server. Der wahrscheinlichste
|
|
||||||
Backend-Stack ist **Ollama** (exponiert eine OpenAI-kompatible API auf Port 11434)
|
|
||||||
oder **llama.cpp HTTP-Server** (Port 8080, eigenes Format). Wir wissen es nicht sicher.
|
|
||||||
|
|
||||||
## Phase 1 — Theorist (du selbst, Opus)
|
|
||||||
1. Liste die drei wahrscheinlichsten Backend-Optionen für Jetson Orin:
|
|
||||||
- Ollama (`/api/generate`, `/api/chat` oder OpenAI-compat `/v1/chat/completions`)
|
|
||||||
- llama.cpp HTTP (`/completion`)
|
|
||||||
- Custom FastAPI
|
|
||||||
2. Für jede Option: notiere das minimale Request-/Response-Schema (JSON).
|
|
||||||
3. Schreibe `spike/model-api/spec.md` mit den Schema-Varianten und dem
|
|
||||||
GO-Kriterium: "Antwort ist nicht-leer und unter 30 s".
|
|
||||||
|
|
||||||
## Phase 2 — Prototyper (du selbst, Opus)
|
|
||||||
Schreibe `spike/model-api/probe.py` — ein minimales, wegwerfbares Python-Skript:
|
|
||||||
- Liest MODEL_BASE_URL aus Env-Var (default: http://localhost:11434).
|
|
||||||
- Schickt eine kurze Test-Nachricht ("Hallo, antworte mit einem Wort.").
|
|
||||||
- Gibt die rohe JSON-Antwort aus.
|
|
||||||
- Kommentiert, welches Schema es probiert hat.
|
|
||||||
|
|
||||||
Das Skript ist **kein Produktionscode** — kein Error-Handling, keine Abstraktionen.
|
|
||||||
|
|
||||||
## Phase 3 — GO/NO-GO
|
|
||||||
Dokumentiere in `spike/model-api/result.md`:
|
|
||||||
- Welches Backend hast du vorgefunden (oder angenommen)?
|
|
||||||
- Funktioniert der Probe erfolgreich? (GO / NO-GO)
|
|
||||||
- Exaktes API-Schema für den Connector (Request + Response-Felder).
|
|
||||||
- Empfehlung für F-05 Porter (welche Library, welchen Endpoint).
|
|
||||||
|
|
||||||
## Akzeptanzkriterien
|
|
||||||
- [ ] `spike/model-api/spec.md` enthält ≥ 2 Schema-Varianten mit JSON-Beispielen.
|
|
||||||
- [ ] `spike/model-api/probe.py` läuft ohne Import-Fehler (`python spike/model-api/probe.py --help` o. ä.).
|
|
||||||
- [ ] `spike/model-api/result.md` enthält ein klares GO oder NO-GO mit Begründung.
|
|
||||||
- [ ] GO: Das finale API-Schema ist in `result.md` exakt spezifiziert (Felder, Typen, Endpoint-Pfad).
|
|
||||||
- [ ] NO-GO: Ursache dokumentiert + Human-Empfehlung, welches Backend aufzusetzen.
|
|
||||||
|
|
||||||
## Nicht anfassen
|
|
||||||
`src/`, `tests/`, `pyproject.toml`, `ROADMAP.md`, `STATE.md` — alles außer `spike/model-api/`.
|
|
||||||
Kein Produktionscode schreiben. Spike-Branch wird nach GO verworfen.
|
|
||||||
|
|
||||||
## Commit & Push
|
|
||||||
- Conventional Commit: `docs: spike model-api format discovery [GO/NO-GO]`
|
|
||||||
- Trailer: `Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>`
|
|
||||||
- Push nach `origin spike/model-api`.
|
|
||||||
- Kein PR — Leader entscheidet nach GO/NO-GO über nächsten Schritt.
|
|
||||||
|
|
||||||
## Abschluss
|
|
||||||
1. `STATE.md` aktualisieren: F-02 Spike-Ergebnis + GO/NO-GO eintragen.
|
|
||||||
2. Falls GO: Leader dispatcht F-05 (Porter · Sonnet) mit `result.md` als Spec.
|
|
||||||
Falls NO-GO: Leader markiert F-05 als ⛔ blocked-extern + Human-Eskalation.
|
|
||||||
3. Session-Log: `sessions/F-02-<datum>.md`.
|
|
||||||
4. Hygiene-Gate: `bash scripts/gate-session-hygiene.sh`.
|
|
||||||
```
|
|
||||||
Reference in New Issue
Block a user