docs: ticket 05 (script-engine-research) aufloesen, ticket 13 graduieren

This commit is contained in:
2026-08-11 15:45:38 +02:00
parent 9f9279d926
commit c8cde87db1
4 changed files with 317 additions and 1 deletions

View File

@@ -1,7 +1,7 @@
# 05 — Research: Script-Engine für Mod-Stufe (c)
Type: research
Status: open
Status: resolved
Blocked by: —
## Question
@@ -19,3 +19,33 @@ Fakten sammeln, keine Entscheidung treffen. Zu klären:
- Reifegrad: Wartungsstand, Release-Frequenz, Größe des Ökosystems, Beispiele aus echten Spielen.
Ergebnis: Vergleichstabelle plus Empfehlung mit Begründung; die Entscheidung fällt der Mensch später.
## Answer
Vollständiger Bericht: [`research/05-script-engine.md`](../research/05-script-engine.md)
(209 Zeilen, geprüft am 2026-08-11). **Empfehlung: Rhai** — begründet, nicht entschieden.
- **Fehlermeldungen**: Rhai liefert Zeile *und* Spalte plus Call-Chain. Passt direkt zur
`Result`-Fehlerstrategie aus Ticket 04.
- **Typ-Brücke**: `#[derive(CustomType)]`, nur `Clone` nötig — gegen `impl UserData` pro Feld bei mlua.
- **Hot-Reload**: AST-Tausch bei überlebendem `Scope`.
- **Build**: kein `cc`, kein `libc` im Baum. Gemessen 44 Dependencies und 45,5 s gegen 166/304 Deps und
262 s/356 s bei den WASM-Kandidaten.
- **Sandbox, der schärfste Einzelbefund**: Ein Lua-Script hat auf dieser Maschine unter `Lua::new()`
**und** unter `StdLib::ALL_SAFE` per `io.open` eine echte Datei gelesen. `ALL_SAFE` ist `(1<<30)-1`
und meint *speichersicher*, nicht *fähigkeitsbeschränkt*. Rhai hat Datei-, Netz- und Prozesszugriff
gar nicht erst in der Standard-Engine. Beide brauchen Härtung, bei Rhai kostet ein vergessener
Handgriff weniger. Rhais Defaults sind aber auch nicht harmlos: `FileModuleResolver` lädt `./*.rhai`
von der Platte, `eval()` ist an, CPU- und Memory-Limits sind aus.
- **Gegenseite, ehrlich**: Lua gewinnt bei der Vertrautheit deutlich (Factorio, GMod, WoW, Teardown,
Noita, Don't Starve, Luanti, Dota 2). Ist das Ziel „möglichst viele fremde Mods" statt „gut moddbar
für einen kleinen Kreis", kippt die Empfehlung.
- **Rhai-Risiken**: Bus-Faktor 1; Unsoundness-Issue #894 offen seit 2024; Pflicht-Dependency
`smartstring` seit 2026-08-10 unmaintained (RUSTSEC-2026-0249); VM-Rewrite im Gang.
- **WASM scheidet für 1.0 aus** — nicht technisch (beste Sandbox), sondern wegen Compile-Pflicht für
Modder, Fehlermeldungen ohne Quellzeile und Build-Overhead. Falls später doch: `wasmi`, nicht wasmtime.
- **Nicht verifizierbar und so gekennzeichnet**: kein ausgeliefertes Spiel mit Rhai-Modding, kein
Rust-Spiel mit mlua, kein kommerzielles Spiel mit WASM-Modding auffindbar.
**Folge für die Map**: Reden Scripts ausschließlich über das Effekt-Vokabular, ist die Engine-Wahl
weit umkehrbarer als sie aussieht. Die Entscheidung selbst ist zu Ticket 13 graduiert und hängt an 01.

View File

@@ -0,0 +1,29 @@
# 13 — Script-Engine wählen und Sandbox härten
Type: grilling
Status: open
Blocked by: 01
## Question
Rhai oder mlua — und wie wird die gewählte Engine abgedichtet?
Ticket 05 hat die Fakten geliefert und Rhai empfohlen. Die Entscheidung steht noch aus, und sie hängt
bewusst an 01: Reden Scripts ausschließlich über das Effekt-Vokabular, ist die Wahl später umkehrbar;
reichen sie tiefer in den Game-State, ist sie es nicht. Zu klären:
- **Ist das Effekt-Vokabular die einzige Schnittstelle für Scripts?** Wenn ja, ist die Engine-Wahl eine
Implementierungsentscheidung statt einer Architekturentscheidung.
- **Zielgruppe**: „gut moddbar für einen kleinen Kreis" spricht für Rhai, „möglichst viele fremde Mods"
für Lua. Das ist die Frage, an der die Empfehlung kippt.
- **Vertraust du fremden Mods?** Bei feindlichen Mods ist Luau der einzige echte Sandbox — zum Preis
einer C++17-Toolchain und eines Lua-*Dialekts*.
- **Härtungs-Checkliste** für die gewählte Engine festlegen. Bei Rhai mindestens: `FileModuleResolver`
abschalten, `eval()` deaktivieren, CPU- und Memory-Limits setzen. Bei mlua: niemals `Lua::new()`,
sondern `new_with` mit ausgewählten Libs, `load`/`loadstring`/`dofile`/`require` entfernen,
`ChunkMode::Text` erzwingen.
- **Wie geht das Projekt mit den Rhai-Risiken um** — Bus-Faktor 1, Unsoundness-Issue #894 seit 2024,
`smartstring` unmaintained (RUSTSEC-2026-0249)? Akzeptiert, beobachtet, oder Ausschlusskriterium?
- **Wann fällt die Entscheidung endgültig** — jetzt, oder erst wenn Mod-Stufe (c) gebaut wird?
Ergebnis: gewählte Engine mit Begründung, Härtungs-Checkliste, und die Regel, was Scripts sehen dürfen.