Ported from sq-2 (Python), adapted for the Rust rewrite (~2026-03-30 to 2026-04-19), then carried back to Python per ADR-082. Game design decisions preserved across both language transitions.
The backend was Rust (sidequest-api) from ~2026-03-30 to 2026-04-19, then
ported back to Python (sidequest-server) per ADR-082. Cutover completed
2026-04-23. The Rust tree is preserved read-only at
https://github.com/slabgorb/sidequest-api but no longer exists in the working
tree. ADR-085 governed tracker hygiene through the port window.
Rust code samples and type declarations appear in ADRs throughout the 001–081 range — these were written while Rust was the live backend. Treat them as historical illustration, not current implementation. The design decisions carried forward; the language-specific mechanism descriptions did not. Quick translation reference:
| Rust artifact in an ADR | Current Python reality |
|---|---|
crates/sidequest-<X>/src/<Y>.rs |
sidequest-server/sidequest/<X>/<Y>.py |
#[derive(Serialize, Deserialize)] pub struct |
class X(pydantic.BaseModel) |
tokio::spawn, tokio::select! |
asyncio.create_task, asyncio.wait |
Arc<RwLock<T>> |
asyncio.Lock guarding a mutable |
rusqlite |
stdlib sqlite3 (DB work via asyncio.to_thread) |
serde_yaml |
pyyaml |
axum router |
FastAPI app |
cargo test |
pytest |
Decomposition ADRs (060–065, 072) carry "Post-port mapping" notes at their tails that translate crate layouts to the current Python package structure. ADR-007 (character model) has a header note pointing to the Python home. Narrative and game-system ADRs (014, 017–025, 041–043, etc.) describe language-agnostic design and are unaffected by the port.
The 2026-04-23 cutover audit moved these ADRs from Proposed to Accepted
because the Python port executed their plans:
- ADR-060 (Genre Models Decomposition) — realized as
sidequest/genre/models/package - ADR-061 (Lore Module Decomposition) — realized as sibling
lore_*.pymodules undersidequest/game/ - ADR-062 (Server lib.rs Extraction) — realized as separate modules under
sidequest/server/ - ADR-063 (Dispatch Handler Splitting) — realized as
sidequest/server/dispatch/package - ADR-064 (Game Crate Domain Modules) — partially accepted; most files flat, only
projection/promoted to subdirectory - ADR-082 itself — moved from "Proposed (quick-look draft)" to
Accepted (cutover completed 2026-04-23)
ADR-065 (protocol message decomposition) and ADR-072 (system/milieu split) remain Proposed — the Python port did not execute them; the 1:1 port rule forbade structural refactors during cutover.
Current backend reference documents: docs/architecture.md, docs/tech-stack.md,
docs/api-contract.md. An abbreviated index of this document is reproduced in
CLAUDE.md for agent activation context.
Generated. Do not edit this section by hand. Update frontmatter on the individual ADR files and rerun
scripts/regenerate_adr_indexes.py. The preamble above the BEGIN marker and any prose below the END marker are preserved.
| ADR | Status | Impl |
|---|---|---|
| ADR-001: Claude CLI Only | ✓ accepted | live |
| ADR-002: SOUL Principles | ✓ accepted | — |
| ADR-003: Genre Pack Architecture | ✓ accepted | live |
| ADR-004: Lazy Genre Binding | ✓ accepted | live |
| ADR-005: Background-First Pipeline | ✓ accepted | live |
| ADR-006: Graceful Degradation | ✓ accepted | live |
| ADR-007: Unified Character Model | ✓ accepted | live |
| ADR | Status | Impl |
|---|---|---|
| ADR-008: Three-Tier Rule Taxonomy | ✓ accepted | live |
| ADR-009: Attention-Aware Prompt Zones | ✓ accepted | live |
| ADR | Status | Impl |
|---|---|---|
| ADR-011: World State JSON Patches | ✓ accepted | live |
| ADR-012: Agent Session Management | ✓ accepted | live |
| ADR-066: Persistent Opus Narrator Sessions | ✓ accepted | live |
| ADR-067: Unified Narrator Agent — Collapse Multi-Agent into Single Persistent Session | ✓ accepted | live |
| ADR | Status | Impl |
|---|---|---|
| ADR-014: Diamonds and Coal | ✓ accepted | — |
| ADR-015: Character Builder State Machine | ✓ accepted | live |
| ADR-016: Three-Mode Character Creation | ✓ accepted | live |
| ADR-018: Trope Engine | ✓ accepted | drift → ADR-087 |
| ADR-019: Cartography Discovery | ✓ accepted | live |
| ADR-020: NPC Disposition System | ✓ accepted | drift → ADR-087 |
| ADR-021: Progression System | ✓ accepted | live |
| ADR-022: WorldBuilder Maturity | ✓ accepted | live |
| ADR-023: Session Persistence | ✓ accepted | live |
| ADR-024: Dual-Track Tension Model | ✓ accepted | live |
| ADR-025: Pacing Detection | ✓ accepted | live |
| ADR-074: Dice Resolution Protocol — Player-Facing Rolls via WebSocket | ◇ proposed | deferred |
| ADR-077: Dogfight Subsystem via StructuredEncounter Extension | ◇ proposed | deferred → ADR-087 |
| ADR-078: Edge / Composure Combat, Mechanical Advancement, and Push-Currency Rituals | ◇ proposed | deferred → ADR-087 |
| ADR-080: Unified Narrative Weight Trait | ✓ accepted | — |
| ADR-081: Advancement Effect Variant Expansion (v1) | ◇ proposed | deferred → ADR-087 |
| ADR | Status | Impl |
|---|---|---|
| ADR-026: Client-Side State Mirror | ✓ accepted | live |
| ADR-027: Reactive State Messaging | ✓ accepted | live |
| ADR-075: 3D Dice Rendering — Three.js + Rapier Physics Overlay | ◇ proposed | deferred |
| ADR-079: Genre Theme System Unification | ✓ accepted | live |
| ADR | Status | Impl |
|---|---|---|
| ADR-028: Perception Rewriter | ✓ accepted | live |
| ADR-029: Guest NPC Players | ◇ proposed | deferred |
| ADR-030: Scenario Packs | ◇ proposed | deferred |
| ADR-036: Multiplayer Turn Coordination | ✓ accepted | live |
| ADR-037: Shared-World / Per-Player State Split | ✓ accepted | live |
| ADR | Status | Impl |
|---|---|---|
| ADR-035: Unix Socket IPC for Python Sidecar | ✓ accepted | live |
| ADR-038: WebSocket Transport Architecture | ✓ accepted | live |
| ADR-046: GPU Memory Budget Coordinator | ✓ accepted | live |
| ADR-047: Prompt Injection Sanitization Layer | ✓ accepted | live |
| ADR | Status | Impl |
|---|---|---|
| ADR-040: Narrative Character Sheet (No Raw Stats) | ✓ accepted | live |
| ADR-049: Narrator Verbosity and Vocabulary (Two-Axis Text Tuning) | ✓ accepted | live |
| ADR-052: Narrative Axis System (/tone Command) | ✓ accepted | live |
| ADR-057: Narrator Crunch Separation — LLM Narrates, Scripts Crunch | ✓ accepted | partial → ADR-059 |
| ADR | Status | Impl |
|---|---|---|
| ADR-041: Genie Wish / Consequence Engine | ✓ accepted | drift → ADR-087 |
| ADR-042: OCEAN Personality Live Evolution | ✓ accepted | drift → ADR-087 |
| ADR-043: Conlang Morpheme System | ✓ accepted | drift → ADR-087 |
| ADR-053: Scenario System (Clue Graph, Belief State, Gossip Propagation) | ✓ accepted | drift → ADR-087 |
| ADR | Status | Impl |
|---|---|---|
| ADR-044: Speculative Prerendering During TTS Playback | ✓ accepted | drift → ADR-087 |
| ADR-045: Client Audio Engine | ✓ accepted | partial → ADR-076 |
| ADR-048: Lore RAG Store with Cross-Process Embedding | ✓ accepted | live |
| ADR-050: Image Pacing Throttle | ✓ accepted | live |
| ADR-070: MLX Image Renderer — Replace PyTorch/diffusers with Apple MLX | ✓ accepted | live |
| ADR-083: Multi-LoRA Stacking and Verification Pipeline | ◇ proposed | deferred |
| ADR-086: Image-Composition Taxonomy — Portraits, POIs, Illustrations | ◇ proposed | deferred |
| ADR-089: Pre-Rendered Cavern Battle Maps via Ported Cellular Automata | ◇ proposed | drift |
| ADR | Status | Impl |
|---|---|---|
| ADR-051: Two-Tier Turn Counter (Interaction vs. Round) | ✓ accepted | live |
| ADR | Status | Impl |
|---|---|---|
| ADR-055: Room Graph Navigation | ◇ proposed | deferred |
| ADR | Status | Impl |
|---|---|---|
| ADR-059: Monster Manual — Server-Side Pre-Generation via Game-State Injection | ✓ accepted | drift → ADR-087 |
| ADR-069: Scenario Fixtures — Pre-configured World States for Testing | ✓ accepted | drift → ADR-087 |
| ADR | Status | Impl |
|---|---|---|
| ADR-058: Claude Subprocess OTEL Passthrough | ◇ proposed | deferred |
| ADR-090: OTEL Dashboard Restoration after Python Port | ✓ accepted | live |
| ADR | Status | Impl |
|---|---|---|
| ADR-060: Genre Models Decomposition — Split models.rs by Domain | ✓ accepted | live |
| ADR-061: Lore Module Decomposition — Split lore.rs by Responsibility | ✓ accepted | live |
| ADR-062: Server lib.rs Extraction — Route Groups, State, and Watcher Events | ✓ accepted | live |
| ADR-063: Dispatch Handler Splitting — By Pipeline Stage | ✓ accepted | live |
| ADR-064: Game Crate Domain Modules — Organize 69 Flat Files | ✓ accepted | live |
| ADR-065: Protocol Message Decomposition — Split message.rs by Domain | ◇ proposed | deferred |
| ADR-068: Magic Literal Extraction — Domain-Scoped Constants | ✓ accepted | live |
| ADR-072: System/Milieu Decomposition — Separating Mechanics from Aesthetic | ◇ proposed | deferred |
| ADR-088: ADR Frontmatter Schema and Auto-Generated Indexes | ✓ accepted | live |
| ADR | Status | Impl |
|---|---|---|
| ADR-073: Local Fine-Tuned Model Architecture | ✓ accepted | live |
| ADR-076: Narration Protocol Collapse Post-TTS Removal | ◇ proposed | deferred |
| ADR | Status | Impl |
|---|---|---|
| ADR-031: Game Watcher — Semantic Telemetry for AI Agent Observability | ✓ accepted | live |
| ADR-033: Genre Mechanics Engine — Confrontations & Resource Pools | ✓ accepted | partial → ADR-087 |
| ADR | Status | Impl |
|---|---|---|
ADR-082: Port sidequest-api from Rust back to Python |
✓ accepted | live |
| ADR-085: Tracker hygiene during the Rust→Python port — handling port-drift | ✓ accepted | live |
| ADR-087: Post-Port Subsystem Restoration Plan | ◇ proposed | deferred |
Retired ADRs. See SUPERSEDED.md for the grouped view.
| ADR | Status | Successor |
|---|---|---|
| ADR-010: Intent-Based Agent Routing | ✗ superseded | ADR-067 |
| ADR-013: Lazy JSON Extraction | ✗ superseded | ADR-057 |
| ADR-017: Cinematic Chase Engine | ✗ superseded | ADR-033 |
| ADR-032: Genre-Specific LoRA Style Training for Flux Image Generation | ✗ superseded | ADR-070 |
| ADR-034: Portrait Identity Consistency — Tiered Character Recognition Pipeline | ✗ superseded | ADR-086 |
| ADR-039: Narrator Structured Output (JSON Sidecar Block) | ✗ superseded | ADR-057 |
| ADR-054: WebRTC Voice Chat (Disabled — Echo Feedback Loop) | ✗ historical | — |
| ADR-056: Script Tool Generators — Offloading Structured Generation from LLM to Rust Binaries | ✗ superseded | ADR-059 |
| ADR-071: Tactical ASCII Grid Maps — Deterministic Room Layout via ASCII Art | ✗ superseded | ADR-086 |
| ADR-084: Compositional-Dimension Specialization for Style LoRAs | ✗ superseded | ADR-070 |
ADRs whose implementation is absent, partial, or deferred. See DRIFT.md for priority-tier details.