summaryrefslogtreecommitdiff
path: root/app/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'app/README.md')
-rw-r--r--app/README.md1012
1 files changed, 532 insertions, 480 deletions
diff --git a/app/README.md b/app/README.md
index 522018c..fab1593 100644
--- a/app/README.md
+++ b/app/README.md
@@ -1,244 +1,265 @@
-# Altersvorsorge-Vergleich — Web-App
+# Altersvorsorge-Vergleich — Webanwendung
-Progressive Web-App zum Excel-Modell im übergeordneten Ordner. Derselbe Rechenkern, dieselben
-Ergebnisse, aber bedienbar von Menschen, die keine Tabellenkalkulation aufmachen wollen.
+Progressive Webanwendung (PWA) zum Vergleich dreier Gestaltungsvarianten der Altersvorsorge.
+Es handelt sich um das eigentliche Erzeugnis dieses Bestandes; hinsichtlich einer allgemeinen
+Einführung wird auf das [Wurzel-README](../README.md) verwiesen. Der Rechenkern ist aus einer
+zwischenzeitlich entfallenen Excel-Arbeitsmappe übernommen worden, welche ausschließlich über
+die Versionsgeschichte zugänglich ist; die Ergebnisse sind dieselben, die Bedienung ist jedoch
+auch denjenigen Personen eröffnet, welche eine Tabellenkalkulation nicht zu öffnen beabsichtigen.
-| Datei | Rolle |
+| Datei | Zweckbestimmung |
|---|---|
-| `index.html` | **Die ganze App.** Rechenkern, Oberfläche, Diagramme — eine Datei, keine externen Abhängigkeiten außer den Wörterbüchern. Läuft per Doppelklick. |
+| `index.html` | **Die vollständige Anwendung.** Rechenkern, Bedienoberfläche und Diagramme in einer einzigen Datei, ohne externe Abhängigkeiten mit Ausnahme der Wörterbücher. Der Aufruf erfolgt mittels Doppelklicks. |
| `i18n.de.js` | Wörterbuch Deutsch. Hauptsprache und Rückfallebene. **Vollständig.** |
| `i18n.en.js` `i18n.nl.js` `i18n.fr.js` `i18n.la.js` `i18n.ja.js` | Englisch, Niederländisch, Französisch, Latein, Japanisch. **Vollständig** (459 Schlüssel). |
-| `i18n.nds.js` `i18n.bar.js` `i18n.eu.js` `i18n.eo.js` `i18n.tr.js` `i18n.uk.js` | Niederdeutsch, Bairisch, Baskisch, Esperanto, Türkisch, Ukrainisch. **Teilweise** (315 Schlüssel, siehe 3b). |
-| `i18n.got.js` `i18n.goh.js` `i18n.gmh.js` `i18n.grc.js` `i18n.sa.js` | Gotisch, Althochdeutsch, Mittelhochdeutsch, Altgriechisch, Sanskrit. **Teilweise**. |
-| `i18n.ine-x-proto.js` | Urindogermanisch, LIV²/Rix-Notation mit Laryngalen und Asterisk. Kein ISO-639-3-Code möglich (639-3 vergibt keine Codes an Rekonstruate), daher BCP-47-Privatuntertag `ine-x-proto`. **Vollständig**. |
-| `i18n.jbo.js` `i18n.tok.js` | Lojban, Toki Pona. Toki Pona speichert sitelen Lasina (ASCII); das Stilblatt setzt für `lang="tok"` ligaturfähige sitelen-pona-Zeichensätze, die die ASCII-Wörter zu Logographen binden — ohne installierten Zeichensatz bleibt lesbares Latein statt PUA-Kästchen. **Vollständig**. |
-| `i18n.akk-x-ob.js` | Altbabylonisch in Keilschrift (U+12000…). Erzeugt aus `i18n.akk-x-ob.translit.js` durch `node akk-keilschrift.js`; die Umschrift ist die Quelle, die Keilschrift das Erzeugnis. Codepunkte werden zur Bauzeit über die Unicode-Namenstabelle aufgelöst statt von Hand gesetzt. **Vollständig**. |
-| `manifest.json` | Macht die App installierbar (Name, Farben, Symbole). |
-| `service-worker.js` | Offline-Cache, `stale-while-revalidate`. |
-| `icon-*.png` | App-Symbole, 192 / 512 / 512-maskable. |
+| `i18n.nds.js` `i18n.bar.js` `i18n.eu.js` `i18n.eo.js` `i18n.tr.js` `i18n.uk.js` | Niederdeutsch, Bairisch, Baskisch, Esperanto, Türkisch, Ukrainisch. **Vollständig** (siehe § 3b). |
+| `i18n.got.js` `i18n.goh.js` `i18n.gmh.js` `i18n.grc.js` `i18n.sa.js` | Gotisch, Althochdeutsch, Mittelhochdeutsch, Altgriechisch, Sanskrit. **Vollständig.** |
+| `i18n.ine-x-proto.js` | Urindogermanisch in LIV²/Rix-Notation nebst Laryngalen und Asterisk. Ein Code nach ISO 639-3 ist nicht zu erlangen, da für Rekonstruate keine Codes vergeben werden; es wird daher der Privatuntertag `ine-x-proto` nach BCP 47 geführt. **Vollständig.** |
+| `i18n.jbo.js` `i18n.tok.js` | Lojban, Toki Pona. Toki Pona wird in sitelen Lasina (ASCII) vorgehalten; das Stilblatt setzt für `lang="tok"` ligaturfähige sitelen-pona-Zeichensätze, welche die ASCII-Wörter zu Logographen binden. Ist ein solcher Zeichensatz nicht installiert, verbleibt lesbares Latein anstelle leerer Kästchen. **Vollständig.** |
+| `i18n.akk-x-ob.js` | Altbabylonisch in Keilschrift (U+12000 ff.). Erzeugt aus `i18n.akk-x-ob.translit.js` mittels `node akk-keilschrift.js`; die Umschrift ist die Quelle, die Keilschrift das Erzeugnis. Die Codepunkte werden zur Bauzeit über die Unicode-Namenstabelle aufgelöst und nicht von Hand gesetzt. **Vollständig.** |
+| `manifest.json` | Bewirkt die Installierbarkeit (Bezeichnung, Farben, Symbole). |
+| `service-worker.js` | Offline-Zwischenspeicher, Verfahren `stale-while-revalidate`. |
+| `icon-*.png` | Symbole der Anwendung, 192 / 512 / 512-maskable. |
---
-## 1. Weitergeben — drei Wege
+## § 1 Weitergabe — drei Wege
-**a) Nur die Dateien.** `index.html` samt allen dreiundzwanzig `i18n.*.js` verschicken — sie gehören
-zusammen und müssen im selben Ordner liegen. Doppelklick genügt,
-alles rechnet, Eingaben werden im Browser gespeichert. Was fehlt, ist nur die PWA-Hülle —
-kein Symbol auf dem Startbildschirm, kein Offline-Cache. Beides braucht es hier auch nicht,
-die Datei liegt ja schon auf dem Gerät. Die App sagt das dem Nutzer auch selbst.
+**a) Ausschließlich die Dateien.** Es sind `index.html` nebst sämtlichen dreiundzwanzig
+`i18n.*.js` zu übersenden; sie gehören zusammen und haben in demselben Ordner zu liegen. Ein
+Doppelklick genügt, sämtliche Berechnungen werden durchgeführt, und die Eingaben werden im
+Browser vorgehalten. Es fehlt lediglich die PWA-Hülle — mithin das Symbol auf dem
+Startbildschirm sowie der Offline-Zwischenspeicher. Beides ist hier entbehrlich, da die Datei
+bereits auf dem Gerät vorliegt. Die Anwendung weist hierauf von sich aus hin.
-**b) Der ganze Ordner auf einem Webspace.** Irgendein HTTPS-Hosting genügt (GitHub Pages,
-Netlify, ein Unterverzeichnis auf der eigenen Domain). Dann ist sie installierbar und
-offlinefähig. Es gibt kein Backend, keine Datenbank, keine Build-Kette.
+**b) Der vollständige Ordner auf einem Webspeicherplatz.** Ein beliebiges HTTPS-Hosting genügt
+(GitHub Pages, Netlify, ein Unterverzeichnis der eigenen Domäne). Sodann ist die Anwendung
+installierbar und offlinefähig. Ein Hintergrundsystem, eine Datenbank sowie eine Baukette
+bestehen nicht.
```bash
-# lokal ausprobieren, mit Service Worker:
+# örtliche Erprobung einschließlich Dienstarbeiter:
cd app && python3 -m http.server 8000 # -> http://localhost:8000
```
-Service Worker laufen auch auf `http://localhost` — als „secure context“ ist localhost
-ausdrücklich ausgenommen.
+Dienstarbeiter (*service worker*) sind auch über `http://localhost` betriebsfähig; localhost ist
+als sicherer Kontext ausdrücklich ausgenommen.
-**c) Als Link.** Der Knopf *„Link mit meinen Zahlen kopieren“* kodiert den kompletten
-Eingabestand base64url in den Fragment-Bezeichner. Fragmente werden vom Browser **nicht** an
-den Server geschickt (RFC 3986 § 3.5) — der Link enthält also persönliche Zahlen, überträgt
-sie aber an niemanden außer den Empfänger.
+**c) Als Verweis.** Die Schaltfläche *„Link mit meinen Zahlen kopieren"* kodiert den
+vollständigen Eingabestand base64url in den Fragmentbezeichner. Fragmente werden vom Browser
+**nicht** an den Server übermittelt (RFC 3986 § 3.5); der Verweis enthält mithin persönliche
+Zahlen, überträgt diese jedoch an niemanden außer den Empfänger.
-## 2. Wo die Daten liegen
+## § 2 Verbleib der Daten
-Ausschließlich in `localStorage` unter dem Schlüssel `altersvorsorge.v1`, also im Browser des
-Nutzers. Kein Server, keine Analytik, keine Schriftarten von fremden Domains, keine externen
-Skripte. Die einzigen Netzwerkzugriffe der App sind die, die der Service Worker macht, um sich
-selbst zu aktualisieren.
+Ausschließlich in `localStorage` unter dem Schlüssel `altersvorsorge.v1`, mithin im Browser der
+nutzenden Person. Ein Server, eine Auswertung, Schriftarten von fremden Domänen sowie externe
+Skripte bestehen nicht. Die einzigen Netzwerkzugriffe der Anwendung sind diejenigen, welche der
+Dienstarbeiter zum Zwecke seiner eigenen Aktualisierung vornimmt.
-## 3. Aufbau der Datei
+## § 3 Aufbau der Datei
`index.html` ist in nummerierte Teile gegliedert:
| Teil | Inhalt |
|---|---|
| 0 | **Sprachen** — `t()`, Sprachwahl, Rückfall auf Deutsch |
-| 1 | **Rechenkern** — Portierung von `build_bav.py`. Reine Funktionen, kein DOM |
-| 2 | Felddefinitionen: 80 Eingaben mit Bereich, Einheit, Wörterbuchschlüssel |
-| 3 | Zustand, `localStorage`, Kodierung für den Teilen-Link |
+| 1 | **Rechenkern** — Portierung des ursprünglichen Formelgenerators. Reine Funktionen, kein DOM |
+| 2 | Felddefinitionen: 80 Eingaben nebst Bereich, Einheit und Wörterbuchschlüssel |
+| 3 | Zustand, `localStorage`, Kodierung für den Weitergabeverweis |
| 4 | Formatierung und Zahleneingabe, sprachabhängig |
| 5 | Kennzahlen |
-| 6 | Aufbau der Oberfläche |
-| 7 | Ergebniskarten mit Δ-Anzeige |
-| 7b | Klartext-Fazit, Beispielwert-Hinweis, mitlaufende Ergebnisleiste |
-| 8 | Diagramme, reines Canvas |
+| 6 | Aufbau der Bedienoberfläche |
+| 7 | Ergebniskarten nebst Δ-Anzeige |
+| 7b | Klartextfazit, Hinweis auf Beispielwerte, mitlaufende Ergebnisleiste |
+| 8 | Diagramme, ausschließlich Canvas |
| 9 | Rechenweg |
| 10 | Render-Schleife |
| 11 | Installation und Offline-Betrieb |
| 12 | Fensterrahmen: Titelleisten und Minimieren |
-| 13 | Kachelung: ein, zwei oder drei Fensterspalten |
-| 14 | Sprachumschaltung in der Oberfläche |
+| 13 | Kachelung: eine, zwei oder drei Fensterspalten |
+| 14 | Sprachumschaltung in der Bedienoberfläche |
Der Rechenkern in Teil 1 ist **die einzige Stelle, an der gerechnet wird.** Er ist zeichengenau
-aus `build_bav.py` übertragen; Änderungen an der Rechtslage gehören in beide Dateien.
+aus dem ursprünglichen Formelgenerator übertragen worden; Änderungen der Rechtslage sind mithin
+ausschließlich dort vorzunehmen.
-### Brutto und Netto sind gekoppelt
+### Brutto- und Nettobetrag sind gekoppelt
-Es gibt keinen Umschalter „ich gebe vor: Brutto / Netto“ mehr. Beide Felder zeigen dieselbe
-Größe, nur in verschiedener Währung:
+Ein Umschalter „Vorgabe: Brutto / Netto" besteht nicht mehr. Beide Felder weisen dieselbe Größe
+aus, lediglich in verschiedener Währung:
```
N(B) = B − SV-Ersparnis_AN(B) − Steuerersparnis(B)
```
`N` ist auf `[0, Bruttogehalt]` stetig und wegen `dN/dB = 1 − Grenz-SV-Satz − Grenzsteuersatz > 0`
-streng monoton wachsend, also eine Bijektion auf `[0, N(Bruttogehalt)]`. Ein Umschalter wäre
-eine Auswahl zwischen einer Funktion und ihrer Umkehrfunktion — also keine.
+streng monoton wachsend, mithin eine Bijektion auf `[0, N(Bruttogehalt)]`. Ein Umschalter wäre
+eine Auswahl zwischen einer Funktion und ihrer Umkehrfunktion, mithin keine Auswahl.
-`beitrag` bleibt die einzige Quelle der Wahrheit; `netto_ziel` ist ein **abgeleitetes Feld** mit
-`get` (Vorwärtsrechnung, Jahr 0 der Ansparphase) und `set` (Bisektion, `bruttoVonNetto`).
-Beide werten dasselbe erste Jahr aus — Lohn- und Tarifindex sind dort 1 —, weshalb die
-Richtungen exakt invers sind. Gemessen über 12 Parameterkombinationen × 5 Stützstellen:
+`beitrag` verbleibt die einzige maßgebliche Größe; `netto_ziel` ist ein **abgeleitetes Feld** mit
+`get` (Vorwärtsrechnung, Jahr 0 der Ansparphase) und `set` (Intervallhalbierung,
+`bruttoVonNetto`). Beide werten dasselbe erste Jahr aus — Lohn- und Tarifindex betragen dort 1 —,
+weshalb die Richtungen exakt invers sind. Gemessen über 12 Parameterkombinationen × 5
+Stützstellen:
| Richtung | größter relativer Fehler |
|---|---|
| B → N → B | 2,3 · 10⁻⁸ |
| N → B → N | 2,1 · 10⁻⁸ |
-Das ist genau die Auflösung der Bisektion: 34 Halbierungen auf `[0, 250.000 €]` sind
-1,5 · 10⁻⁵ €/Jahr, also gut ein Millionstel Cent im Monat. Die Monotonie ist zusätzlich auf
-`1 … 1.500 €/Monat` in Ein-Euro-Schritten geprüft; die kleinste beobachtete Steigung ist
-`dN/dB = 0,545`, d. h. Steuer und Sozialabgaben tragen zusammen nie mehr als 45,5 % des
-Bruttobeitrags.
+Dies entspricht genau der Auflösung des Halbierungsverfahrens: 34 Halbierungen auf
+`[0, 250.000 €]` ergeben 1,5 · 10⁻⁵ €/Jahr, mithin gut ein Millionstel Cent im Monat. Die
+Monotonie ist ergänzend auf `1 … 1.500 €/Monat` in Ein-Euro-Schritten geprüft worden; die
+geringste beobachtete Steigung beträgt `dN/dB = 0,545`, mithin tragen Steuer und Sozialabgaben
+zusammen niemals mehr als 45,5 vom Hundert des Bruttobeitrags.
-Fällt der Nettoaufwand für das erste Jahr auf null — weil man dann bereits ausgeschieden ist —,
-existiert die Umkehrung nicht. Die App sagt das statt still nichts zu tun.
+Fällt der Nettoaufwand für das erste Jahr auf null — weil zu diesem Zeitpunkt bereits ein
+Ausscheiden vorliegt —, so existiert die Umkehrung nicht. Die Anwendung weist hierauf hin,
+anstatt untätig zu verbleiben.
-## 3b. Neunzehn Sprachen
+## § 3b Dreiundzwanzig Sprachfassungen
-Deutsch ist die Hauptsprache; alle übrigen sind Übersetzungen derselben Rechtslage, kein
-zweiter Rechtsstand. **Die Normzitate bleiben in allen Sprachen deutsch**
-(`§ 1a BetrAVG`, `§ 226 Abs. 2 S. 2 SGB V`, …) — sie sind die Primärquellen und haben keine
-amtliche Übersetzung; eine eigene wäre hier keine Hilfe, sondern eine Fehlerquelle. Ebenso
-bleiben zwei Produktnamen stehen, weil sie Eigennamen sind: `Altersvorsorgedepot` und
-`Versorgungsbezüge`; im Japanischen mit Glosse (`Versorgungsbezüge(企業年金等の給付)`).
+Deutsch ist die Hauptsprache; sämtliche übrigen Fassungen sind Übersetzungen derselben
+Rechtslage und nicht etwa ein zweiter Rechtsstand. **Die Normzitate verbleiben in sämtlichen
+Sprachfassungen in deutscher Sprache** (`§ 1a BetrAVG`, `§ 226 Abs. 2 S. 2 SGB V`, …) — es
+handelt sich um die Primärquellen, für welche eine amtliche Übersetzung nicht vorliegt; eine
+eigene wäre insoweit keine Hilfe, sondern eine Fehlerquelle. Gleichermaßen verbleiben zwei
+Produktbezeichnungen unübersetzt, da es sich um Eigennamen handelt: `Altersvorsorgedepot` und
+`Versorgungsbezüge`; im Japanischen nebst Glosse
+(`Versorgungsbezüge(企業年金等の給付)`).
| | Sprachen | Schlüssel |
|---|---|---|
-| **vollständig** | `de` `de-x-amt` `de-x-sales` `en` `nl` `fr` `la` `ja` `nds` `bar` `eu` `eo` `tr` `uk` `got` `goh` `gmh` `grc` `sa` | 459 |
+| **vollständig** | `de` `de-x-amt` `de-x-sales` `en` `nl` `fr` `la` `ja` `nds` `bar` `eu` `eo` `tr` `uk` `got` `goh` `gmh` `grc` `sa` `ine-x-proto` `jbo` `tok` `akk-x-ob` | 459 |
| **teilweise** | — | — |
-Alle dreiundzwanzig Sprachen sind inzwischen vollständige Wörterbücher (459 von 459 Schlüsseln); die
-Tabellenzeile „teilweise“ bleibt stehen, weil `TEILWEISE` in `index.html` als Mechanismus
-weiterlebt — sie ist nur derzeit leer. Ursprünglich war die Auswahl strukturell, nicht nach
-Zeichenzahl: zuerst übersetzt wurde, was man anfasst oder als Überschrift liest —
-Feldbeschriftungen, Einheiten, Auswahlwerte, Fenstertitel, Kennzahlen, Tabellenköpfe,
-Diagrammlegenden, Meldungen; die langen juristischen Erläuterungen (die `?`-Texte an den
-Feldern, das Fazit, die Notizen unter den Feldern, der ganze Rechenweg) kamen erst in einer
-zweiten Fassung dazu. Für die drei historischen Sprachstufen und für Sanskrit und Altgriechisch
-ist der Vertrauensgrad in diesen Fließtext-Passagen entsprechend niedriger als in den
-Feldbeschriftungen selbst — siehe die Kopfkommentare der jeweiligen `i18n.*.js`-Datei für die
-genauen Prozentsätze und die dort neu geprägten Fachbegriffe.
+Sämtliche dreiundzwanzig Sprachfassungen sind zwischenzeitlich vollständige Wörterbücher (459 von
+459 Schlüsseln); die Tabellenzeile „teilweise" verbleibt, weil `TEILWEISE` in `index.html` als
+Mechanismus fortbesteht — sie ist lediglich derzeit unbesetzt. Ursprünglich erfolgte die Auswahl
+strukturell und nicht nach Zeichenzahl: zuerst übersetzt wurde dasjenige, was betätigt oder als
+Überschrift gelesen wird — Feldbeschriftungen, Einheiten, Auswahlwerte, Fenstertitel,
+Kennzahlen, Tabellenköpfe, Diagrammlegenden, Meldungen; die ausführlichen juristischen
+Erläuterungen (die `?`-Texte an den Feldern, das Fazit, die Notizen unter den Feldern, der
+gesamte Rechenweg) sind erst in einer zweiten Fassung hinzugetreten. Für die drei historischen
+Sprachstufen sowie für Sanskrit und Altgriechisch ist der Vertrauensgrad in diesen
+Fließtextpassagen entsprechend geringer als in den Feldbeschriftungen selbst; die genauen
+Prozentsätze sowie die dort neu geprägten Fachbegriffe sind den Kopfkommentaren der jeweiligen
+`i18n.*.js`-Datei zu entnehmen.
**Die drei alten germanischen Fassungen** (`got` Gotisch, `goh` Althochdeutsch,
-`gmh` Mittelhochdeutsch) sind kein Scherz, sondern eine Probe darauf, wie viel Fachsprache eine
-Sprachstufe trägt. Nur `goh` und `gmh` sind Vorstufen des Deutschen; **Gotisch ist ostgermanisch
-und damit eine Schwester, keine Ahnin** — es steht hier, weil es das älteste umfangreich
-überlieferte Germanisch überhaupt ist. Das Ergebnis ist ein klares Gefälle, und es folgt genau
-der Verstädterung:
-
-- **Gotisch** hat mit Wulfilas Bibel ein Korpus von rund 3.000 Lexemen, praktisch keines
- davon wirtschaftlich. Belegt sind immerhin `faihu` (Vermögen), `gild` (Abgabe), `wokrs` (Zins,
- Lk 19,23 *miþ wokra*), `mizdo` (Lohn), `asneis` (Lohnarbeiter). Alles Übrige — `haubidafaihu`
- für Kapital, `gagaleikeins` für Vergleich — ist geprägt. Vertrauensgrad ≈ 30 %.
+`gmh` Mittelhochdeutsch) sind nicht als Scherz zu verstehen, sondern als Probe darauf, wie viel
+Fachsprache eine Sprachstufe zu tragen vermag. Lediglich `goh` und `gmh` sind Vorstufen des
+Deutschen; **das Gotische ist ostgermanisch und mithin eine Schwester, keine Ahnin** — es steht
+hier, weil es das älteste umfangreich überlieferte Germanisch überhaupt darstellt. Das Ergebnis
+ist ein deutliches Gefälle, welches genau der Verstädterung folgt:
+
+- **Gotisch** verfügt mit der Wulfila-Bibel über ein Korpus von rund 3.000 Lexemen, von welchen
+ praktisch keines wirtschaftlicher Natur ist. Belegt sind immerhin `faihu` (Vermögen), `gild`
+ (Abgabe), `wokrs` (Zins, Lk 19,23 *miþ wokra*), `mizdo` (Lohn), `asneis` (Lohnarbeiter). Alles
+ Übrige — `haubidafaihu` für Kapital, `gagaleikeins` für Vergleich — ist geprägt.
+ Vertrauensgrad ≈ 30 vom Hundert.
- **Althochdeutsch** gewinnt durch Tatian und Notker: `gelt`, `zins`, `lon`, `wuohhar` sind
belegt, und **`widarmezzon` steht im Tatian genau für lateinisch *comparare*** — der
- Fenstertitel ist also kein Kunstwort. Vertrauensgrad ≈ 50 %.
-- **Mittelhochdeutsch** ist die tragfähigste Stufe, weil es bereits eine städtische Geld- und
- Rechtssprache gibt. Drei Treffer sind keine Prägung, sondern der jeweilige Terminus:
+ Fenstertitel ist mithin kein Kunstwort. Vertrauensgrad ≈ 50 vom Hundert.
+- **Mittelhochdeutsch** ist die tragfähigste Stufe, da bereits eine städtische Geld- und
+ Rechtssprache besteht. Drei Treffer sind keine Prägung, sondern der jeweilige Terminus:
**`houbetguot`** ist das Kapital, **`lîpgedinge`** die lebenslange Leibrente, **`tiurunge`**
- der Preisanstieg — also die Inflation. Dazu `gülte`, `stiure`, `wuocher`, `gewin`, `koste`.
- Vertrauensgrad ≈ 65 %.
-
-**Gotisch steht in lateinischer Umschrift** (Streitberg), nicht im Wulfila-Alphabet
-(U+10330–1034F). Der Grund ist der Grundsatz aus § 2: die App lädt keine Schriften von fremden
-Domains. Für gotische Schrift gibt es auf keinem verbreiteten System eine vorinstallierte Datei
-— 𐌰𐌻𐌻𐌰𐌹𐌼 wären leere Kästchen. Die Umschrift ist ohnehin die Form, in der das Gotische gelesen
-wird. Wer die Schrift will, braucht eine eingebettete Schriftart und damit eine andere
-Grundsatzentscheidung.
-
-### Registervarianten des Deutschen: gebaut
-
-**„Beamtendeutsch“ und „Vertrieb“** sind keine Sprachen, sondern Stilebenen derselben Sprache —
-sie stehen daher nach BCP 47 § 2.2.7 unter `de` mit privatem Untertag: `de-x-amt` und
-`de-x-sales`, in `i18n.de-x-amt.js` und `i18n.de-x-sales.js`. Anders als bei den übrigen
-Sprachen genügt hier keine Teilfassung: der Witz liegt gerade im Fließtext, den eine
-Teilübersetzung weglassen würde. Derselbe § 1a BetrAVG heißt im Amtsdeutsch „Ein Rechtsanspruch
+ der Preisanstieg, mithin die Inflation. Hinzu treten `gülte`, `stiure`, `wuocher`, `gewin`,
+ `koste`. Vertrauensgrad ≈ 65 vom Hundert.
+
+**Das Gotische steht in lateinischer Umschrift** (Streitberg) und nicht im Wulfila-Alphabet
+(U+10330–1034F). Maßgeblich hierfür ist der Grundsatz gemäß § 2: die Anwendung lädt keine
+Schriften von fremden Domänen. Für die gotische Schrift liegt auf keinem verbreiteten System
+eine vorinstallierte Datei vor — 𐌰𐌻𐌻𐌰𐌹𐌼 erschiene als leere Kästchen. Die Umschrift ist
+ohnehin diejenige Form, in welcher das Gotische gelesen wird. Wer die Schrift wünscht, bedarf
+einer eingebetteten Schriftart und mithin einer abweichenden Grundsatzentscheidung.
+
+### Registervarianten des Deutschen: eingerichtet
+
+**„Beamtendeutsch" und „Vertrieb"** sind keine Sprachen, sondern Stilebenen derselben Sprache;
+sie werden daher nach BCP 47 § 2.2.7 unter `de` mit privatem Untertag geführt: `de-x-amt` und
+`de-x-sales`, in `i18n.de-x-amt.js` und `i18n.de-x-sales.js`. Abweichend von den übrigen
+Sprachfassungen genügt hier keine Teilfassung: der Witz liegt gerade im Fließtext, welchen eine
+Teilübersetzung fortließe. Derselbe § 1a BetrAVG lautet im Amtsdeutsch „Ein Rechtsanspruch
besteht ausschließlich bis zur Höhe von 4 vom Hundert der Beitragsbemessungsgrenze der
-Rentenversicherung“ und im Vertriebsdeutsch „Bis zu 4 % on top — geschenkt vom Gesetzgeber!“ —
-beide beschreiben exakt dieselbe Rechtslage, und der Vergleich ist der Punkt. Die Zahlen ändern
-sich auch dort nicht; `pruefe.js` prüft das wie bei jeder anderen Sprache ohne Sonderfall.
-
-Technisch brauchte das drei Änderungen: `pickLang()` matcht seither zusätzlich zur
-Grundsprache beliebig viele `-x-[a-z0-9]{1,8}`-Untertags; `LANGS` und `DICT` bekamen
-Einträge mit Bindestrich; `LOCALES`/`GRUPPEN` brauchten dagegen **keine** neuen Einträge, weil
-ihre bestehenden `||`-Rückfälle (`'de-DE'` bzw. `'.'`) für beide Varianten schon das Richtige
-liefern. Der Sprachknopf zeigt nicht den vollen Code (`DE-X-AMT` wäre zu lang für die
-zweizeilige Schaltfläche), sondern nur den Teil nach dem letzten Bindestrich (`AMT`, `SALES`);
-`lang="…"` und das Autonym im `title` tragen weiterhin den vollen Code bzw. den vollen Namen.
-
-### Vorgemerkt, noch nicht gebaut
-
-**Rechtsläufige Sprachen (`he`, `fa`, `ar`).** Die Übersetzung ist der billige Teil. Teuer ist
-dreierlei: `applyStatic()` muss neben `lang` auch `dir` setzen; im Stilblatt müssen
-`margin-left`/`-right` durch die logischen Eigenschaften ersetzt werden, sonst kippt die
-Kachelung; und Teil 8 zeichnet auf Canvas, wo es **keinen Bidi-Algorithmus gibt** — Achsen,
-Legenden und der Wasserfall müssten von Hand gespiegelt werden. Dazu `fa-u-nu-latn` und
-`ar-u-nu-latn` in `LOCALES`, sonst liefert ICU ostarabische Ziffern (۱۲۳۴) neben einem `€`.
-Die Einzelheiten stehen als Kommentarblock in `index.html` direkt bei `TEILWEISE`.
-
-**Codes.** ISO 639-1, wo es einen gibt, sonst 639-3. Dreibuchstabig sind `grc`
-(**nicht** `el` — das wäre Neugriechisch), `nds` und `bar`; keine der drei hat einen
-zweibuchstabigen Code. Deshalb matcht `pickLang()` `[a-z]{2,3}` als Grundcode, optional gefolgt
-von den erwähnten `-x-…`-Untertags.
-
-**Wahl der Sprache**, in dieser Reihenfolge:
-
-1. `?lang=…` in der Adresse — teilbar, überschreibt alles,
-2. die gemerkte Wahl in `localStorage` unter `altersvorsorge.lang`,
+Rentenversicherung" und im Vertriebsdeutsch „Bis zu 4 % on top — geschenkt vom Gesetzgeber!" —
+beide Fassungen beschreiben exakt dieselbe Rechtslage, und der Vergleich ist der Punkt. Die
+Zahlen ändern sich auch dort nicht; `pruefe.js` prüft dies wie bei jeder anderen Sprache ohne
+Sonderfall.
+
+Technisch waren hierfür drei Änderungen erforderlich: `pickLang()` erkennt seither zusätzlich
+zur Grundsprache beliebig viele `-x-[a-z0-9]{1,8}`-Untertags; `LANGS` und `DICT` haben Einträge
+mit Bindestrich erhalten; `LOCALES` und `GRUPPEN` bedurften hingegen **keiner** neuen Einträge,
+da deren bestehende `||`-Rückfälle (`'de-DE'` bzw. `'.'`) für beide Varianten bereits das
+Zutreffende liefern. Die Sprachschaltfläche weist nicht den vollständigen Code aus (`DE-X-AMT`
+wäre für die zweizeilige Schaltfläche zu lang), sondern lediglich den Teil nach dem letzten
+Bindestrich (`AMT`, `SALES`); `lang="…"` sowie das Autonym im `title` tragen weiterhin den
+vollständigen Code bzw. die vollständige Bezeichnung.
+
+### Vorgemerkt, noch nicht eingerichtet
+
+**Rechtsläufige Sprachen (`he`, `fa`, `ar`).** Die Übersetzung stellt den geringeren Aufwand
+dar. Aufwendig ist Dreierlei: `applyStatic()` hat neben `lang` auch `dir` zu setzen; im Stilblatt
+sind `margin-left`/`-right` durch die logischen Eigenschaften zu ersetzen, da andernfalls die
+Kachelung kippt; und Teil 8 zeichnet auf Canvas, wo **ein Bidi-Algorithmus nicht besteht** —
+Achsen, Legenden und der Wasserfall wären mithin von Hand zu spiegeln. Hinzu treten
+`fa-u-nu-latn` und `ar-u-nu-latn` in `LOCALES`, da ICU andernfalls ostarabische Ziffern (۱۲۳۴)
+neben einem `€` liefert. Die Einzelheiten sind als Kommentarblock in `index.html` unmittelbar
+bei `TEILWEISE` niedergelegt.
+
+**Codes.** ISO 639-1, soweit ein solcher besteht, im Übrigen 639-3. Dreibuchstabig sind `grc`
+(**nicht** `el` — dies wäre Neugriechisch), `nds` und `bar`; für keine der drei Sprachen besteht
+ein zweibuchstabiger Code. `pickLang()` erkennt daher `[a-z]{2,3}` als Grundcode, fakultativ
+gefolgt von den vorgenannten `-x-…`-Untertags.
+
+**Wahl der Sprache**, in nachstehender Reihenfolge:
+
+1. `?lang=…` in der Adresse — weitergabefähig, überschreibt alles Übrige,
+2. die vorgehaltene Wahl in `localStorage` unter `altersvorsorge.lang`,
3. `navigator.language`, nach BCP-47-Teilkette (`xx` oder `xx-…`).
- **Latein, Altgriechisch, Sanskrit und Esperanto werden nie automatisch gewählt** — ein
- Browser, der `la` meldet, meint es fast sicher nicht als Anzeigesprache.
+ **Latein, Altgriechisch, Sanskrit und Esperanto werden niemals selbsttätig gewählt** — ein
+ Browser, welcher `la` meldet, meint dies mit an Sicherheit grenzender Wahrscheinlichkeit
+ nicht als Anzeigesprache.
-Die Knöpfe tragen das Kürzel, der `title` das **Autonym** (`Українська`, `Plattdüütsch`,
-`संस्कृतम्`) — nicht den übersetzten Namen. Wer Ukrainisch sucht, erkennt `Українська` auch dann,
-wenn die Oberfläche gerade auf Baskisch steht; nebenbei spart das 14 × 14 Wörterbucheinträge.
+Die Schaltflächen tragen das Kürzel, der `title` hingegen das **Autonym** (`Українська`,
+`Plattdüütsch`, `संस्कृतम्`) und nicht die übersetzte Bezeichnung. Wer Ukrainisch sucht, erkennt
+`Українська` auch dann, wenn die Oberfläche gegenwärtig auf Baskisch eingestellt ist; nebenbei
+werden hierdurch 14 × 14 Wörterbucheinträge eingespart.
**Zahlenformat.** `LOCALES` bildet jeden Code auf ein ICU-Tag ab, `GRUPPEN` auf das
-Tausenderzeichen, das `parseNum()` beim mehrdeutigen `1,234` heranzieht. Sprachen ohne eigene
-ICU-Daten (`nds`, `bar`, `eo`, `la`, `grc`, `sa`) bekommen `de-DE`: Devanāgarī-Ziffern neben
-einem `€` wären eine Schikane, keine Genauigkeit, und griechische Buchstabenzahlen erst recht.
-`fr` gruppiert mit U+202F, `uk` mit U+00A0 — beides so, wie ICU es tatsächlich setzt, nachgeprüft
-gegen `formatToParts`.
-
-**Zu Latein und Japanisch.** Das Latein ist pragmatisches Neulatein: klassische Syntax,
-aber gebildete Neuprägungen für Moderne (`pensio operativa`, `impensa pura`, `valor praesens`,
-`usura interna`). Römische Ziffern wären ein Witz auf Kosten der Lesbarkeit — und die
+Tausenderzeichen, welches `parseNum()` beim mehrdeutigen `1,234` heranzieht. Sprachen ohne
+eigene ICU-Daten (`nds`, `bar`, `eo`, `la`, `grc`, `sa`) erhalten `de-DE`: Devanāgarī-Ziffern
+neben einem `€` wären eine Schikane und keine Genauigkeit, griechische Buchstabenzahlen erst
+recht. `fr` gruppiert mit U+202F, `uk` mit U+00A0 — beides so, wie ICU es tatsächlich setzt,
+nachgeprüft gegen `formatToParts`.
+
+**Zu Latein und Japanisch.** Das Latein ist pragmatisches Neulatein: klassische Syntax, jedoch
+gebildete Neuprägungen für die Moderne (`pensio operativa`, `impensa pura`, `valor praesens`,
+`usura interna`). Römische Ziffern wären ein Witz zu Lasten der Lesbarkeit — und die
Trennzeichenkonvention ist ohnehin jünger als jede lateinische Quelle. Das Japanische folgt
-dem, was für Software dieser Art dort üblich ist: Erklärtexte in です・ます, Feldbeschriftungen
-als Nominalphrasen im 体言止め. Für die Schrift ist der `--ui`-Stapel um MS PGothic, Hiragino,
-Yu Gothic und Meiryo erweitert — eine Rasterschrift mit harten Kanten passt zum Thema.
+demjenigen, was für Software dieser Art dort üblich ist: Erläuterungstexte in です・ます,
+Feldbeschriftungen als Nominalphrasen im 体言止め. Für die Schrift ist der `--ui`-Stapel um
+MS PGothic, Hiragino, Yu Gothic und Meiryo erweitert worden — eine Rasterschrift mit harten
+Kanten ist dem Gegenstand angemessen.
-Der japanische Satzbau erzwingt, wofür die Funktionsform der Einträge da ist. Das Fazit lautet
-im Deutschen „X liegt vorn mit W — D mehr als Y“, im Japanischen dagegen
-`Xが首位です(W)。YをD上回ります。` — Verb am Ende, Vergleichsgröße mit を statt „als“. Als
-Verkettung fester Bausteine ließe sich das nicht bauen.
+Der japanische Satzbau erzwingt dasjenige, wozu die Funktionsform der Einträge bestimmt ist. Das
+Fazit lautet im Deutschen „X liegt vorn mit W — D mehr als Y", im Japanischen hingegen
+`Xが首位です(W)。YをD上回ります。` — das Verb am Ende, die Vergleichsgröße mit を anstelle von
+„als". Als Verkettung fester Bausteine ließe sich dies nicht herstellen.
-Der Umschalter oben im Kopffenster schreibt beides fort, Speicher und Adresse. Der Teilen-Link
-nimmt die Suchzeichenfolge mit, der Zustand steckt weiter im Fragment — beides stört sich nicht.
+Der Umschalter oben im Kopffenster schreibt beides fort, mithin Speicher und Adresse. Der
+Weitergabeverweis führt die Suchzeichenfolge mit, der Zustand verbleibt im Fragment; beides
+stört sich nicht.
**Aufbau der Wörterbücher.** Ein Eintrag ist entweder eine Zeichenkette oder eine Funktion
-`(p, f) → string`. Die Funktionsform ist keine Bequemlichkeit, sondern notwendig: ein Satz ist
-nicht die Verkettung seiner Teile. Stellung, Numerus und Rektion hängen an der Sprache, und
-`'mehr als ' + nom` funktioniert nur, solange beide Sprachen denselben Satzbau haben. Deshalb
-bekommen die Funktionen **Rohwerte** — Zahlen, keine fertigen Textstücke — und formatieren
-selbst über `f` (`f.eur`, `f.pct`, `f.nf2`, …). Sichtbar wird der Unterschied etwa im Fazit:
-das Deutsche braucht dort einen Genitiv (`der bAV`), das Englische eine Präposition.
+`(p, f) → string`. Die Funktionsform ist keine Bequemlichkeit, sondern zwingend erforderlich: ein
+Satz ist nicht die Verkettung seiner Teile. Stellung, Numerus und Rektion hängen an der Sprache,
+und `'mehr als ' + nom` ist lediglich so lange tragfähig, wie beide Sprachen denselben Satzbau
+aufweisen. Den Funktionen werden daher **Rohwerte** übergeben — Zahlen und keine fertigen
+Textstücke —, und die Formatierung erfolgt selbsttätig über `f` (`f.eur`, `f.pct`, `f.nf2`, …).
+Sichtbar wird der Unterschied etwa im Fazit: das Deutsche bedarf dort eines Genitivs (`der bAV`),
+das Englische einer Präposition.
```
t('n.beitrag.ueber8', { v8: v8 })
@@ -246,213 +267,228 @@ t('n.beitrag.ueber8', { v8: v8 })
en: 'Above 8 % of the pension-insurance contribution ceiling (' + f.eur(p.v8) + ' per year). …'
```
-**Schlüsselschema.** Eingabefelder liegen unter `f.<src>:<key>.label|hint|unit|o<wert>`,
-die Optionen also unter ihrem *Wert*, nicht unter ihrem Index — dann bleibt die Zuordnung
-richtig, wenn eine Option dazukommt. `FIELDS`, `OPTS` und `METRICS` tragen ihre Texte nicht
+**Schlüsselschema.** Eingabefelder liegen unter `f.<src>:<key>.label|hint|unit|o<wert>`, die
+Optionen mithin unter ihrem *Wert* und nicht unter ihrem Index; sodann verbleibt die Zuordnung
+zutreffend, wenn eine Option hinzutritt. `FIELDS`, `OPTS` und `METRICS` führen ihre Texte nicht
mehr als Feld, sondern als `Object.defineProperty`-Zugriffsfunktion: `f.label` steht unverändert
an jeder Aufrufstelle und liefert nach einem Sprachwechsel von selbst den neuen Wert.
-**Fehlt ein Eintrag**, greift Deutsch; fehlt auch der, erscheint der Schlüssel selbst im
-Klartext. Ein stiller Leerstring wäre die schlechtere Wahl — er verschwindet unbemerkt.
+**Fehlt ein Eintrag**, so greift Deutsch; fehlt auch dieser, so erscheint der Schlüssel selbst im
+Klartext. Ein stiller Leerstring wäre die schlechtere Wahl, da er unbemerkt verschwände.
-**Zahlen.** Umgeschaltet wird nur die Zifferngruppierung — `de` und `la` → `de-DE`,
-`en` → `en-GB`, `ja` → `ja-JP`; die Währung bleibt überall der nachgestellte Euro:
-`75.000,00 €` bzw. `75,000.00 €`. Die Eingabe nimmt **beide**
-Schreibweisen an, damit ein Sprachwechsel keine getippte Zahl entwertet. Die Regel in
-`parseNum`: stehen beide Zeichen im Text, ist das rechte das Dezimalzeichen; steht nur eines
-und folgen ihm genau drei Ziffern, ist es die Tausendergruppe der aktuellen Sprache
-(`GRUPPEN`: `.` für de und la, `,` für en und ja). Damit
-bleibt allein `1,234` mehrdeutig — und genau dort entscheidet die Sprache.
+**Zahlen.** Umgeschaltet wird ausschließlich die Zifferngruppierung — `de` und `la` → `de-DE`,
+`en` → `en-GB`, `ja` → `ja-JP`; die Währung verbleibt durchgängig der nachgestellte Euro:
+`75.000,00 €` bzw. `75,000.00 €`. Die Eingabe nimmt **beide** Schreibweisen an, damit ein
+Sprachwechsel eine eingegebene Zahl nicht entwertet. Die Regel in `parseNum` lautet: stehen beide
+Zeichen im Text, so ist das rechte das Dezimalzeichen; steht lediglich eines und folgen ihm genau
+drei Ziffern, so handelt es sich um die Tausendergruppe der gegenwärtigen Sprache (`GRUPPEN`:
+`.` für de und la, `,` für en und ja). Damit verbleibt allein `1,234` mehrdeutig — und genau dort
+entscheidet die Sprache.
**Was ein Sprachwechsel nicht anfasst:** die Eingaben, den Referenzstand und die Ergebnisse.
-`setLang` baut nur die Teile neu, deren Beschriftungen beim Aufbau festgeschrieben werden
-(Kennzahlenleiste, Registerkarten, Felder, Fenstertitel); alles Übrige zeichnet `refresh()`
-ohnehin bei jedem Durchgang. Der Referenzstand merkt sich deshalb den *Feldschlüssel* und
-nicht den fertigen Satz — sonst stünde nach dem Wechsel „vor der Änderung von …“ noch in der
-alten Sprache da.
-
-**Prüfung.** `pruefe.js` (Entwicklungswerkzeug, wird vom Service Worker nicht ausgeliefert) lädt die Seite kopflos in
-jsdom, schaltet alle dreiundzwanzig Sprachen durch, klappt jeden Abschnitt auf, erzwingt über fünf
-Szenarien die bedingten Texte und prüft: kein unaufgelöster Schlüssel, keine deutschen Reste im
-englischen Modus außer den erlaubten Fachbegriffen, kein sichtbar gebliebener Schlüssel, und
-— die eigentliche Invariante —
-**identische Rechenergebnisse in allen dreiundzwanzig Sprachen**.
-
-Die Liste der Wörterbücher liest das Skript aus `index.html` statt sie zu pflegen: eine neue
-Sprache soll den Test nicht stillschweigend an einem leeren Objekt vorbeilaufen lassen. Das
+`setLang` baut lediglich diejenigen Teile neu auf, deren Beschriftungen beim Aufbau
+festgeschrieben werden (Kennzahlenleiste, Registerkarten, Felder, Fenstertitel); alles Übrige
+zeichnet `refresh()` ohnehin bei jedem Durchgang. Der Referenzstand hält daher den
+*Feldschlüssel* vor und nicht den fertigen Satz; andernfalls stünde nach dem Wechsel „vor der
+Änderung von …" noch in der vormaligen Sprache da.
+
+**Prüfung.** `pruefe.js` (Entwicklungswerkzeug, wird vom Dienstarbeiter nicht ausgeliefert) lädt
+die Seite kopflos in jsdom, schaltet sämtliche dreiundzwanzig Sprachfassungen durch, klappt jeden
+Abschnitt auf, erzwingt über fünf Szenarien die bedingten Texte und prüft: kein unaufgelöster
+Schlüssel, keine deutschen Reste im englischen Modus außer den zugelassenen Fachbegriffen, kein
+sichtbar verbliebener Schlüssel, und — die eigentliche Invariante — **identische
+Rechenergebnisse in sämtlichen dreiundzwanzig Sprachfassungen**.
+
+Die Liste der Wörterbücher liest das Skript aus `index.html` aus, anstatt sie zu pflegen: eine
+neue Sprache soll den Test nicht stillschweigend an einem leeren Objekt vorbeilaufen lassen. Das
Regex für die `<script src="i18n….js">`-Tags lässt dabei auch Bindestriche im Dateinamen zu
-(`i18n.de-x-amt.js`), nicht nur zwei- bis dreibuchstabige Codes. Für Teilsprachen — sobald es
-wieder welche gibt — wird zusätzlich der Rückfall selbst nachgewiesen: jeder nicht übersetzte
-Schlüssel muss den *deutschen Text* liefern, nie einen Leerstring und nie den Schlüssel; kein
-eigener Eintrag darf den Typ wechseln (Zeichenkette ↔ Funktion); der Hinweis unter dem
-Umschalter steht genau bei den Teilsprachen und sonst nirgends. Umgekehrt wird für jede
-Vollsprache — das sind inzwischen alle dreiundzwanzig — nachgewiesen, dass ihr Wörterbuch tatsächlich
-459 von 459 Schlüsseln trägt und der Teilhinweis NICHT erscheint. Für die beiden
-Registervarianten des Deutschen wird zusätzlich geprüft, dass der Bindestrich-Untertag die
-Adresszeile und den Rückweg durch `pickLang()` übersteht. Bricht das Hauptskript beim Parsen —
-der wahrscheinlichste Fall ist ein Blockkommentar, den ein Regex-Literal vorzeitig schliesst —,
-steigt das Skript mit einer klaren Meldung aus, statt an einem `undefined` zu straucheln.
-154 Prüfungen.
-
-## 4. Prüfung
-
-Der Kern ist gegen die Excel-Mappe geprüft, sechs unabhängige Fälle, jeweils rund 20 Aggregate:
+(`i18n.de-x-amt.js`) und nicht nur zwei- bis dreibuchstabige Codes. Für Teilsprachen — sobald
+solche wieder bestehen — wird ergänzend der Rückfall selbst nachgewiesen: jeder nicht übersetzte
+Schlüssel hat den *deutschen Text* zu liefern, niemals einen Leerstring und niemals den
+Schlüssel; kein eigener Eintrag darf den Typ wechseln (Zeichenkette ↔ Funktion); der Hinweis
+unter dem Umschalter hat genau bei den Teilsprachen und sonst nirgends zu stehen. Umgekehrt wird
+für jede Vollsprache — mithin gegenwärtig für sämtliche dreiundzwanzig — nachgewiesen, dass ihr
+Wörterbuch tatsächlich 459 von 459 Schlüsseln trägt und der Teilhinweis NICHT erscheint. Für die
+beiden Registervarianten des Deutschen wird ergänzend geprüft, dass der Bindestrich-Untertag die
+Adresszeile sowie den Rückweg durch `pickLang()` übersteht. Bricht das Hauptskript beim Parsen —
+der wahrscheinlichste Fall ist ein Blockkommentar, welchen ein Regex-Literal vorzeitig schließt
+—, so bricht das Skript mit einer eindeutigen Meldung ab, anstatt an einem `undefined` zu
+straucheln. 154 Prüfungen.
+
+## § 4 Prüfung
+
+Der Kern ist gegen das ursprüngliche Excel-Modell geprüft worden, sechs unabhängige Fälle zu je
+rund 20 Aggregaten:
| Testfall | größte relative Abweichung |
|---|---|
-| Basisfall (40 J., 75.000 €, 300 €/Monat, GKV, Kapital, Ausscheiden mit 63) | 3,6 · 10⁻¹⁵ |
+| Regelfall (40 J., 75.000 €, 300 €/Monat, GKV, Kapital, Ausscheiden mit 63) | 3,6 · 10⁻¹⁵ |
| Splitting, KiSt 9 %, kinderlos, PKV, Rente, Fünftelregelung, Modus 2, Teilkapital | 1,3 · 10⁻¹⁴ |
-| GKV + lebenslange Rente, Zuschussmodus 0, KiSt 8 %, Teilkapital 30 % | 6,2 · 10⁻¹⁵ |
+| GKV nebst lebenslanger Rente, Zuschussmodus 0, KiSt 8 %, Teilkapital 30 % | 6,2 · 10⁻¹⁵ |
| **AVD verrentet** | 5,2 · 10⁻¹⁵ |
-| **AVD verrentet + 30 % Einmalbetrag** | 3,6 · 10⁻¹⁵ |
-| **beide Produkte verrentet, Splitting, PKV, andere Zeitachse, 2 Kinder** | 4,4 · 10⁻¹⁵ |
-| **fester AG-Zuschuss 100 €/Monat** | exakt (< 10⁻⁹ auf allen Jahreswerten) |
-| **fester Zuschuss 400 €/Monat, 4-%-Topf erschöpft** | exakt |
-| **fester Zuschuss mit Mindestschwelle, ober- und unterhalb** | exakt |
-| **Mindestschwelle + Modus 2 (Bisektion über die Sprungstelle)** | exakt |
-
-> Der Prüfanker ist **erhalten geblieben**: `build_bav.py` wurde für die Depotverrentung
-> mitgezogen (neue Eingaben, drei neue Spalten im Blatt `Auszahlung`, zweite Memo-Zeile im
-> Blatt `Vergleich`), die Mappe neu erzeugt und mit LibreOffice durchgerechnet — 0 Formelfehler,
-> und der Basisfall ist auf den Cent unverändert. Der JS-Kern wird gegen diesen Recalc geprüft,
-> nicht gegen sich selbst.
-
-Das sind wenige Dutzend ULP — akkumulierter Gleitkommafehler, nichts Systematisches.
-Die Referenzwerte stammen aus einem LibreOffice-Recalc der Mappe mit denselben Eingaben.
-
-> Die **Voreinstellungen** der App weichen bewusst vom Excel-Basisfall ab: „Ausscheiden aus dem
-> Job“ und „Teilzeit ab Alter“ stehen beide auf 67, also auf „durchgehend bis zur Rente“. Die
-> Testfälle setzen `ausscheid: 63, tzalter: 55` deshalb ausdrücklich — sonst prüfte man ein
-> anderes Szenario und merkte es nicht.
+| **AVD verrentet nebst 30 % Einmalbetrag** | 3,6 · 10⁻¹⁵ |
+| **beide Produkte verrentet, Splitting, PKV, abweichende Zeitachse, 2 Kinder** | 4,4 · 10⁻¹⁵ |
+| **fester AG-Zuschuss 100 €/Monat** | exakt (< 10⁻⁹ auf sämtlichen Jahreswerten) |
+| **fester Zuschuss 400 €/Monat, 4-%-Höchstbetrag erschöpft** | exakt |
+| **fester Zuschuss nebst Mindestschwelle, ober- und unterhalb derselben** | exakt |
+| **Mindestschwelle nebst Modus 2 (Halbierungsverfahren über die Sprungstelle)** | exakt |
+
+> Der Prüfanker ist **erhalten geblieben**: der ursprüngliche Formelgenerator ist für die
+> Depotverrentung mitgezogen worden (neue Eingaben, drei neue Spalten im Blatt `Auszahlung`,
+> zweite Memo-Zeile im Blatt `Vergleich`), die Mappe ist neu erzeugt und mit LibreOffice
+> durchgerechnet worden — 0 Formelfehler, und der Regelfall ist auf den Cent unverändert
+> geblieben. Der JavaScript-Kern wird gegen dieses Ergebnis geprüft und nicht gegen sich selbst.
+
+Es handelt sich um wenige Dutzend Einheiten der letzten Stelle, mithin um akkumulierten
+Gleitkommafehler und nicht um eine systematische Abweichung. Die Referenzwerte stammen aus einem
+LibreOffice-Durchlauf der Mappe unter denselben Eingaben.
+
+> Die **Voreinstellungen** der Anwendung weichen bewusst vom Excel-Regelfall ab: „Ausscheiden aus
+> dem Job" und „Teilzeit ab Alter" stehen beide auf 67, mithin auf „durchgehend bis zur Rente".
+> Die Testfälle setzen daher `ausscheid: 63, tzalter: 55` ausdrücklich; andernfalls würde ein
+> abweichendes Szenario geprüft, ohne dass dies bemerkt würde.
Damit die beiden Kopien des Kerns nicht auseinanderlaufen, schneidet `extract.js` Teil 1 aus
-`index.html` heraus und erzeugt daraus das `model.js`, gegen das getestet wird. Der Testkern
-*kann* also gar nicht vom ausgelieferten abweichen.
-
-Die Testskripte liegen unter `outputs/tests/`, `./tests/alle.sh` fährt alles durch:
-
-- **Stilblatt-Test:** vergleicht die im Dokument benutzten Klassen mit denen im Stilblatt,
- in beide Richtungen. Benutzt-ohne-Regel heißt: ein Element steht unformatiert da.
- Regel-ohne-Nutzung heißt: tote Zeilen, meist eine vergessene Umbenennung. Der Test hat
- nach dem Stilwechsel zwei echte Fehler gefunden — den unformatierten Wasserfall-Umschalter
- und sechs verwaiste Hilfsklassen. Zusätzlich: jede per `var()` referenzierte Farbvariable
- muss definiert sein.
+`index.html` heraus und erzeugt hieraus dasjenige `model.js`, gegen welches geprüft wird. Der
+Prüfkern *kann* mithin vom ausgelieferten Kern gar nicht abweichen.
+
+Die Prüfskripte werden als Sitzungsausgaben unter `outputs/tests/` geführt und liegen nicht im
+Arbeitsbaum vor; `./tests/alle.sh` fährt sämtliche Prüfungen durch:
+
+- **Stilblatt-Test:** vergleicht die im Dokument verwendeten Klassen mit denjenigen im Stilblatt,
+ und zwar in beiden Richtungen. Verwendet-ohne-Regel bedeutet: ein Element steht unformatiert
+ da. Regel-ohne-Verwendung bedeutet: tote Zeilen, im Regelfall eine unterbliebene Umbenennung.
+ Der Test hat nach dem Stilwechsel zwei tatsächliche Fehler aufgefunden — den unformatierten
+ Wasserfall-Umschalter sowie sechs verwaiste Hilfsklassen. Ergänzend gilt: jede per `var()`
+ referenzierte Farbvariable hat definiert zu sein.
- **Excel-Abgleich der Depotverrentung** (`7-avrente.js`): die drei neuen Fälle gegen einen
- frischen LibreOffice-Recalc, einschließlich der Memo-Zeile für Zahlungen nach dem Horizont.
-- **DOM-Test:** 57 Zusicherungen über jsdom — Karten, Sichtbarkeitsregeln, Regler, Segment-
- umschalter, Brutto-Netto-Kopplung in beide Richtungen, Fazittexte, mitlaufende Leiste,
- Rundung, Tabs, Kennzahlwechsel, Referenz merken, Zurücksetzen, `localStorage`.
- Die beiden seltenen Zweige des Fazits — „zulasten“ und „die Reihenfolge kehrt sich um“ —
- sind eigens durch Parametersuche im Modell aufgespürt und dann im DOM nachgestellt worden;
- ungetestete Textzweige sind sonst genau die, die beim Nutzer falsch dastehen.
+ frischen LibreOffice-Durchlauf, einschließlich der Memo-Zeile für Zahlungen nach dem Horizont.
+- **DOM-Test:** 57 Zusicherungen über jsdom — Karten, Sichtbarkeitsregeln, Regler,
+ Segmentumschalter, Brutto-Netto-Kopplung in beiden Richtungen, Fazittexte, mitlaufende Leiste,
+ Rundung, Registerkarten, Kennzahlwechsel, Referenz merken, Zurücksetzen, `localStorage`.
+ Die beiden seltenen Zweige des Fazits — „zulasten" und „die Reihenfolge kehrt sich um" — sind
+ eigens durch Parametersuche im Modell aufgespürt und sodann im DOM nachgestellt worden;
+ ungeprüfte Textzweige sind andernfalls genau diejenigen, welche beim Nutzer unzutreffend
+ dastehen.
- **Canvas-Test, Stufe 1** (Endlichkeit): 120 Kombinationen aus 2 Breiten × 15 Randfällen ×
- 4 Diagrammen. Jeder Zeichenaufruf wird auf endliche Koordinaten, gesetzte Farben und
- Beschriftungen ohne `NaN` geprüft. Fand drei echte Fehler: Division durch null bei
- Beitrag 0, entarteter Zeitraum bei Horizont = Rentenbeginn, und — der interessanteste —
- nicht ganzzahlige Zwischenwerte in der Sensitivitätskurve über das Feld *Alter*, wodurch
+ 4 Diagrammen. Jeder Zeichenaufruf wird auf endliche Koordinaten, gesetzte Farben sowie
+ Beschriftungen ohne `NaN` geprüft. Aufgefunden wurden drei tatsächliche Fehler: Division durch
+ null bei Beitrag 0, entarteter Zeitraum bei Horizont = Rentenbeginn, und — der bemerkenswerteste
+ — nicht ganzzahlige Zwischenwerte in der Sensitivitätskurve über das Feld *Alter*, wodurch
`Z[6,2]` indiziert wurde.
- **Canvas-Test, Stufe 2** (Sichtbarkeit): 400 Kombinationen aus 5 Breiten-/DPR-Paaren ×
- 20 Szenarien × 4 Diagrammen. Prüft zusätzlich, dass jede Koordinate **innerhalb der Bitmap**
- liegt. Diese Stufe entstand, nachdem Stufe 1 einen sichtbaren Fehler durchgelassen hatte:
- `prep()` skalierte die Zeichenmatrix mit `devicePixelRatio`, setzte `canvas.height` aber in
- logischen Pixeln — alles unterhalb von `h/dpr` wurde aus der Bitmap herausgezeichnet.
- Sämtliche Koordinaten waren dabei endlich, also fehlerfrei nach Stufe 1. Lehre: bei Canvas
- reicht „endlich“ nicht, es muss „im Bild“ geprüft werden.
-
-## 5. Was die App über das Excel hinaus kann
-
-- **Sensitivitätskurve** über den zuletzt bewegten Regler: 41 vollständige Modellläufe
- (~0,5 ms je Lauf), mit markierten Schnittpunkten gegen das Privatdepot. Damit sind
- Break-evens ablesbar statt ausgerechnet.
-- **Wasserfall der Werttreiber**, teleskopierend zerlegt, also exakt aufgehend. Reihenfolge-
- abhängig, weil die Effekte nicht additiv separierbar sind — die App sagt das dazu.
-- **Warnung bei uneiniger Rangfolge.** Barwert und äquivalente Monatsleistung ranken
- unterschiedlich, sobald der Wiederanlagezins nach Steuern deutlich über der Inflation liegt
- (im Basisfall 5,54 % gegen 2,00 %). Genau daran hängt die Aussage
- „PKV im Ruhestand dreht das Ergebnis“: nach Monatsleistung ja, nach Barwert nicht.
-- **Alle 45 Rechengrößen editierbar**, mit Fundstelle. Wer die Modellannahme
- „Sonderausgaben-Höchstbetrag 2.340 €“ (Vertrauensgrad ~70 %) nicht teilt, ändert sie.
-- **Live-Notizen an den Reglern.** Der Arbeitgeberzuschuss meldet, ab welchem Prozentsatz er
- sättigt; der Monatsbeitrag meldet das Überschreiten der 4-%- und der 8-%-Grenze der
- Beitragsbemessungsgrenze RV. Beides sind Schwellen, an denen der Regler seine Wirkung
- verliert oder die Rechtslage wechselt — ohne Hinweis dreht man ratlos weiter.
-- **Fester Arbeitgeberzuschuss** (Regler „Fester Zuschuss zusätzlich“, darunter der Schalter
- für die Dynamisierung, unter „Weitere Angaben“ die Mindest-Eigenleistung). Tarifvertragliche
- Festbeträge — Deutsche Bahn und viele andere — hängen nicht am Umwandlungsbetrag und stehen
- neben den 15 % des § 1a Abs. 1a BetrAVG. Der Regler meldet, wenn der Festbetrag den 4-%-Topf
- des § 1 Abs. 1 S. 1 Nr. 9 SvEV vorrangig belegt und dadurch die eigene Umwandlung verdrängt,
- und warnt oberhalb von 4 % der BBG-RV (2026: 338 €/Monat), wo das Modell die dann fällige
- Beitragspflicht des Überhangs bewusst nicht gegenrechnet.
-- **Klartext-Fazit** in einem Satz: wer vorn liegt, um wie viel, und welcher Posten des
- Wasserfalls den Abstand hauptsächlich trägt. Beschreibend formuliert, nicht empfehlend.
- Angehängt ein Belastbarkeitstest über ±1 Prozentpunkt Bruttorendite, der ausdrücklich sagt,
- wenn die Reihenfolge in dieser Spanne kippt — was sie überraschend oft tut.
-
-## 6. Bedienung auf dem Telefon
-
-Die Regler standen ursprünglich rund 1.000 px unter den Ergebniskarten. Wer auf einem 390-px-
-Gerät einen Regler schob, sah von der Wirkung **nichts** — genau das Gegenteil der Anforderung.
-Zwei Änderungen:
+ 20 Szenarien × 4 Diagrammen. Geprüft wird ergänzend, dass jede Koordinate **innerhalb der
+ Bitmap** liegt. Diese Stufe ist eingerichtet worden, nachdem Stufe 1 einen sichtbaren Fehler
+ durchgelassen hatte: `prep()` skalierte die Zeichenmatrix mit `devicePixelRatio`, setzte
+ `canvas.height` jedoch in logischen Pixeln — alles unterhalb von `h/dpr` wurde mithin aus der
+ Bitmap herausgezeichnet. Sämtliche Koordinaten waren dabei endlich und nach Stufe 1 mithin
+ fehlerfrei. Erkenntnis: bei Canvas genügt „endlich" nicht, es ist „im Bild" zu prüfen.
+
+## § 5 Was die Anwendung über die Tabellenkalkulation hinaus leistet
+
+- **Sensitivitätskurve** über denjenigen Regler, welcher zuletzt bewegt worden ist: 41
+ vollständige Modellläufe (~0,5 ms je Lauf) nebst gekennzeichneten Schnittpunkten gegenüber dem
+ privaten Depot. Gewinnschwellen sind hierdurch ablesbar und nicht zu errechnen.
+- **Wasserfall der Werttreiber**, teleskopierend zerlegt und mithin exakt aufgehend. Die
+ Darstellung ist reihenfolgeabhängig, da die Effekte nicht additiv separierbar sind; die
+ Anwendung weist hierauf hin.
+- **Warnhinweis bei uneinheitlicher Rangfolge.** Barwert und äquivalente Monatsleistung ranken
+ unterschiedlich, sobald der Wiederanlagezins nach Steuern die Inflationsrate deutlich
+ übersteigt (im Regelfall 5,54 gegenüber 2,00 vom Hundert). Hieran hängt genau die Aussage
+ „private Krankenversicherung im Ruhestand kehrt das Ergebnis um": nach Monatsleistung ja, nach
+ Barwert nicht.
+- **Sämtliche 45 Rechengrößen sind änderbar**, jeweils unter Angabe der Fundstelle. Wer die
+ Modellannahme „Sonderausgaben-Höchstbetrag 2.340 €" (Vertrauensgrad ~70 vom Hundert) nicht
+ teilt, hat sie zu ändern.
+- **Fortlaufende Notizen an den Reglern.** Der Arbeitgeberzuschuss meldet, ab welchem
+ Prozentsatz er sättigt; der Monatsbeitrag meldet das Überschreiten der 4-%- und der
+ 8-%-Grenze der Beitragsbemessungsgrenze der Rentenversicherung. Es handelt sich in beiden
+ Fällen um Schwellen, an welchen der Regler seine Wirkung verliert oder die Rechtslage wechselt;
+ ohne Hinweis würde ratlos weitergedreht.
+- **Fester Arbeitgeberzuschuss** (Regler „Fester Zuschuss zusätzlich", darunter der Schalter zur
+ Dynamisierung, unter „Weitere Angaben" die Mindest-Eigenleistung). Tarifvertragliche
+ Festbeträge — bei der Deutschen Bahn sowie in zahlreichen weiteren Tarifwerken vorgesehen —
+ hängen nicht am Umwandlungsbetrag und treten neben die 15 vom Hundert des § 1a Abs. 1a
+ BetrAVG. Der Regler meldet, wenn der Festbetrag den 4-%-Höchstbetrag des § 1 Abs. 1 S. 1 Nr. 9
+ SvEV vorrangig belegt und hierdurch die eigene Umwandlung verdrängt, und warnt oberhalb von
+ 4 vom Hundert der Beitragsbemessungsgrenze der Rentenversicherung (2026: 338 €/Monat), wo das
+ Modell die sodann anfallende Beitragspflicht des Überhangs bewusst nicht gegenrechnet.
+- **Klartextfazit** in einem Satz: wer vorn liegt, um welchen Betrag, und welcher Posten des
+ Wasserfalls den Abstand hauptsächlich trägt. Die Formulierung ist beschreibend und nicht
+ empfehlend gehalten. Angefügt ist ein Belastbarkeitstest über ±1 Prozentpunkt Bruttorendite,
+ welcher ausdrücklich mitteilt, wenn die Reihenfolge innerhalb dieser Spanne kippt — was
+ überraschend häufig der Fall ist.
+
+## § 6 Bedienung auf dem Telefon
+
+Die Regler standen ursprünglich rund 1.000 px unterhalb der Ergebniskarten. Wer auf einem
+390-px-Gerät einen Regler verschob, sah von der Wirkung **nichts** — mithin genau das Gegenteil
+der Anforderung. Zwei Änderungen wurden vorgenommen:
1. **Reihenfolge:** Ergebnis → *Ihre Angaben* → Diagramme → Weitere Angaben → Rechenweg.
- Die Diagramme sind Vertiefung, die Eingaben sind der Arbeitsplatz.
+ Die Diagramme dienen der Vertiefung, die Eingaben sind der Arbeitsplatz.
2. **Mitlaufende Ergebnisleiste**, eingeblendet per `IntersectionObserver`, sobald die
- Ergebniskarten den oberen Rand verlassen. Sie zeigt alle drei Werte, das Δ zum
- Referenzstand, die Bezeichnung der Kennzahl und einen Sprung zurück nach oben.
+ Ergebniskarten den oberen Rand verlassen. Sie weist sämtliche drei Werte, das Δ zum
+ Referenzstand, die Bezeichnung der Kennzahl sowie einen Rücksprung nach oben aus.
-Dazu: `:focus-visible` ist jetzt definiert (vorher gab es gar keine sichtbare Tastaturführung
-auf den Segment-Umschaltern), und `prefers-reduced-motion` schaltet Übergänge ab.
+Ergänzend gilt: `:focus-visible` ist nunmehr definiert (vormals bestand auf den
+Segmentumschaltern überhaupt keine sichtbare Tastaturführung), und `prefers-reduced-motion`
+schaltet Übergänge ab.
-> **Berichtigung.** Der `IntersectionObserver` beobachtete `#result`. Dieses Element gibt es
-> nicht; der Abschnitt heißt `#w-result`. `observe(null)` wirft nach WebIDL einen `TypeError`
-> (`observe(Element target)`), und die Ausnahme riss alles mit, was im Skript danach kam:
-> die Leiste selbst, die Registrierung des Service Workers und den Installationshinweis.
-> Behoben; die drei Dinge funktionieren erstmals.
+> **Berichtigung.** Der `IntersectionObserver` beobachtete `#result`. Ein solches Element besteht
+> nicht; der Abschnitt trägt die Bezeichnung `#w-result`. `observe(null)` wirft nach WebIDL einen
+> `TypeError` (`observe(Element target)`), und die Ausnahme riss alles mit sich, was im Skript
+> nachfolgte: die Leiste selbst, die Registrierung des Dienstarbeiters sowie den
+> Installationshinweis. Der Mangel ist behoben; die drei Vorgänge sind erstmals betriebsfähig.
-## 6b. Bedienung auf breiten Schirmen
+## § 6b Bedienung auf breiten Bildschirmen
Ein Fenster wird nicht breiter als rund 570 px. Darüber hinaus wird keine Zeile lesbarer — die
-Typografie mag 45 bis 75 Zeichen —, also wandert der gewonnene Platz in eine weitere Spalte
-statt in längere Zeilen:
+Typografie verträgt 45 bis 75 Zeichen —, weshalb der gewonnene Platz in eine weitere Spalte und
+nicht in längere Zeilen wandert:
| Breite | Spalten | Aufteilung |
|---|---|---|
| < 1080 px | 1 | Quelltextreihenfolge, unverändert |
| ≥ 1080 px | 2 | Eingaben ‖ Ausgaben |
-| ≥ 1560 px | 3 | Eingaben ‖ Ergebnis + Diagramm ‖ Herleitung |
-
-Die Aufteilung folgt der Wirkungsrichtung: was man anfasst, steht links; was daraus folgt,
-rechts daneben und damit **gleichzeitig im Bild**. Das ist der eigentliche Gewinn — Ursache und
-Wirkung ohne Scrollen, wofür auf dem Telefon die mitlaufende Leiste einspringt.
-
-Drei Entwurfsentscheidungen, jede mit ihrem Grund:
-
-1. **Die Fenster werden wirklich umgehängt** (`LAY.apply`), nicht bloß per CSS umsortiert.
- Der Quelltext bleibt einspaltig und damit in der für schmale Geräte richtigen Reihenfolge.
- `display:contents` auf vorgebauten Spalten hätte genau diese Reihenfolge zerstört, und eine
- reine Grid-Zuweisung (`grid-column`/`grid-row`) hätte in jeder Zeile eine Lücke in Höhe des
- jeweils höchsten Fensters gelassen. Echte Blockcontainer packen dicht.
-2. **`position:sticky` braucht einen Blockcontainer.** Der Grid-Bereich eines Elements ist genau
- eine Zeile hoch; ein darin klebendes Element hätte keinen Weg, sich irgendwohin zu kleben.
- Deshalb `.col` als Zwischenebene — und deshalb bleibt das Ergebnisfenster in seiner Spalte
- oben stehen, während links die Regler wandern. Die mitlaufende Leiste blendet sich dabei von
- selbst aus, ohne Sonderfall im Code: ihr Beobachter sieht das angeheftete Fenster ja
- unverwandt im Bild.
-3. **Die Enge hängt nicht mehr am Schirm, sondern am Fenster.** Ein 560 px breites Fenster auf
- einem 1600-px-Schirm braucht dieselben Regeln wie ein Telefon. Das ist der Fall, für den es
- `@container` gibt; die alten `@media (max-width:640px)`-Regeln bleiben als Rückfall stehen.
-
-Ein angeheftetes Fenster nimmt dauerhaft Platz weg. Über 60 % der Schirmhöhe wäre das ein
-schlechter Tausch, und ein Fenster höher als der Schirm ließe sein unteres Ende gar nicht mehr
-erreichen. In dem Fall (`body.nosticky`, gesetzt nach Messung in `LAY.fit`) scrollt es normal
-mit, und die mitlaufende Leiste übernimmt wieder — die dafür ja gebaut ist.
-
-Der Rechenweg baut 98 Tabellenzeilen. Solange kein Abschnitt aufgeklappt ist, wird der
-Neuaufbau jetzt bis 300 ms nach der letzten Eingabe verschoben und beim Aufklappen nachgeholt.
-
-## 7. Zwei Zinssätze und der Kapitalverlauf
-
-In der Auszahlungsphase arbeiten **zwei verschiedene Zinssätze**, und das ist kein Versehen:
+| ≥ 1560 px | 3 | Eingaben ‖ Ergebnis nebst Diagramm ‖ Herleitung |
+
+Die Aufteilung folgt der Wirkungsrichtung: was betätigt wird, steht links; was hieraus folgt,
+rechts daneben und mithin **gleichzeitig im Bild**. Hierin liegt der eigentliche Gewinn — Ursache
+und Wirkung ohne Scrollen, wofür auf dem Telefon die mitlaufende Leiste einspringt.
+
+Drei Entwurfsentscheidungen, jede nebst ihrer Begründung:
+
+1. **Die Fenster werden tatsächlich umgehängt** (`LAY.apply`) und nicht lediglich per CSS
+ umsortiert. Der Quelltext verbleibt einspaltig und mithin in der für schmale Geräte
+ zutreffenden Reihenfolge. `display:contents` auf vorgebauten Spalten hätte genau diese
+ Reihenfolge zerstört, und eine reine Grid-Zuweisung (`grid-column`/`grid-row`) hätte in jeder
+ Zeile eine Lücke in Höhe des jeweils höchsten Fensters hinterlassen. Echte Blockcontainer
+ packen dicht.
+2. **`position:sticky` bedarf eines Blockcontainers.** Der Grid-Bereich eines Elements ist genau
+ eine Zeile hoch; ein darin klebendes Element hätte keine Möglichkeit, sich irgendwohin zu
+ kleben. Hierfür besteht `.col` als Zwischenebene — und aus demselben Grund verbleibt das
+ Ergebnisfenster in seiner Spalte oben stehen, während links die Regler wandern. Die
+ mitlaufende Leiste blendet sich dabei von selbst aus, und zwar ohne Sonderfall im Code: ihr
+ Beobachter sieht das angeheftete Fenster unverwandt im Bild.
+3. **Die Enge hängt nicht mehr am Bildschirm, sondern am Fenster.** Ein 560 px breites Fenster
+ auf einem 1600-px-Bildschirm bedarf derselben Regeln wie ein Telefon. Es handelt sich um
+ denjenigen Fall, für welchen `@container` besteht; die vormaligen
+ `@media (max-width:640px)`-Regeln verbleiben als Rückfallebene.
+
+Ein angeheftetes Fenster nimmt dauerhaft Platz in Anspruch. Bei über 60 vom Hundert der
+Bildschirmhöhe wäre dies ein ungünstiger Tausch, und ein Fenster, welches höher als der Bildschirm
+ist, ließe sein unteres Ende überhaupt nicht mehr erreichen. In diesem Fall (`body.nosticky`,
+gesetzt nach Messung in `LAY.fit`) scrollt es regulär mit, und die mitlaufende Leiste übernimmt
+wieder — wofür sie eingerichtet worden ist.
+
+Der Rechenweg baut 98 Tabellenzeilen auf. Solange kein Abschnitt aufgeklappt ist, wird der
+Neuaufbau nunmehr bis 300 ms nach der letzten Eingabe verschoben und beim Aufklappen nachgeholt.
+
+## § 7 Zwei Zinssätze und der Kapitalverlauf
+
+In der Auszahlungsphase wirken **zwei verschiedene Zinssätze**; hierbei handelt es sich nicht um
+ein Versehen:
| Geld … | verzinst sich mit | versteuert |
|---|---|---|
@@ -460,9 +496,9 @@ In der Auszahlungsphase arbeiten **zwei verschiedene Zinssätze**, und das ist k
| … im Produkt (Privatdepot) | `rnet_priv` = 6,80 % | erst bei Entnahme |
| … ausgezahlt, noch nicht verbraucht | `wiederanl` = **5,54 %** | bereits versteuert |
-Wieviel davon betroffen ist, entscheidet die **Auszahlungsform**. Beide geförderten Produkte
-haben eine, und sie sind **unabhängig voneinander** einstellbar — wer die bAV als Kapital nimmt,
-kann das Depot trotzdem verrenten:
+In welchem Umfang dies zum Tragen kommt, entscheidet die **Auszahlungsform**. Beide geförderten
+Produkte verfügen über eine solche, und sie sind **unabhängig voneinander** einstellbar: wer die
+betriebliche Altersversorgung als Kapital nimmt, kann das Depot gleichwohl verrenten:
| | Einmalbetrag | Rest |
|---|---|---|
@@ -471,24 +507,28 @@ kann das Depot trotzdem verrenten:
### Die Verrentung des Altersvorsorgedepots
-Beim Depot hängen an der Auszahlungsform **drei** Wirkungen — nicht vier wie bei der bAV, weil
-KV/PV entfällt (keine Versorgungsbezüge):
-
-1. **Ertragsanteil statt halbem Unterschiedsbetrag** für die nicht geförderte Schicht, im
- Basisfall 30,7 % des Kapitals. Steuerpflichtig sind dann 17,0 % der Rente statt 26,2 % der
- Planentnahme (§ 22 Nr. 5 S. 2 Buchst. a EStG). Ein echter Vorteil der Verrentung.
-2. **Rentenfaktor statt Marktrendite** auf das Restkapital — eigenes Eingabefeld `rentfak_av`,
- weil ein Depotvertrag ohne Versicherungsmantel auskommt und günstiger sein kann.
-3. **Zahlungen nach dem Horizont**, die der Vergleich nicht mitzählt. Eigene Memo-Zeile in der
- Diagnose und eine Live-Notiz am Schalter; im Basisfall 145.618 €.
-
-Die geförderte Schicht ist in beiden Formen voll nachgelagert steuerpflichtig
-(§ 22 Nr. 5 S. 1 EStG) — daran ändert die Auszahlungsform nichts. Der Einmalbetrag wirkt in
-beiden Formen und wird als Kapital besteuert, auch wenn der Rest verrentet wird.
-
-Beim Altersvorsorgedepot kostet der Einmalbetrag aus denselben zwei Gründen wie bei der bAV:
-volle Progression im Zuflussjahr und danach nur noch der Satz nach Abgeltungsteuer. Im
-Basisfall:
+Beim Depot hängen an der Auszahlungsform **drei** Wirkungen — und nicht vier wie bei der
+betrieblichen Altersversorgung, da Beiträge zur Kranken- und Pflegeversicherung entfallen (keine
+Versorgungsbezüge):
+
+1. **Ertragsanteil anstelle des halben Unterschiedsbetrags** für die nicht geförderte Schicht, im
+ Regelfall 30,7 vom Hundert des Kapitals. Steuerpflichtig sind sodann 17,0 vom Hundert der
+ Rente anstelle von 26,2 vom Hundert der Planentnahme (§ 22 Nr. 5 S. 2 Buchst. a EStG). Es
+ handelt sich um einen tatsächlichen Vorteil der Verrentung.
+2. **Rentenfaktor anstelle der Marktrendite** auf das Restkapital — hierfür besteht ein eigenes
+ Eingabefeld `rentfak_av`, da ein Depotvertrag ohne Versicherungsmantel auskommt und mithin
+ günstiger sein kann.
+3. **Zahlungen nach dem Horizont**, welche der Vergleich nicht mitzählt. Hierfür bestehen eine
+ eigene Memo-Zeile in der Diagnose sowie eine fortlaufende Notiz am Schalter; im Regelfall
+ 145.618 €.
+
+Die geförderte Schicht ist in beiden Formen in vollem Umfang nachgelagert steuerpflichtig (§ 22
+Nr. 5 S. 1 EStG); hieran ändert die Auszahlungsform nichts. Der Einmalbetrag wirkt in beiden
+Formen und wird als Kapital besteuert, auch wenn der Rest verrentet wird.
+
+Beim Altersvorsorgedepot verursacht der Einmalbetrag aus denselben zwei Gründen Kosten wie bei
+der betrieblichen Altersversorgung: volle Progression im Zuflussjahr und sodann lediglich noch
+der Satz nach Abgeltungsteuer. Im Regelfall:
| Einmalbetrag | steuerpflichtig Jahr 0 | Grenzbelastung | Monatsleistung |
|---|---|---|---|
@@ -496,18 +536,20 @@ Basisfall:
| 15 % | 42.543 € | 29,7 % | 840,09 € |
| 30 % | 67.793 € | 32,3 % | 823,37 € |
-Zwei Kontrollen dazu: das Restkapital am Horizont ist über alle geprüften Renditen, Horizonte
-und Einmalbeträge **exakt 0,00 €** — der Annuitätenfaktor passt zur Rekursion, es wird nichts
-stillschweigend einbehalten. Und der Überschuss über den Jahreshöchstbetrag („Sleeve“) wird
-ohne Einmalbetrag verrentet; das ist eine Modellkonvention, kein Rechtssatz.
+Zwei Kontrollen sind hierzu vorgenommen worden: das Restkapital am Horizont beträgt über
+sämtliche geprüften Renditen, Horizonte und Einmalbeträge **exakt 0,00 €** — der
+Annuitätenfaktor passt mithin zur Rekursion, und es wird nichts stillschweigend einbehalten.
+Ferner wird der Überschuss über den Jahreshöchstbetrag („Sleeve") ohne Einmalbetrag verrentet;
+hierbei handelt es sich um eine Modellkonvention und nicht um einen Rechtssatz.
-**Verbleibende Modelllücke, ausdrücklich:** die bAV kennt weiterhin nur ganz oder gar nicht.
-Eine Teilkapitalisierung der Betriebsrente, die es in der Praxis gibt, ist nicht abgebildet —
-anders als beim Depot, wo Einmalbetrag und Verrentung seit dieser Fassung kombinierbar sind.
+**Verbleibende Modelllücke, ausdrücklich:** die betriebliche Altersversorgung kennt weiterhin
+lediglich die vollständige oder die unterbliebene Kapitalisierung. Eine Teilkapitalisierung der
+Betriebsrente, welche in der Praxis vorkommt, ist nicht abgebildet — abweichend vom Depot, wo
+Einmalbetrag und Verrentung seit dieser Fassung kombinierbar sind.
### Der Kapitalverlauf
-Eine Größe über die ganze Zeitachse, mit Verbrauch und mit Liquiditätszerlegung.
+Eine Größe über die gesamte Zeitachse, nebst Verbrauch und nebst Liquiditätszerlegung.
```
Wiederanlage(0) = 0
@@ -515,7 +557,7 @@ Wiederanlage(t+1) = (Wiederanlage(t) + netto(t))·(1+w) − M M = V(0)·ANN
Vermögen(t) = Produktkonto(t) + Wiederanlage(t)
```
-Die äquivalente Monatsleistung wird also **tatsächlich verbraucht**. Weil `ANNW` der
+Die äquivalente Monatsleistung wird mithin **tatsächlich verbraucht**. Da `ANNW` der
nachschüssige Annuitätenfaktor ist und der Konsum am Jahresende abgeht, gilt
`Wiederanlage(n) = 0` exakt.
@@ -523,40 +565,41 @@ Vier geprüfte Identitäten:
| | |
|---|---|
-| `Vermögen(0) = Produktkapital` | 0,00 € — die Wiederanlage ist am Rentenbeginn null, die Kurve läuft **knickfrei** durch |
-| `Vermögen(n) = 0` | 7,4 · 10⁻¹⁰ € — jede Option ist am Horizont punktgenau aufgebraucht |
-| `M = V(0)·ANNW`, `M/12` diskontiert `=` Monatsleistung | 0,00 € — der Verbrauch ist genau die Kennzahl oben |
+| `Vermögen(0) = Produktkapital` | 0,00 € — die Wiederanlage beträgt am Rentenbeginn null, die Kurve verläuft **knickfrei** |
+| `Vermögen(n) = 0` | 7,4 · 10⁻¹⁰ € — jede Variante ist am Horizont punktgenau aufgebraucht |
+| `M = V(0)·ANNW`, `M/12` diskontiert `=` Monatsleistung | 0,00 € — der Verbrauch entspricht genau der vorstehenden Kennzahl |
| Pfade **nicht** proportional | AV/privat wandert von 1,3152 auf 1,2497 |
-> **Warum das nicht proportional ist — und die naheliegende Variante schon.**
-> Setzt man *alles* auf den Wiederanlagezins und konsumiert daraus
-> (`G(t+1) = G(t)(1+w) − M`), kürzt sich der Unterschied heraus: `G_x/G_y = M_x/M_y` für alle t,
-> geprüft auf 4 · 10⁻¹⁴. Entscheidend ist, **wo** der Konsum abgeht. Nimmt man ihn nur aus der
-> Wiederanlage und lässt das Produktkapital im Produkt, wo es mit der Produktrendite **vor**
-> Steuern wächst, bleibt genau der Unterschied stehen, um den es geht.
+> **Weshalb dies nicht proportional ist — die naheliegende Variante hingegen schon.**
+> Wird *alles* auf den Wiederanlagezins gesetzt und hieraus konsumiert
+> (`G(t+1) = G(t)(1+w) − M`), so kürzt sich der Unterschied heraus: `G_x/G_y = M_x/M_y` für alle
+> t, geprüft auf 4 · 10⁻¹⁴. Maßgeblich ist mithin, **wo** der Konsum abgeht. Wird er
+> ausschließlich der Wiederanlage entnommen und verbleibt das Produktkapital im Produkt, wo es
+> mit der Produktrendite **vor** Steuern wächst, so verbleibt genau derjenige Unterschied, um
+> welchen es geht.
### Liquidität
-Durchgezogen das Vermögen insgesamt, gestrichelt in derselben Farbe der **frei verfügbare**
-Teil. Der Abstand ist gebundenes Kapital.
+Durchgezogen dargestellt ist das Vermögen insgesamt, gestrichelt in derselben Farbe der **frei
+verfügbare** Teil. Der Abstand ist gebundenes Kapital.
-| | Bindung | im Basisfall bei Rentenbeginn |
+| | Bindung | im Regelfall bei Rentenbeginn |
|---|---|---|
-| bAV | vollständig bis zum Rentenbeginn — § 1b BetrAVG kennt Unverfallbarkeit, nicht Verfügbarkeit; danach kein Konto mehr | **0 € von 357.076 € frei** |
-| Altersvorsorgedepot | Entnahme vor 65 ist förderschädlich; frei ist nur der „Sleeve“ über dem Jahreshöchstbetrag | 0 € von 240.001 € frei |
+| bAV | vollständig bis zum Rentenbeginn — § 1b BetrAVG kennt die Unverfallbarkeit, nicht die Verfügbarkeit; danach besteht kein Konto mehr | **0 € von 357.076 € frei** |
+| Altersvorsorgedepot | eine Entnahme vor Vollendung des 65. Lebensjahres ist förderschädlich; frei ist ausschließlich der „Sleeve" oberhalb des Jahreshöchstbetrags | 0 € von 240.001 € frei |
| privates ETF-Depot | jederzeit | **182.489 € von 182.489 € frei** |
-Das ist die einzige Achse, auf der eine bAV-Kapitalauszahlung gut aussieht: mit 68 springt sie
-von 0 % auf 100 % Verfügbarkeit. Und es ist die Achse, die in Beratungsgesprächen am häufigsten
-fehlt.
+Es handelt sich um die einzige Achse, auf welcher eine Kapitalauszahlung der betrieblichen
+Altersversorgung günstig erscheint: mit 68 springt sie von 0 auf 100 vom Hundert Verfügbarkeit.
+Und es ist diejenige Achse, welche in Beratungsgesprächen am häufigsten fehlt.
-### Warum kein Konsummodell
+### Weshalb kein Konsummodell
-Naheliegend wäre, Lebenshaltungskosten als eigene Eingabe zu führen. Das wurde geprüft und
-verworfen — es trägt **beweisbar keine vergleichende Information**. Weil der Nettoaufwand in
-allen drei Optionen identisch ist, unterscheiden sich die Zahlungsströme nur in der
-Auszahlungsphase; ein für alle drei gleicher Konsumstrom `C` ist damit eine gemeinsame additive
-Verschiebung:
+Naheliegend wäre, die Lebenshaltungskosten als eigene Eingabe zu führen. Dies ist geprüft und
+verworfen worden — es trägt **nachweislich keine vergleichende Information**. Da der
+Nettoaufwand in sämtlichen drei Varianten identisch ist, unterscheiden sich die Zahlungsströme
+ausschließlich in der Auszahlungsphase; ein für alle drei gleicher Konsumstrom `C` stellt mithin
+eine gemeinsame additive Verschiebung dar:
| Konsum | AV − privat bei t = 5 | bei t = 15 | bAV − privat bei t = 15 |
|---|---|---|---|
@@ -564,119 +607,128 @@ Verschiebung:
| 12.000 €/Jahr | 55.049,182535 € | 56.681,527808 € | −62.016,690135 € |
| 60.000 €/Jahr | 55.049,182535 € | 56.681,527808 € | −62.016,690135 € |
-Auf sechs Nachkommastellen identisch. Dazu käme: ein ehrliches Konsummodell bräuchte in der
-Ansparphase auch das Gehalt, sonst liefe die Kurve sofort ins Minus — das wäre ein
-Haushaltsplaner, kein Förderarchitektur-Vergleich. Und die Zahl „leer mit 87“ würde als Aussage
-über die Altersvorsorge insgesamt gelesen, obwohl das Modell nur diese eine Entscheidung kennt.
+Auf sechs Nachkommastellen identisch. Hinzu träte: ein sachgerechtes Konsummodell bedürfte in der
+Ansparphase auch des Gehalts, da die Kurve andernfalls unverzüglich ins Minus liefe — dies wäre
+ein Haushaltsplaner und kein Vergleich der Förderarchitekturen. Ferner würde die Angabe „leer mit
+87" als Aussage über die Altersvorsorge insgesamt gelesen, obgleich das Modell ausschließlich
+diese eine Entscheidung kennt.
-Der Verbrauch der **äquivalenten** Monatsleistung ist etwas anderes: er ist je Option
-verschieden, aus dem Modell abgeleitet und braucht keine Fremdannahme. Deshalb steht er drin.
+Der Verbrauch der **äquivalenten** Monatsleistung ist demgegenüber etwas anderes: er ist je
+Variante verschieden, aus dem Modell abgeleitet und bedarf keiner Fremdannahme. Er ist daher
+enthalten.
### Vier verworfene Fassungen
-Der Weg dorthin lohnt die Notiz, weil jede Zwischenstufe an einem anderen Denkfehler scheiterte:
+Der Weg dorthin verdient die Notiz, da jede Zwischenstufe an einem anderen Denkfehler scheiterte:
-1. **Nur das Produktkonto.** Die bAV fällt bei Kapitalwahl auf null und schweigt über den Rest.
- Verschweigt, dass die Kennzahl sehr wohl eine Wiederanlage unterstellt.
-2. **Die prospektive Reserve `V(t)`.** Mathematisch tadellos und exakt die Größe hinter der
- Monatsleistung — aber nach einer Kapitalauszahlung **negativ** (−54.555 € ab Alter 68), weil
- dann nur noch Lasten ausstehen. Wahr, wichtig, und als Kurve unlesbar.
-3. **Der reine Entsparpfad** `G(t+1) = G(t)(1+w) − M`. Läuft sauber auf null, aber die Pfade
- sind dann zwangsläufig proportional: wer den Verbrauch fixiert *und* alles zum selben Zins
+1. **Ausschließlich das Produktkonto.** Die betriebliche Altersversorgung fällt bei Kapitalwahl
+ auf null und schweigt über den Rest. Verschweigt mithin, dass die Kennzahl sehr wohl eine
+ Wiederanlage unterstellt.
+2. **Die prospektive Reserve `V(t)`.** Mathematisch tadellos und exakt diejenige Größe hinter der
+ Monatsleistung — nach einer Kapitalauszahlung jedoch **negativ** (−54.555 € ab Alter 68), da
+ sodann lediglich noch Lasten ausstehen. Zutreffend, bedeutsam, und als Kurve unlesbar.
+3. **Der reine Entsparpfad** `G(t+1) = G(t)(1+w) − M`. Läuft sauber auf null, doch sind die Pfade
+ sodann zwangsläufig proportional: wer den Verbrauch fixiert *und* alles zu demselben Zins
führt, hat das Vermögen determiniert.
4. **Der beitragsfreie Wert** in der Ansparphase, um den Einheitenwechsel am Rentenbeginn zu
- vermeiden. Stetig und sauber, aber es blieb bei einer Nettogröße, die für das Privatdepot
- eine Bewegung suggeriert, wo keine ist.
-
-## 8. Eine Lesefalle in der Sensitivitätskurve
-
-Reglern wie *Jahresbrutto* oder *Monatsbeitrag* verändern nicht nur die Förderarchitektur,
-sondern auch den **Nettoaufwand** — und damit den Betrag, der in allen drei Optionen investiert
-wird. Die drei Kurven sind deshalb bei jedem einzelnen x fair vergleichbar, das Niveau zwischen
-verschiedenen x aber nicht. Die auffälligen Sprünge sind echt und sitzen an den
-Beitragsbemessungsgrenzen: oberhalb von 69.750 € spart die Entgeltumwandlung keine
-KV/PV-Beiträge mehr, oberhalb von 101.400 € auch keine RV/AV-Beiträge. Der Nettoaufwand
-springt dort um bis zu 15 %, die investierte Summe mit ihm. Die App blendet einen Hinweis mit
-der tatsächlichen Spanne ein, sobald der Effekt 2 % übersteigt.
-
-## 9. Zwei Befunde, die beim Portieren aufgefallen sind
-
-**Die Vorabpauschale ist im Basisfall ein Vorteil für das Privatdepot.** Über 35 Jahre fallen
-121.774 € Vorabpauschale an, davon werden aber nur 11.942 € tatsächlich versteuert — der Rest
-läuft in den Sparer-Pauschbetrag. Die *volle* Summe erhöht dagegen die Kostenbasis und spart
-bei der Entnahme rund 22.000 € Abgeltungsteuer. Setzt man den Sparer-Pauschbetrag auf null,
-dreht das Vorzeichen. Der Balken „Wegfall der Vorabpauschale“ im Wasserfall ist deshalb
-negativ; das ist kein Vorzeichenfehler.
-
-**Der Arbeitgeberzuschuss sättigt — und zwar früher, als man denkt.** Im Zuschussmodus „spitz“
-(§ 1a Abs. 1a BetrAVG wörtlich) wächst der Zuschuss nur bis zur tatsächlichen SV-Ersparnis des
-Arbeitgebers. Bei 75.000 € Gehalt und 300 €/Monat liegt das Entgelt bereits **über** der
-KV-Beitragsbemessungsgrenze von 69.750 €: der Arbeitgeber spart dort überhaupt keine
-KV/PV-Beiträge, sondern nur RV/AV auf 3.600 €, also 381,60 € im Jahr — das sind 10,6 % des
-umgewandelten Betrags. Der gesetzliche Mindestzuschuss von 15 % ist damit schon der gedeckelte
-Wert; **jede Erhöhung des Reglers ist wirkungslos.** Die App zeigt das jetzt direkt am Regler an.
-
-Der im README des Modells genannte Break-even von ~26,7 % ist folglich im spitzen Modus gar
-nicht erreichbar, sondern nur in den Modi „voller Beitrag“ bzw. „sv-freier Anteil“.
-Die Sensitivitätskurve zeigt die Sättigung als waagerechten Ast.
+ vermeiden. Stetig und sauber, doch verblieb es bei einer Nettogröße, welche für das
+ Privatdepot eine Bewegung suggeriert, wo eine solche nicht besteht.
+
+## § 8 Eine Lesefalle in der Sensitivitätskurve
+
+Regler wie *Jahresbrutto* oder *Monatsbeitrag* verändern nicht allein die Förderarchitektur,
+sondern auch den **Nettoaufwand** — und mithin denjenigen Betrag, welcher in sämtlichen drei
+Varianten angelegt wird. Die drei Kurven sind daher bei jedem einzelnen x sachgerecht
+vergleichbar, das Niveau zwischen verschiedenen x hingegen nicht. Die auffälligen Sprünge sind
+zutreffend und sitzen an den Beitragsbemessungsgrenzen: oberhalb von 69.750 € erspart die
+Entgeltumwandlung keine Beiträge zur Kranken- und Pflegeversicherung mehr, oberhalb von
+101.400 € auch keine Beiträge zur Renten- und Arbeitslosenversicherung. Der Nettoaufwand springt
+dort um bis zu 15 vom Hundert, die angelegte Summe mit ihm. Die Anwendung blendet einen Hinweis
+nebst der tatsächlichen Spanne ein, sobald der Effekt 2 vom Hundert übersteigt.
+
+## § 9 Zwei Befunde, welche bei der Portierung aufgefallen sind
+
+**Die Vorabpauschale stellt im Regelfall einen Vorteil für das Privatdepot dar.** Über 35 Jahre
+fallen 121.774 € Vorabpauschale an, wovon jedoch lediglich 11.942 € tatsächlich versteuert werden
+— der Rest läuft in den Sparer-Pauschbetrag. Die *vollständige* Summe erhöht demgegenüber die
+Kostenbasis und erspart bei der Entnahme rund 22.000 € Abgeltungsteuer. Wird der
+Sparer-Pauschbetrag auf null gesetzt, so dreht das Vorzeichen. Der Balken „Wegfall der
+Vorabpauschale" im Wasserfall ist daher negativ; es handelt sich nicht um einen Vorzeichenfehler.
+
+**Der Arbeitgeberzuschuss sättigt — und zwar früher als angenommen.** Im spitz berechneten
+Zuschussmodus (§ 1a Abs. 1a BetrAVG dem Wortlaut nach) wächst der Zuschuss lediglich bis zur
+tatsächlichen Ersparnis des Arbeitgebers an Sozialversicherungsbeiträgen. Bei 75.000 € Gehalt
+und 300 €/Monat liegt das Entgelt bereits **oberhalb** der Beitragsbemessungsgrenze der
+Krankenversicherung von 69.750 €: der Arbeitgeber erspart dort überhaupt keine Beiträge zur
+Kranken- und Pflegeversicherung, sondern lediglich zur Renten- und Arbeitslosenversicherung auf
+3.600 €, mithin 381,60 € im Jahr — dies entspricht 10,6 vom Hundert des umgewandelten Betrags.
+Der gesetzliche Mindestzuschuss von 15 vom Hundert ist damit bereits der gedeckelte Wert; **jede
+Erhöhung des Reglers bleibt wirkungslos.** Die Anwendung weist dies nunmehr unmittelbar am
+Regler aus.
+
+Die im übergeordneten README genannte Gewinnschwelle von ~26,7 vom Hundert ist folglich im
+spitzen Modus nicht erreichbar, sondern ausschließlich in den Modi „voller Beitrag" bzw.
+„sv-freier Anteil". Die Sensitivitätskurve weist die Sättigung als waagerechten Ast aus.
---
-## 10. Das Aussehen: Windows 3.1 / NT 3.5
+## § 10 Das Erscheinungsbild: Windows 3.1 / NT 3.5
-Silber `#C0C0C0` auf Petrol `#008080`, Navy-Titelleisten, harte Ein-Pixel-Kanten, alles aus der
-16-Farben-VGA-Palette. **Es gibt nur ein Farbschema** — `prefers-color-scheme` ist entfernt,
-eine Dunkelvariante gäbe es hier nicht zu skinnen.
+Silber `#C0C0C0` auf Petrol `#008080`, Titelleisten in Navy, harte Ein-Pixel-Kanten, alles aus
+der 16-Farben-VGA-Palette. **Es besteht ausschließlich ein Farbschema** — `prefers-color-scheme`
+ist entfernt worden; eine Dunkelvariante wäre hier nicht zu gestalten.
-Drei Kantenformen tragen die ganze Oberfläche:
+Drei Kantenformen tragen die gesamte Bedienoberfläche:
-| Form | Aufbau | Wo |
+| Form | Aufbau | Verwendung |
|---|---|---|
| erhaben (3.1) | `1px solid #000` + `inset 1px 1px 0 #FFF` + `inset -1px -1px 0 #808080` | Schaltflächen |
| erhaben (95) | zusätzlich `border-color:#DFDFDF #000 #000 #DFDFDF` | Fenster, Kacheln |
| versenkt | `border-color:#808080 #FFF #FFF #808080` + `inset 1px 1px 0 #000` | Felder, Zeichenfläche |
-Gedrückte Umschalter bekommen zusätzlich das Rastermuster der eingerasteten Werkzeugleiste
+Gedrückte Umschalter erhalten ergänzend das Rastermuster der eingerasteten Werkzeugleiste
(`repeating-conic-gradient` mit 2 px Kachel). Das Fokusrechteck ist das originale gepunktete —
-zugleich das barrierefreiste, was Windows je hatte.
+zugleich dasjenige, welches Windows je an Barrierefreiheit aufzuweisen hatte.
-### Was bewusst aus Windows 95 / NT 4 kommt
+### Was bewusst aus Windows 95 / NT 4 übernommen worden ist
-Windows 3.1 kannte diese Steuerelemente schlicht nicht, und ohne sie wäre die App schlechter:
+Windows 3.1 kannte diese Steuerelemente schlicht nicht, und ohne sie wäre die Anwendung
+schlechter:
-- **Trackbar** — der Schieberegler ist ein Win95-Common-Control. Unter 3.1 hätte man Zahlen
- eintippen müssen; die unmittelbare Rückkopplung wäre dahin.
-- **Registerkarten** — 3.1 löste Mehrseitigkeit über eigene Dialoge. Vier Diagramme in vier
- Fenstern wären hier klar schlechter.
-- **Versenkter Rahmen** (`WS_EX_CLIENTEDGE`) statt 3.1s einfachem schwarzen Rahmen um
+- **Trackbar** — der Schieberegler ist ein Win95-Common-Control. Unter 3.1 wären Zahlen
+ einzutippen gewesen; die unmittelbare Rückkopplung wäre mithin entfallen.
+- **Registerkarten** — 3.1 löste die Mehrseitigkeit über eigene Dialoge. Vier Diagramme in vier
+ Fenstern wären hier eindeutig schlechter.
+- **Versenkter Rahmen** (`WS_EX_CLIENTEDGE`) anstelle des einfachen schwarzen Rahmens von 3.1 um
Eingabefelder — liest sich deutlich besser.
### Was 3.1 besser konnte
-Die Segmentschalter sind zu **echten Optionsfeldgruppen** geworden. Das ist die authentische
-Entsprechung für eine Auswahl unter wenigen Alternativen, es ist das semantisch richtige
-Element, und die Pfeiltastennavigation der Radiogruppe gibt es geschenkt.
+Die Segmentschalter sind zu **echten Optionsfeldgruppen** geworden. Dies ist die authentische
+Entsprechung für eine Auswahl unter wenigen Alternativen, es ist das semantisch zutreffende
+Element, und die Pfeiltastennavigation der Radiogruppe tritt ohne weiteres Zutun hinzu.
-### Fenster, die wirklich Fenster sind
+### Fenster, welche tatsächlich Fenster sind
-Jeder Abschnitt hat eine Titelleiste mit Systemmenü-Kasten und Minimieren-Knopf. Der Knopf ist
-kein Zierrat: er klappt den Inhalt tatsächlich ein, Doppelklick auf die Titelleiste ebenso, und
-der Zustand wird gespeichert. Auf dem Telefon ist das nützlich — man klappt „Ihre Angaben“ zu
-und hat das Diagramm ganzseitig.
+Jeder Abschnitt verfügt über eine Titelleiste nebst Systemmenü-Kasten und Minimieren-Schaltfläche.
+Die Schaltfläche ist kein Zierrat: sie klappt den Inhalt tatsächlich ein, ein Doppelklick auf die
+Titelleiste gleichermaßen, und der Zustand wird vorgehalten. Auf dem Telefon ist dies von Nutzen
+— „Ihre Angaben" wird zugeklappt, und das Diagramm steht ganzseitig zur Verfügung.
-Grau ist unter Windows die Farbe des *Deaktivierten*. Lesbarer Text bleibt deshalb durchgehend
-schwarz und wird über Größe und Kursivstellung abgestuft, nicht über Aufhellung. Das ist
-zugleich authentisch und der bessere Kontrast: Schwarz auf `#C0C0C0` sind 9,9 : 1.
+Grau ist unter Windows die Farbe des *Deaktivierten*. Lesbarer Text verbleibt daher durchgängig
+schwarz und wird über Größe und Kursivstellung abgestuft, nicht über Aufhellung. Dies ist
+zugleich authentisch und der bessere Kontrast: Schwarz auf `#C0C0C0` ergibt 9,9 : 1.
-## 11. Bewusst nicht gebaut
+## § 11 Bewusst nicht eingerichtet
-- **Onboarding-Assistent.** Elf Kernfelder tragen keinen Wizard; er verstellte nur den Blick
- auf die Kopplung der Größen.
-- **Animierte Zahlenübergänge.** Sie lenken von genau dem ab, was man vergleichen soll.
+- **Einführungsassistent.** Elf Kernfelder tragen keinen Assistenten; er verstellte lediglich den
+ Blick auf die Kopplung der Größen.
+- **Animierte Zahlenübergänge.** Sie lenken von genau demjenigen ab, was verglichen werden soll.
- **Aufgeräumte Rechengrößen.** Die 45 gesetzlichen Werte stehen bewusst hinten und bewusst
- vollständig. Wer die Modellannahme mit 70 % Vertrauensgrad nicht teilt, soll sie ändern
- können, ohne den Quelltext anzufassen.
+ vollständig. Wer die Modellannahme mit 70 vom Hundert Vertrauensgrad nicht teilt, soll sie
+ ändern können, ohne den Quelltext anfassen zu müssen.
---
-*Keine Steuer- oder Anlageberatung. Ein Modell ist kein Vertrag.*
+*Es wird abschließend darauf hingewiesen, dass weder eine Steuer- noch eine Anlageberatung
+erbracht wird. Ein Modell ist kein Vertrag.*