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>
174 lines
7.3 KiB
Markdown
174 lines
7.3 KiB
Markdown
# 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`
|