Files
TerminalBasic/openspec/changes/archive/2026-09-04-phase-3-runtime-bildschirm/proposal.md
Chili Palmer d0461bea34 OpenSpec: phase-3-runtime-bildschirm archiviert, Delta-Specs gesynct
Zwei neue Capabilities in den Hauptspecs:
- datei-eio: Dateiverwaltung, drei Zugriffsarten, UTF-32-Festtextfelder,
  Recordkonvertierung, Sperren, Dateisystem-Anweisungen
- sprachinventar: das Vollstaendigkeits-Inventar als pruefbares Artefakt

Fortgeschrieben: textbildschirm (Doppelzellen, Groessenunabhaengigkeit,
Bildschirmanweisungen), konsolen-basisbibliothek (Host-Neuschnitt, volle
String-/Format-/Datums-/Finanzbibliothek), kompat-testkorpus
(Snapshot-Vergleich, Nachweis der Groessenunabhaengigkeit),
sprach-frontend (Signaturpflicht, ON-ERROR-Scoping, DATA-Rohtext).

Bilanz: +32 Anforderungen, 6 geaendert, 1 ersetzt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 06:55:02 +02:00

10 KiB
Raw Blame History

Phase 3 (Kern) — Laufzeitbibliothek, Bildschirm und Datei-E/A

Why

Phase 2 hat eine lauffähige VM geliefert, aber nur eine dünne Bibliotheksscheibe: rund 50 dokumentierte Anweisungen und Funktionen sind im Frontend zwar typgeprüft, senken aber auf HStmtKind::Unsupported/ HExpr::Unsupported ab und enden zur Laufzeit in Fehler 73. Betroffen sind alle Bildschirmanweisungen (CLS, LOCATE, COLOR, VIEW PRINT, CSRLIN, POS, INKEY$), die komplette Datei-E/A, PRINT USING, die Datums-/Zeitfunktionen und die System-Anweisungen. Klassische Konsolenprogramme des Vorbilds laufen damit nicht.

Zusätzlich fehlt das Messinstrument: die Leitplanke „Vollständigkeit ist das Soll" fordert ein Inventar aller Anweisungen/Funktionen mit Abdeckungsstatus als Abnahmekriterium für Phase 6 — bislang existiert nur die Implementierungsseite (die Unsupported-Marker), nicht die Sollseite aus der Original-Hilfe.

Dieser Change löst den Plan-Meilenstein „klassische Konsolenprogramme laufen unverändert" ein. ISAM ist als eigener Change phase-3-isam ausgegliedert und schließt Phase 3 ab.

What Changes

  • Vollständigkeits-Inventar (docs/inventar.md): Tabelle aller Anweisungen, Funktionen und Metabefehle des Vorbilds aus der Original-Hilfe mit Status implementiert / offen / Non-Feature und Fundstelle. Ein automatischer Test gleicht die Tabelle gegen builtin_fn/builtin_stmt und die Unsupported-Marker im Code ab; Divergenz schlägt fehl. Damit misst sich die Abdeckung selbst.
  • Bildschirmpuffer wandert nach tb-runtime (Entscheidung 2026-09-03, Explore-Session): Cell/TextScreen mit der kompletten Bildschirmsemantik (Cursor, Farbattribute, Scrollen, VIEW PRINT, resize) ziehen ratatui-frei von tb-ui::screen nach tb-runtime::screen. In tb-ui bleiben nur die Ratatui-Anbindung (basic_color, impl Widget) und künftig der Terminal-Adapter. Begründung: PRINT, LOCATE, CLS und SCREEN() sind Elemente der Laufzeitbibliothek und müssen den Puffer erreichen; zugleich bleiben tb-vm und tb-runtime damit frei von einer Terminal-Abhängigkeit, sodass jedes Bildschirmverhalten ohne Terminal prüfbar ist. Die Forms-Engine bleibt laut PLAN.md in tb-ui::forms (Entscheidung 2026-09-03) und zeichnet von dort in denselben Puffer — tb-ui hängt künftig an tb-runtime, nicht umgekehrt.
  • BREAKING: Host-Trait neu geschnitten: statt write(&str) / read_line() künftig Präsentation eines Zellenpuffers und Ereignisabfrage. write/read_line können den Bildschirmzustand nicht transportieren (LOCATE, COLOR, CSRLIN, SCREEN(r,c) liest vom Bildschirm zurück). Betrifft ConsoleHost, CaptureHost und tbc run.
  • BREAKING: Korpusvergleich auf Bildschirm-Snapshot (getrimmt): .out-Dateien halten künftig das Textbild des Puffers bis zur letzten belegten Zelle statt eines Byte-Streams; eine Attributebene kommt nur hinzu, wenn das Programm COLOR verwendet. Die acht bestehenden Golden Files werden neu erzeugt. Ein Byte-Stream kann LOCATE/COLOR nicht abbilden.
  • Bildschirmanweisungen und -funktionen: CLS, COLOR, LOCATE, WIDTH, SCREEN (Anweisung und Funktion), VIEW PRINT, CSRLIN, POS, INKEY$, INPUT$, TAB, SPC, KEY (inkl. Klärung des Umfangs der Funktionstasten-Makros KEY LIST/ON/OFF).
  • 80×25 ist nirgends eine feste Grenze (Vorgabe des Projektinhabers 2026-09-03, Priorität für das ganze Programm): 80×25 steht stets als Synonym für „voller Bildschirm". Kein beobachtbares Verhalten darf eine feste Spalten- oder Zeilenzahl voraussetzen — CLS, der voreingestellte Scrollbereich, Umbruch- und Scrollgrenzen sowie die Bereichsprüfungen von LOCATE und SCREEN() folgen den aktuellen Abmessungen. Größenänderungen während der Ausführung werden als Ereignis zugestellt und angepasst (Inhalt oben links erhalten, Cursor und VIEW PRINT-Bereich geklemmt). Das Mindestmaß 80×25 bleibt ausschließlich eine untere Schranke der Darstellung.
  • Breite Unicode-Zeichen belegen zwei Zellen (Entscheidung 2026-09-02): Zellenmodell, Cursorfortschritt, POS/LOCATE und Umbruch am rechten Rand berücksichtigen die Darstellungsbreite (unicode-width). Ersetzt die bisherige Regel „1 Zeichen = 1 Zelle".
  • Vollständige String- und Zahlenbibliothek: die restlichen dokumentierten Stringfunktionen sowie PRINT USING und FORMAT$ vollständig, inklusive Klärung des %-Präfixes bei Feldüberlauf.
  • Datums- und Zeitfunktionen: NOW, DATESERIAL, TIMESERIAL, DATEVALUE, TIMEVALUE, DAY, MONTH, YEAR, WEEKDAY, HOUR, MINUTE, SECOND sowie DATE$/TIME$ als Anweisungsform.
  • Finanzmathematik (Befund aus Aufgabe 1.1, 2026-09-03 — im ursprünglichen Umfang übersehen): FV#, PV#, Pmt#, IPmt#, PPmt#, NPer#, Rate#, NPV#, IRR#, MIRR#, SLN#, SYD#, DDB#.
  • Record-Konvertierungsfunktionen (ebenfalls Befund 1.1): MKI$/MKL$/MKS$/MKD$/MKC$ und CVI/CVL/CVS/CVD/CVC sowie die MBF-Varianten MKSMBF$/MKDMBF$/CVSMBF/CVDMBF — sie gehören zum FIELD-basierten wahlfreien Zugriff.
  • Weitere Befunde aus 1.1: CURDIR$, DIR$, CHDRIVE, SHELL als Funktion, LPOS, STACK (Anweisung und Funktion), SYSTEM, ERDEV/ERDEV$, SetFormatCC.
  • Signaturen für alle Inventarelemente: Die Semantik führt für jedes im Inventar geführte Element eine Signatur, auch wenn das Laufzeitverhalten noch aussteht — sonst enden dokumentierte Elemente in „unbekannter Bezeichner" statt in einer namentlichen Ablehnung.
  • Mathematik vervollständigen: kompatibler RND/RANDOMIZE-PRNG (gleiche Zahlenfolge wie das Vorbild bei gleichem Startwert), Rundungsverhalten, Integer-Überlauf → Fehler 6.
  • Datei-E/A: OPEN in beiden Syntaxen (sequenziell, random, binär), CLOSE, RESET, PRINT #, WRITE #, INPUT #, LINE INPUT #, GET, PUT, FIELD, LSET, RSET, SEEK (Anweisung und Funktion), EOF, LOF, LOC, FREEFILE, FILEATTR, LOCK/ UNLOCK, NAME … AS, LPRINT. Feste Strings in Records als UTF-32 (Entscheidung 2026-09-02, 4 Bytes/Zeichen, feste Recordlänge).
  • System-Anweisungen: FILES, KILL, CHDIR, MKDIR, RMDIR, SHELL, ENVIRON/ENVIRON$, CLEAR, FRE, TRON/TROFF, plattformübergreifende Pfadsemantik.
  • Drei Altlasten aus Phase 2:
    • ON ERROR GOTO-Scoping: ein Handler-Label auf Modulebene ist auch aus Prozeduren heraus ansprechbar; heute wird nicht-lokales ON ERROR in einer Prozedur fälschlich wie ON LOCAL ERROR behandelt (sema.rs, lower_stmt/OnError).
    • DATA-Rohtext: unquotierte DATA-Elemente verlieren die Groß-/ Kleinschreibung, weil der Lexer Bezeichner normalisiert.
    • TODO verify-Zellen der Konvertierungsmatrix in docs/tbvm-design.md gegen die Original-Hilfe auflösen (CURRENCY-Promotion mit Gleitkomma, ^-Ergebnistyp, Exponentialform-Schwellen, CURRENCY-Ausgabeformat).

Non-Goals: ISAM (eigener Change phase-3-isam, schließt Phase 3 ab); Forms-Engine, Ereignisschleife und Ereignissteuerung (TIMER/KEY(n) ON| OFF|STOP, ON SIGNAL/SIGNAL, SETUEVENT, MSGBOX, INPUTBOX$ — Phase 4); IDE und Debugger (Phase 5); tbc build --exe (Phase 6). Die Forms-Engine bleibt laut PLAN.md in tb-ui::forms (Entscheidung 2026-09-03); dieser Change schafft ihr mit dem Puffer in tb-runtime nur die Zeichenfläche.

Capabilities

New Capabilities

  • datei-eio: Dateiverwaltung und Datenübertragung — OPEN/CLOSE, die drei Zugriffsarten (sequenziell, random, binär), Record-Layout mit UTF-32-Festtextfeldern, FIELD/LSET/RSET, Positions- und Statusfunktionen (EOF/LOF/LOC/SEEK/FREEFILE/FILEATTR), Sperren, Dateisystem-Anweisungen und plattformübergreifende Pfadsemantik.
  • sprachinventar: das Vollständigkeits-Inventar als prüfbares Artefakt — Aufbau der Tabelle, Statusvokabular, Pflicht zur Vollständigkeit gegenüber der Original-Hilfe und der automatische Abgleich gegen den Code.

Modified Capabilities

  • textbildschirm: Der Zellenpuffer SHALL in tb-runtime liegen und ratatui-frei sein; das Unicode-Zellenmodell wechselt von „1 Zeichen = 1 Zelle" auf Darstellungsbreite (breite Zeichen belegen zwei Zellen); neue Anforderung für die Bildschirmanweisungen des Dialekts auf dem Puffer.
  • konsolen-basisbibliothek: Der Host-Trait wechselt vom Stream- auf ein Bildschirmmodell (Präsentation + Ereignisabfrage); die Funktionsliste wird von der Korpusscheibe auf die vollständige String-, Zahlen-, Formatierungs- (PRINT USING) und Datums-/ Zeitbibliothek erweitert; RND erhält eine Kompatibilitätsanforderung.
  • kompat-testkorpus: Der Laufzeitvergleich wechselt vom Byte-Stream auf einen getrimmten Bildschirm-Snapshot; neue Abdeckungsanforderung für Bildschirm-, Formatierungs- und Datei-E/A-Semantik.
  • sprach-frontend: ON ERROR GOTO auf Modulebene SHALL aus Prozeduren heraus ansprechbar sein (bisher fälschlich lokal); unquotierte DATA-Elemente SHALL ihren Rohtext behalten.

Impact

  • crates/tb-ui: screen.rs verliert Puffer und Semantik an tb-runtime; zurück bleiben basic_color und impl Widget als Adapter auf den Runtime-Puffer. Neue Abhängigkeit tb-runtime (bisher waren beide Blätter im Abhängigkeitsgraphen); forms.rs bleibt als Platzhalter für Phase 4 unberührt.
  • crates/tb-runtime: neues screen-Modul; host.rs neu geschnitten (BREAKING); strings, format, math, datetime, fileio, builtins von Stub/Scheibe auf Vollimplementierung; neue Abhängigkeit unicode-width.
  • crates/tb-frontend: rund 50 Unsupported-Marker weichen echter Absenkung; rund 30 bislang signaturlose Elemente (Finanzmathematik, MK…$/CV…, CURDIR$, DIR$, CHDRIVE, LPOS, STACK, SYSTEM, ERDEV/ERDEV$, SetFormatCC) erhalten Signaturen; sema.rs (ON ERROR-Scoping), lexer.rs (DATA-Rohtext).
  • crates/tb-vm: neue Builtin-Indizes; Instr::Unsupported bleibt für die verbleibenden Phase-4-Marker bestehen.
  • crates/tb-cli: tbc run auf den neuen Host; Harness auf Snapshot-Vergleich (BREAKING für die acht bestehenden .out).
  • tests/compat: acht Golden Files neu erzeugt, neue Korpusdateien für Bildschirm, PRINT USING, Datei-E/A, Datum/Zeit, breite Zeichen.
  • docs/: neu docs/inventar.md und docs/bibliothek.md; fortgeschrieben docs/sprachreferenz.md (Doppelzellen, KEY n, PRINT USING-Überlauf) und docs/tbvm-design.md (Konvertierungsmatrix). PLAN.md-Haken folgen bei Abschluss.