feat(#372): Planner v1 — echte Slots + Location-Cluster + Calendar-Aware #373

Merged
admin-mrrm merged 1 commit from feat/372-planner-v1 into main 2026-05-20 23:35:45 +02:00
Owner

Summary

  • Pure-function slotPlan(candidates, events, dayStart){ placed, overflow }
  • Sequenzielle 30-Min-Slots ab 09:00 UTC, default estDurationMin falls Candidate keine eigene Dauer hat
  • Ueberspringt Kalender-Events (Phase 6 Daten): Cursor springt hinter Event-Ende
  • Respektiert earliestAt/latestAt und Tagesfenster (21:00 hartkodiert)
  • Location-Cluster: Candidates mit gleichem locationHints[0].name (case-insensitive) landen im gleichen Bucket → konsekutive Slots
  • Buckets nach hoechster Prio + frueheste createdAt sortiert
  • getToday unveraendert; planToday ersetzt v0-Heuristik

Phase 7 von Epic #360

  • Phase 5 (Planner v0): #368
  • Phase 6 (Calendar Read): #370
  • Phase 7 (Planner v1): #372 ← hier

Test plan

  • 11 Unit-Tests slotPlan: sequenziell, estDurationMin, earliestAt, Event-Skip, Multi-Event-Skip, latestAt-Overflow, Day-End-Overflow, Prio-Order, Location-Cluster, Bucket-Prio-Promotion, Cluster-mit-earliestAt
  • 5 Unit-Tests PlannerService (4 angepasst auf v1, alle gruen)
  • 4 neue Integration-Tests planner-v1.int-spec.ts: sequenzielle Slots, Event-Block, Location-Cluster, earliestAt
  • Alle bestehenden Tests (planner.int-spec.ts, calendar.int-spec.ts) gruen ohne Anpassung
  • 419 Unit + 83 Integration passing
  • typecheck + lint clean

Out of scope (Phase 8+)

  • LLM-Assistenz (#122)
  • Multi-Day-Overflow
  • TZ-aware Working-Hours (aktuell UTC-hart)
  • dependsOn-Aufloesung
  • Adaptive Re-Planning

Closes #372

🤖 Generated with Claude Code

## Summary - Pure-function `slotPlan(candidates, events, dayStart)` → `{ placed, overflow }` - Sequenzielle 30-Min-Slots ab 09:00 UTC, default `estDurationMin` falls Candidate keine eigene Dauer hat - Ueberspringt Kalender-Events (Phase 6 Daten): Cursor springt hinter Event-Ende - Respektiert `earliestAt`/`latestAt` und Tagesfenster (21:00 hartkodiert) - **Location-Cluster:** Candidates mit gleichem `locationHints[0].name` (case-insensitive) landen im gleichen Bucket → konsekutive Slots - Buckets nach hoechster Prio + frueheste createdAt sortiert - `getToday` unveraendert; `planToday` ersetzt v0-Heuristik ## Phase 7 von Epic #360 - Phase 5 (Planner v0): #368 ✅ - Phase 6 (Calendar Read): #370 ✅ - **Phase 7 (Planner v1): #372 ← hier** ## Test plan - [x] 11 Unit-Tests `slotPlan`: sequenziell, estDurationMin, earliestAt, Event-Skip, Multi-Event-Skip, latestAt-Overflow, Day-End-Overflow, Prio-Order, Location-Cluster, Bucket-Prio-Promotion, Cluster-mit-earliestAt - [x] 5 Unit-Tests `PlannerService` (4 angepasst auf v1, alle gruen) - [x] 4 neue Integration-Tests `planner-v1.int-spec.ts`: sequenzielle Slots, Event-Block, Location-Cluster, earliestAt - [x] Alle bestehenden Tests (planner.int-spec.ts, calendar.int-spec.ts) gruen ohne Anpassung - [x] 419 Unit + 83 Integration passing - [x] typecheck + lint clean ## Out of scope (Phase 8+) - LLM-Assistenz (#122) - Multi-Day-Overflow - TZ-aware Working-Hours (aktuell UTC-hart) - `dependsOn`-Aufloesung - Adaptive Re-Planning Closes #372 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(#372): Planner v1 - echte Slots + Location-Cluster + Calendar-Aware (Phase 7 von #360)
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
0a73dca7a5
Loest v0-Heuristik "alles auf jetzt" ab. Pure-Function slotPlan() weist
sequenzielle 30-Min-Slots ab 09:00 UTC zu. Slots ueberspringen Kalender-Events
(Phase 6 Daten), respektieren earliestAt/latestAt und Tagesgrenze 21:00.
Candidates mit gleichem locationHints[0].name (case-insensitive) werden im
gleichen Bucket konsekutiv platziert — Habit-Anchors fallen ueber Prio-Sort
heraus, kein Sonderfall.

Out of scope (Phase 8+): LLM-Assistenz, Multi-Day-Overflow, TZ-aware Working
Hours, dependsOn-Resolution.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp!373
No description provided.