Skip to content

Responsibility map

Code is grouped around owners rather than technical convenience. Each rule or piece of mutable state has one owner and is consumed through a narrow contract.

Concern Owner Adapters and consumers
Legal moves, active route, and visible trail Navigation domain Session service, web controller
Frozen decision frontiers Session exploration domain Persistence, API presenter, map board
Score and time windows Scoring domain Session completion, results UI
Hint choice and penalties Hints domain Session commands, hint presentation
Entity and edge lookup GraphReader SQLite adapter, session service, pipeline compiler
Choice-first round eligibility Pipeline round builder Compiler, API invariant verifier, game modes
Guest identity Guest service Cookie/HTTP adapter, PostgreSQL repository
Daily assignment and ranking Daily service Repository, REST routes
Race lifecycle and reconnect Room service Valkey adapter, WebSocket routes
Open-data acquisition Pipeline acquisition HTTP transport, immutable cache
Relationship semantics and explanation quality Pipeline relationship semantics Wikidata normalization, compiler, semantic refresh
Round curation Pipeline round builder Review records, graph compiler
Canonical deterministic map MapBoard domain Responsive projection, Svelte interaction
Responsive geometry and phone choice confirmation Map-board presentation Map camera, detail tray, semantic DOM, renderers
Spatial canvas camera Map-camera presentation Gestures, controls, Three.js and SVG view adapters
Historical path inspection Map inspection projection Read-only Svelte inspector
Anonymous reporting contract Web analytics adapter App orchestration, self-hosted Umami
Rendering and interaction Svelte feature components API facade and domain view models

Cross-domain code is shared only when it represents a stable concept with multiple real consumers. There are no global grab-bag utilities, god services, or UI components that combine transport, game-rule enforcement, and rendering.