988 lines
17 KiB
Markdown
988 lines
17 KiB
Markdown
|
|
# Buying Agent – Frontend MVP Specification v0.1
|
|||
|
|
|
|||
|
|
**Status:** implementierungsbereit
|
|||
|
|
**Spezifikationsversion:** 0.1
|
|||
|
|
**Stand:** 2026-10-04
|
|||
|
|
|
|||
|
|
**Ergänzt verbindlich:**
|
|||
|
|
1. `buying-agent-v0.1-spec-v1.1.md`
|
|||
|
|
2. `buying-agent-architecture-addendum-v1.md`
|
|||
|
|
3. `buying-agent-source-discovery-spec-v0.1.md`
|
|||
|
|
|
|||
|
|
Diese Frontend-Spezifikation hebt für den nutzbaren MVP die frühere Aussage „kein Frontend in diesem Slice“ auf.
|
|||
|
|
Sie ändert keine fachliche Backend-Logik; sie definiert die Benutzeroberfläche und die dafür notwendigen API-Verträge.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. Ziel
|
|||
|
|
|
|||
|
|
Der Buying Agent soll als **nutzbare PWA** einen vollständigen vertikalen Ablauf unterstützen:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
BuyingProject anlegen
|
|||
|
|
↓
|
|||
|
|
Produktkategorie wählen
|
|||
|
|
↓
|
|||
|
|
dynamische Kriterien aus Source-Taxonomie auswählen
|
|||
|
|
↓
|
|||
|
|
Kriterien konfigurieren
|
|||
|
|
↓
|
|||
|
|
Geizhals-Suche generieren
|
|||
|
|
↓
|
|||
|
|
SearchRun starten / Status verfolgen
|
|||
|
|
↓
|
|||
|
|
Kandidaten sehen
|
|||
|
|
↓
|
|||
|
|
Ranking + Shortlist sehen
|
|||
|
|
↓
|
|||
|
|
Kandidat öffnen
|
|||
|
|
↓
|
|||
|
|
Status, Historie, bisherige Ergebnisse und Empfehlungen sehen
|
|||
|
|
↓
|
|||
|
|
Kriterien bei Bedarf anpassen
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Der MVP muss diesen Flow über die Oberfläche vollständig nutzbar machen.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. Technologiestack
|
|||
|
|
|
|||
|
|
Frontend:
|
|||
|
|
|
|||
|
|
- React
|
|||
|
|
- TypeScript
|
|||
|
|
- Vite
|
|||
|
|
- PWA
|
|||
|
|
- TanStack Query für Server-State / Data Fetching
|
|||
|
|
- React Router oder äquivalente schlanke Routing-Lösung
|
|||
|
|
- schlanke komponentenbasierte UI
|
|||
|
|
- kein Next.js
|
|||
|
|
- kein SSR
|
|||
|
|
- keine SEO-Anforderungen
|
|||
|
|
|
|||
|
|
Das Frontend liegt im bestehenden Monorepo:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
buying-agent/
|
|||
|
|
├── backend/
|
|||
|
|
├── frontend/
|
|||
|
|
├── docs/
|
|||
|
|
└── docker-compose.yml
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Backend bleibt System of Record.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. Gestaltungsprinzipien
|
|||
|
|
|
|||
|
|
1. **Einfach für Standardnutzer, leistungsfähig im Hintergrund.**
|
|||
|
|
2. Keine technische Datenbank-/Engine-Sicht in der Standardoberfläche.
|
|||
|
|
3. Dynamische Kriterien statt fest verdrahteter Notebook-Felder.
|
|||
|
|
4. Responsive von Anfang an.
|
|||
|
|
5. Zwei bewusst gestaltete Hauptlayouts:
|
|||
|
|
- Desktop
|
|||
|
|
- Mobile
|
|||
|
|
6. Nüchternes, klares Design.
|
|||
|
|
7. Bedienbarkeit vor visueller Komplexität.
|
|||
|
|
8. Admin-/Source-Themen von der normalen Nutzung trennen.
|
|||
|
|
9. Keine Businesslogik im Frontend.
|
|||
|
|
10. Frontend konsumiert ausschließlich die versionierte Backend-API.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. PWA und Responsive Layout
|
|||
|
|
|
|||
|
|
### Desktop
|
|||
|
|
|
|||
|
|
Desktop verwendet primär:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Sidebar
|
|||
|
|
+ Hauptinhalt
|
|||
|
|
+ optionaler Detailbereich
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Beispiel:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
┌───────────────┬──────────────────────────────────────┐
|
|||
|
|
│ Buying Agent │ Projekt: Mobiler Entwicklungsrechner│
|
|||
|
|
│ │ │
|
|||
|
|
│ Projekte │ Status / Suche / Ranking / Shortlist│
|
|||
|
|
│ Admin │ │
|
|||
|
|
│ Einstellungen │ │
|
|||
|
|
└───────────────┴──────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Mobile
|
|||
|
|
|
|||
|
|
Mobile verwendet primär:
|
|||
|
|
|
|||
|
|
- Bottom Navigation oder kompakte Hauptnavigation
|
|||
|
|
- Vollbild-Detailseiten
|
|||
|
|
- Tabs innerhalb eines BuyingProjects
|
|||
|
|
- keine verkleinerte Desktop-Sidebar
|
|||
|
|
|
|||
|
|
Beispiel:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Projekt
|
|||
|
|
────────────────
|
|||
|
|
Übersicht
|
|||
|
|
Kandidaten
|
|||
|
|
Shortlist
|
|||
|
|
Kriterien
|
|||
|
|
Historie
|
|||
|
|
|
|||
|
|
[ Projekte ] [ Suche ] [ Admin ]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Mitai-Bezug
|
|||
|
|
|
|||
|
|
Falls im bestehenden Mitai-Code wiederverwendbare Layout-, PWA-, Responsive- oder Navigationsmuster vorhanden sind, sollen diese bevorzugt übernommen oder konsistent nachgebildet werden.
|
|||
|
|
|
|||
|
|
Keine fachliche Kopplung an Mitai.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. Hauptnavigation
|
|||
|
|
|
|||
|
|
Der MVP benötigt mindestens:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Projekte
|
|||
|
|
Admin
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Optional:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Systemstatus
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Noch nicht erforderlich:
|
|||
|
|
|
|||
|
|
- Benutzerverwaltung
|
|||
|
|
- Warenkorb
|
|||
|
|
- Benachrichtigungseinstellungen
|
|||
|
|
- Account-/Profilverwaltung
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. Screen 1 – BuyingProject-Liste
|
|||
|
|
|
|||
|
|
Route:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/projects
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Funktionen:
|
|||
|
|
|
|||
|
|
- aktive BuyingProjects anzeigen
|
|||
|
|
- Projektname
|
|||
|
|
- Kategorie
|
|||
|
|
- Status
|
|||
|
|
- letzter erfolgreicher SearchRun
|
|||
|
|
- Anzahl Kandidaten
|
|||
|
|
- Anzahl Shortlist-Kandidaten
|
|||
|
|
- aktueller Discovery-Status
|
|||
|
|
- Button „Neues Projekt“
|
|||
|
|
|
|||
|
|
Mögliche Status:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
ACTIVE
|
|||
|
|
PURCHASED
|
|||
|
|
ARCHIVED
|
|||
|
|
OUT_OF_SYNC
|
|||
|
|
BLOCKED
|
|||
|
|
TOO_BROAD
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Die Liste darf keine produktkategoriespezifischen Felder voraussetzen.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. Screen 2 – BuyingProject anlegen
|
|||
|
|
|
|||
|
|
Route:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/projects/new
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Schritt 1 – Basisdaten
|
|||
|
|
|
|||
|
|
Mindestens:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
name
|
|||
|
|
source
|
|||
|
|
source_category
|
|||
|
|
market
|
|||
|
|
currency
|
|||
|
|
shortlist_size
|
|||
|
|
schedule_interval
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Default:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
shortlist_size = 5
|
|||
|
|
schedule_interval_minutes = 180
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Schritt 2 – Kriterien
|
|||
|
|
|
|||
|
|
Nach Auswahl der Source-Kategorie lädt das Frontend dynamisch:
|
|||
|
|
|
|||
|
|
- Canonical Criteria
|
|||
|
|
- Source Filter Definitions
|
|||
|
|
- CriterionMappings
|
|||
|
|
- Mapping-Status
|
|||
|
|
|
|||
|
|
Das Frontend erzeugt daraus dynamisch die Eingabefelder.
|
|||
|
|
|
|||
|
|
Es gibt **keine fest codierten Notebook-Felder**.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. Dynamische Kriterien
|
|||
|
|
|
|||
|
|
Verfügbare Kriterien entstehen aus:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
SourceCategory
|
|||
|
|
↓
|
|||
|
|
SourceFilterDefinitions
|
|||
|
|
↓
|
|||
|
|
CriterionDefinitions
|
|||
|
|
↓
|
|||
|
|
CriterionMappings
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Das Frontend rendert Controls anhand des Typs.
|
|||
|
|
|
|||
|
|
### Unterstützte Control-Typen
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
BOOLEAN
|
|||
|
|
ENUM
|
|||
|
|
MULTI_ENUM
|
|||
|
|
NUMERIC_RANGE
|
|||
|
|
NUMERIC_THRESHOLD
|
|||
|
|
TEXT
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Für ein Kriterium sollen mindestens konfigurierbar sein:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
operator
|
|||
|
|
value
|
|||
|
|
mandatory / optional
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Wenn vom Scoring unterstützt zusätzlich:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
weight
|
|||
|
|
preference strategy
|
|||
|
|
acceptable
|
|||
|
|
ideal
|
|||
|
|
direction
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Sichtbarer Mapping-Status
|
|||
|
|
|
|||
|
|
Pro Kriterium:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
VERIFIED
|
|||
|
|
LEARNED_UNVERIFIED
|
|||
|
|
INTERNAL_ONLY
|
|||
|
|
BROKEN
|
|||
|
|
DISABLED
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Standardnutzer sollen primär verständliche Hinweise sehen:
|
|||
|
|
|
|||
|
|
- „Wird direkt bei Geizhals gefiltert“
|
|||
|
|
- „Wird erst intern bewertet“
|
|||
|
|
- „Filter derzeit nicht verfügbar“
|
|||
|
|
|
|||
|
|
Technische IDs bleiben im Admin-Bereich.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9. Kriterienänderungen
|
|||
|
|
|
|||
|
|
Wenn Kriterien geändert werden:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
criteria_version++
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Die bestehende DiscoverySearch wird:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
OUT_OF_SYNC
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Danach muss das Backend eine neue Query aus den aktuellen:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Criteria
|
|||
|
|
+
|
|||
|
|
VERIFIED Mappings
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
erzeugen.
|
|||
|
|
|
|||
|
|
Das Frontend zeigt klar:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Suchkriterien wurden geändert.
|
|||
|
|
Die externe Suche muss aktualisiert werden.
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Aktion:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Suche aktualisieren
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Danach:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
generate-query
|
|||
|
|
→ optional run
|
|||
|
|
→ neuer SearchRun
|
|||
|
|
→ neues Ranking
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 10. Screen 3 – BuyingProject-Detail
|
|||
|
|
|
|||
|
|
Route:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/projects/:projectId
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Desktop: strukturierte Detailansicht.
|
|||
|
|
|
|||
|
|
Mobile: Tabs.
|
|||
|
|
|
|||
|
|
Mindestens folgende Bereiche:
|
|||
|
|
|
|||
|
|
### Übersicht
|
|||
|
|
|
|||
|
|
- Projektstatus
|
|||
|
|
- Kategorie
|
|||
|
|
- letzter SearchRun
|
|||
|
|
- Discovery-Status
|
|||
|
|
- Trefferzahl
|
|||
|
|
- Kandidatenzahl
|
|||
|
|
- Shortlist-Größe
|
|||
|
|
- Zeitpunkt nächste geplante Suche
|
|||
|
|
- wichtige Warnungen
|
|||
|
|
|
|||
|
|
### Kandidaten
|
|||
|
|
|
|||
|
|
- aktuelle Kandidaten
|
|||
|
|
- ProductScore
|
|||
|
|
- product_eligibility
|
|||
|
|
- aktueller best_price, sofern vorhanden
|
|||
|
|
- Diff-Status
|
|||
|
|
- Lifecycle-Status
|
|||
|
|
- Shortlist-Markierung
|
|||
|
|
|
|||
|
|
### Shortlist
|
|||
|
|
|
|||
|
|
Top-N gemäß Projektkonfiguration.
|
|||
|
|
|
|||
|
|
### Kriterien
|
|||
|
|
|
|||
|
|
Dynamische Kriterien anzeigen und bearbeiten.
|
|||
|
|
|
|||
|
|
### Historie
|
|||
|
|
|
|||
|
|
- SearchRuns
|
|||
|
|
- wichtige Statusänderungen
|
|||
|
|
- bisherige Rankings
|
|||
|
|
- soweit vorhanden frühere Bewertungen / Empfehlungen
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 11. Screen 4 – Kandidatenliste
|
|||
|
|
|
|||
|
|
Route:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/projects/:projectId/candidates
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Darstellung:
|
|||
|
|
|
|||
|
|
- sortierbare Liste/Tabelle auf Desktop
|
|||
|
|
- Cards/List Items auf Mobile
|
|||
|
|
|
|||
|
|
Mindestens:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Produktname
|
|||
|
|
Hersteller
|
|||
|
|
wichtige dynamische Attribute
|
|||
|
|
best_price
|
|||
|
|
ProductScore
|
|||
|
|
product_eligibility
|
|||
|
|
diff_status
|
|||
|
|
lifecycle_status
|
|||
|
|
shortlist_status
|
|||
|
|
last_seen
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Dynamische Attribute
|
|||
|
|
|
|||
|
|
Welche Eigenschaften sichtbar sind, darf nicht notebook-spezifisch hart codiert sein.
|
|||
|
|
|
|||
|
|
Mögliche Strategie:
|
|||
|
|
|
|||
|
|
1. Source-/Category-Definition liefert relevante display attributes.
|
|||
|
|
2. Projekt kann später bevorzugte sichtbare Attribute konfigurieren.
|
|||
|
|
3. MVP darf zunächst die wichtigsten vorhandenen normalisierten Attribute anzeigen.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 12. Screen 5 – Kandidatendetail
|
|||
|
|
|
|||
|
|
Route:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/projects/:projectId/candidates/:candidateId
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Der Nutzer soll in ein Produkt „hineinspringen“ können.
|
|||
|
|
|
|||
|
|
Mindestens:
|
|||
|
|
|
|||
|
|
### Aktueller Status
|
|||
|
|
|
|||
|
|
- Name
|
|||
|
|
- Hersteller
|
|||
|
|
- Source-Link
|
|||
|
|
- ProductScore
|
|||
|
|
- product_eligibility
|
|||
|
|
- Shortlist-Status
|
|||
|
|
- aktueller best_price
|
|||
|
|
- letzte Sichtung
|
|||
|
|
|
|||
|
|
### Attribute
|
|||
|
|
|
|||
|
|
Alle verfügbaren normalisierten dynamischen Produktattribute.
|
|||
|
|
|
|||
|
|
Keine notebook-spezifische Feldliste.
|
|||
|
|
|
|||
|
|
### Historie
|
|||
|
|
|
|||
|
|
- Preisentwicklung aus ProductObservations
|
|||
|
|
- relevante Attributänderungen
|
|||
|
|
- NEW / CHANGED / MISSING / DISAPPEARED
|
|||
|
|
- SearchRun-Bezug
|
|||
|
|
|
|||
|
|
### Bewertungen / Ergebnisse
|
|||
|
|
|
|||
|
|
- aktuelle Bewertung
|
|||
|
|
- frühere gespeicherte Bewertungen, soweit Backend vorhanden
|
|||
|
|
- Gründe / Constraint-Ergebnisse
|
|||
|
|
- Coverage / fehlende Daten
|
|||
|
|
|
|||
|
|
### Spätere Erweiterbarkeit
|
|||
|
|
|
|||
|
|
Dieser Screen wird später Zielort für:
|
|||
|
|
|
|||
|
|
- Deep Enrichment
|
|||
|
|
- Tests
|
|||
|
|
- Reviews
|
|||
|
|
- Benchmarks
|
|||
|
|
- Händlervergleich
|
|||
|
|
- Kaufempfehlung
|
|||
|
|
|
|||
|
|
Diese Funktionen sind noch nicht Bestandteil dieses MVP-Slices.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 13. Screen 6 – Shortlist
|
|||
|
|
|
|||
|
|
Route:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/projects/:projectId/shortlist
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Zweck:
|
|||
|
|
|
|||
|
|
Nur die aktuell relevantesten Produkte zeigen.
|
|||
|
|
|
|||
|
|
Mindestens:
|
|||
|
|
|
|||
|
|
- Rang
|
|||
|
|
- Produkt
|
|||
|
|
- ProductScore
|
|||
|
|
- Product Eligibility
|
|||
|
|
- aktueller Preis
|
|||
|
|
- relevante Stärken
|
|||
|
|
- relevante Schwächen / fehlende Daten
|
|||
|
|
- letzter Änderungsstatus
|
|||
|
|
|
|||
|
|
Default:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Top 5
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
konfigurierbar am BuyingProject.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 14. Screen 7 – Search Runs / Historie
|
|||
|
|
|
|||
|
|
Route:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/projects/:projectId/history
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Anzeige:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Zeitpunkt
|
|||
|
|
Status
|
|||
|
|
Trefferzahl
|
|||
|
|
Page Count
|
|||
|
|
NEW
|
|||
|
|
CHANGED
|
|||
|
|
MISSING
|
|||
|
|
DISAPPEARED
|
|||
|
|
TOO_BROAD
|
|||
|
|
Fehler / BLOCKED
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Ein SearchRun muss geöffnet werden können, um Detailinformationen zu sehen.
|
|||
|
|
|
|||
|
|
Kein HTML anzeigen oder archivieren.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 15. Screen 8 – Admin: Taxonomie & Mapping
|
|||
|
|
|
|||
|
|
Route:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/admin/sources
|
|||
|
|
/admin/sources/:source/categories/:category
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Dieser Bereich darf technischer sein.
|
|||
|
|
|
|||
|
|
Funktionen:
|
|||
|
|
|
|||
|
|
- gelernte Kategorien sehen
|
|||
|
|
- SourceFilterDefinitions sehen
|
|||
|
|
- SourceFilterOptions/Ranges sehen
|
|||
|
|
- Canonical Criteria sehen
|
|||
|
|
- CriterionMappings sehen
|
|||
|
|
- Mapping-Status ändern
|
|||
|
|
- fehlerhafte kleine Mapping-Änderungen direkt korrigieren
|
|||
|
|
- BROKEN / DISABLED erkennen
|
|||
|
|
- Taxonomie neu einlesen
|
|||
|
|
- Query-Mapping nachvollziehen
|
|||
|
|
|
|||
|
|
### Wichtig
|
|||
|
|
|
|||
|
|
Das Frontend darf kein URL-Encoding selbst erfinden.
|
|||
|
|
|
|||
|
|
Es editiert/pflegt nur persistierte Mapping-Daten.
|
|||
|
|
|
|||
|
|
Backend bleibt für Validierung und Query-Generation verantwortlich.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 16. Server State und Data Fetching
|
|||
|
|
|
|||
|
|
Empfehlung:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
TanStack Query
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
für:
|
|||
|
|
|
|||
|
|
- Projekte
|
|||
|
|
- Kriterien
|
|||
|
|
- Taxonomie
|
|||
|
|
- Mappings
|
|||
|
|
- SearchRuns
|
|||
|
|
- Kandidaten
|
|||
|
|
- Shortlist
|
|||
|
|
- Produktdetails
|
|||
|
|
|
|||
|
|
Client-State nur für:
|
|||
|
|
|
|||
|
|
- UI-Zustände
|
|||
|
|
- Formulare
|
|||
|
|
- Tabs
|
|||
|
|
- lokale Filter
|
|||
|
|
|
|||
|
|
Keine fachlich relevante Server-Wahrheit ausschließlich im Browser halten.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 17. API-Verträge
|
|||
|
|
|
|||
|
|
Das Frontend nutzt mindestens:
|
|||
|
|
|
|||
|
|
### Projekte
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GET /api/v1/buying-projects
|
|||
|
|
POST /api/v1/buying-projects
|
|||
|
|
GET /api/v1/buying-projects/{id}
|
|||
|
|
PATCH /api/v1/buying-projects/{id}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Projektkriterien
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GET /api/v1/buying-projects/{id}/criteria
|
|||
|
|
PUT /api/v1/buying-projects/{id}/criteria
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Falls Backend intern versionierte Ressourcen bevorzugt, kann PUT eine neue Version erzeugen.
|
|||
|
|
|
|||
|
|
### Taxonomie
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
POST /api/v1/sources/{source}/categories/{category}/discover-taxonomy
|
|||
|
|
GET /api/v1/sources/{source}/categories/{category}/filters
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Criterion Definitions / Mappings
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GET /api/v1/criterion-definitions
|
|||
|
|
GET /api/v1/criterion-mappings
|
|||
|
|
POST /api/v1/criterion-mappings
|
|||
|
|
PATCH /api/v1/criterion-mappings/{id}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Discovery Search
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GET /api/v1/buying-projects/{id}/discovery-search
|
|||
|
|
POST /api/v1/discovery-searches/{id}/generate-query
|
|||
|
|
POST /api/v1/discovery-searches/{id}/run
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Search Runs
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GET /api/v1/discovery-searches/{id}/runs
|
|||
|
|
GET /api/v1/search-runs/{id}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Candidates
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GET /api/v1/buying-projects/{id}/candidates
|
|||
|
|
GET /api/v1/buying-projects/{id}/shortlist
|
|||
|
|
GET /api/v1/buying-projects/{id}/candidates/{candidateId}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 18. Status- und Fehlerdarstellung
|
|||
|
|
|
|||
|
|
Frontend muss mindestens folgende Zustände sichtbar machen:
|
|||
|
|
|
|||
|
|
### Discovery
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
SUCCESS
|
|||
|
|
PARTIAL
|
|||
|
|
FAILED
|
|||
|
|
BLOCKED
|
|||
|
|
TOO_BROAD
|
|||
|
|
OUT_OF_SYNC
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Candidate Diff
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
NEW
|
|||
|
|
CHANGED
|
|||
|
|
UNCHANGED
|
|||
|
|
MISSING
|
|||
|
|
DISAPPEARED
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Matching
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
MATCHED
|
|||
|
|
MATCH_UNCERTAIN
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Mapping
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
DISCOVERED
|
|||
|
|
LEARNED_UNVERIFIED
|
|||
|
|
VERIFIED
|
|||
|
|
BROKEN
|
|||
|
|
DISABLED
|
|||
|
|
INTERNAL_ONLY
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Fehlertexte für Standardnutzer verständlich formulieren.
|
|||
|
|
|
|||
|
|
Technische Details optional aufklappbar.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 19. Loading / Empty / Error States
|
|||
|
|
|
|||
|
|
Jeder Screen braucht explizit:
|
|||
|
|
|
|||
|
|
- Loading
|
|||
|
|
- Empty
|
|||
|
|
- Error
|
|||
|
|
- Retry
|
|||
|
|
|
|||
|
|
Beispiele:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Noch keine Kandidaten gefunden.
|
|||
|
|
Noch kein SearchRun ausgeführt.
|
|||
|
|
Taxonomie wurde noch nicht geladen.
|
|||
|
|
Diese Suche ist derzeit BLOCKED.
|
|||
|
|
Die Kriterien wurden geändert; Suche ist OUT_OF_SYNC.
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 20. PWA-Grundgerüst
|
|||
|
|
|
|||
|
|
Mindestens:
|
|||
|
|
|
|||
|
|
- installierbare PWA
|
|||
|
|
- Manifest
|
|||
|
|
- Icons / App-Metadaten
|
|||
|
|
- responsive shell
|
|||
|
|
- app-like navigation
|
|||
|
|
- sinnvolle Offline-Fallback-Seite
|
|||
|
|
|
|||
|
|
Keine Offline-Businesslogik erforderlich.
|
|||
|
|
|
|||
|
|
Keine komplexe Synchronisationslogik in v0.1.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 21. Tests
|
|||
|
|
|
|||
|
|
### Unit / Component
|
|||
|
|
|
|||
|
|
- dynamischer Criterion Renderer je Filtertyp
|
|||
|
|
- Mapping-Status-Darstellung
|
|||
|
|
- Candidate Status-Darstellung
|
|||
|
|
- responsive Komponenten
|
|||
|
|
- Formvalidierung
|
|||
|
|
|
|||
|
|
### API Integration
|
|||
|
|
|
|||
|
|
- Projektliste
|
|||
|
|
- Projektanlage
|
|||
|
|
- Kriterien laden/speichern
|
|||
|
|
- SearchRun starten
|
|||
|
|
- Kandidaten laden
|
|||
|
|
- Shortlist laden
|
|||
|
|
- Admin-Mapping aktualisieren
|
|||
|
|
|
|||
|
|
### E2E
|
|||
|
|
|
|||
|
|
Mindestens ein vollständiger Notebook-Pilot:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Projekt anlegen
|
|||
|
|
→ Kategorie Notebooks
|
|||
|
|
→ dynamische Kriterien laden
|
|||
|
|
→ Kriterien setzen
|
|||
|
|
→ Geizhals Query generieren
|
|||
|
|
→ SearchRun starten
|
|||
|
|
→ Kandidaten erscheinen
|
|||
|
|
→ Ranking sichtbar
|
|||
|
|
→ Shortlist sichtbar
|
|||
|
|
→ Kandidat öffnen
|
|||
|
|
→ Historie sichtbar
|
|||
|
|
→ Kriterium ändern
|
|||
|
|
→ OUT_OF_SYNC sichtbar
|
|||
|
|
→ Query neu erzeugen
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Responsive E2E
|
|||
|
|
|
|||
|
|
Mindestens:
|
|||
|
|
|
|||
|
|
- Desktop-Viewport
|
|||
|
|
- Mobile-Viewport
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 22. Nicht implementieren
|
|||
|
|
|
|||
|
|
In diesem Slice weiterhin nicht:
|
|||
|
|
|
|||
|
|
- Login/Auth
|
|||
|
|
- RBAC
|
|||
|
|
- Einladungen
|
|||
|
|
- Multi-User-UI
|
|||
|
|
- Keepa
|
|||
|
|
- Idealo
|
|||
|
|
- WhatsApp
|
|||
|
|
- Warenkorb
|
|||
|
|
- Kaufautomatisierung
|
|||
|
|
- LLM-Automation
|
|||
|
|
- Deep Enrichment
|
|||
|
|
- finale Decision Engine
|
|||
|
|
|
|||
|
|
Die Architektur darf diese Erweiterungen nicht verbauen.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 23. Definition of Done
|
|||
|
|
|
|||
|
|
- [ ] React + TypeScript + Vite Frontend existiert im Monorepo.
|
|||
|
|
- [ ] PWA ist installierbar.
|
|||
|
|
- [ ] Desktop- und Mobile-Layouts sind bewusst getrennt gestaltet.
|
|||
|
|
- [ ] BuyingProjects können über die UI angelegt und geöffnet werden.
|
|||
|
|
- [ ] Produktkategorie kann ausgewählt werden.
|
|||
|
|
- [ ] Kriterien werden dynamisch aus Taxonomie / CriterionDefinitions erzeugt.
|
|||
|
|
- [ ] Keine notebook-spezifischen Criteria-Felder im Frontend-Core.
|
|||
|
|
- [ ] Kriterien können bearbeitet und gespeichert werden.
|
|||
|
|
- [ ] Mapping-Status ist sichtbar.
|
|||
|
|
- [ ] INTERNAL_ONLY-Kriterien können gespeichert werden.
|
|||
|
|
- [ ] Discovery Search kann generiert werden.
|
|||
|
|
- [ ] SearchRun kann aus der UI gestartet werden.
|
|||
|
|
- [ ] SearchRun-Status ist sichtbar.
|
|||
|
|
- [ ] Kandidatenliste funktioniert.
|
|||
|
|
- [ ] Ranking ist sichtbar.
|
|||
|
|
- [ ] Shortlist funktioniert.
|
|||
|
|
- [ ] Kandidatendetail zeigt dynamische Attribute und Historie.
|
|||
|
|
- [ ] Projekt-Historie zeigt SearchRuns und relevante Änderungen.
|
|||
|
|
- [ ] Kriterienänderung setzt/zeigt OUT_OF_SYNC und ermöglicht Regeneration.
|
|||
|
|
- [ ] Admin-Bereich erlaubt Prüfung/Korrektur von Source-Taxonomie und Mappings.
|
|||
|
|
- [ ] Loading-/Empty-/Error-Zustände existieren.
|
|||
|
|
- [ ] E2E-Test des vollständigen Notebook-Piloten ist grün.
|
|||
|
|
- [ ] Desktop- und Mobile-E2E sind grün.
|
|||
|
|
- [ ] Backend bleibt alleinige Quelle fachlicher Wahrheit.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Coding-Agent-Arbeitsauftrag
|
|||
|
|
|
|||
|
|
Verwende als verbindliche Anforderungen:
|
|||
|
|
|
|||
|
|
1. `buying-agent-v0.1-spec-v1.1.md`
|
|||
|
|
2. `buying-agent-architecture-addendum-v1.md`
|
|||
|
|
3. `buying-agent-source-discovery-spec-v0.1.md`
|
|||
|
|
4. `buying-agent-frontend-mvp-spec-v0.1.md`
|
|||
|
|
|
|||
|
|
Die Frontend-MVP-Spec hebt für den nutzbaren MVP die frühere Scope-Aussage „kein Frontend“ auf.
|
|||
|
|
|
|||
|
|
## 1. Vor Implementierung
|
|||
|
|
|
|||
|
|
Prüfe den aktuellen Repository-Stand gegen alle vier Dokumente.
|
|||
|
|
|
|||
|
|
Berichte kurz:
|
|||
|
|
|
|||
|
|
- welche Backend-APIs für den Frontend-Flow bereits existieren,
|
|||
|
|
- welche Endpunkte fehlen,
|
|||
|
|
- ob aktuelle DTOs dynamische Kriterien und Produktattribute vollständig tragen,
|
|||
|
|
- ob bestehender Code notebook-spezifische Felder enthält,
|
|||
|
|
- welche Änderungen rein additiv möglich sind.
|
|||
|
|
|
|||
|
|
Keine größere strukturelle Abweichung ohne Rückfrage.
|
|||
|
|
|
|||
|
|
## 2. Vertikalen MVP implementieren
|
|||
|
|
|
|||
|
|
Nicht Backend und Frontend getrennt in langen Phasen bauen.
|
|||
|
|
|
|||
|
|
Stattdessen vertikal:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Projektliste
|
|||
|
|
→ Projektanlage
|
|||
|
|
→ dynamische Kriterien
|
|||
|
|
→ Query Generation
|
|||
|
|
→ SearchRun
|
|||
|
|
→ Kandidaten
|
|||
|
|
→ Ranking
|
|||
|
|
→ Shortlist
|
|||
|
|
→ Kandidatendetail
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Jeder Schritt soll nach Implementierung unmittelbar über die UI prüfbar sein.
|
|||
|
|
|
|||
|
|
## 3. Dynamik sicherstellen
|
|||
|
|
|
|||
|
|
Keine festen Felder wie:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
ram_gb
|
|||
|
|
storage_gb
|
|||
|
|
weight_kg
|
|||
|
|
display_inches
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
in generischen Frontend-Komponenten hardcoden.
|
|||
|
|
|
|||
|
|
Controls und sichtbare Produktattribute werden metadata-driven erzeugt.
|
|||
|
|
|
|||
|
|
Notebook-spezifische Werte dürfen nur als gelernte/gespeicherte Daten vorkommen.
|
|||
|
|
|
|||
|
|
## 4. UI
|
|||
|
|
|
|||
|
|
- React + TypeScript + Vite
|
|||
|
|
- PWA
|
|||
|
|
- TanStack Query
|
|||
|
|
- einfache, nüchterne Bedienung
|
|||
|
|
- Desktop: Sidebar + Content/Detail
|
|||
|
|
- Mobile: kompakte Navigation / Bottom Navigation + Vollbild-Details
|
|||
|
|
- vorhandene Mitai-Muster wiederverwenden, falls im zugänglichen Repo vorhanden und passend
|
|||
|
|
|
|||
|
|
## 5. Tests
|
|||
|
|
|
|||
|
|
Führe aus:
|
|||
|
|
|
|||
|
|
- Frontend Unit/Component Tests
|
|||
|
|
- API Integration Tests
|
|||
|
|
- E2E vollständiger Notebook-Pilot
|
|||
|
|
- Desktop E2E
|
|||
|
|
- Mobile E2E
|
|||
|
|
|
|||
|
|
## 6. Abschlussbericht
|
|||
|
|
|
|||
|
|
Dokumentiere:
|
|||
|
|
|
|||
|
|
- implementierte Screens
|
|||
|
|
- neue/angepasste Backend-Endpunkte
|
|||
|
|
- verwendete Frontend-Bibliotheken
|
|||
|
|
- responsive Verhalten
|
|||
|
|
- ausgeführte Tests und Ergebnisse
|
|||
|
|
- offene Abweichungen
|
|||
|
|
- Risiken für spätere Multi-User-, Deep-Enrichment- und Decision-Erweiterungen
|