pp-planer/.sisyphus/notepads/pro-gen-and-ui-fixes/learnings.md
Thorsten Bus fa3162b2b7 docs: add build commands and architecture overview to AGENTS.md
Add build/test/lint commands, architecture overview, PHP/Vue/test
code style conventions, and key project constraints. Include dompdf
config, vite HMR note, and sisyphus evidence files.
2026-03-02 23:03:14 +01:00

50 lines
3.2 KiB
Markdown
Raw Permalink 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.

# Learnings: ProPresenter Generator and UI Fixes
## Task 6: Translated Textbox Positioning (2026-03-02)
### Implementation Pattern
- **Dual bounds methods**: Created `buildOriginalBounds()` and `buildTranslationBounds()` following same pattern as existing `buildBounds()`
- **Conditional logic in buildCue()**: Check for translation presence, use different bounds for each element
- **Optional parameter pattern**: Modified `buildSlideElement()` to accept `?Rect $bounds = null` parameter, defaulting to `buildBounds()` for backward compatibility
### Exact Values from TestTranslated.pro
- Original textbox: origin(150, 99.543), size(1620×182.946) — top position, ~183px tall
- Translation textbox: origin(150, 303.166), size(1620×113.889) — below, ~114px tall
- Non-translated: origin(150, 100), size(1620×880) — full height
### Testing Approach
- **PHPUnit tests**: Added two new tests to verify bounds for translated and non-translated slides
- **QA scenarios**: Used PHP CLI to generate, write, read back, and verify exact positioning values
- **Method access**: Used `getGraphicsElement()->getBounds()` to access protobuf bounds from TextElement wrapper
### Git Workflow
- **Symlinked vendor**: `vendor/propresenter/parser` is symlink to `/Users/thorsten/AI/propresenter-work/php`
- **Commit location**: Changes committed in propresenter-work repo, not cts-work
- **Branch**: propresenter-parser
### Test Results
- PHPUnit: 14/14 tests pass (95 assertions)
- Laravel: 203/203 tests pass (1115 assertions)
- QA verification: All positioning values match TestTranslated.pro reference exactly
## Task 8: .probundle Export fuer Service-Slide-Bloecke (2026-03-02)
### Export-Pattern
- Fuer ZIP-basierte Exporte ist `Storage::disk("public")->path(...)` teststabiler als harte `storage_path(...)`-Pfade, weil `Storage::fake("public")` dann direkt funktioniert.
- `.probundle` wurde als flaches ZIP umgesetzt: genau eine `.pro` plus alle Bilddateien auf Root-Ebene.
- Medienreferenzen in der `.pro` funktionieren robust mit Dateinamen (Root-Datei im Bundle) statt absoluten Pfaden.
### Controller-Integration
- Route-Parameter fuer Blocktyp (`information|moderation|sermon`) lassen sich sauber per Request-Validation nach `merge()` pruefen und liefern bei Fehlern korrekt 422 in JSON-Requests.
- Download-Response fuer temporaere Bundle-Dateien mit `deleteFileAfterSend(true)` vermeidet Temp-Muell.
### Test-Pattern
- Fuer BinaryFileResponse in Feature-Tests: Datei aus Response in eigenen Temp-Pfad kopieren und dann mit `ZipArchive` validieren.
- Vollsuite hatte einen sporadischen bestehenden Flake in `SongPdfTest`; Re-Run lief voll gruen (206/206).
## Scope-Audit Learnings (F4, 2026-03-02)
- Fuer strikte Scope-Fidelity prueft man nicht nur Dateiliste pro Commit, sondern auch unerwartete Hunks innerhalb der erwarteten Dateien (z.B. Header-Navigation oder Bulk-Delete-Features in einem Export-Task).
- Wenn ein Task auf vendor-Dateien zielt, die im Repo nicht versioniert sind, ist der Task aus Sicht des Git-Diffs nicht nachweisbar umgesetzt ("missing", auch wenn QA-Evidence existiert).
- Commit-Message-Match allein reicht nicht: Task 1/4/7/8 zeigen, dass ein passender Commit-Titel trotzdem deutliche Scope-Creep enthalten kann.