CG-Feedback-Monitor/docs/HANDOVER.md
Lars d894c3c8e4 V2-Stand: UX-Dashboard, Personen v2, Starter-Paket und Dexie-Legacy entfernt.
Sichert den lokalen Entwicklungsstand nach Gitea: Nav/Dashboard, Personen-Excel/Archiv, Team-Setup, Assignment-Übergabe und C6/C7/T2.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-16 14:17:25 +02:00

174 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Handover-Dokument — Assignment Monitor V2
Einstieg für neue Chat-/Dev-Sessions. **Produktiv** (`c:\dev\AssigmentMonitor`) niemals anfassen.
> **DEV-Isolation:** Repo `AssigmentMonitorV2` · Ports **5174 / 4001** · SQLite `assignment-monitor-v2-dev.sqlite3`
> Details: [`DEV_ISOLATION.md`](./DEV_ISOLATION.md) · Team-Verteilung: [`TEAM_SETUP.md`](./TEAM_SETUP.md) · Offene Punkte: [`STATUS_UND_OFFENE_PUNKTE.md`](./STATUS_UND_OFFENE_PUNKTE.md)
---
## Stand (2026-08-16)
**Arbeitsverzeichnis:** `C:\dev\AssigmentMonitorV2`
### Zuletzt umgesetzt (Auswahl)
| Wann | Thema |
|---|---|
| 2026-08-16 | **Personen v2** E-Mail Pflicht · Gruppen umbenennen/löschen · Verschieben · Excel-Import · Archiv · Detail (Assignments/Feedbacks/Entwicklung) · Lösch-Kaskade |
| 2026-08-16 | **UX.3 Teil 1** Nav (Assignments/Feedbacks/Personen/Einstellungen) · Dashboard-Kachel-Grid · Plandaten · Typ-Farben · Filter/Überfällig |
| 2026-08-16 | **UX.1–UX.2** Design-Tokens + App-Chrome · **C0** Smoke · **C6/C7** Tagging/KI · **T2** Dexie entfernt |
| 2026-08 | Assignment-**Übergabe** Export/Import (Lead→Lead, inkl. Berater/Checklisten/Notizen) |
| 2026-08 | Team-**Starter-Paket** (`starter:export` / `bootstrap` / `setup` / `pack:zip`) |
| 2026-08 | Bewertungsskala **1–10**, Farbbänder, `meetingCategoryRatings` |
| 2026-08 | Feedback-Kaskade Stufe A (Kategorie) → B (Dimension), Benefits/Concerns |
| 2026-07 | Checklisten, selbstlernendes Kriterien-Tagging, PDF-Exporte, Papierkorb/Archiv, Meeting-Historie |
| 2026-07-04 | Lokaler Node/Express + `node:sqlite` statt IndexedDB als Primärspeicher |
**Laufende Arbeitsliste Feedback/KI:** [`FEEDBACK_CASCADE_PLAN.md`](./FEEDBACK_CASCADE_PLAN.md) — Pakete **0**, 1–3, 1b, **6, 7**, 8.3 erledigt; 4/5 Code weitgehend (manuelles Smoke/5.3 offen).
**Kanonischer Status + offene Punkte:** [`STATUS_UND_OFFENE_PUNKTE.md`](./STATUS_UND_OFFENE_PUNKTE.md) — als Nächstes **T4**.
---
## Worum geht es?
PWA für die Live-Bewertung von Capgemini-Trainees („Institutees“) während Kunden-Assignments: Meetings protokollieren, Kriterien taggen, einschätzen, Abschluss-Feedback (Benefits/Concerns) erzeugen.
---
## Tech-Stack
| | |
|---|---|
| Frontend | **React 19** + TypeScript + Vite (PWA) |
| Routing | **React Router 7** (`react-router-dom`) |
| CSS | Tailwind v4 — `@import "tailwindcss"`, Brand `brand` / `#0070AD` |
| Daten | Lokaler **Express** + **`node:sqlite`** (kein better-sqlite3), RPC `POST /api/rpc` |
| Ports (V2) | Frontend **5174**, API **4001** |
| DB-Datei | `server/data/assignment-monitor-v2-dev.sqlite3` (gitignored) |
| Tabellen | **26** — einzige Quelle: `server/db/tableRegistry.ts` |
```bash
npm run dev:all # Vite :5174 + API :4001
npx tsc -b # TypeScript — NICHT tsc --noEmit am Root
npm run setup # Starter-Struktur einspielen
npm run pack:zip # Team-ZIP nach dist-release/ (ohne DB)
npm run pack:laptop # Umzug: Code + volle Dev-DB
```
---
## Bewertungsskala (1–10)
```typescript
type RatingScore = number // 1–10 ganzzahlig; unset = null (kein N/A-String mehr)
```
- Farbbänder konfigurierbar: Config → **Skala** (`ratingColorBands` in `appSettings`)
- Notation in Protokollen: **führende Zahl** `1`–`10` am Zeilenanfang (`parseNotationPrefix`); `>` Zitat, `[…]` Abschnitte bleiben
- Meeting-Pflichtscore oft auf **Kategorie**-Ebene (`meetingCategoryRatings`); Kriterien bleiben Beobachtungs-/Detail-Ebene
- Aggregation: gewichtet `Σ(score×weight)/Σ(weight)`; `Σweight===0` → null; Details `docs/SCALE_1_TO_10.md`
**Legacy:** Alte Enum-Skala `not_client_ready` … und Notation `+`/`!` sind abgelöst — nicht neu einbauen.
---
## Datenmodell-Kern
### `criteriaId`-Semantiken (unverändert kritisch)
```
Assessment.criteriaId → FeedbackCriterionItem.id
ConversationSkillScore.criteriaId → FeedbackCategory.id
ConversationLineTag.criterionItemId → FeedbackCriterionItem.id
```
### Sichtbare Struktur je Assignment-Typ
`AssignmentType.criteriaIds` (leer = alle). Kanonisch:
`resolveVisibleStructure()` / `filterVisibleFeedbackStructure()` in `src/db/queries/feedbackStructure.ts` — nicht erneut inline.
### Checkliste
- `PhaseTemplate.hasChecklist` + `checklistItemDefs` / `checklistResponses`
- Effektives Kriterium: Antwort-Override oder Config-`linkedCriterionItemId` (`getEffectiveChecklistCriterionId`)
- UI im Gesprächsprotokoll-Tab (kein eigener Meeting-Tab)
- Tagging: eigener Prompt `checklistTaggingPromptTemplate` (`PUNKT n:`), getrennt vom Protokoll (`ZEILE n:`)
---
## Routing
```
/ Dashboard (+ Import Übergabe)
/assignment/new
/assignments/trash | /assignments/archive
/assignment/:id Detail (+ Export Übergabe, PDF)
/assignment/:id/edit
/assignment/:id/history Gesamtprotokoll
/assignment/:id/meeting/:meetingId MeetingView ← meetingId ≠ Assignment-ID
/assignment/:id/feedback/:instituteeId
/assignment/:id/feedback-draft/:instituteeId Legacy
/evaluation | /consultants | /config
```
---
## Konfiguration (6 Tabs)
| Tab | Inhalt |
|---|---|
| Feedback | Dimensionen → Kategorien → Kriterien (Gewicht 0,0–2,0) |
| Ass.-Typen | Phasen, Checklisten, Kriterien-Sichtbarkeit, Standard-Zuordnung (KI) |
| Gewichtung | Zeitgewichtungs-Faktor Trend |
| Skala | Farbbänder 1–10 |
| KI-Prompts | Kategorie-/Dimension-Templates, Protokoll- + Checklisten-Tagging |
| Backup | Voll-Backup JSON (Wipe-Import) |
---
## Team & Übergabe
| Zweck | Wie |
|---|---|
| Frische Struktur ohne Personen | `docs/starter/starter-structure.json` · `npm run setup` |
| ZIP an Kollegen | `npm run pack:zip` → `dist-release/` · Anleitung `EINRICHTUNG.md` |
| Laptop-Umzug (Code + volle DB) | `npm run pack:laptop` → `dist-release/` · Anleitung `UMZUG.md` |
| Assignment an anderen Lead | Detail **↔ Übergabe** / Dashboard **↔ Import** (`assignmentTransfer`) |
Import prüft Berater per Vor-/Nachname (wiederverwenden oder anlegen); Feedback-Struktur muss auf dem Ziel (Starter) passen.
---
## Stil-Regeln
- Keine Kommentare außer nicht-offensichtlichen Invarianten
- Kein Auto-Resize-Textarea via `rows={1}` + JS
- Scores: `ScorePicker` / `resolveScoreStyle` / `RATING_SCORES` — keine alten `RATING_OPTIONS`-Enums neu erfinden
- Gewichtete Mittel: immer `weightedAverageScore` / `weightedAverageRating` in `ratingTrend.ts`
- Zeilen splitten: `splitNoteLines()` — nicht `note.split('\n')` inline
- Cross-Boundary: Dateien für Client+Server nur aus `src/db/types.ts` / `src/config/constants.ts` (in `tsconfig.server.json` include)
---
## Datenschutz
- Daten nur lokal unter V2-`server/data/` · kein Cloud-Upload
- GDPR: Institutee-/Kundennamen, Gesprächsnotizen
- KI-Key in `localStorage` — nie loggen
- Backup- und Übergabe-JSON = personenbezogen → vertraulich
- Produktiv-Backup nicht in V2-Experimente mischen
---
## Fallstricke
1. `MeetingInstance.generalNotes` → immer `?? ''`
2. `Assessment.criteriaId` ≠ Kategorie-ID
3. `npx tsc --noEmit` am Root prüft nichts — immer `npx tsc -b`
4. V2-Ports 5174/4001 — Start bricht bei 5173/4000 ab
5. Protokoll-Tagging-Prompt in DB darf kein `{{CHECKLISTEN_PUNKTE}}` mehr enthalten (Auto-Migration in `getOrSeedCriterionTaggingPromptTemplate`)
6. Dexie/IndexedDB-Legacy ist entfernt (2026-08-16) — nicht wieder einführen; Struktur über Starter/`npm run setup`