378 lines
9.0 KiB
Markdown
378 lines
9.0 KiB
Markdown
# Buying Agent – Architecture Addendum v1
|
||
|
||
**Status:** ergänzende Architekturvorgabe
|
||
**Gültig zusammen mit:** `buying-agent-v0.1-spec-v1.1.md`
|
||
**Stand:** 2026-10-03
|
||
|
||
## 1. Zweck
|
||
|
||
Dieses Addendum ergänzt die bestehende Spezifikation um übergreifende Architekturentscheidungen für das spätere Zielsystem.
|
||
|
||
Es ersetzt **nicht** die fachliche Spezifikation `buying-agent-v0.1-spec-v1.1.md`.
|
||
|
||
Bei Konflikten zwischen beiden Dokumenten hat dieses Addendum für die hier behandelten Architekturthemen Vorrang.
|
||
|
||
Ziel ist, den aktuellen v0.1-Slice schlank zu halten, ohne spätere Erweiterungen auf Frontend, mehrere Kaufprojekte und mehrere Benutzer unnötig zu erschweren.
|
||
|
||
---
|
||
|
||
## 2. Zielstruktur des Repositories
|
||
|
||
Das Projekt wird als Monorepo strukturiert:
|
||
|
||
```text
|
||
buying-agent/
|
||
├── README.md
|
||
├── docker-compose.yml
|
||
├── .env.example
|
||
├── .gitignore
|
||
├── docs/
|
||
│ ├── buying-agent-v0.1-spec-v1.1.md
|
||
│ └── buying-agent-architecture-addendum-v1.md
|
||
├── backend/
|
||
│ ├── Dockerfile
|
||
│ ├── pyproject.toml
|
||
│ ├── uv.lock
|
||
│ ├── alembic.ini
|
||
│ ├── migrations/
|
||
│ ├── app/
|
||
│ ├── rules/
|
||
│ ├── profiles/
|
||
│ ├── fixtures/
|
||
│ ├── scripts/
|
||
│ └── tests/
|
||
└── frontend/
|
||
└── README.md
|
||
```
|
||
|
||
### Regeln
|
||
|
||
- `docker-compose.yml` bleibt im Repository-Root.
|
||
- Das Backend ist der aktuell implementierte v0.1-Scope.
|
||
- `frontend/` wird in v0.1 **nicht implementiert**.
|
||
- `frontend/README.md` dokumentiert lediglich, dass dort später die Benutzeroberfläche entsteht.
|
||
- Keine zusätzliche `infra/`-Struktur in v0.1, solange sie nicht konkret benötigt wird.
|
||
|
||
---
|
||
|
||
## 3. Backend-/Frontend-Grenze
|
||
|
||
Das Backend bleibt das **System of Record** und besitzt:
|
||
|
||
- Domain-Modell
|
||
- Constraints
|
||
- Scoring
|
||
- Evaluation
|
||
- Persistenz
|
||
- Preis- und Produktlogik
|
||
- zukünftige Kaufentscheidungslogik
|
||
|
||
Das spätere Frontend konsumiert ausschließlich die versionierte Backend-API, primär unter:
|
||
|
||
```text
|
||
/api/v1
|
||
```
|
||
|
||
Das Frontend enthält keine fachlich verbindliche Business-Logik.
|
||
|
||
---
|
||
|
||
## 4. Zukünftige Multi-User-Architektur
|
||
|
||
Das Zielsystem soll später von Familie und gegebenenfalls engen Freunden genutzt werden können.
|
||
|
||
Die Architektur darf daher nicht von einem impliziten Single-User-Modell ausgehen.
|
||
|
||
Zielmodell:
|
||
|
||
```text
|
||
User
|
||
↕
|
||
WorkspaceMember
|
||
↕
|
||
Workspace
|
||
↓
|
||
BuyingProject
|
||
↓
|
||
ProjectCandidate
|
||
↓
|
||
ProductVariant
|
||
```
|
||
|
||
Ein Benutzer kann Mitglied in mehreren Workspaces sein.
|
||
|
||
Beispiele:
|
||
|
||
```text
|
||
Lars
|
||
├── Privat
|
||
├── Familie
|
||
└── Freunde
|
||
```
|
||
|
||
### Noch nicht Bestandteil von v0.1
|
||
|
||
Nicht implementieren:
|
||
|
||
- Login
|
||
- Authentifizierung
|
||
- Passwortverwaltung
|
||
- Einladungen
|
||
- RBAC
|
||
- komplexe ACLs
|
||
- Sharing-UI
|
||
- Workspace-Administration
|
||
|
||
Die aktuelle Architektur darf deren spätere Einführung aber nicht unnötig erschweren.
|
||
|
||
---
|
||
|
||
## 5. Globale versus Workspace-bezogene Daten
|
||
|
||
### Global wiederverwendbare Daten
|
||
|
||
Diese Entitäten bleiben systemweit gemeinsam nutzbar:
|
||
|
||
- Product
|
||
- ProductVariant
|
||
- Offer
|
||
- PriceObservation
|
||
- AttributeDefinition
|
||
- Source
|
||
|
||
Sie erhalten **keine** `user_id` oder `workspace_id`.
|
||
|
||
Ein Produkt oder Angebot darf nicht pro Benutzer oder Workspace dupliziert werden.
|
||
|
||
### Workspace-bezogene Daten
|
||
|
||
Spätere benutzerbezogene Beschaffungskontexte gehören zu einem Workspace:
|
||
|
||
- BuyingProject
|
||
- ProjectCandidate
|
||
- projektspezifische Profil-/Anforderungsauswahl
|
||
- Notification Preferences
|
||
- Beschaffungsdeadline
|
||
- Zielpreis
|
||
- Kaufentscheidungsstatus
|
||
- gegebenenfalls spätere Warenkorb-/Beschaffungsinformationen
|
||
|
||
Diese Objekte werden erst in späteren Slices implementiert.
|
||
|
||
---
|
||
|
||
## 6. BuyingProject als zukünftiges Kernobjekt
|
||
|
||
Ein `BuyingProject` repräsentiert ein konkretes Beschaffungsvorhaben.
|
||
|
||
Beispiele:
|
||
|
||
- Mobiler Entwicklungsrechner
|
||
- Lokaler LLM-Server
|
||
- Fernseher
|
||
- Kamera
|
||
|
||
Ein Workspace kann mehrere BuyingProjects parallel besitzen.
|
||
|
||
Ein BuyingProject kann mehrere ProjectCandidates beobachten.
|
||
|
||
```text
|
||
BuyingProject
|
||
├── Candidate A → ProductVariant
|
||
├── Candidate B → ProductVariant
|
||
└── Candidate C → ProductVariant
|
||
```
|
||
|
||
### Wichtig für v0.1
|
||
|
||
`BuyingProject` und `ProjectCandidate` müssen in v0.1 noch nicht implementiert werden.
|
||
|
||
Die aktuelle Implementierung darf jedoch nicht annehmen:
|
||
|
||
- es existiert genau ein aktives Profil,
|
||
- es existiert genau ein Kaufvorhaben,
|
||
- es gibt globale Singleton-Konfiguration für einen aktuellen Kauf,
|
||
- alle Daten gehören automatisch demselben Benutzer,
|
||
- es existiert nur eine gleichzeitig relevante Evaluation.
|
||
|
||
Mehrere unabhängige Profile und Evaluationen müssen bereits parallel koexistieren können.
|
||
|
||
---
|
||
|
||
## 7. Rolle von n8n
|
||
|
||
n8n bleibt eine externe Orchestrierungsschicht.
|
||
|
||
Spätere mögliche Aufgaben:
|
||
|
||
- Scheduler
|
||
- Preisabfragen
|
||
- Datenimport
|
||
- Benachrichtigungen
|
||
- externe Integrationen
|
||
- volatile oder häufig veränderte Workflows
|
||
|
||
Kern-Business-Logik bleibt im Programmcode, insbesondere wenn sie:
|
||
|
||
- deterministisch sein soll,
|
||
- versioniert werden muss,
|
||
- getestet werden muss,
|
||
- fachliche Entscheidungen reproduzierbar machen soll.
|
||
|
||
n8n darf für veränderliche Prozesslogik eingesetzt werden, aber nicht zur Voraussetzung für das Funktionieren der Buying Engine werden.
|
||
|
||
---
|
||
|
||
## 8. Zukünftiges Frontend
|
||
|
||
Das Zielsystem soll später eine einfach bedienbare Oberfläche erhalten.
|
||
|
||
Die Standardoberfläche soll auch für nichttechnische Familienmitglieder verständlich bleiben.
|
||
|
||
Die Engine darf gleichzeitig deutlich leistungsfähiger sein als die Oberfläche.
|
||
|
||
Voraussichtliche spätere Kernbereiche:
|
||
|
||
- Übersicht laufender Kaufprojekte
|
||
- Kandidaten je Projekt
|
||
- aktueller bester Deal
|
||
- Preisverlauf
|
||
- Produkt-Fit
|
||
- Offer-Fit
|
||
- DealScore
|
||
- verständliche Gründe
|
||
- Beobachtungsstatus
|
||
- konkrete Kaufempfehlung
|
||
- ggf. spätere Benachrichtigungs- und Warenkorbfunktionen
|
||
|
||
Keine dieser UI-Funktionen ist Bestandteil von v0.1.
|
||
|
||
---
|
||
|
||
## 9. Kaufentscheidungslogik
|
||
|
||
Langfristig soll das System nicht nur Scores liefern, sondern auch konfigurierbare Kaufentscheidungen unterstützen.
|
||
|
||
Beispiele möglicher Einflussfaktoren:
|
||
|
||
- Zielpreis
|
||
- Maximalpreis
|
||
- spätestes Beschaffungsdatum
|
||
- aktueller Preis
|
||
- Preisentwicklung der letzten Tage/Wochen/Monate
|
||
- Abstand zu historischem Median
|
||
- Produkt-Fit
|
||
- Offer-Fit
|
||
- Verfügbarkeit
|
||
- Lieferzeit
|
||
- Händlerqualität
|
||
- alternative Kandidaten
|
||
- Beschaffungsdringlichkeit
|
||
|
||
Die Kaufentscheidung soll nachvollziehbar und möglichst deterministisch bleiben.
|
||
|
||
LLMs dürfen später Erklärungen, Normalisierung oder qualitative Interpretation unterstützen, sollen aber keine nicht nachvollziehbare Blackbox-Entscheidung erzwingen.
|
||
|
||
---
|
||
|
||
## 10. Datenquellen
|
||
|
||
Das Zielsystem muss mehrere Produkt- und Preisquellen unterstützen können.
|
||
|
||
Mögliche spätere Quellen:
|
||
|
||
- Amazon / Keepa
|
||
- Preisvergleichsportale
|
||
- Hersteller
|
||
- Händler
|
||
- weitere APIs
|
||
|
||
v0.1 implementiert weiterhin **keine reale externe Quelle**.
|
||
|
||
Die bestehende Source-Adapter-Grenze bleibt die vorgesehene Erweiterungsstelle.
|
||
|
||
---
|
||
|
||
## 11. Scope-Grenze für die laufende v0.1-Implementierung
|
||
|
||
Dieses Addendum darf nicht als Anlass dienen, v0.1 unnötig zu vergrößern.
|
||
|
||
Insbesondere **nicht jetzt implementieren**:
|
||
|
||
- echtes Frontend
|
||
- Authentifizierung
|
||
- User Management
|
||
- Workspace Management
|
||
- RBAC
|
||
- Einladungen
|
||
- BuyingProject
|
||
- ProjectCandidate
|
||
- Notifications
|
||
- n8n
|
||
- externe Preisquellen
|
||
- automatische Produktsuche
|
||
- Warenkorbmanagement
|
||
|
||
Ziel ist Architekturkompatibilität, nicht vorgezogene Feature-Entwicklung.
|
||
|
||
---
|
||
|
||
## 12. Arbeitsauftrag für die laufende Implementierung
|
||
|
||
Der Coding-Agent soll vor Fortsetzung des laufenden Builds einen kurzen Architecture-Alignment-Check durchführen.
|
||
|
||
### Prüfen
|
||
|
||
1. Entspricht die Repository-Struktur bereits der Monorepo-Struktur mit:
|
||
- `backend/`
|
||
- `frontend/`
|
||
- `docs/`
|
||
- Root-`docker-compose.yml`
|
||
|
||
2. Gibt es Annahmen über:
|
||
- genau einen Benutzer,
|
||
- genau ein aktives Profil,
|
||
- genau ein Kaufprojekt,
|
||
- globale Singleton-Zustände?
|
||
|
||
3. Sind Product, ProductVariant, Offer und PriceObservation weiterhin global und unabhängig von späteren Workspaces modelliert?
|
||
|
||
4. Ist das Backend klar von zukünftiger Frontend- und n8n-Logik getrennt?
|
||
|
||
### Änderungen
|
||
|
||
Nur notwendige strukturelle Anpassungen durchführen.
|
||
|
||
Keine vorgezogene Multi-User- oder Frontend-Funktionalität implementieren.
|
||
|
||
Die fachlichen Anforderungen aus `buying-agent-v0.1-spec-v1.1.md` bleiben vollständig gültig.
|
||
|
||
### Abschlussbericht
|
||
|
||
Dokumentieren:
|
||
|
||
- geänderte oder verschobene Dateien,
|
||
- notwendige Architekturänderungen,
|
||
- Änderungen an Datenbank/Migrationen,
|
||
- ausgeführte Tests,
|
||
- Testergebnisse,
|
||
- verbleibende Risiken für spätere Workspace-/BuyingProject-Erweiterung.
|
||
|
||
---
|
||
|
||
## 13. Vorrang und Weiterentwicklung
|
||
|
||
Dieses Dokument ist ein Architektur-Addendum zur v0.1-Spezifikation.
|
||
|
||
Nach Abschluss von v0.1 sollen die Erkenntnisse aus:
|
||
|
||
- `buying-agent-v0.1-spec-v1.1.md`
|
||
- diesem Addendum
|
||
- der realen Implementierung
|
||
|
||
in eine konsolidierte Folgespezifikation für den nächsten Slice übernommen werden.
|
||
|
||
Die Kernregel lautet:
|
||
|
||
> Nicht vorzeitig bauen, aber bekannte Zielanforderungen nicht architektonisch verbauen.
|