Build the sqlite variant with make APP=mxd-wireframe-server sqlite or the
postgres variant with make APP=mxd-wireframe-server postgres. The targets
reuse the shared CLI module, so both binaries honour the same flags,
environment overrides, and .mxd.toml defaults.
Start the daemon with
cargo run --bin mxd-wireframe-server -- --bind 0.0.0.0:6600 --database mxd.db.
The binary prints mxd-wireframe-server listening on … after the Wireframe
listener binds.
Administrative subcommands such as create-user remain available because
the bootstrap calls mxd::server::run_command before starting the listener.
The Wireframe listener now decodes the Hotline 12-byte handshake preamble,
uses the upstream preamble hooks to send the 8-byte reply (0 on success, 1
for invalid protocol, 2 for unsupported version, 3 for handshake timeout),
drops idle sockets after the five-second handshake timeout before routing,
and records the negotiated sub-protocol ID and sub-version in per-connection
state. The metadata stays available for the lifetime of the connection, so
compatibility shims can branch on client quirks, and it is cleared during
teardown to avoid leaking between sessions. The transaction framing adapter
keeps Hotline's native multi-fragment wire contract while configuring
explicit inbound Wireframe budgets for one full logical request (20-byte
header plus up to 1 MiB of payload). Fragmented requests above that cap are
disconnected. If a client pauses a fragmented request for more than five
seconds and then resumes it, the server closes the connection instead of
routing the partial request. Valid fragmented requests that stay within the
cap continue to route normally. Routing error replies preserve transaction
IDs and types when a header is available, and routing failures are logged
through the existing tracing infrastructure with transaction context.
The wireframe adapter automatically detects clients that XOR-encode text
fields (for example, SynHX with the encode toggle enabled). Once detected,
inbound payloads are decoded and outbound replies are encoded to match the
client, without any additional configuration.
Login reply compatibility now depends on client metadata. SynHX is detected
via handshake sub-version 2 and receives only the server version field
(160). Hotline 1.8.5 and 1.9 clients are identified by the login request's
version field (160) and receive the banner fields 161/162 in addition to the
server version.
Compatibility behaviour is unchanged by roadmap item 1.5.4; that milestone
adds bounded Kani verification for XOR round-trips and login
sub-version/version gating invariants.
Presence parity is now available in the wireframe server. After a successful
login, users whose account carries the NO_AGREEMENT privilege are
immediately visible to peers. Users who must accept the server agreement
first become visible only after sending the Agreed transaction (121) and the
session reaches Online. Get User Name List (300) and Notify Change User
(301) are emitted only once the session is Online. Once online,
Notify Delete User (302), Get Client Info Text (303), and
Set Client User Info (304) behave as before: disconnects remove the user,
info lookup returns the visible name with blank info text, and session
nickname/icon/options updates notify peers.
Internal release validation uses
docs/internal-compatibility-matrix.md as the compatibility source of truth.
Release-note QA sign-off must reference that matrix using the checklist in
docs/release-notes-qa-sign-off.md.
WireframeRouter is the sole public routing entrypoint. It embeds a
CompatibilityLayer that applies XOR decoding, login-version recording, and
banner-field augmentation on every routed transaction. Compatibility hooks
cannot be accidentally bypassed by new routes. No user-visible behaviour
change.
Roadmap item 1.5.6 is complete: the guardrail routing entrypoint now wires
AuthStrategy for login dispatch and LoginReplyAugmenter for login reply
decoration. Default Hotline 1.8.5/1.9 and SynHX behaviour remains unchanged,
so this is an internal architecture refactor rather than a user-visible
protocol change.