Architecture decisions
Each record explains one decision about the server, the wire protocol or the Lua SDK: the problem, what was decided and why, and the options that were rejected. A record describes the decision in force. Numbers are not contiguous: the numbering is shared with decisions about parts of DarqlineMP that are not in this repository.
| ADR | Decision |
|---|---|
| 0004 | A protocol envelope: revision check, session token, stale-packet protection and strict decoding |
| 0007 | Discrete events travel on one reliable, ordered lane per connection and direction |
| 0009 | Gamemode code acts through a flat, id-based server facade |
| 0010 | The server owns time of day and weather; the clock stands still unless the server runs it |
| 0012 | The server owns spawn-point selection, apart from the world baseline and the spawn packets |
| 0013 | One internal grant primitive, grown only by real consumers |
| 0014 | Health and armor rewards are additive grants the recipient applies to itself |
| 0016 | Player commands are a packet of their own, handled by resources and answered with server messages |
| 0017 | Death and respawn: server-owned life state plus reliable lifecycle events |
| 0019 | The gamemode decides what a pickup does and when it is consumed |
| 0020 | The gamemode decides respawn delay and point for each death |
| 0021 | One removal path frees everything a departing player owned |
| 0022 | The handshake accepts a session; spawning is a separate request and grant |
| 0023 | The gamemode decides when and how a connected player spawns |
| 0024 | The server owns the weapon inventory and reconciles it only downward |
| 0025 | Resources call each other through marshalled exports and start in dependency order |
| 0026 | The operator console is a typed, socket-free dispatcher over the server facade |
| 0027 | Cross-resource calls go only through a dependency-gated dlmp.import |
| 0029 | Damage events, and a death's killer from the last accepted damage |
| 0033 | Explosion and fire damage is credited to an accepted cause |
| 0034 | A destroyed vehicle's killer is the attacker the server can corroborate |
| 0035 | Players are shown only to players in the same world scope and within distance |
| 0037 | Players own every key; servers declare actions, not keys |
| 0038 | Refusable events fail closed; chat is one of them |
| 0039 | Friendly fire is refused by the victim's client through damage groups |
| 0040 | The server holds movement to plausible limits; the game mode decides on suspicion |
| 0041 | A shot rewinds its recipient instead of deciding the hit for it |
| 0042 | A secret session token and a stateless return-address cookie |
| 0043 | Map editing proposes and the owning resource applies; maps are documents the core validates |
| 0045 | The server keeps each life's health; the victim confirms the hit |
| 0046 | Domain code does not read the clock: every server step has one time |
| 0047 | The protocol module owns the whole wire contract |
| 0048 | Resources receive game events as one stream, in the order the server committed them |
| 0049 | Resources ship web pages as views; the server keeps all authority |
| 0050 | Server configuration is a strict server.toml with environment overrides |
| 0051 | Voice chat runs on its own encrypted channel, relayed by the game server (not implemented yet) |
| 0052 | Login is decided in PreAuth by one auth resource named in the config |
| 0053 | A server-scoped device credential, proven in the handshake and kept by the launcher |
| 0054 | Resource storage is asynchronous SQL in a namespace per resource, with migrations per backend |
| 0055 | Web login: an in-game form posts to the server's auth site over HTTPS, and the core verifies a signed JWT |
