# 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.