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
|