Files
TerminalBasic/openspec/changes/archive/2026-09-06-phase-5-04-ausfuehrung-und-output/verification.md

9.8 KiB
Raw Blame History

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.11.5: VM-Poll, Frame-Fortsetzungen, Dialogmodell, Forms-Pump und untenstehender Wartepfad-Audit; sieben gezielte VM-Tests plus bestehende Ereignis-/Forms-Regressionen.
  • 2.12.5: execution.rs, App-Befehle und gemeinsame Projekt-/Reset-Funktionen; zwölf IDE-Ausführungstests, CLI-Startup-/TBC- und bestehende STOP-Exitcode-Tests.
  • 3.13.4: Input-Dispatcher, ScreenWidget, gemeinsamer TerminalGuard, Print-Dialog; IDE-, UI- und reale PTY-Nachweise.
  • 4.14.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 mit TB_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.