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

187 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.