2026-09-16 14:17:25 +02:00
# Handover-Dokument — Assignment Monitor V2
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
Einstieg für neue Chat-/Dev-Sessions. **Produktiv** (`c:\dev\AssigmentMonitor`) niemals anfassen.
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
> **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)
2026-08-08 17:35:05 +02:00
2026-07-02 10:10:06 +02:00
---
2026-09-16 14:17:25 +02:00
## Stand (2026-08-16)
2026-07-03 11:56:22 +02:00
2026-09-16 14:17:25 +02:00
**Arbeitsverzeichnis:** `C:\dev\AssigmentMonitorV2`
2026-08-08 17:35:05 +02:00
2026-09-16 14:17:25 +02:00
### Zuletzt umgesetzt (Auswahl)
2026-07-13 12:45:35 +02:00
2026-09-16 14:17:25 +02:00
| 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 |
2026-07-13 12:45:35 +02:00
2026-09-16 14:17:25 +02:00
**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).
2026-07-06 19:08:24 +02:00
2026-09-16 14:17:25 +02:00
**Kanonischer Status + offene Punkte:** [`STATUS_UND_OFFENE_PUNKTE.md` ](./STATUS_UND_OFFENE_PUNKTE.md ) — als Nächstes **T4** .
2026-07-03 11:56:22 +02:00
---
2026-07-02 10:10:06 +02:00
## Worum geht es?
2026-09-16 14:17:25 +02:00
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.
2026-07-06 19:08:24 +02:00
2026-09-16 14:17:25 +02:00
---
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
## Tech-Stack
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
| | |
|---|---|
| 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` |
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
```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
2026-07-02 10:10:06 +02:00
```
2026-09-16 14:17:25 +02:00
---
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
## Bewertungsskala (1– 10)
2026-07-02 10:10:06 +02:00
```typescript
2026-09-16 14:17:25 +02:00
type RatingScore = number // 1– 10 ganzzahlig; unset = null (kein N/A-String mehr)
2026-07-02 10:10:06 +02:00
```
2026-09-16 14:17:25 +02:00
- 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`
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
**Legacy:** Alte Enum-Skala `not_client_ready` … und Notation `+` /`!` sind abgelöst — nicht neu einbauen.
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
---
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
## Datenmodell-Kern
### `criteriaId`-Semantiken (unverändert kritisch)
2026-07-02 10:10:06 +02:00
```
2026-09-16 14:17:25 +02:00
Assessment.criteriaId → FeedbackCriterionItem.id
ConversationSkillScore.criteriaId → FeedbackCategory.id
ConversationLineTag.criterionItemId → FeedbackCriterionItem.id
2026-07-02 10:10:06 +02:00
```
2026-09-16 14:17:25 +02:00
### Sichtbare Struktur je Assignment-Typ
2026-07-03 11:56:22 +02:00
2026-09-16 14:17:25 +02:00
`AssignmentType.criteriaIds` (leer = alle). Kanonisch:
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
`resolveVisibleStructure()` / `filterVisibleFeedbackStructure()` in `src/db/queries/feedbackStructure.ts` — nicht erneut inline.
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
### Checkliste
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
- `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:`)
2026-07-06 19:08:24 +02:00
2026-09-16 14:17:25 +02:00
---
2026-07-03 11:56:22 +02:00
2026-09-16 14:17:25 +02:00
## Routing
2026-07-03 11:56:22 +02:00
2026-09-16 14:17:25 +02:00
```
/ 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
```
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
---
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
## Konfiguration (6 Tabs)
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
| 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) |
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
---
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
## Team & Übergabe
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
| 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`) |
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
Import prüft Berater per Vor-/Nachname (wiederverwenden oder anlegen); Feedback-Struktur muss auf dem Ziel (Starter) passen.
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
---
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
## Stil-Regeln
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
- 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)
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
---
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
## Datenschutz
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
- 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
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
---
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
## Fallstricke
2026-07-02 10:10:06 +02:00
2026-09-16 14:17:25 +02:00
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`