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.
|