# sprachinventar Specification ## Purpose Das Sprachinventar ist das Messinstrument für die Leitplanke „Vollständigkeit ist das Soll": eine gepflegte Liste aller in der Original-Hilfe des Vorbilds dokumentierten Anweisungen, Funktionen und Metabefehle mit Abdeckungsstatus, gegen die sich der Implementierungsstand jederzeit prüfen lässt. ## Requirements ### Requirement: Vollständiges Inventar der Original-Hilfe `docs/inventar.md` SHALL jede in der Original-Hilfe des Vorbilds dokumentierte Anweisung, Funktion, Metabefehl, Operator-Schlüsselwort und Klausel als eigenen Eintrag führen. Darüber hinaus SHALL es das **Forms-Objektmodell** führen: je Klasse ihre Eigenschaften, Methoden und Ereignisse als eigene Einträge. Ein dokumentiertes Element MUST NOT fehlen; Vollständigkeit gegenüber der Quelle geht der Kürze vor. Jeder Eintrag SHALL Name, Art (Anweisung/Funktion/Metabefehl/Eigenschaft/ Methode/Ereignis), Themengruppe, Status, Fundstelle und Quelle tragen. Für Einträge des Objektmodells SHALL die Quelle die Forms-Referenz sein, weil die Themenliste der Original-Hilfe sie nicht führt. #### Scenario: Dokumentiertes Element ist erfasst - **WHEN** die Original-Hilfe die Anweisung `VIEW PRINT` dokumentiert - **THEN** enthält das Inventar einen Eintrag `VIEW PRINT` mit Art, Gruppe, Status und Fundstelle #### Scenario: Non-Feature ist erfasst, nicht weggelassen - **WHEN** `PEEK` als Non-Feature deklariert ist - **THEN** steht `PEEK` mit Status `Non-Feature` im Inventar und die Fundstelle verweist auf den Abschnitt „Abweichungen" der Sprachreferenz #### Scenario: Eigenschaft einer Steuerelementklasse ist erfasst - **WHEN** die Forms-Referenz für `TextBox` die Eigenschaft `SelStart` führt - **THEN** enthält das Inventar einen Eintrag für `TextBox.SelStart` mit Art `Eigenschaft`, Status und Quelle Forms-Referenz #### Scenario: Ereignis einer Klasse ist erfasst - **WHEN** die Forms-Referenz für `Form` das Ereignis `Resize` führt - **THEN** enthält das Inventar einen Eintrag für `Form_Resize` mit Art `Ereignis` ### Requirement: Festes Statusvokabular Der Status eines Eintrags SHALL genau einen von drei Werten tragen: `implementiert` (Frontend senkt ab und die Laufzeit führt aus), `offen` (dokumentiert, noch nicht verfügbar) oder `Non-Feature` (vom Projektinhaber abgelehnt und in der Sprachreferenz unter „Abweichungen" gelistet). Ein Eintrag mit Status `Non-Feature` MUST eine Fundstelle in der Sprachreferenz nennen. #### Scenario: Unzulässiger Status - **WHEN** ein Eintrag den Status `teilweise` trägt - **THEN** schlägt die Inventarprüfung mit Nennung des Eintrags fehl #### Scenario: Non-Feature ohne Fundstelle - **WHEN** ein Eintrag den Status `Non-Feature` trägt, aber keine Fundstelle nennt - **THEN** schlägt die Inventarprüfung mit Nennung des Eintrags fehl ### Requirement: Automatischer Abgleich Inventar gegen Implementierung Ein automatischer Test SHALL das Inventar gegen den tatsächlichen Implementierungsstand prüfen und bei jeder Divergenz fehlschlagen. Als `implementiert` markierte Elemente MUST im Frontend eine Signatur besitzen und MUST NOT auf einen „nicht verfügbar"-Marker absenken; als `offen` markierte Elemente MUST auf einen solchen Marker absenken oder ohne Signatur sein; als `Non-Feature` markierte Elemente MUST zur Compile-Zeit mit „Feature unavailable" abgewiesen werden. Der Test MUST das divergierende Element, seinen Inventarstatus und den vorgefundenen Zustand benennen. Klassentabellen oder deklarierte Signaturnamen allein MUST NOT als Laufzeitnachweis gelten. Für implementierte Elemente SHALL ein erreichbarer Frontend-/Absenkungspfad und ein ausführbares Laufzeitziel geprüft werden. Für deklarierte Ereignisse SHALL ein Test den Auslöser bis zum BASIC-Handler führen. #### Scenario: Inventar hinkt der Implementierung hinterher - **WHEN** `LOCATE` implementiert wurde, im Inventar aber noch `offen` steht - **THEN** schlägt der Abgleich fehl und nennt `LOCATE`, Status `offen` und den Befund „implementiert" #### Scenario: Inventar behauptet zu viel - **WHEN** ein Eintrag `implementiert` trägt, das Element aber weiterhin auf den „nicht verfügbar"-Marker absenkt - **THEN** schlägt der Abgleich fehl und nennt das Element #### Scenario: Abdeckungsstand ist abrufbar - **WHEN** der Abgleich läuft - **THEN** nennt er die Zahl der Einträge je Status als Abdeckungsstand #### Scenario: Deklariertes Ereignis ohne Auslöser - **WHEN** ein als implementiert geführtes Formularereignis bei seiner dokumentierten Hosteingabe keinen Handler ausführt - **THEN** schlägt der Abgleich mit Name, Status und fehlendem Auslösepfad fehl ### Requirement: Keine stillen Lücken bei dokumentierten Elementen Ein Element mit Status `offen` MUST bei Verwendung eine benannte Ablehnung erzeugen — entweder eine Compile-Diagnose oder den Laufzeitfehler für nicht verfügbare Funktionen —, die das Element namentlich nennt. Ein generischer Syntaxfehler oder „unbekannter Bezeichner" für ein dokumentiertes Element MUST NOT auftreten (Guiding Principle). #### Scenario: Offenes Element wird namentlich abgewiesen - **WHEN** ein Programm eine im Inventar als `offen` geführte Anweisung verwendet - **THEN** nennt die Ablehnung den Namen der Anweisung, nicht nur „Syntaxfehler"