# ADR-001: Stack and storage ## Decision Electron + React + TypeScript + Vite; SQLite with JSON documents for systems/characters; portable `app/shared` contract for future TTRPG Player + mobile. ## Rationale Matches TTRPG Player packaging targets; offline-first; no Postgres. # ADR-002: Formula DSL ## Decision Custom minimal expression language (`floor`, `ceil`, `round`, `min`, `max`, `clamp`, arithmetic, `attr.*` / `skill.*` / `resource.*` / `derived.*`). ## Rationale Same evaluator can be copied into the player; explicit rounding; no heavy CEL/JSONata dependency. # ADR-003: Schema freeze via snapshotHash ## Decision Player binds store `snapshotHash` (content-addressed) rather than inline full schema per character. ## Rationale Implements freeze-on-bind without bloating `players.json`. # ADR-004: Spells from dnd.su ## Decision Provide an import pipeline for PHB-labelled spells from dnd.su at product owner request, with README/IP disclaimer. Prefer SRD stubs in default presets. ## Rationale Owner requested PHB coverage; redistribution risk acknowledged.