This commit is contained in:
2026-07-26 18:11:57 +02:00
parent d408e01ab5
commit 21a3b34471
139 changed files with 32872 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
# MASTER PROMPT Beste Suggestions
Du arbeitest **nur** an den Vorschlägen (Suggestions) für den Berichtsheft-Generator.
Kein Word-Template, kein UI-Redesign, kein PDF außer es ist zwingend nötig, damit Suggestions gespeichert/geladen werden.
## Ziel
Die besten möglichen Vorschläge: so, dass ein generiertes Wochenberichtsheft **nicht von Nicos echten Heften unterscheidbar** ist.
## Quelle der Wahrheit
Nur diese Ordner:
- `1. Ausbildungsjahr/*.docx`
- `2. Ausbildungsjahr/*.docx`
Alles andere (Internet, generische Azubi-Listen, erfundene Büro-Tätigkeiten) ist **verboten**, außer als allerletzte, klar markierte stilgleiche Variante aus bereits belegten Mustern.
## Kontext Person / Betrieb
- Nico Baumann, Büromanagement, Kfz-Firma, Abt. 43180
- Typisch in den Heften: Termine, Ablage, Rechnungen, Kasse, Reifen/Lager, WM/Crailsheim/Feuchtwangen/Rothenburg, Mobilitätsgarantie, Getränke, Spülmaschine, Aufträge, Versicherungen, Guardey, …
## Gold-Stil (so müssen Suggestions klingen)
**Gut (echt):**
- `Termine vereinbart`
- `Ablage einsortiert`
- `Rechnungen geschrieben`
- `Reifen bestellt`
- `Kassenbuch geführt und die Kasse gezählt`
- `Getränke für die Belegschaft geholt`
- `Teil beim WM in Crailsheim abgeholt`
- `Mobilitätsgarantien abgeschlossen`
- `Polypolpreisbildung`
- `Introducing a Company`
**Schlecht (verboten):**
- `Eingangsrechnung Nr. 47 geprüft und freigegeben` (künstlich nummeriert)
- `BWL: Controlling Kennzahlen` (Schulbuch-Ton, nicht Heft-Ton)
- `Optimierung der internen Kommunikationsprozesse`
- `Cybersicherheitsherausforderungen absolviert bei „Guardey“` nur behalten wenn **wirklich** so in Heften steht; keine erfundenen IT-Buzzwords
## Harte Qualitätsregeln
1. **Original first** echte Phrasen aus den Heften haben Vorrang
2. **Häufigkeit = Qualitätssignal** oft vorkommende Formulierungen höher gewichten
3. **Kurzer Ton** wie in den Heften (meist 312 Wörter, manchmal 1 längerer Satz)
4. **Kein Müll** keine XML-IDs, keine `……`, keine Header (`Abteilung`, `Lfd. Nr.`, `Unterschrift`)
5. **Typ trennen** `betrieb` vs `schule` strikt getrennt
6. **Varianten sparsam** nur leichte Umformulierungen echter Muster, nie neue Themen erfinden
7. **Orte/Eigennamen nur wenn belegt** WM, Crailsheim, Feuchtwangen, Rothenburg, Guardey, Bosch, …
8. **Ausgabe** `web/src/data/suggestions.ts` (+ ggf. Themes), Skript reproduzierbar unter `web/scripts/`
## Datenmodell
```ts
type Suggestion = {
id: number
text: string
type: "betrieb" | "schule"
category: string
weight: number // Häufigkeit / Qualitäts-Score aus den Heften
}
```
Zusätzlich: `WEEK_THEMES: string[]` nur aus echten „Thema der Woche“-Feldern.
## Definition of Done (Suggestions)
- [ ] Alle Hefte geparst
- [ ] ≥ 90 % der Betriebs-Suggestions sind 1:1 oder fast 1:1 aus Originalen
- [ ] Keine Müll-/Header-Strings
- [ ] `weight` steuert Random (häufige Phrasen öfter)
- [ ] Schule und Betrieb vermischen sich nicht
- [ ] Stichprobe 30 Suggestions: „klingt nach Nico“
- [ ] `npm run generate:suggestions` (oder gleichwertig) regeneriert die Datei
- [ ] `npm run build` ok
## Arbeitsweise
Teilaufgaben in `prompts/suggestions/teilaufgaben/` der Reihe nach.
Nach jeder Teilaufgabe: kurze Statusmeldung + was sich in welchen Dateien geändert hat.
+28
View File
@@ -0,0 +1,28 @@
# Suggestions-Prompts (Master)
Nur für **beste Vorschläge**. Word-Vorlage/UI liegen absichtlich außerhalb.
| Datei | Zweck |
|-------|--------|
| [00-MASTER.md](00-MASTER.md) | Regeln, Stil, DoD |
| [START-HIER.md](START-HIER.md) | Copy-Paste |
| [teilaufgaben/01-extrahieren.md](teilaufgaben/01-extrahieren.md) | Alle Hefte parsen |
| [teilaufgaben/02-saeubern-dedupe.md](teilaufgaben/02-saeubern-dedupe.md) | Müll weg, dedupe |
| [teilaufgaben/03-kategorisieren-gewichten.md](teilaufgaben/03-kategorisieren-gewichten.md) | category + weight |
| [teilaufgaben/04-varianten-sparsam.md](teilaufgaben/04-varianten-sparsam.md) | max. 30 % Varianten |
| [teilaufgaben/05-auswahl-algorithmus.md](teilaufgaben/05-auswahl-algorithmus.md) | weighted random / Woche |
| [teilaufgaben/06-qualitaetstor.md](teilaufgaben/06-qualitaetstor.md) | Auto-Check + Stichprobe |
## Regenerieren / Qualitätstor
```bash
cd web
npm run generate:suggestions # Extrakt → Clean → Score → suggestions.ts → verify
npm run check:suggestions # nur Qualitätstor
```
## Einstieg
```
Lies prompts/suggestions/START-HIER.md und führe den Block „Alles der Reihe nach“ aus.
```
+40
View File
@@ -0,0 +1,40 @@
# Copy-Paste Nur Suggestions (beste Qualität)
## Alles der Reihe nach
```
Du arbeitest NUR an Suggestions.
Lies und befolge strikt:
1) prompts/suggestions/00-MASTER.md
2) Dann nacheinander:
- prompts/suggestions/teilaufgaben/01-extrahieren.md
- prompts/suggestions/teilaufgaben/02-saeubern-dedupe.md
- prompts/suggestions/teilaufgaben/03-kategorisieren-gewichten.md
- prompts/suggestions/teilaufgaben/04-varianten-sparsam.md
- prompts/suggestions/teilaufgaben/05-auswahl-algorithmus.md
- prompts/suggestions/teilaufgaben/06-qualitaetstor.md
Ziel: Vorschläge müssen klingen wie Nico Baumanns echte Berichtshefte
(Büro + Kfz: Termine, Ablage, Rechnungen, Reifen, WM/Crailsheim, Kasse, …).
Verboten: generische KI-Bürofloskeln, nummerierte Kunstsätze, Themen die nie in den Heften vorkommen.
Mindestens 70 % Betrieb-Suggestions = exakte Originale aus den .docx.
Nach jeder Teilaufgabe kurzer Status, dann weiter bis Definition of Done.
```
## Nur Extraktion + Clean
```
Lies prompts/suggestions/00-MASTER.md und führe
01-extrahieren.md + 02-saeubern-dedupe.md aus.
Parse alle Berichtshefte in 1. und 2. Ausbildungsjahr.
```
## Nur Auswahl besser machen
```
Lies prompts/suggestions/00-MASTER.md und führe
05-auswahl-algorithmus.md aus.
Weighted random, Diversität, Ferien = nur Betrieb.
```
@@ -0,0 +1,31 @@
# S01 Alle Hefte extrahieren
Lies `prompts/suggestions/00-MASTER.md`. Nur Extraktion noch keine Varianten erfinden.
## Auftrag
1. Parse **jede** `.docx` in `1. Ausbildungsjahr/` und `2. Ausbildungsjahr/`.
2. Ziehe Rohtext aus `word/document.xml`.
3. Speichere Rohdump + strukturierte Phrasen:
- `web/scripts/extracted-all.txt` (Roh)
- `web/scripts/raw-phrases.json` mit Feldern:
- `sourceFile`
- `activities[]`
- `weekThemes[]`
- `schoolTopics[]`
- `frameworkRefs[]` (nur zum Filtern, nicht als Suggestion)
## Parsing-Hinweise
Abschnitte typischerweise:
- Tätigkeiten vor „Betriebliche Tätigkeiten“ / Rahmenplan
- „Thema der Woche …“
- „Berufsschule …“
Alles was Header/Footer/Unterschrift ist → ignorieren.
## Abnahme
- [ ] Anzahl Quelldateien = Anzahl geparster Hefte (ca. 78)
- [ ] Pro Heft mindestens ein paar Activities (außer reine Urlaubswochen)
- [ ] JSON ist valide und nachvollziehbar
@@ -0,0 +1,35 @@
# S02 Säubern + Deduplizieren
Lies `prompts/suggestions/00-MASTER.md`. Nutze die Ausgabe aus S01.
## Auftrag
Erzeuge `web/scripts/clean-phrases.json`:
```json
{
"activities": [{ "text": "...", "count": 14, "sources": ["..."] }],
"themes": [{ "text": "...", "count": 5 }],
"school": [{ "text": "...", "count": 2 }]
}
```
## Filter (muss weg)
- `Abteilung`, `Ausbildungsnachweis`, `Für die Zeit`, `Name`, `Datum`
- `Lfd. Nr.`, `Unterschrift`, `Ausbilderin`, Punkte-Linien `……`
- reine Zahlen / lange Ziffernblöcke / XML-Artefakte
- `Ferien` als Activity (gehört nur ins Berufsschule-Feld der Woche)
- doppelte Zeilen durch Tabellen-Duplikate in Word (gleiche Phrase 2× im selben Heft → count sinnvoll)
## Dedup
- case-insensitive
- trim, Whitespace normalisieren
- optionale Endpunkt-Varianten zusammenführen (`Termine geplant und vergeben.` ≈ ohne Punkt)
## Abnahme
- [ ] Top-Activities sehen aus wie echte Heftzeilen
- [ ] `Termine vereinbart` / `Ablage …` / `Rechnungen …` sind oben, wenn häufig
- [ ] Kein sichtbarer Müll in den Top 50
@@ -0,0 +1,49 @@
# S03 Kategorisieren + Gewichten
Lies `prompts/suggestions/00-MASTER.md`. Input: `clean-phrases.json`.
## Auftrag
Baue Suggestions mit Kategorie und Gewicht.
### Kategorien Betrieb (nur wenn passend)
- Rechnungswesen
- Kunden
- Lager
- Kasse
- Fahrzeuge
- Fahrten
- Organisation
- Betrieb (Fallback)
### Kategorien Schule
- BWL
- Buchhaltung
- Englisch
- Deutsch
- IT
- BFK
- Gesellschaft
- Berufsschule (Fallback)
Regeln an echten Wörtern aus den Phrasen ausrichten (Rechnung, Termin, Reifen, Kasse, Crailsheim, Excel, Englisch, …).
### weight
```
weight = count // Rohhäufigkeit aus den Heften
```
Optional leicht anheben (+1..2), wenn Phrase in mehreren Ausbildungsjahren vorkommt.
## Ausgabe
Zwischenfile ok, z.B. `web/scripts/scored-phrases.json`.
## Abnahme
- [ ] Jede Phrase hat `type`, `category`, `weight`
- [ ] Schule nie als `betrieb` gelabelt (Stichprobe)
- [ ] Hohe weights = wirklich häufige Originalphrasen
@@ -0,0 +1,40 @@
# S04 Stilgleiche Varianten (sparsam)
Lies `prompts/suggestions/00-MASTER.md`.
## Ziel
Pool groß genug für Abwechslung aber **ohne** Fake-Büro-Text.
## Erlaubt
Nur Varianten, die klar aus einem belegten Muster kommen:
| Original (belegt) | Erlaubte Variante |
|-------------------|-------------------|
| Termine vereinbart | Termine telefonisch vereinbart |
| Ablage einsortiert | Ablage sortiert |
| Rechnungen geschrieben | Rechnungen erstellt |
| Getränke geholt | Getränke für die Belegschaft geholt |
## Verboten
- Nummerierte Kunstsätze (`Rechnung 1000+i`)
- Neue Themen, die nie in den Heften vorkommen
- Englische Management-Floskeln
- Überlange KI-Sätze
## Mengenregel
- Mindestens **70 %** des finalen Betrieb-Pools = exakte Originale
- Höchstens **30 %** stilgleiche Varianten
- Varianten: `weight` niedriger als das Original (z.B. `max(1, originalWeight - 2)`)
## Schule
Für Schule: bevorzugt **nur Originale**. Varianten nur wenn extrem nah (z.B. Tippfehler-Korrektur).
## Abnahme
- [ ] Verhältnis Original/Variante dokumentiert (Konsolen-Log reicht)
- [ ] 20 zufällige Varianten manuell gegen Originale haltbar
@@ -0,0 +1,33 @@
# S05 Auswahl-Algorithmus (beste Random-Sets)
Lies `prompts/suggestions/00-MASTER.md`.
Code vor allem in `web/src/lib/suggest.ts` (+ App nur wenn nötig).
## Ziel
Wenn der User „4 neue“, „8 neue“ oder „Woche automatisch füllen“ klickt, sollen die Vorschläge **so gut wie möglich** sein nicht nur zufällig, sondern gewichtet und passend zur Woche.
## Regeln
1. **Weighted random** nach `weight` (häufige echte Phrasen öfter)
2. **Keine Duplikate** in Offer + bereits gewählten Texten
3. **usedSuggestionIds** meiden, bis Pool zu klein → dann Fallback
4. **Ferienwoche / keine Schule:** nur `type: betrieb`
5. **Schulwoche:** überwiegend Betrieb; 02 Schule-Themen in größeren Offers
6. **Auto-füllen Woche:** ca. 812 Betriebseinträge, thematisch gemischt (nicht 8× nur Ablage)
7. **Diversität:** bei Auto-füllen max. 23 aus derselben `category`, außer Pool zu klein
8. **Themen der Woche:** random aus echten `WEEK_THEMES`
## API (orientierend)
```ts
pickRandomSuggestions(monday, count, usedIds, alreadySelectedTexts)
pickWeekSet(monday, usedIds) // für Auto-füllen: diverse, gewichtete Woche
```
## Abnahme
- [ ] 10× „4 neue“: Phrasen klingen echt, wenig Wiederholung
- [ ] Auto-füllen: gemischte Kategorien
- [ ] Ferienwoche: keine Schul-Vorschläge im Offer
- [ ] Build ok
@@ -0,0 +1,38 @@
# S06 Qualitätstor „klingt nach Nico“
Lies `prompts/suggestions/00-MASTER.md`. Abschluss-Check nur für Suggestions.
## Automatische Checks (Skript)
Schreibe/aktualisiere ein Skript, das failt wenn:
- Phrase matcht Müll-Regex (Unterschrift, Lfd. Nr., `……`, lange Ziffern)
- `type` fehlt / ungültig
- `weight < 1`
- Duplikate (case-insensitive)
- Anteil exakter Originale am Betrieb-Pool < 70 % (gegen `clean-phrases.json`)
## Manuelle Stichprobe (du als Agent)
Ziehe 30 zufällige Betrieb + 15 Schule und bewerte:
| Kriterium | Ja/Nein |
|-----------|---------|
| Könnte so im echten Heft stehen | |
| Kein KI-/Lehrbuch-Ton | |
| Kategorie plausibel | |
Wenn > 3 klare Flops → zurück zu S02/S04 und nachbessern.
## Final schreiben
- `web/src/data/suggestions.ts` final generieren
- `WEEK_THEMES` nur echte Themen
- `npm run generate:suggestions` dokumentieren/aktualisieren
- `npm run build`
## Abnahme
- [ ] Auto-Checks grün
- [ ] Stichprobe bestanden
- [ ] Kurzbericht: Anzahl Betrieb/Schule, Top-10 Phrasen, Original-Anteil