7.6 KiB
Implementierungs- und Verifikationsnachweis
Change: laufzeit-eingabe-und-systemstatus, Stand 06.09.2026.
Grundlage: Arbeitsbaum auf 815825dde76eb8f4b48cb27d83f21732afe707c2;
Proposal, Design, vier Delta-Specs und alle sechs Tasks abgeglichen.
Ergebnis
| Dimension | Ergebnis |
|---|---|
| Vollständigkeit | 6/6 Tasks, 6/6 Requirements, 21/21 Szenarien abgeglichen |
| Korrektheit | Alle zugeordneten Regressionen und Workspace-Tests bestanden |
| Kohärenz | D1–D4 umgesetzt; keine zusätzlichen Dependencies |
| Offene Befunde | 0 CRITICAL, 0 WARNING, 0 SUGGESTION im Change |
F14–F17 und F19 sind umgesetzt. Die vier Hauptspecs wurden am 06.09.2026
synchronisiert und alle 15 Hauptspecs streng validiert. Der Change ist unter
openspec/changes/archive/2026-09-06-laufzeit-eingabe-und-systemstatus archiviert.
Umsetzung und Design
- D1:
Dateiverwendet einenBufReader<File>für den gemeinsamen Cursor.feld_lesen,zeile_lesen,zeichen_lesen, EOF und SEEK erhalten den Lesefortschritt. INPUT # liest einzelne Felder statt vollständiger Zeilen; fehlende Felder erzeugen Fehler 62. Dekodierte Strings werden in der VM nicht erneut von Anführungszeichen oder Rand-Leerraum befreit. - D2: INPUT$ zählt UTF-8-Codepoints. Beschädigte oder abgeschnittene UTF-8-Sequenzen führen zu Fehler 57; EOF vor einem geforderten Zeichen zu Fehler 62. Ein bereits angenommener Tastaturrest wird vor weiteren Tasten geliefert und nicht nochmals als Trap-/Forms-Ereignis eingereiht. Direkter Builtin-Dispatch und resumierbare VM-Eingabe verwenden dieselbe Aufteilung. Alle fünf CV-Funktionen prüfen exakte Breite und Bytezeichen. GET/PUT und UTF-32-Recorddarstellung bleiben eigenständige Binärpfade.
- D3:
fehler_am_pfadunterscheidet fehlenden Dateieintrag (53) von fehlendem Elternverzeichnis (76) bei OPEN, KILL, NAME und MKDIR. Vorhandene Berechtigungs-/Existenzfehler bleiben erhalten; ein Pfadbestandteil, der kein Verzeichnis ist, wird ebenfalls als Pfadfehler eingeordnet. - D4: TIMEZONEKNOWN ist als parameterlose INTEGER-Funktion durch Semantik,
HIR, Codegenerator, stabile neue Builtin-ID 156 und Dispatch geführt.
RtState::zeitpunktlöst Zeit und Status gemeinsam auf. Die Systemquelle bleibt nach Ausfällen aktiv, sodass spätere Erholung sichtbar wird. Tests können die Zonenquelle ersetzen, ohne die Rechnerzone zu verändern. Programmversatz, monotone Ereigniszeit und Betriebssystemuhr werden durch die Statusabfrage nicht verändert. CLI-Startwarnung und Inventar sind angepasst.
Szenarien und ausführbare Nachweise
Testnamen ohne Präfix stehen in crates/tb-vm/tests/vm.rs. runtime meint
crates/tb-runtime/src/builtins.rs, frontend die Semantik bzw. Inventartests.
Die Korpusprogramme liegen in tests/compat; der Harness führt jedes zweimal
gegen seine festgeschriebene Sollausgabe aus.
| Requirement / Szenario | Nachweis |
|---|---|
| Sequenzielle Datenübertragung: WRITE # und INPUT # sind gegenläufig | input_datei_bewahrt_felder_und_unterscheidet_leer_von_fehlend; eingabefortschritt.bas |
| Lesen über das Dateiende | Derselbe Test: leere Datei, fehlendes zweites Feld und EOF; input_datei_alle_lesearten_teilen_utf8_cursor_und_seek |
| Felder über zwei Aufrufe | input_datei_bewahrt_felder_und_unterscheidet_leer_von_fehlend: WRITE a/b, anschließende getrennte Reads |
| Zu wenige Felder | Derselbe Test: mit/ohne finales Zeilenende Fehler 62; explizit leere Felder bleiben lesbar |
| Record-Konvertierungen: MK und CV sind gegenläufig | alle_mk_cv_paare_verlangen_exakte_bytezeichenbreite: alle fünf Paare |
| Falsche Argumentlänge | Derselbe Test: jeweils Zielbreite minus ein Zeichen → Fehler 5 |
| Zu langes CVI-Argument | Derselbe Test: jeweils Zielbreite plus ein Zeichen → Fehler 5; zusätzlich Nicht-Bytezeichen |
| Dateisystem: Rückwärts-Schrägstrich auf Unix | datei_und_elternpfadfehler_sind_am_sprachzugang_unterscheidbar: OPEN über Backslash, anschließendes NAME/Lesen/Löschen |
| Verzeichnis durchlaufen | Derselbe Test: DIR$ mit Muster und Folgeaufruf; vorhandener Dateikorpus |
| Fehlender Pfad | Derselbe Test: MKDIR, NAME-Ziel, CHDIR, RMDIR, DIR$ → 76 |
| OPEN mit fehlendem Elternpfad | Derselbe Test: INPUT mit fehlender Datei → 53, fehlendem Elternpfad → 76; zusätzlich OUTPUT/APPEND/BINARY/RANDOM |
| Zonenermittlung: Zone nicht ermittelbar | runtime zonenquelle_ausfall_und_erholung_gelten_fuer_alle_zeitfunktionen; timezonefallback.bas |
| Rückfallebene ist erkennbar | timezoneknown_hat_integer_signatur_und_zeigt_aktuellen_status; timezoneknown.bas und timezonefallback.bas |
| Rückfall nach Programmstart | Derselbe VM-Test über STOP/Fortsetzung und runtime-Zonenquelle mit Ausfall und Erholung; bekannte UTC liefert -1 |
| Signaturen: Element ohne Laufzeitverhalten wird namentlich abgewiesen | Vorhandener frontend-Test dokumentierte_elemente_werden_namentlich_abgewiesen; Inventar hat derzeit 0 offene Elemente |
| Argumentprüfung ohne Laufzeitverhalten | frontend builtins_typen: MKL$() hat benannte Argumentanzahl-Diagnose |
| Signatur der Zonenzustandsabfrage | frontend builtins_typen: 0 Argumente, INTEGER; TIMEZONEKNOWN(1) benannt abgewiesen; runtime-Test prüft tatsächliches Value::Int |
| Tastatur: INKEY$ bei leerem Puffer | inkey_ohne_taste_ist_leer |
| Sondertaste als zwei Zeichen | inkey_liefert_zeichen_und_sondertaste |
| Sondertastenfolge in zwei Reads | input_s_teilt_sondertasten_und_bewahrt_rest_fuer_inkey; eingabefortschritt.bas; direkter runtime-Dispatch |
| Unicode aus Datei | input_datei_alle_lesearten_teilen_utf8_cursor_und_seek: ä/Emoji, INPUT und BINARY |
Zusätzliche Randfälle: CR/LF/CRLF, Leerzeilen, eingebettete Kommas,
verdoppelte Anführungszeichen und Zeilenumbrüche, Null-Länge, negative Länge,
ungültiges UTF-8, falscher Dateimodus, SEEK nach EOF und gemischte Lesearten.
unicode_puffergrenzen_und_binaere_records_bleiben_getrennt prüft UTF-8 an
8-KiB-Puffergrenzen sowie GET/PUT zwischen INPUT$-Aufrufen.
sondertastenrest_wird_nicht_erneut_getrappt prüft F1 unter KEY STOP/ON.
Die bestehenden Programmversatz- und Ereignistests bestehen weiterhin.
Abnahme
cargo test --workspace --quiet: 463 bestanden, 0 fehlgeschlagen, 1 ignoriert. Der ignorierte Golden-Generator wurde nicht ausgeführt.cargo clippy --workspace --all-targets --all-features -- -D warnings: bestanden.cargo fmt --all -- --check: bestanden.git diff --check: bestanden vor dem Staging. Die abschließende Prüfung des gestagten Changes mitgit diff --cached --check -- . ':(exclude)tests/compat/*.out'besteht ebenfalls. Die neuen.out-Dateien enthalten absichtlich signifikante PRINT-Leerzeichen am Zeilenende.openspec validate laufzeit-eingabe-und-systemstatus --strict: bestanden.- Bestehende
tests/compat/*.outunverändert; drei neue Programme mit vorab festgelegten Sollausgaben ergänzt. Die Inventar-Abdeckungszahl berücksichtigt die neue Erweiterung: 795 implementiert, 0 offen, 50 Non-Features, insgesamt 845 Einträge.
Die anfänglichen Testfehler (doppelte Quote-Auswertung, fehlende Korpus- Rückfalldirektive, Test-Namensauflösung, Inventar-Gesamtzahl) sind behoben; der abschließende Workspace-Lauf ist grün. Keine Tests oder vorhandenen Sollausgaben wurden zum Übergehen dieser Fehler abgeschwächt.
Geprüft wurde headless auf macOS. Es erfolgte kein neuer interaktiver
Fremdprogrammvergleich und keine Windows-/Linux-Ausführung. Die ergänzenden
Korpusfälle belegen den erklärten TerminalBasic-Vertrag, keine historische
Bytekompatibilität. Der verbleibende Change
spezifikationsabgleich-und-regressionsnachweise bleibt eigenständig.