Spec: Distanz per Nominatim-Geokodierung + Haversine; Kontakt-Firma-Verknüpfung explizit

- Einsatzort-Distanz wird geocodiert (Nominatim, nur DE) statt LLM-geschätzt;
  Bänder ≤50/50-60/>60 km bleiben, Fallback bei unbekanntem Ort → .
- 6.2: Verknüpfung des neuen Kontakts zur Firma (accountId) explizit gefordert.
- Feasibility verifiziert (München 19, Rosenheim 38, Augsburg 71, Nürnberg 170 km).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
tlg
2026-06-12 12:48:42 +02:00
parent 9699e61952
commit 9c557be5e8

View File

@@ -46,14 +46,14 @@ durch den Skill `projekt-anlegen`. Ändern sich selten.
## Einsatzort-Regel ## Einsatzort-Regel
- 100 % Remote → ✅ (Ort egal). - 100 % Remote → ✅ (Ort egal).
- Onsite/Hybrid, Ort 50 km Luftlinie um Sauerlach → ✅. - Onsite/Hybrid, Ort 50 km Luftlinie um Sauerlach → ✅.
- Onsite/Hybrid, Ort grenzwertig ≈ 5060 km → ❔. - Onsite/Hybrid, Ort 5060 km (grenzwertig) → ❔.
- Onsite/Hybrid, Ort 60 km → ❌. - Onsite/Hybrid, Ort > 60 km → ❌.
- Einsatzort/Remote-Anteil unklar oder nicht genannt → ❌. - Einsatzort/Remote-Anteil unklar oder nicht genannt → ❌.
### Referenz-Distanzen ab Sauerlach (Luftlinie, gerundet) Distanz = Luftlinie zwischen Onsite-Ort und Sauerlach (47,9721 N / 11,6528 O),
- München-Zentrum ≈ 25 km ✅ · Holzkirchen ≈ 10 km ✅ · Wolfratshausen ≈ 15 km ✅ · Rosenheim ≈ 40 km ✅ bestimmt per Geokodierung (Nominatim/OpenStreetMap, nur Deutschland) und Haversine.
- Augsburg ≈ 75 km ❌ · Landshut ≈ 80 km ❌ · Ingolstadt ≈ 95 km ❌ · Nürnberg ≈ 150 km ❌ · Stuttgart ≈ 200 km ❌ Unbekannter/mehrdeutiger Ort → ❔.
Hinweis: „heute" = aktuelles Datum der Session. „8 Wochen" = 56 Tage. Hinweis: „heute" = aktuelles Datum der Session. „8 Wochen" = 56 Tage.
``` ```
@@ -72,7 +72,7 @@ Zusätzlich zu Projektname/URL/Anforderungen aus der Ausschreibung ziehen:
Misc-Anforderungen zu Verfügbarkeit/Auslastung/Laufzeit/Einsatzort werden gegen `vorgaben/rahmenbedingungen.md` bewertet und erhalten direkt ✅/❌/❔ gemäß den Regeln in §3 — **statt** des bisherigen pauschalen ❔. Greift eine Regel nicht eindeutig (Auslastung/Start nicht genannt, Ort grenzwertig), bleibt es ❔. Misc-Anforderungen zu Verfügbarkeit/Auslastung/Laufzeit/Einsatzort werden gegen `vorgaben/rahmenbedingungen.md` bewertet und erhalten direkt ✅/❌/❔ gemäß den Regeln in §3 — **statt** des bisherigen pauschalen ❔. Greift eine Regel nicht eindeutig (Auslastung/Start nicht genannt, Ort grenzwertig), bleibt es ❔.
- Distanzbeurteilung: Luftlinie vom genannten Onsite-Ort nach Sauerlach schätzen; Referenz-Distanzen aus §3 als Anker. Klar innerhalb → ✅, klar außerhalb → ❌, grenzwertig/unbekannter Ort → ❔ bzw. ❌ gemäß Regel. - Distanzbeurteilung per **Geokodierung**: Onsite-Ort über Nominatim (OpenStreetMap; `format=json`, `countrycodes=de`, `limit=1`, eigener `User-Agent`; max. 1 Request/s) auflösen, Luftlinie zu Sauerlach (47,9721 N / 11,6528 O) per Haversine berechnen, gegen die Bänder ≤ 50 / 5060 / > 60 km prüfen. Geokodierung gescheitert oder Ort mehrdeutig → ❔. (Feasibility verifiziert: München 19 km, Rosenheim 38 km, Augsburg 71 km, Nürnberg 170 km.)
- Startdatum: „heute + 8 Wochen" (56 Tage) gegen den genannten Projektstart prüfen. - Startdatum: „heute + 8 Wochen" (56 Tage) gegen den genannten Projektstart prüfen.
- Misc-Zeilen gehen weiterhin **nicht** in die Match-Prozente ein; die automatische Bewertung ist informativ und spart das manuelle Setzen. - Misc-Zeilen gehen weiterhin **nicht** in die Match-Prozente ein; die automatische Bewertung ist informativ und spart das manuelle Setzen.
@@ -90,7 +90,8 @@ Alle Schreibvorgänge erst **nach** der Review-Freigabe (§7).
### 6.2 Kontakt (`Contact`) ### 6.2 Kontakt (`Contact`)
1. Dedup-Suche per Name analog zu 6.1. 1. Dedup-Suche per Name analog zu 6.1.
2. Kein/zu bestätigender Treffer → nach Freigabe neu anlegen: `POST /Contact` mit `{firstName, lastName, accountId}` (verknüpft mit der Firma aus 6.1). 2. Kein/zu bestätigender Treffer → nach Freigabe neu anlegen: `POST /Contact` mit `{firstName, lastName, accountId}`.
- **Die Verknüpfung zur Firma aus 6.1 wird beim Neu-Anlegen zwingend mitgesetzt** (`accountId`), sodass der neue Kontakt der Firma zugeordnet ist.
- Namensaufteilung: letztes Token = `lastName`, der Rest = `firstName`. Ungewöhnliche Fälle im Review klären. - Namensaufteilung: letztes Token = `lastName`, der Rest = `firstName`. Ungewöhnliche Fälle im Review klären.
### 6.3 Verkaufschance (`Opportunity`) ### 6.3 Verkaufschance (`Opportunity`)
@@ -118,7 +119,7 @@ Erst nach Freigabe werden Firma, Kontakt und Verkaufschance in dieser Reihenfolg
- Unberührt: `cowork-projekt-match` (Archiv). - Unberührt: `cowork-projekt-match` (Archiv).
## 9. Bewusst NICHT enthalten (YAGNI) ## 9. Bewusst NICHT enthalten (YAGNI)
- Keine automatische Geokodierung/Distanz-API — Distanz wird anhand der Referenz-Anker geschätzt; Grenzfälle → ❔. - Keine Fahrstrecken-/Routing-Berechnung — für das 50-km-Kriterium genügt die Luftlinie (Haversine) auf Basis der Nominatim-Geokodierung.
- Keine automatische Zusammenführung bestehender CRM-Dubletten. - Keine automatische Zusammenführung bestehender CRM-Dubletten.
- Keine Änderung der Must/Nice-Bewertungslogik oder der Match-Berechnung. - Keine Änderung der Must/Nice-Bewertungslogik oder der Match-Berechnung.