# Verification Report: phase-5-05-formular-designer

Stand: 2026-09-06. Geprüft wurden Proposal, Design, alle zwölf Tasks und alle
sechs Anforderungen samt Szenarien gegen den aktuellen Arbeitsstand.

## Ergebnis

| Dimension | Ergebnis |
| --- | --- |
| Completeness | 12/12 Aufgaben; 6/6 Anforderungen umgesetzt |
| Correctness | Alle sechs Spec-Szenarien durch ausführbare Prüfungen abgedeckt |
| Coherence | Gemeinsames FRM-Dokument, vorhandene Metadaten, FormsModel/TextScreen, gemeinsamer Prozedur- und Undo-Pfad |
| Offene Befunde | 0 CRITICAL, 0 WARNING, 0 SUGGESTION |

## Anforderungen und Szenarien

Die Designerprüfungen liegen in `crates/tb-ide/tests/designer.rs` und bedienen
die produktiven App-Aktionen sowie den realen Event-Dispatcher/Renderer.

| Anforderung / Scenario | Implementierung | Nachweis |
| --- | --- | --- |
| Designfläche und vollständige Toolbox / Jede Controlklasse | `designer::tools`, `design_place`, `preview`, `design_mouse`, `design_render`; `commands::menus` | `all_metadata_tools_persist_and_preview_matches_runtime_without_events`: alle 17 Toolboxvarianten, einschließlich VSpin/HSpin, Browserklassen und Timer, persistieren mit gleichen wirksamen Properties. Pixelvergleich mit FormsModel-Rendering; aktivierter 1-ms-Timer bleibt in der Vorschau ohne Deadline/Ereignis, Load-/Timer-Code wird nicht ausgeführt. `toolbox_double_click_tool_drag_grid_and_window_form_selection` prüft Doppelklick und Tools-Aufziehen. Menu wird durch die Menütests abgedeckt. |
| Auswahl und Geometrie / Container und Mehrfachauswahl | `design_select`, `design_geometry`, `design_resize`, `design_tab`, `design_mouse`; öffentliche Laufzeitgeometrie `FormsModel::rect` | `container_multiselect_keyboard_drag_resize_and_undo`: tatsächliche Framekoordinaten, Ctrl+Klick, Tab/Shift+Tab, 1-/5-Zellen-Bewegungen, Shift-Skalierung, Drag und gemeinsames Undo. `all_eight_handles_resize_transactionally_and_preserve_identity_after_structure_edits`: alle acht Handles, Ablehnung unzulässiger Geometrie und stabile IDs über Indexänderung, Löschen, Neuanlage und Undo. |
| Properties Bar und Bearbeitungsaktionen / Ungültige Eigenschaft | `design_property`, `design_value_focus`, `design_bar`, `design_copy/paste/delete`; `Project::edit_form/undo` | `property_bar_types_readonly_and_no_status_line`: Typen/Bereiche/readonly, F2/F10, sichtbare Geometrie, keine Statuszeile, Spin-Größenvertrag. Runtime-Setter validieren zusätzlich kontextabhängige Propertyregeln in einer isolierten Vorschau. `clipboard_children_arrays_and_delete_preserve_code`: Containerkinder, neue Namen, erhaltene Array-Indizes, Cut/Paste/Clear und vollständiges Undo. |
| Menüdesigner und Farbpalette / Menü mit Array und Untermenü | `design_action`, `design_submit`, `design_menu_move/commit`, `design_tool_render`; `forms::menu_shortcuts` | `menu_hierarchy_arrays_shortcuts_and_palette_use_events`: Access-Key, Separator, Index=0, Shortcut, Hierarchie/Reihenfolge, FRM-Roundtrip und Kompilierung; Fore-/BackColor-Auftrag. `menu_indent_outdent_rename_and_field_changes_have_one_undo`: Ebenenwechsel und eine Undo-Einheit für Name und Dialogfelder. `property_menu_buttons_palette_drag_and_modal_mouse_are_connected`: echte Property-/Menübuttons, Farbdrop und Modalität. |
| Dokumentkonsistenz und Umbenennen / Umbenennen mit Ereigniscode | `design_rename_with`; `ProjectCompiler::bound_form_references`; opt-in Referenzaufzeichnung im regulären Sema; `Project::commit_transaction/undo` | `bound_rename_across_documents_is_atomic_and_undo_restores_all`: Control, Handler und qualifizierte Verweise in anderen Modulen; Undo aus einer beteiligten Datei; Konflikt-/Syntaxabbruch ohne Teiländerung. `rename_preserves_shadowed_names_and_handles_form_aliases_and_include_calls`, `shared_include_ambiguity_aborts_rename_and_event_defaults_use_includes`, `imported_type_shadow_is_not_an_object_reference_during_rename`: Kommentare/Strings, gleichnamige Variablen, importierte UDT-Felder, Prototypen/Aufrufe, Formularalias und mehrdeutig gemeinsam genutzte Includes. Löschen erhält Code und meldet ungebundene Handler sichtbar. |
| Ereignisprozeduren und Moduswechsel / Ereignis zweimal öffnen | `design_event`, `event_parameters`, gemeinsames `App::new_procedure_text`; `show_document/design_enter` | `clipboard_children_arrays_and_delete_preserve_code` öffnet Array-Click zweimal ohne Duplikat. `event_array_signature_twice_and_shared_form_identity` prüft außerdem DragOver zweimal mit Index/CONTROL/SINGLE/INTEGER, gleiche Dokumentidentität, Cursor und Controlauswahl. `existing_default_typed_event_and_all_metadata_signatures_compile`: vorhandene DEFtype-Signatur und alle CommandButton-Events kompilieren. `events_with_the_same_name_are_local_to_their_form`: gleichnamige Ereignisse zweier Formulare bleiben getrennt. |

## Persistenz und Compilergrenze

- `binary_designer_import_requires_text_target_and_compiles` bearbeitet einen
  echten Binärimport, verlangt ein separates Textziel, erhält die Originalbytes
  und lädt das Ergebnis über den bestehenden Compilerpfad.
- `crates/tb-cli/tests/project.rs::designer_frm_is_accepted_by_the_standalone_cli_compiler`
  erzeugt ein Formular samt Control-Array und Ereigniscode über App-Aktionen,
  speichert es mit dem vorhandenen Writer, startet den echten `tbc build`-Prozess
  und lädt das erzeugte TBC erneut. Die zusätzliche Abhängigkeit auf tb-ide
  gilt ausschließlich für CLI-Tests; es gibt keine neue externe Bibliothek.
- Der FRM-Writer lässt explizite Defaultwerte weg. Die Roundtripprüfung
  vergleicht Klassen, Namen, Hierarchie, explizite Array-Indizes und sämtliche
  wirksamen Metadatenproperties, statt unterschiedliche interne Maps als
  Formatfehler zu behandeln.

## Behobene Befunde während der Verifikation

- Acht Größenhandles einschließlich linker/oberer Kanten und zusammenfallender
  Handles kleiner Controls werden korrekt aufgelöst.
- Designerzeichen erreichen den Quelltexteditor nicht. Property-/Menübuttons
  sind im nichtmodalen Dispatcher angebunden; Dialoge sperren Hintergrundaktionen.
- Fenster-/Formwechsel aktualisieren die Designeridentität. Die ursprüngliche
  Befehlsidentität beim Weiterschalten eines Fensters bleibt erhalten.
- Positions-/Größenanzeige bleibt rechts sichtbar, auch wenn Propertytext lang ist.
- Umbenennen nutzt die Importkontexte der tatsächlich übersetzten Module.
  Synthetische Importprototypen ohne physische Quellposition werden nicht editiert.
  Echte Prototypen und Prozeduraufrufe werden semantisch erfasst; keine globale
  Bezeichnerersetzung beschädigt unabhängige Variablen/UDT-Felder.
- Ereigniserzeugung verwendet denselben includebewussten New-Sub-Pfad wie der
  Editor. Vorhandene Formularalias-/DEFtype-Signaturen und gleichnamige Events
  unterschiedlicher Formulare werden korrekt zugeordnet.
- Aktivierte Timer bleiben im Dokument erhalten, sind in der Vorschau aber
  ausdrücklich deaktiviert. Es existiert dort keine VM oder Event-Pump.

- Der workspaceweite Clippy-Lauf fand die bereits vorhandene Shell-Hilfsfunktion
  hinter dem Testmodul in `tb-runtime/src/host.rs`. Sie wurde unverändert vor
  das Testmodul verschoben; das beseitigt die Ordnungswarnung ohne Verhaltensänderung.

## Abschlussprüfungen

- `cargo test --workspace`: 567 bestanden, 0 fehlgeschlagen, 2 bestehende
  Ignore-Fälle (Golden-Output-Generator und externe VBDOS-Referenzsuite).
  Darin: 17 Designer-Integrationstests und der zusätzliche echte CLI-Compilerpfad.
- `cargo clippy --workspace --all-targets -- -D warnings`: bestanden.
- `cargo fmt --all -- --check`: bestanden.
- `git diff --check`: bestanden.
- `openspec validate --all --strict`: 23/23 gültig. Vorhandene INFO-Hinweise
  zur Länge von Requirement-Texten sind keine Validierungsfehler.

Keine angeforderte Prüfdimension wurde ausgelassen. Die Tests sind headless;
für diesen Change wurde keine interaktive GUI-/Emulatorsitzung benötigt.
Die gemeinsame Phase-5-Abnahme bleibt Aufgabe von Change 08. Der Change ist
vollständig umgesetzt und zur separaten Synchronisierung/Archivierung bereit.
