9.8 KiB
Verifizierung: Phase 5 / 04 – Ausführung und Output
Stand: 2026-09-06. Geprüft gegen proposal.md, design.md, alle 16 Aufgaben und alle sechs Requirements mit neun Szenarien in specs/ide-ausfuehrung/spec.md.
Ergebnis
Vollständig umgesetzt. Keine offenen Befunde in Vollständigkeit, Korrektheit
oder Kohärenz. Am 2026-09-06 wurde die Hauptspezifikation ide-ausfuehrung
synchronisiert, mit 19 Hauptspezifikationen erfolgreich validiert und der
Change unter archive/2026-09-06-phase-5-04-ausfuehrung-und-output archiviert.
Die VM läuft auf dem IDE-Thread in begrenzten Intervallen. Yield und Waiting sind von RunEvent und Debugger-Ereignissen getrennt. Der CLI-Wrapper treibt dieselben Operationen bis zum nächsten RunEvent. Bestehende Capture-/Forms- und Fehlerhandler-Regressionen bleiben grün. Es gibt keine neuen Abhängigkeiten.
Szenarien und Nachweise
| Spec-Szenario | Umsetzung | Ausgeführter Nachweis |
|---|---|---|
| Startauswahl in IDE und CLI | ProjectSources::compile, nach Startdatei geordnete SourceUnits, explizites BAS ohne Startformular, FRM-Auswahl im TBC |
IDE startup_selection_matches_shared_cli_pipeline_and_legacy_mak; CLI explicit_startup_order_and_form_selection_survive_tbc: Reihenfolge B/A, ausgewähltes zweites FRM, Legacy-Standard, COMMAND$, TBC-Rundlauf |
| Änderung während einer Pause | Sitzung bindet Bytecode und vollständige Quellrevision; Entscheidung Neustart/ausdrücklich altes Kompilat, sichtbare Kennzeichnung | IDE changed_paused_source_requires_explicit_old_revision_or_restart, comment_only_source_change_also_requires_revision_choice; ungültiger neuer Stand startet keine VM |
| Abbruch während INPUT | Frame besitzt Teiltext, Restlänge und Stack-Argumente; Pause nennt Quelldatei/Zeile | IDE f5_input_pause_copy_and_single_delivery_keep_the_same_vm; VM partial_console_operations_keep_prompt_arguments_and_assignment: INPUT, LINE INPUT, INPUT$, RANDOMIZE, Prompt und Zuweisung genau einmal |
| Enge Schleife und Formular | Feste Instruktionsbudgets, fortsetzbares SHOW und Forms-Pump, Pause/F5/F4 | VM finite_slices_preserve_events_without_clock_queries, modal_and_modeless_forms_resume_handlers_across_tiny_budgets; IDE explicit_end_and_system_end_visible_forms_but_natural_end_keeps_them_live, einschließlich Ctrl+Break unterhalb der Terminal-Mindestgröße |
| Wiederholter Neustart | new_execution als gemeinsamer Reset; altes VM-/Runtime-Objekt wird verworfen; separates Ausführungsziel |
IDE restart_drops_files_data_traps_and_queued_actions, restart_command_run_targets_and_missing_target_preserve_documents, named_run_of_current_target_uses_edited_sources: offene Datei, DATA, Timer-Trap, Variablen, COMMAND$, ausstehende Shell/Eingaben, RUN-Startzeile, relative/fehlende Ziele und erhaltene Dokumente |
| Kleines Ausgabefenster | ScreenWidget als abgeschnittene Ansicht des einzigen Programmpuffers; physische Mindestgröße beim Terminalbesitzer | IDE output_viewports_resize_and_end_preserve_buffer_and_basic_colors: 30×8-Fenster, F4, BASIC-Farben, 120×40-Resize, erhaltene Endausgabe; VM pending_dialog_keeps_physical_resize_and_modeless_handler_finishes_after_hide |
| Copy und Programmeingabe | App-Dispatcher entscheidet vor Runtime-Zustellung; lokale Mauskoordinaten im Output-Viewport | IDE f5_input_pause_copy_and_single_delivery_keep_the_same_vm, bestehender mouse_focus_is_modal_and_program_abort_is_not_editor_copy: Ctrl+C im Editor kopiert, im Output pausiert es; Zeichen kommen einmal an |
| Shell kehrt zurück | Gemeinsamer Host-Shell-Einstieg und gemeinsamer TerminalGuard; IDE plant Übergabe außerhalb des VM-Polls; Kind wird abgewartet bzw. beendet | IDE shell_request_is_resumed_once_and_error_is_basic_error; UI terminal_cleanup_on_normal_error_and_partial_initialization: Exit 0/7, kontrollierter Abbruch ohne regulären Exit-Code mit unverändertem Rückgabewert 0, Modusrestaurierung; echter PTY-Smoke für BASIC-SHELL, Ctrl+C und File→Shell mit Rückkehr, Continue und identischen Terminalattributen |
| Druckziel nicht schreibbar | Print nutzt geschütztes Project::save_text und atomare Ausgabe; Auswahl/Gesamttext, Vorgabe LPT1.TXT |
IDE print_uses_utf8_protected_output_and_does_not_mutate_source: UTF-8, Auswahl/Gesamttext, explizites Überschreiben, geschütztes Quellziel und nicht beschreibbarer Pfad unter einer regulären Datei; Quelldatei und bestehender Zielbestand bleiben unverändert |
Zusätzliche Nachweise: sleep_deadline_survives_pause_and_does_not_pop_argument_twice,
dialogs_keep_partial_text_focus_and_caller_arguments und
common_dialog_external_call_keeps_byref_arguments_until_completion prüfen
Deadline, MSGBOX/INPUTBOX samt Fokus und Common-Dialog-Aufrufe mit ByRef-Argumenten.
ide_and_cli_run_wrapper_match_input_time_and_forms_script vergleicht einen
identischen Forms-Timer-/SLEEP-/Eingabe-/COMMAND$-Ablauf und die fertige Ausgabe.
Aufgabenabdeckung
- 1.1–1.5: VM-Poll, Frame-Fortsetzungen, Dialogmodell, Forms-Pump und untenstehender Wartepfad-Audit; sieben gezielte VM-Tests plus bestehende Ereignis-/Forms-Regressionen.
- 2.1–2.5:
execution.rs, App-Befehle und gemeinsame Projekt-/Reset-Funktionen; zwölf IDE-Ausführungstests, CLI-Startup-/TBC- und bestehende STOP-Exitcode-Tests. - 3.1–3.4: Input-Dispatcher, ScreenWidget, gemeinsamer TerminalGuard, Print-Dialog; IDE-, UI- und reale PTY-Nachweise.
- 4.1–4.2: gemeinsamer Skriptvergleich, vollständige Workspace-Regression, Bedienungsdokumentation, dieser Report und Format-/Clippy-Prüfung.
Audit aller Wartepfade
| Pfad | Verhalten im IDE-Poll / Grenze |
|---|---|
Vm::konsoleneingabe → INPUT/LINE INPUT |
Teiltext im Frame; höchstens 64 gepufferte Tasten je Leseraufruf; danach Fortschritt oder Waiting, kein Host-Warten. Referenzen bleiben bis zur Zuweisung auf dem Stack. |
CallBuiltin(INPUT_S, 1) |
Derselbe Leser mit erhaltener Restlänge und Tastencode-Rest; Datei-Variante mit zwei Argumenten bleibt synchrones Datei-I/O. |
CallBuiltin(RANDOMIZE, 0) |
Derselbe Leser; Seed-Prompt einmal, Saatsetzung erst nach vollständiger Eingabe. Direkter Runtime-Fallback bi_randomize/read_line wird von der VM nicht verwendet. |
Instr::Sleep |
Absolute Host-Deadline im Frame; Waiting nennt auch frühere Trap-/Forms-Fristen. Ereignishandler beenden SLEEP wie bisher. Der direkte Runtime-Fallback bi_sleep wird vom Codegenerator nicht als Wartepfad verwendet. |
forms_dialog → MSGBOX/INPUTBOX sowie ABOUT/FILEOPEN/FILESAVE/FINDTEXT/CHANGETEXT |
Dialog::poll bewahrt Modell, Fokus, Eingabetext und Hintergrund; ein Ereignis pro Aufruf, kein blockierendes next_event. Common-Dialog-Argumente verbleiben bis Abschluss auf dem Stack. Resize erreicht auch den aufbewahrten Hintergrund. |
Modales SHOW / waiting_form |
Waiting statt warten; Handler und wartender Aufrufer bleiben getrennte Frames. |
poll_visible_forms |
Handler laufen auch über Budgetgrenzen und nach Hide vollständig zu Ende; EOF verarbeitet zuvor angenommene Ereignisse. |
Vm::warten, run, run_visible_forms |
Blockierende Komfort-Wrapper für CLI/Capture; ausschließlich diese Wrapper rufen den Host-Wartepfad auf. Der explizite alte run_visible_forms-Einstieg bleibt für bestehende Einbetter erhalten; IDE/CLI unterscheiden natürliches Ende von END/SYSTEM. |
Dialog::run, msgbox_dialog, inputbox_dialog |
Synchrone UI-Komfort-Wrapper um denselben Dialog-Poll. Die VM verwendet die fortsetzbaren Konstruktoren und Dialog::poll. |
RtState::naechste_taste(true), read_line, direkte bi_input_s/bi_sleep |
Kompatibilitäts-APIs für direkte Runtime-Nutzer; kein erreichbarer IDE-VM-Wartepfad. INKEY$ bleibt nicht blockierend. |
Host::shell |
IDE: Anfrage/Ergebnis-Fortsetzung. main gibt das Terminal an den Vordergrundprozess ab; Erfolg, Fehler und Abbruch stellen es wieder her. CLI/sonstige synchrone Hosts dürfen den Kindprozess in diesem ausdrücklich synchronen Host-Einstieg abwarten. |
TerminalHost::warten, CLI PipeHost::warten/stdin |
Terminal-/CLI-Ereignisschleifen, außerhalb des IDE-Hosts. IdeHost::warten würde im Test sofort fehlschlagen. |
| OPEN/CLOSE, INPUT#/LINE INPUT#/INPUT$(…, Datei), GET/PUT, Verzeichnis-/Dateioperationen, ISAM, Projekt-/Include-I/O, Compiler, Print und Save | Synchrone Betriebssystem-/Rechenoperationen, keine auf Benutzertasten wartenden Schleifen. Ein laufender Systemaufruf ist nicht unterbrechbar. Die Grenze ist in design.md vorgesehen und in der Bedienungsdokumentation beschrieben. |
Ausgeführte Prüfungen
cargo test --workspace: 549 bestanden, 0 fehlgeschlagen, 2 absichtlich ignoriert, 30 Testgruppen einschließlich Doc-Tests. Ignoriert bleiben der Golden-Ausgabe-Generator und der externe VBDOS-Formularlauf mitTB_VBDOS_REPO.- Nach letzter Korrektur der Sitzungsbereinigung:
cargo test -p tb-ide --test execution: 12 bestanden. cargo clippy -p tb-ide -p tb-vm -p tb-ui -p tb-cli --all-targets -- -D warnings: bestanden.cargo fmt --all -- --check,git diff --check: bestanden.cargo build -p tb-ide;python3 tests/support/ide-execution-pty.py: drei PTY-Szenarien bestanden; inklusive Prüfung der Terminalattribute nach IDE-Ende.openspec validate --all --strict: 23 bestanden, keine Fehler.openspec instructions apply --change phase-5-04-ausfuehrung-und-output --json: 16/16,all_done.
Die während der Verifizierung gefundenen Differenzen wurden behoben und mit Regressionen abgesichert: Pipe-Ausgabe bei fehlgeschlagener Terminalinitialisierung, Forms-Ende/EOF und Budgetfortsetzung nach Hide, Dialog-Resize, identische RUN-Ziele mit anderer Schreibweise, Kommentaränderungen bei pausiertem Kompilat sowie veraltete Shell-Anfragen beim Reset, sofortige Eingabeumschaltung nach Ctrl+C und der unveränderte SHELLFN-Vertrag bei Signalende. Es verbleiben keine Befunde innerhalb des Change-Vertrags. Native EXE-/Library-Erzeugung bleibt gemäß PLAN.md in Phase 6.