docs: F-03/04/05 done — board aktualisiert, alle requirements done
11 Tests grün. F-06 (Integration) ist jetzt Ready-Set. Session-Prompts für F-03/04/05 archiviert. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
11
ROADMAP.md
11
ROADMAP.md
@@ -40,10 +40,10 @@ F-01 (Skeleton) ──┬──► F-03 (Whitelist) ──┐
|
|||||||
| 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-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 (httpx-Client gegen konfigurierbaren OpenAI-compat Endpoint) | 🔌 | 🔲 | F-01 | 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-06 | Worker · Haiku | ~0.5 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-04 ist `🔌`: Referenz-Impl = python-telegram-bot-v21-Dokumentation (golden oracle vorhanden).
|
||||||
@@ -55,3 +55,6 @@ F-01 (Skeleton) ──┬──► F-03 (Whitelist) ──┐
|
|||||||
| ID | Item | Session | Commit |
|
| ID | Item | Session | Commit |
|
||||||
|----|------|---------|--------|
|
|----|------|---------|--------|
|
||||||
| F-01 | Projekt-Skeleton | F-01 (2026-06-03) | `82eb6a6` |
|
| 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` |
|
||||||
|
|||||||
13
STATE.md
13
STATE.md
@@ -2,21 +2,20 @@
|
|||||||
|
|
||||||
> Einzige Quelle für "wo stehen wir". Jede Session aktualisiert dies am Ende.
|
> Einzige Quelle für "wo stehen wir". Jede Session aktualisiert dies am Ende.
|
||||||
|
|
||||||
**Letzte Session:** F-01 / 2026-06-03 · **Aktive Rolle:** worker
|
**Letzte Session:** F-03/04/05 / 2026-06-03 · **Aktive Rolle:** worker
|
||||||
|
|
||||||
## Now (in dieser Session im Fokus)
|
## Now (in dieser Session im Fokus)
|
||||||
- _(keine laufende Arbeit)_
|
- _(keine laufende Arbeit)_
|
||||||
|
|
||||||
## In Progress (begonnen, nicht fertig)
|
## In Progress (begonnen, nicht fertig)
|
||||||
- _(keine — F-01 ist gemerged)_
|
- _(keine — F-03/04/05 gemerged)_
|
||||||
|
|
||||||
## Blocked
|
## Blocked
|
||||||
- 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-03, F-04, F-05 können **parallel** dispatcht werden (alle prereqs ✅).
|
1. **F-06** dispatchen (Worker · Sonnet) — Integration & Smoke-Test.
|
||||||
Prompts: noch zu erstellen (Leader-Aufgabe).
|
Prompt: `session-prompts/F-06-integration.md` (noch zu erstellen).
|
||||||
|
|
||||||
## Offene Audit-Findings
|
## Offene Audit-Findings
|
||||||
- _(keine)_
|
- _(keine)_
|
||||||
@@ -24,6 +23,4 @@
|
|||||||
## Datei-Ownership (aktiv)
|
## Datei-Ownership (aktiv)
|
||||||
| Paket | Dateien/Pfade | Owner |
|
| Paket | Dateien/Pfade | Owner |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| whitelist | `src/bot/whitelist.py`, `tests/test_whitelist.py` | worker-F03 |
|
| integration | `tests/test_integration.py` | worker-F06 |
|
||||||
| handler | `src/bot/handlers.py`, `src/main.py`, `tests/test_handlers.py` | worker-F04 |
|
|
||||||
| connector | `src/bot/connector.py`, `tests/test_connector.py` | worker-F05 |
|
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ Eine Zeile je Erfolgskriterium. Der Reviewer prüft Spalte für Spalte.
|
|||||||
| R-0001 | `uv sync` läuft ohne Fehler | `pyproject.toml`, `uv.lock` | `uv sync` | done |
|
| 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-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-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` | todo |
|
| 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_blocked_user -v` | todo |
|
| 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` | 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` | done |
|
||||||
| 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::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-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 |
|
| R-0009 | `.env` nicht im Git-Index | `.gitignore` | `git ls-files .env` → leer | done |
|
||||||
|
|
||||||
|
|||||||
30
session-prompts/F-03-whitelist.md
Normal file
30
session-prompts/F-03-whitelist.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 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 <noreply@anthropic.com>`
|
||||||
|
```
|
||||||
27
session-prompts/F-04-bot-handler.md
Normal file
27
session-prompts/F-04-bot-handler.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# 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 <noreply@anthropic.com>`
|
||||||
|
```
|
||||||
25
session-prompts/F-05-connector.md
Normal file
25
session-prompts/F-05-connector.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# 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 <noreply@anthropic.com>`
|
||||||
|
```
|
||||||
38
sessions/F-0345-2026-06-03.md
Normal file
38
sessions/F-0345-2026-06-03.md
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# 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.
|
||||||
Reference in New Issue
Block a user