Establish a project-level Technical Architecture Document: engine/game boundary, deployment/live-demo strategy, and versioning policy
Context
With glemy positioned as a general-purpose engine (the current merge puzzler being a proving-ground game, not the end goal) and a public website now live, the user requested a researched, cross-checked technical architecture covering four questions: whether the system should be built around a core engine generating sub-games versus a modular/decoupled approach; how continuous deployment interacts with live-streamed/live demo sessions; what prevents backward-compatibility breakage during early development; and other material architectural/operational risks. The user required real, cited research (not memory) cross-checked across multiple independent sources, presented in chat for review before any formal document was written (two-phase workflow), then compiled into a public-ready, third-person Technical Architecture Document once approved.
Options considered
Decision
Wrote docs/technical-architecture.md as the project-level (multi-repo) architecture document, distinct in scope from ARCHITECTURE.md (which stays scoped to in-repo module placement rules) -- cross-referenced from both directions. Established, as explicit policy: (1) game-rule outcomes are represented as GameEvent data returned from pe.tick rather than embedded in genre-agnostic physics logic; (2) shared engine modules (pe, render, io) stay in a single repository until a second, genre-distinct game begins active development, at which point they are extracted into an independently versioned, consumed package -- mirroring Bevy/Godot/Phaser's real structure; (3) built static assets require content-hashed filenames (not yet implemented); (4) the live demo is split into a pinned /play (stable) and directly-tracking /play-edge (latest) channel, promoted deliberately, following the stable/beta/nightly pattern documented in Rust's own release-channel RFC; (5) docs/decisions.jsonl continues serving as the system's migration record, matching Bevy's own migration-guide practice for a pre-1.0 engine; (6) Semantic Versioning is adopted for glemy's own version number once engine modules become an independently consumed package; (7) any future persisted game state requires an explicit schema_version field, stepwise migration functions, and dedicated save DTOs distinct from runtime Model types, established as policy ahead of any persistence implementation.
Verification
Every research question was answered against 2-4 independent, cited real sources (Bevy's own docs/migration guides, Godot's signal-system docs, Phaser framework docs, Martin Fowler's micro-frontends/feature-flag writeups, semver.org, caniuse.com, GitHub's own Pages limits documentation, Rust's release-channel RFC, and general cache-busting/save-versioning industry references), not asserted from memory. Findings were presented in chat for review before the formal document was written (the user's required two-phase workflow), and the user confirmed three specific points be explicitly highlighted (the GameEvent decoupling decision, the content-hashing + /play-edge channel requirements, and the save schema_version policy) before Phase 2 proceeded -- all three are present as explicit, separately-labeled sections in the resulting document.
Consequences
The project now has a written, cited, public-readable answer to 'how does this scale beyond one game' and 'what happens to a live demo during a deploy' -- questions that were previously only implicitly answered by the current single-game, single-repo state. Two concrete open action items follow directly from this decision and are not yet implemented: content-hashed static asset filenames, and the /play vs /play-edge channel split. Both are tracked in the new document's own requirements summary table, not just narrated in prose, so they don't require re-deriving from this decision text later.