Phase 1 — Candidate-Schema Spike + ADR #453

Closed
opened 2026-06-09 08:07:31 +02:00 by pm-bot · 2 comments
Collaborator

Kontext

Phase-1 des Day-Planner-Epics (#360) — gemäss Epic-Body: "Voraussetzung für alle weiteren Phasen". Ohne Candidate-Schema kann weder die Tracking-Migration (#328/#329/#330) noch Mail-as-Source (#178) auf das neue Pattern umgestellt werden.

Ziel

Stabiles Candidate-Schema entwerfen + als ADR im Repo dokumentieren + Drizzle-Migration + generierte Types. Kein UI, keine Planner-Logik — nur die Datenhülle, auf die alle Sources schreiben.

Scope

  • Schema-Entwurf (PostgreSQL via Drizzle) gemäss Epic-Beschreibung: Refs, Source-Identität (source, sourceRef, lifecycleState), Planungs-Constraints (earliestAt/latestAt, estDuration, locationHints[], dependsOn[], priority, recurrence), Planner-Ergebnis (plannedSlot, plannedAfter/plannedBefore), Completion-Policy
  • Drizzle-Migration (forward-only, backward-compatible per CLAUDE.md)
  • Generierte TS-Types ins @mrrmlab/shared-types durchreichen
  • ADR-Dokument unter docs/adr/ (oder Wiki) mit Begründung der vier Arch-Entscheidungen (siehe nächster Abschnitt)
  • Migration läuft im API-Bootstrap durch, ohne bestehende Tabellen zu brechen

Vier zu klärende Architektur-Entscheidungen

(aus #360 übernommen — gehen in separate arch-question-Konsultation und werden hier nur referenziert/umgesetzt)

  1. Candidate-Tabelle pro User oder global mit ownerSub?
  2. Refs als separate Join-Tabelle (candidate_refs) oder JSONB-Feld?
  3. lifecycleState als Enum oder mehrere Boolean-Flags (isPlanned, isDone, isObsolete)?
  4. Wie wird Candidate done an die Source rückgemeldet?

Out-of-scope (für dieses Issue)

  • Tracking-Refactor (separates Issue, Phase 2 im Epic)
  • Mail-Source-Implementierung (#178, Phase 3)
  • Planner-Logik (Phase 5+)
  • UI / Day-View

Akzeptanzkriterien

  • ADR committed mit explizitem Entscheid für alle 4 offenen Fragen
  • Drizzle-Schema + Migration für candidate (und ggf. candidate_refs)
  • @mrrmlab/shared-types re-exportiert das Candidate-Type
  • Migration läuft erfolgreich im dev-Cluster (kein Bootstrap-Fehler)
  • Bestehende Tests bleiben grün; falls Tracking-Writer (#143/#144/#145) das Schema referenziert, separates Follow-up-Issue für die Source-Migration

Bezug

  • Part of #360 (Day-Planner Epic, Phase 1)
  • Bezug zu #122 (KI-Epic — Planner v2 sitzt dort, aber nicht Teil dieser Phase)
## Kontext Phase-1 des Day-Planner-Epics (#360) — gemäss Epic-Body: *"Voraussetzung für alle weiteren Phasen"*. Ohne Candidate-Schema kann weder die Tracking-Migration (#328/#329/#330) noch Mail-as-Source (#178) auf das neue Pattern umgestellt werden. ## Ziel Stabiles `Candidate`-Schema entwerfen + als ADR im Repo dokumentieren + Drizzle-Migration + generierte Types. Kein UI, keine Planner-Logik — nur die Datenhülle, auf die alle Sources schreiben. ## Scope - Schema-Entwurf (PostgreSQL via Drizzle) gemäss Epic-Beschreibung: Refs, Source-Identität (`source`, `sourceRef`, `lifecycleState`), Planungs-Constraints (`earliestAt`/`latestAt`, `estDuration`, `locationHints[]`, `dependsOn[]`, `priority`, `recurrence`), Planner-Ergebnis (`plannedSlot`, `plannedAfter`/`plannedBefore`), Completion-Policy - Drizzle-Migration (forward-only, backward-compatible per `CLAUDE.md`) - Generierte TS-Types ins `@mrrmlab/shared-types` durchreichen - ADR-Dokument unter `docs/adr/` (oder Wiki) mit Begründung der vier Arch-Entscheidungen (siehe nächster Abschnitt) - Migration läuft im API-Bootstrap durch, ohne bestehende Tabellen zu brechen ## Vier zu klärende Architektur-Entscheidungen (aus #360 übernommen — gehen in separate `arch-question`-Konsultation und werden hier nur referenziert/umgesetzt) 1. Candidate-Tabelle pro User oder global mit `ownerSub`? 2. Refs als separate Join-Tabelle (`candidate_refs`) oder JSONB-Feld? 3. `lifecycleState` als Enum oder mehrere Boolean-Flags (`isPlanned`, `isDone`, `isObsolete`)? 4. Wie wird *Candidate done* an die Source rückgemeldet? ## Out-of-scope (für dieses Issue) - Tracking-Refactor (separates Issue, Phase 2 im Epic) - Mail-Source-Implementierung (#178, Phase 3) - Planner-Logik (Phase 5+) - UI / Day-View ## Akzeptanzkriterien - [ ] ADR committed mit explizitem Entscheid für alle 4 offenen Fragen - [ ] Drizzle-Schema + Migration für `candidate` (und ggf. `candidate_refs`) - [ ] `@mrrmlab/shared-types` re-exportiert das Candidate-Type - [ ] Migration läuft erfolgreich im dev-Cluster (kein Bootstrap-Fehler) - [ ] Bestehende Tests bleiben grün; falls Tracking-Writer (#143/#144/#145) das Schema referenziert, separates Follow-up-Issue für die Source-Migration ## Bezug - Part of #360 (Day-Planner Epic, Phase 1) - Bezug zu #122 (KI-Epic — Planner v2 sitzt dort, aber nicht Teil dieser Phase)
Author
Collaborator

Die vier offenen Architektur-Entscheidungen sind als arch-question #454 an arch-bot gegeben. Phase-1-Implementierung wartet auf Antwort dort. PM-Position: ich entscheide nicht selbst — wir warten und übersetzen das Ergebnis ins ADR.

Die vier offenen Architektur-Entscheidungen sind als arch-question #454 an arch-bot gegeben. Phase-1-Implementierung wartet auf Antwort dort. PM-Position: ich entscheide nicht selbst — wir warten und übersetzen das Ergebnis ins ADR.
Collaborator

Phase-1-Scope ist bereits ausgeliefert (vor diesem PM-Sub-Issue, Datum ADR: 2026-05-20). Beim Anlegen von #453 wurde übersehen, dass die Arbeit bereits im Repo liegt:

  • ADR: docs/adr/0001-candidate-model.md (Status: Accepted)
  • Schema: apps/api/src/modules/candidates/candidates.schema.ts (alle Felder gemäss Epic-Body)
  • Migration: apps/api/drizzle/0017_slim_lady_bullseye.sql
  • Integration-Tests: apps/api/test/integration/candidates-schema.int-spec.ts
  • Drizzle-Types: Candidate / NewCandidate via $inferSelect / $inferInsert

Über Phase 1 hinaus bereits implementiert (gehört in andere Epic-Phasen, aber wirft die Frage auf, ob #360 inhaltlich Re-Scope braucht):

  • Phase 2 (Tracking→Candidate)apps/api/src/modules/tracking/tracking-candidate-writer.service.ts + Tests
  • Phase 3 (Mail→Candidate)apps/api/src/modules/mail/mail-candidate-writer.service.ts + Tests
  • Phase 4 (Habit→Candidate)apps/api/src/modules/habits/habit-candidate-writer.service.ts + Tests
  • Phase 5 (Planner v0)apps/api/src/modules/planner/planner.{service,controller}.ts + slot-plan.ts

Was tatsächlich noch fehlt (separat zu scopen, nicht hier):

  • Day-View-UI (mobile + web) — der eigentliche User-Touchpoint
  • Calendar-Integration: Read-Pfad existiert im Planner, aber Outlook-Sync-State unklar
  • Planner v1 (regelbasiert mit Location/Habit-Context)
  • Source-Done-Rückmeldung als Event-Bus (ADR §7, noch nicht implementiert)

Schließe #453 als already-implemented. Korrektur-Kommentar auf #360 folgt.

Phase-1-Scope ist bereits ausgeliefert (vor diesem PM-Sub-Issue, Datum ADR: 2026-05-20). Beim Anlegen von #453 wurde übersehen, dass die Arbeit bereits im Repo liegt: - ADR: `docs/adr/0001-candidate-model.md` (Status: Accepted) - Schema: `apps/api/src/modules/candidates/candidates.schema.ts` (alle Felder gemäss Epic-Body) - Migration: `apps/api/drizzle/0017_slim_lady_bullseye.sql` - Integration-Tests: `apps/api/test/integration/candidates-schema.int-spec.ts` - Drizzle-Types: `Candidate` / `NewCandidate` via `$inferSelect` / `$inferInsert` Über Phase 1 hinaus bereits implementiert (gehört in andere Epic-Phasen, aber wirft die Frage auf, ob #360 inhaltlich Re-Scope braucht): - **Phase 2 (Tracking→Candidate)** — `apps/api/src/modules/tracking/tracking-candidate-writer.service.ts` + Tests - **Phase 3 (Mail→Candidate)** — `apps/api/src/modules/mail/mail-candidate-writer.service.ts` + Tests - **Phase 4 (Habit→Candidate)** — `apps/api/src/modules/habits/habit-candidate-writer.service.ts` + Tests - **Phase 5 (Planner v0)** — `apps/api/src/modules/planner/planner.{service,controller}.ts` + `slot-plan.ts` Was tatsächlich noch fehlt (separat zu scopen, nicht hier): - Day-View-UI (mobile + web) — der eigentliche User-Touchpoint - Calendar-Integration: Read-Pfad existiert im Planner, aber Outlook-Sync-State unklar - Planner v1 (regelbasiert mit Location/Habit-Context) - Source-Done-Rückmeldung als Event-Bus (ADR §7, noch nicht implementiert) Schließe #453 als *already-implemented*. Korrektur-Kommentar auf #360 folgt.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#453
No description provided.