diff --git a/CONVENTIONS.md b/CONVENTIONS.md index 1824cf4..993e8fb 100644 --- a/CONVENTIONS.md +++ b/CONVENTIONS.md @@ -38,14 +38,7 @@ Verbindlich für **alle** Aktoren. Änderungen nur per ADR. 2. Tests grün. 3. Docs aktuell. 4. `STATE.md` aktualisiert. 5. Session-Log geschrieben. 6. Quality-Gate `PASS`. -## Projekt: tg-bot-jetson (projektspezifisch — Änderungen per ADR) +## Projekt: __ (projektspezifisch — Änderungen per ADR) -- **Sprache / Runtime:** Python 3.11+ -- **Paketmanagement:** `uv` + `pyproject.toml`; Lock-Datei `uv.lock` committen. -- **Bot-Framework:** `python-telegram-bot` v21 (asyncio) — ADR-0002. -- **HTTP-Client:** `httpx` (async) für Modell-Connector. -- **Test-Befehl:** `uv run pytest tests/ -v` -- **Lint:** `uv run ruff check src/ tests/` -- **Config-Konvention:** Alle Secrets/Einstellungen via Umgebungsvariablen; - `.env.example` committen, `.env` in `.gitignore` — ADR-0003. -- **Spike-Branch:** `spike/` (z. B. `spike/model-api`), wird nach GO/NO-GO verworfen. +> Dieser Abschnitt wird durch die BOOTSTRAP-Session befüllt. +> Typische Einträge: Sprache/Runtime, Paketmanagement, Test-Befehl, Lint, Config-Konvention. diff --git a/ROADMAP.md b/ROADMAP.md index 3389ac2..54d38b7 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -29,40 +29,21 @@ Ready-Set = { Items mit Status 🔲, deren Prereqs ALLE ✅ sind } > Ein Worker der keinen vorbereiteten Prompt vorfindet, soll NICHT beginnen > sondern `STATE.md` auf "Blocked — kein Prompt" setzen. -## Abhängigkeits-DAG (Projekt: tg-bot-jetson) +## Abhängigkeits-DAG (Projekt: __) ``` -F-01 (Skeleton) ──┬──► F-03 (Whitelist) ──┐ - ├──► F-04 (Bot-Handler) ──┼──► F-06 (Integration) ──► F-07 (Deploy) - └──► F-05 (Model-Connector) ──┘ +F-01 ──► F-02 ──► … ``` -> Nach F-01 ✅ werden F-03, F-04 und F-05 **gleichzeitig** frei — alle drei -> können parallel dispatcht werden. -> F-06 bleibt ⏸ bis F-03 + F-04 + F-05 alle ✅ sind. +> Den DAG nach dem BOOTSTRAP befüllen. ## Board | ID | Item | Typ | Status | Prereqs | Rolle · Modell | Aufwand | |----|------|-----|--------|---------|----------------|---------| -| F-01 | Projekt-Skeleton (pyproject.toml, Paketstruktur, CI-Stub) | 🧱 | ✅ | — | 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-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-07 | Deployment-Config (.env.example, Docker oder systemd-Unit) | 🧱 | ✅ | F-06 | Worker · Haiku | ~0.5 d | - -> F-04 ist `🔌`: Referenz-Impl = python-telegram-bot-v21-Dokumentation (golden oracle vorhanden). -> F-05 ist `🔌`: Referenz-Impl = OpenAI Chat Completions API (de-facto-Standard für -> selbst gehostete Modelle; Endpoint-URL ist reine Config, kein Forschungsproblem). -> ADR-0004 begründet, warum kein Spike nötig ist. +| — | _(nach BOOTSTRAP befüllen)_ | — | — | — | — | — | ## Done | ID | Item | Session | Commit | |----|------|---------|--------| -| F-01 | Projekt-Skeleton | F-01 (2026-06-03) | `82eb6a6` | -| F-03 | Whitelist-Middleware | F-03/04/05 (2026-06-03) | `de34c34` | -| F-04 | Telegram-Bot-Handler | F-03/04/05 (2026-06-03) | `de34c34` | -| F-05 | Modell-HTTP-Connector | F-03/04/05 (2026-06-03) | `de34c34` | -| F-06 | Integration & Smoke-Test | F-06 (2026-06-03) | `b2395e1` | -| F-07 | Deployment-Config | F-07 (2026-06-03) | `cb3b5c6` | +| — | — | — | — | diff --git a/STATE.md b/STATE.md index aca3970..1fcf244 100644 --- a/STATE.md +++ b/STATE.md @@ -2,20 +2,19 @@ > Einzige Quelle für "wo stehen wir". Jede Session aktualisiert dies am Ende. -**Letzte Session:** Retro / 2026-06-03 · **Aktive Rolle:** leader +**Letzte Session:** __ · **Aktive Rolle:** __ ## Now (in dieser Session im Fokus) - _(keine laufende Arbeit)_ ## In Progress (begonnen, nicht fertig) -- _(keine — alle Features F-01 bis F-07 gemerged)_ +- _(keine)_ ## Blocked - _(keine)_ ## Next (priorisiert) -- Alle Features implementiert. Projekt ist deployment-ready. -- Optionaler nächster Schritt: echtes Deployment auf Jetson-Hardware testen. +- _(noch nicht geplant — BOOTSTRAP-Session ausführen)_ ## Offene Audit-Findings - _(keine)_ diff --git a/docs/adr/0002-python-telegram-bot-framework.md b/docs/adr/0002-python-telegram-bot-framework.md deleted file mode 100644 index 906e325..0000000 --- a/docs/adr/0002-python-telegram-bot-framework.md +++ /dev/null @@ -1,15 +0,0 @@ -# 0002 — python-telegram-bot v21 als Bot-Framework - -- **Status:** accepted -- **Kontext:** Das Projekt braucht ein Python-Telegram-Bot-Framework. - Alternativen: `aiogram`, `telebot` (pyTelegramBotAPI), `ntelegram`. -- **Entscheidung:** `python-telegram-bot` v21 mit nativem `asyncio` und `httpx` - als HTTP-Client für den Modell-Connector. `uv` als Paketmanager. -- **Gründe:** - - PTB v21 hat die breiteste Doku, Beispiel-Bibliothek und Community für Telegram. - - Asyncio-first: passt zum Streaming-Potenzial künftiger Modell-Antworten. - - `httpx` ist de-facto-Standard für async HTTP in Python 3.11+. - - `uv` ist schneller und reproduzierbarer als plain pip. -- **Konsequenz:** Gesamte Codebasis ist async-first. PTB-Filter-System - (`filters.User`) eignet sich direkt für die Whitelist (F-03). - Keine Sync-Wrapper nötig. diff --git a/docs/adr/0003-whitelist-env-var.md b/docs/adr/0003-whitelist-env-var.md deleted file mode 100644 index 178f6aa..0000000 --- a/docs/adr/0003-whitelist-env-var.md +++ /dev/null @@ -1,16 +0,0 @@ -# 0003 — User-Whitelist via Umgebungsvariable - -- **Status:** accepted -- **Kontext:** Nur ausgewählte Telegram-User-IDs dürfen den Bot nutzen. - Optionen: Datenbank, Config-Datei, Env-Var, hardcodiert. -- **Entscheidung:** Env-Var `ALLOWED_USER_IDS` als komma-separierte Liste - ganzer Zahlen (z. B. `ALLOWED_USER_IDS=123456,789012`). - PTB-Filter `filters.User(user_ids=...)` erzwingt die Prüfung deklarativ. -- **Gründe:** - - Kein Deployment-Artefakt für die Liste nötig — reicht für v1. - - Änderung ohne Code-Deploy: Service neu starten genügt. - - Keine persistente Zustandsverwaltung, kein Datenbankrisiko. - - Leicht in `.env`-Datei und Docker/systemd-Unit einzutragen. -- **Konsequenz:** Für v2 (dynamisches Hinzufügen per Admin-Command) muss - ein Persistenz-Layer (SQLite o. ä.) ergänzt werden — das ist ein eigenes - Board-Item und ändert diese Entscheidung. diff --git a/docs/adr/0004-modell-api-spike-first.md b/docs/adr/0004-modell-api-spike-first.md deleted file mode 100644 index acabfc0..0000000 --- a/docs/adr/0004-modell-api-spike-first.md +++ /dev/null @@ -1,18 +0,0 @@ -# 0004 — Modell-Connector gegen OpenAI-kompatible API, kein Spike nötig - -- **Status:** accepted (ersetzt: 2026-06-03, vorherige Version sah Spike vor) -- **Kontext:** Der selbst gehostete Modell-Server (Jetson Orin Nano Super) ist - ein **externer Dienst** außerhalb dieses Repos. Das Backend (Ollama, llama.cpp, - vLLM o. ä.) ist Sache des Betreibers, nicht dieses Projekts. -- **Entscheidung:** Der Connector (F-05) portiert gegen die **OpenAI Chat - Completions API** (`POST /v1/chat/completions`). Das ist der de-facto-Standard - für selbst gehostete Modelle. Die Basis-URL wird via Env-Var `MODEL_BASE_URL` - konfiguriert. Kein Spike nötig — die API-Spec ist bekannt und stabil. -- **Gründe:** - - Ollama, llama.cpp-HTTP, vLLM und LiteLLM exponieren alle diese Schnittstelle. - - Der Connector funktioniert mit jedem Backend, das sich daran hält. - - Ein Spike wäre nur nötig, wenn das API-Format unbekannt wäre — das ist hier - 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). diff --git a/manifests/requirements.md b/manifests/requirements.md index a2406dd..996c5ce 100644 --- a/manifests/requirements.md +++ b/manifests/requirements.md @@ -4,14 +4,6 @@ Eine Zeile je Erfolgskriterium. Der Reviewer prüft Spalte für Spalte. | ID | Anforderung | Datei(en) | Test/Prüfbefehl | Status | |----|-------------|-----------|-----------------|--------| -| R-0001 | `uv sync` läuft ohne Fehler | `pyproject.toml`, `uv.lock` | `uv sync` | done | -| R-0002 | Pytest-Suite grün | `tests/` | `uv run pytest tests/ -v` | done | -| R-0003 | Ruff meldet 0 Befunde | `src/`, `tests/` | `uv run ruff check src/ tests/` | done | -| R-0004 | Bot antwortet nur auf whitelistete User-IDs | `src/bot/whitelist.py` | `uv run pytest tests/test_whitelist.py -v` | done | -| R-0005 | Nicht-whitelistete User erhalten keine Antwort | `src/bot/whitelist.py` | `uv run pytest tests/test_whitelist.py::test_whitelist_excludes_other_ids -v` | done | -| R-0006 | Connector sendet POST /v1/chat/completions an MODEL_BASE_URL | `src/bot/connector.py` | `uv run pytest tests/test_connector.py -v` | done | -| R-0007 | Modell-Antwort wird an User zurückgesendet | `src/bot/handlers.py` | `uv run pytest tests/test_handlers.py::test_handle_message_relays_to_model_and_replies -v` | done | -| R-0008 | Config lädt aus Env-Vars ohne Exception | `src/bot/config.py` | `uv run pytest tests/test_config.py -v` | done | -| R-0009 | `.env` nicht im Git-Index | `.gitignore` | `git ls-files .env` → leer | done | +| — | _(nach BOOTSTRAP befüllen)_ | — | — | — | Status: `todo` · `in_progress` · `done` · `drift` (vom Audit markiert). diff --git a/metrics/efficiency.csv b/metrics/efficiency.csv index 78a0651..5c63285 100644 --- a/metrics/efficiency.csv +++ b/metrics/efficiency.csv @@ -1,2 +1 @@ date,sessions,rework_commits,total_commits -2026-06-03,0,0,0 diff --git a/session-prompts/F-01-skeleton.md b/session-prompts/F-01-skeleton.md deleted file mode 100644 index ab15f57..0000000 --- a/session-prompts/F-01-skeleton.md +++ /dev/null @@ -1,67 +0,0 @@ -# Session-Prompt F-01 — Projekt-Skeleton - -``` -Modell: Sonnet - -Du arbeitest in /Users/tarikmoussa/Desktop/files/agent-swarm-repo auf einem neuen Branch -`feat/skeleton` (von `main`). - -## Aufgabe -Lege das Python-Projekt-Skeleton für den Telegram-Bot an: -pyproject.toml, Paketstruktur unter `src/bot/`, leere Test-Dateien unter `tests/`, -.env.example und .gitignore. Kein Feature-Code — nur die Projektstruktur, -sodass `uv run pytest tests/ -v` mit 0 Tests grün durchläuft. - -Scope: NUR Datei- und Konfigurationsstruktur. Kein Bot-Code, kein HTTP-Code. - -## Details -Entscheidungen: `docs/adr/0002-python-telegram-bot-framework.md` -Konventionen: `CONVENTIONS.md` (Abschnitt "Projekt: tg-bot-jetson") - -Gewünschte Verzeichnisstruktur: -``` -src/ - bot/ - __init__.py - config.py # pydantic-settings: BOT_TOKEN, ALLOWED_USER_IDS, MODEL_BASE_URL - handlers.py # vorerst leer (Platzhalter) - whitelist.py # vorerst leer (Platzhalter) - connector.py # vorerst leer (Platzhalter) - main.py # Einstiegspunkt (vorerst nur "pass") -tests/ - __init__.py - test_config.py # vorerst leer -pyproject.toml # [project] name="tg-bot-jetson", requires-python=">=3.11" - # deps: python-telegram-bot>=21, httpx, pydantic-settings - # [dev-deps]: pytest, ruff -.env.example # BOT_TOKEN=, ALLOWED_USER_IDS=123456,789012 - # MODEL_BASE_URL=http://192.168.x.x:11434 -.gitignore # .env, __pycache__, .venv, uv.lock nicht (committen!) -uv.lock # nach `uv sync` erzeugt und committen -``` - -## Akzeptanzkriterien -- [ ] `uv sync` läuft ohne Fehler. -- [ ] `uv run pytest tests/ -v` läuft durch (0 Tests, kein Fehler). -- [ ] `uv run ruff check src/ tests/` → 0 Befunde. -- [ ] `src/bot/config.py` enthält eine Pydantic-Settings-Klasse mit BOT_TOKEN, - ALLOWED_USER_IDS (list[int]), MODEL_BASE_URL. -- [ ] `.env.example` vorhanden und aussagekräftig. -- [ ] `.env` ist in `.gitignore`. - -## Nicht anfassen -Alles außer den oben genannten Pfaden. Kein Telegram-Handler-Code, -kein HTTP-Client-Code, keine Whitelist-Logik. - -## Commit & Push -- Conventional Commit: `chore: scaffold tg-bot-jetson project skeleton` -- Trailer: `Co-Authored-By: Claude Sonnet 4.6 ` -- Push nach `origin feat/skeleton`, PR öffnen (Base: `main`). - -## Abschluss -1. Manifest-Eintrag updaten: `manifests/requirements.md` → R-0001, Status `done`. -2. `STATE.md` aktualisieren: F-01 → In Progress → nach Merge: Next F-03 + F-04 frei. -3. Session-Log schreiben: `sessions/TEMPLATE.md` → `sessions/F-01-.md`. -4. Hygiene-Gate: `bash scripts/gate-session-hygiene.sh`. -5. PR-URL + Test-Zählstand reporten. -``` diff --git a/session-prompts/F-03-whitelist.md b/session-prompts/F-03-whitelist.md deleted file mode 100644 index 7e2f195..0000000 --- a/session-prompts/F-03-whitelist.md +++ /dev/null @@ -1,30 +0,0 @@ -# Session-Prompt F-03 — Whitelist-Middleware - -``` -Modell: Sonnet - -Du arbeitest in /Users/tarikmoussa/Desktop/files/tg-bot-jetson auf einem neuen Branch -`feat/whitelist` (von `main`). - -## Aufgabe -Implementiere die User-ID-Whitelist in `src/bot/whitelist.py`. -Nur whitelistete Telegram-User-IDs dürfen den Bot nutzen. -Nutze PTB v21's eingebauten `filters.User` — kein eigenes Filter-Framework. - -## Details -ADR: `docs/adr/0003-whitelist-env-var.md` (agent-swarm-repo) -Config: `src/bot/config.py` → `get_settings().allowed_user_ids: list[int]` - -## Akzeptanzkriterien -- [ ] `whitelist.py` exportiert `get_whitelist_filter() -> filters.BaseFilter`. -- [ ] Filter enthält alle IDs aus `get_settings().allowed_user_ids`. -- [ ] `uv run pytest tests/test_whitelist.py -v` → grün (≥ 2 Tests). -- [ ] `uv run ruff check src/ tests/` → 0 Befunde. - -## Nicht anfassen -`handlers.py`, `connector.py`, `main.py`, `config.py`. - -## Commit & Push -- `feat: add user-id whitelist filter (F-03)` -- Trailer: `Co-Authored-By: Claude Sonnet 4.6 ` -``` diff --git a/session-prompts/F-04-bot-handler.md b/session-prompts/F-04-bot-handler.md deleted file mode 100644 index f61d936..0000000 --- a/session-prompts/F-04-bot-handler.md +++ /dev/null @@ -1,27 +0,0 @@ -# Session-Prompt F-04 — Telegram Bot Handler - -``` -Modell: Sonnet - -Du arbeitest in /Users/tarikmoussa/Desktop/files/tg-bot-jetson auf einem neuen Branch -`feat/bot-handler` (von `main`). - -## Aufgabe -Implementiere `src/bot/handlers.py` (cmd_start, cmd_help, handle_message) und -`src/main.py` (Application-Setup, Handler-Registrierung, run_polling). -Referenz: python-telegram-bot v21 Doku (golden oracle). - -## Akzeptanzkriterien -- [ ] `/start` antwortet mit Begrüßungstext. -- [ ] `/help` antwortet mit Befehlsübersicht. -- [ ] `handle_message` ruft `ask_model(text)` auf und sendet die Antwort. -- [ ] `main.py` registriert alle Handler mit dem Whitelist-Filter. -- [ ] `uv run pytest tests/test_handlers.py -v` → grün (≥ 3 Tests). - -## Nicht anfassen -`whitelist.py`, `connector.py`, `config.py`. - -## Commit & Push -- `feat: add telegram handlers and application entrypoint (F-04)` -- Trailer: `Co-Authored-By: Claude Sonnet 4.6 ` -``` diff --git a/session-prompts/F-05-connector.md b/session-prompts/F-05-connector.md deleted file mode 100644 index 11f39bc..0000000 --- a/session-prompts/F-05-connector.md +++ /dev/null @@ -1,25 +0,0 @@ -# Session-Prompt F-05 — Modell-HTTP-Connector - -``` -Modell: Sonnet - -Du arbeitest in /Users/tarikmoussa/Desktop/files/tg-bot-jetson auf einem neuen Branch -`feat/model-connector` (von `main`). - -## Aufgabe -Implementiere `src/bot/connector.py`: async httpx-Client der POST /v1/chat/completions -an MODEL_BASE_URL sendet (OpenAI-kompatible API). Referenz: OpenAI API Spec. - -## Akzeptanzkriterien -- [ ] `ask_model(user_message: str) -> str` — async, gibt den Assistant-Text zurück. -- [ ] Nutzt `get_settings().model_base_url` und `model_name`. -- [ ] Timeout 60 s. Fehler werden als Exception weitergegeben (kein Swallow). -- [ ] `uv run pytest tests/test_connector.py -v` → grün (≥ 2 Tests, httpx gemockt). - -## Nicht anfassen -`whitelist.py`, `handlers.py`, `main.py`, `config.py`. - -## Commit & Push -- `feat: add async model HTTP connector (F-05)` -- Trailer: `Co-Authored-By: Claude Sonnet 4.6 ` -``` diff --git a/session-prompts/F-06-integration.md b/session-prompts/F-06-integration.md deleted file mode 100644 index 1589252..0000000 --- a/session-prompts/F-06-integration.md +++ /dev/null @@ -1,35 +0,0 @@ -# Session-Prompt F-06 — Integration & Smoke-Test - -``` -Modell: Sonnet - -Du arbeitest in /Users/tarikmoussa/Desktop/files/tg-bot-jetson auf einem neuen Branch -`feat/integration` (von `main`). - -## Aufgabe -Erstelle `tests/test_integration.py` mit ≥ 3 E2E-Tests, die Whitelist + Handler + -Connector gemeinsam verdrahtet prüfen. Behebe dabei den Entry-Point-Bug: -`src/main.py` liegt ausserhalb des `bot`-Pakets, obwohl pyproject.toml `bot.main:main` -deklariert — die Datei muss nach `src/bot/main.py` verschoben werden. - -## Akzeptanzkriterien -- [ ] `src/bot/main.py` existiert (verschoben von `src/main.py`). -- [ ] `tests/test_integration.py` enthält ≥ 3 Tests (E2E: Handler→Connector, Whitelist-Wire, App-Build). -- [ ] `uv run pytest tests/ -v` → alle Tests grün, kein Regression. -- [ ] `uv run ruff check src/ tests/` → keine Fehler. - -## Nicht anfassen -`whitelist.py`, `handlers.py`, `connector.py`, `config.py`. -Keine bestehenden Tests verändern. - -## Commit & Push -- `feat: F-06 integration smoke-test + fix bot.main entry point` -- Trailer: `Co-Authored-By: Claude Sonnet 4.6 ` -- Push nach `origin`, PR öffnen (Base: `main`). - -## Abschluss -1. `STATE.md` (agent-swarm-repo) aktualisieren. -2. `ROADMAP.md` F-06 auf ✅, F-07 auf 🔲 setzen. -3. Session-Log schreiben. -4. Hygiene-Gate: `bash scripts/gate-session-hygiene.sh`. -``` diff --git a/session-prompts/F-07-deployment.md b/session-prompts/F-07-deployment.md deleted file mode 100644 index a8a5875..0000000 --- a/session-prompts/F-07-deployment.md +++ /dev/null @@ -1,25 +0,0 @@ -# Session-Prompt F-07 — Deployment-Config - -``` -Modell: Haiku - -Du arbeitest in /Users/tarikmoussa/Desktop/files/tg-bot-jetson auf einem neuen Branch -`feat/deployment` (von `main`). - -## Aufgabe -Erstelle die Deployment-Konfiguration: systemd-Unit-Datei (primaer fuer Jetson/Ubuntu) -und Dockerfile (alternativer Docker-Pfad). Dokumentiere beide Wege in DEPLOY.md. - -## Akzeptanzkriterien -- [ ] `tg-bot-jetson.service` — systemd-Unit mit korrekten Abhaengigkeiten und Hardening. -- [ ] `Dockerfile` — minimales Image, keine Dev-Deps, frozen lockfile. -- [ ] `DEPLOY.md` — vollstaendige Installationsschritte fuer beide Pfade. -- [ ] `uv run pytest tests/ -v` → kein Regression. - -## Nicht anfassen -`src/`, `tests/`, `pyproject.toml`, `.env.example`. - -## Commit & Push -- `feat: F-07 deployment config — systemd unit, Dockerfile, DEPLOY.md` -- Trailer: `Co-Authored-By: Claude Haiku 4.5 ` -``` diff --git a/sessions/2026-06-03-bootstrap.md b/sessions/2026-06-03-bootstrap.md deleted file mode 100644 index 5f649a5..0000000 --- a/sessions/2026-06-03-bootstrap.md +++ /dev/null @@ -1,42 +0,0 @@ -# Session S-BOOTSTRAP — 2026-06-03 - -- **Rolle:** leader -- **Modell:** Sonnet 4.6 -- **Ziel:** Bootstrap: Projekt-Brief → ROADMAP-Board + ADRs + STATE + Session-Prompts - -## Geändert (Dateien) -- `ROADMAP.md` — Board mit 7 Items (F-01…F-07), DAG, Ready-Set -- `STATE.md` — Header aktiviert (S-BOOTSTRAP / 2026-06-03), Now/Next/Blocked befüllt -- `CONVENTIONS.md` — projektspezifischer Abschnitt "tg-bot-jetson" ergänzt -- `docs/adr/0002-python-telegram-bot-framework.md` — neu -- `docs/adr/0003-whitelist-env-var.md` — neu -- `docs/adr/0004-modell-api-spike-first.md` — neu -- `session-prompts/F-01-skeleton.md` — kaltstartfähiger Prompt (Worker · Sonnet) -- `session-prompts/F-02-api-spike.md` — kaltstartfähiger Prompt (Theorist · Opus → Spike) -- `sessions/2026-06-03-bootstrap.md` — dieses Log - -## Entscheidungen -- python-telegram-bot v21 + httpx als Stack (ADR-0002) -- Whitelist via Env-Var `ALLOWED_USER_IDS` (ADR-0003) -- Spike vor Connector: API-Format unbekannt (ADR-0004) -- F-01 und F-02 können **parallel** dispatcht werden (keine gegenseitige Abhängigkeit) - -## Tests -- kein Feature-Code in dieser Session - -## Token-Verbrauch -- input: — · output: — · total: — · tokens/Task: — -- Auffälligkeiten: — - -## Gates -- Hygiene: PENDING · Kontext: PASS · Token: — -- Review-Gate: nicht nötig (nur Planung, kein Feature-Code) - -## Handoff / Next -- Dispatche F-01 (`session-prompts/F-01-skeleton.md`) und F-02 (`session-prompts/F-02-api-spike.md`) **parallel**. -- Sobald F-01 ✅: F-03 (Whitelist) und F-04 (Bot-Handler) werden frei → Prompts erstellen. -- Sobald F-02 ✅ + GO: F-05 (Connector) wird frei → Prompt erstellen, dabei `spike/model-api/result.md` als Spec einbinden. -- Review-Gate nötig? Nein (Bootstrap-Session, kein Code) - -## Clean-Start-Check -- [x] Orientierung allein aus AGENTS/STATE/CONVENTIONS möglich. diff --git a/sessions/F-01-2026-06-03.md b/sessions/F-01-2026-06-03.md deleted file mode 100644 index 6476442..0000000 --- a/sessions/F-01-2026-06-03.md +++ /dev/null @@ -1,38 +0,0 @@ -# Session F-01 — 2026-06-03 - -- **Rolle:** worker -- **Modell:** Sonnet 4.6 -- **Ziel:** Projekt-Skeleton für tg-bot-jetson anlegen - -## Geändert (Dateien — Repo: tg-bot-jetson) -- `pyproject.toml` — deps: python-telegram-bot v21, httpx, pydantic-settings; dev: pytest, ruff -- `src/bot/config.py` — Settings-Klasse mit lru_cache-Factory -- `src/bot/{whitelist,handlers,connector}.py` — Platzhalter -- `src/main.py` — Platzhalter -- `tests/test_config.py` — 3 Tests -- `.env.example`, `.gitignore` - -## Entscheidungen -- pydantic-settings v2 parst `list[int]` via JSON-Array-Format (`[111,222]`), - nicht Comma-Separated. `.env.example` und Tests entsprechend angepasst. -- `settings` wird nicht auf Modulebene instantiiert — stattdessen `get_settings()` - mit `@lru_cache`, damit Tests und Prod unabhängig bleiben. - -## Tests -- `uv run pytest tests/ -v` → 3 passed -- `uv run ruff check src/ tests/` → 0 Befunde - -## Token-Verbrauch -- input: — · output: — · total: — · tokens/Task: — - -## Gates -- Hygiene: PASS · Kontext: PASS · Token: — -- Review-Gate: nötig (Skeleton-Code — Worker-Session) - -## Handoff / Next -- F-03 (Whitelist), F-04 (Bot-Handler), F-05 (Connector) sind jetzt alle frei. -- Leader erstellt die drei Prompts und dispatcht sie parallel. -- Review-Gate nötig? Ja — Opus-Session auf Commit `82eb6a6`. - -## Clean-Start-Check -- [x] Orientierung allein aus AGENTS/STATE/CONVENTIONS möglich. diff --git a/sessions/F-0345-2026-06-03.md b/sessions/F-0345-2026-06-03.md deleted file mode 100644 index 24a5db5..0000000 --- a/sessions/F-0345-2026-06-03.md +++ /dev/null @@ -1,38 +0,0 @@ -# Session F-03/04/05 — 2026-06-03 - -- **Rolle:** worker -- **Modell:** Sonnet 4.6 -- **Ziel:** Whitelist, Bot-Handler, Model-Connector implementieren - -## Geändert (Dateien — Repo: tg-bot-jetson) -- `src/bot/whitelist.py` — `get_whitelist_filter()` via `filters.User(user_id=...)` -- `src/bot/connector.py` — `ask_model()` async httpx POST /v1/chat/completions -- `src/bot/handlers.py` — `cmd_start`, `cmd_help`, `handle_message` -- `src/main.py` — ApplicationBuilder + Handler-Registrierung mit Whitelist-Filter -- `pyproject.toml` — `pythonpath = ["src"]` für pytest -- `tests/test_whitelist.py`, `tests/test_connector.py`, `tests/test_handlers.py` - -## Entscheidungen -- PTB v22 installiert (nicht v21 wie in pyproject.toml spezifiziert, da >= 21). - `filters.User(user_id=...)` — Konstruktor-Parameter ist singular `user_id`, - das Attribut nach Konstruktion heißt `user_ids` (frozenset). -- `pythonpath = ["src"]` in pytest nötig für src-Layout ohne editable-Install. -- pydantic-settings v2: `list[int]`-Env-Var muss JSON-Array-Format `[1,2,3]` haben. - -## Tests -- `uv run pytest tests/ -v` → **11 passed** -- `uv run ruff check src/ tests/` → 0 Befunde - -## Token-Verbrauch -- input: — · output: — · total: — · tokens/Task: — - -## Gates -- Hygiene: PASS · Kontext: PASS · Token: — -- Review-Gate: nötig (Opus-Session auf Commit `de34c34`) - -## Handoff / Next -- F-06 (Integration & Smoke-Test) ist jetzt frei — alle Prereqs ✅. -- Review-Gate nötig? Ja — Opus-Session auf `de34c34`. - -## Clean-Start-Check -- [x] Orientierung allein aus AGENTS/STATE/CONVENTIONS möglich. diff --git a/sessions/F-06-2026-06-03.md b/sessions/F-06-2026-06-03.md deleted file mode 100644 index 302d760..0000000 --- a/sessions/F-06-2026-06-03.md +++ /dev/null @@ -1,36 +0,0 @@ -# Session F-06 — 2026-06-03 - -- **Rolle:** worker -- **Modell:** Sonnet 4.6 -- **Ziel:** Integration & Smoke-Test implementieren; Entry-Point-Bug beheben. - -## Geändert (Dateien) -- `tg-bot-jetson/src/bot/main.py` — verschoben von `src/main.py` (Entry-Point-Fix) -- `tg-bot-jetson/tests/test_integration.py` — neu, 3 E2E-Tests -- `agent-swarm-repo/session-prompts/F-06-integration.md` — neu -- `agent-swarm-repo/ROADMAP.md` — F-06 auf ✅, F-07 auf 🔲 -- `agent-swarm-repo/STATE.md` — aktualisiert - -## Entscheidungen -- `src/main.py` → `src/bot/main.py`: pyproject.toml deklarierte `bot.main:main`, - aber das Modul lag ausserhalb des `bot`-Pakets — installierter CLI-Einstieg wäre kaputt gewesen. -- Integrationstests mocken `httpx.AsyncClient` (tiefer als die Unit-Tests), damit - die volle Kette Handler→Connector→HTTP in einem Lauf validiert wird. - -## Tests -- `uv run pytest tests/ -v` → 14 passed, 0 failed -- `uv run ruff check src/ tests/` → All checks passed - -## Token-Verbrauch -- nicht gemessen (automatisierte Session) - -## Gates -- Hygiene: PASS · Kontext: PASS · Token: n/a -- Review-Gate: ausstehend (Opus, Branch feat/integration) - -## Handoff / Next -- Review-Gate F-06 durchführen (Opus, kalt, diff feat/integration vs main). -- Nach Approve + Merge: F-07 dispatchen (Worker · Haiku, Deployment-Config). - -## Clean-Start-Check -- [x] Orientierung allein aus AGENTS/STATE/CONVENTIONS möglich. diff --git a/sessions/F-07-2026-06-03.md b/sessions/F-07-2026-06-03.md deleted file mode 100644 index 1cb8acc..0000000 --- a/sessions/F-07-2026-06-03.md +++ /dev/null @@ -1,30 +0,0 @@ -# Session F-07 — 2026-06-03 - -- **Rolle:** worker -- **Modell:** Sonnet 4.6 -- **Ziel:** Deployment-Config erstellen (systemd-Unit, Dockerfile, DEPLOY.md). - -## Geändert (Dateien) -- `tg-bot-jetson/tg-bot-jetson.service` — neu, systemd-Unit mit Hardening -- `tg-bot-jetson/Dockerfile` — neu, minimales python:3.11-slim Image -- `tg-bot-jetson/DEPLOY.md` — neu, Installationsschritte fuer beide Pfade - -## Entscheidungen -- systemd als primaerer Pfad: Jetson laeuft auf Ubuntu/Linux, kein Container-Overhead noetig. -- `python:3.11-slim` fuer Docker: Bot benoetigt keine GPU, daher kein Jetson-spezifisches Base-Image. -- `uv sync --no-dev --frozen` im Dockerfile: Reproduzierbarkeit durch Lockfile sichergestellt. -- `NoNewPrivileges + PrivateTmp` im systemd-Unit: minimales Hardening ohne Mehraufwand. - -## Tests -- `uv run pytest tests/ -v` → 14 passed (keine Regression) - -## Gates -- Hygiene: PASS -- Review-Gate: APPROVE (inline) - -## Handoff / Next -- Alle Features F-01 bis F-07 sind done. Das Projekt ist deployment-ready. -- Naechster Schritt: echtes Deployment auf Jetson-Hardware oder weiterer Feature-Ausbau. - -## Clean-Start-Check -- [x] Orientierung allein aus AGENTS/STATE/CONVENTIONS moeglich. diff --git a/sessions/retro-2026-06-03.md b/sessions/retro-2026-06-03.md deleted file mode 100644 index 0171003..0000000 --- a/sessions/retro-2026-06-03.md +++ /dev/null @@ -1,36 +0,0 @@ -# Session Retro — 2026-06-03 - -- **Rolle:** leader (Retro + Template-Verbesserung) -- **Modell:** Sonnet 4.6 + Opus 4.x (Review-Gate) -- **Ziel:** Abschluss-Review (Opus, kalt) + Template-Verbesserungen aus Chat-Retro. - -## Geändert (Dateien) -- `agent-swarm-repo/session-prompts/TEMPLATE.md` — 7 Verbesserungen (siehe unten) -- `agent-swarm-repo/ROADMAP.md` — Leader-Dispatch-Invariante ergaenzt - -## Entscheidungen (Template-Verbesserungen) - -| # | Problem (beobachtet in Session) | Fix | -|---|---|---| -| 1 | Keine Pflichtlektüre im Prompt (AGENTS/CONVENTIONS/STATE) | Pflichtlektüre-Block hinzugefügt | -| 2 | Rollen-Aktivierungssatz fehlte | `Rolle:` + Link zur Rollendatei als Pflichtfeld | -| 3 | Scope-Eskalationspfad undefiniert | Out-of-Scope-Findings-Regel eingefügt | -| 4 | Worker konnte selbst mergen (kein Hinweis) | "NICHT selbst mergen" explizit im Template | -| 5 | "Tests zuerst" war implizit | "Tests ZUERST grün, dann committen" | -| 6 | Kein Swarm-Kontext bei automatisiertem Dispatch | Optionale Swarm-Kontext-Sektion | -| 7 | Session-Prompt wurde in gleicher Session erstellt | ROADMAP-Invariante: Prompt existiert VOR Dispatch | - -## Opus-Review Ergebnis -- **APPROVE** — alle 14 Tests gruen, Entry-Point verifiziert, Deployment-ready. -- Nice-to-haves (non-blocking): systemd-Hardening ausbaubar, kein `PYTHONUNBUFFERED=1` im Dockerfile. - -## Gates -- Hygiene: PASS -- Review-Gate: APPROVE (Opus, kalt) - -## Handoff / Next -- Projekt vollstaendig. Naechster Schritt: echtes Deployment auf Jetson-Hardware. -- Templates verbessert und committet. - -## Clean-Start-Check -- [x] Orientierung allein aus AGENTS/STATE/CONVENTIONS moeglich.